From c2a584b587de0b1cb233fe10cf5b1dc9d377f58b Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 18:49:11 -0700 Subject: [PATCH 01/22] chore: update telemetry server --- .gitattributes | 2 - .ottotime | 5 +- package.json | 2 +- pnpm-lock.yaml | 18 +- telemetry-server/package.json | 9 +- telemetry-server/pnpm-lock.yaml | 1049 +++++++++++++++----------- telemetry-server/pnpm-workspace.yaml | 3 + telemetry-server/src/worker.ts | 33 +- telemetry-server/wrangler.jsonc | 2 +- 9 files changed, 661 insertions(+), 462 deletions(-) delete mode 100644 .gitattributes create mode 100644 telemetry-server/pnpm-workspace.yaml diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 984c34e2..00000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Prevents merge conflicts in Ottotime files -.ottotime merge=union diff --git a/.ottotime b/.ottotime index 353acdca..8195967f 100644 --- a/.ottotime +++ b/.ottotime @@ -9,12 +9,12 @@ 1738887917- 4:19 1738956932- 0:34 1738958362- 15:54 -1740554835- 23:27 -1740700468- 2:20 1738958362- 4:31 +1740554835- 23:27 1740603160- 12:56 1740606231- 0:14 1740688246- 0:30 +1740700468- 2:20 1741307017- 14:15 1743012236- 10:23 1743027095- 23:01 @@ -33,3 +33,4 @@ 1753395700- 10:19 1758009073- 3:21 1758009278- 33:49 +1785980576- 6:11 diff --git a/package.json b/package.json index 28f496bb..3c402d7f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { "devDependencies": { - "@types/node": "^22.15.21" + "@types/node": "^26.1.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dc6b098..5898d68c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,21 +9,21 @@ importers: .: devDependencies: '@types/node': - specifier: ^22.15.21 - version: 22.15.21 + specifier: ^26.1.2 + version: 26.1.2 packages: - '@types/node@22.15.21': - resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} snapshots: - '@types/node@22.15.21': + '@types/node@26.1.2': dependencies: - undici-types: 6.21.0 + undici-types: 8.3.0 - undici-types@6.21.0: {} + undici-types@8.3.0: {} diff --git a/telemetry-server/package.json b/telemetry-server/package.json index 04691d98..7f99bc4c 100644 --- a/telemetry-server/package.json +++ b/telemetry-server/package.json @@ -9,10 +9,11 @@ "cf-typegen": "wrangler types" }, "devDependencies": { - "typescript": "^5.9.2", - "wrangler": "^4.37.0" + "typescript": "^7.0.2", + "wrangler": "^4.118.0" }, "dependencies": { - "zod": "^4.1.8" - } + "valibot": "^1.4.2" + }, + "packageManager": "pnpm@11.20.0" } diff --git a/telemetry-server/pnpm-lock.yaml b/telemetry-server/pnpm-lock.yaml index e32be7ca..734e3b61 100644 --- a/telemetry-server/pnpm-lock.yaml +++ b/telemetry-server/pnpm-lock.yaml @@ -8,58 +8,58 @@ importers: .: dependencies: - zod: - specifier: ^4.1.8 - version: 4.1.8 + valibot: + specifier: ^1.4.2 + version: 1.4.2(typescript@7.0.2) devDependencies: typescript: - specifier: ^5.9.2 - version: 5.9.2 + specifier: ^7.0.2 + version: 7.0.2 wrangler: - specifier: ^4.37.0 - version: 4.37.0 + specifier: ^4.118.0 + version: 4.118.0 packages: - '@cloudflare/kv-asset-handler@0.4.0': - resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} - engines: {node: '>=18.0.0'} + '@cloudflare/kv-asset-handler@0.5.0': + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} + engines: {node: '>=22.0.0'} - '@cloudflare/unenv-preset@2.7.3': - resolution: {integrity: sha512-tsQQagBKjvpd9baa6nWVIv399ejiqcrUBBW6SZx6Z22+ymm+Odv5+cFimyuCsD/fC1fQTwfRmwXBNpzvHSeGCw==} + '@cloudflare/unenv-preset@2.16.1': + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} peerDependencies: - unenv: 2.0.0-rc.21 - workerd: ^1.20250828.1 + unenv: 2.0.0-rc.24 + workerd: '>1.20260305.0 <2.0.0-0' peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250906.0': - resolution: {integrity: sha512-E+X/YYH9BmX0ew2j/mAWFif2z05NMNuhCTlNYEGLkqMe99K15UewBqajL9pMcMUKxylnlrEoK3VNxl33DkbnPA==} + '@cloudflare/workerd-darwin-64@1.20260730.1': + resolution: {integrity: sha512-+MBHmPaiTe2KajryW0T24rZvWFxb41hD3d8anNzQqHzft6vSEb18+sp0znSwxgij7ApPhSM1+vhkNg4f3YMguA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250906.0': - resolution: {integrity: sha512-X5apsZ1SFW4FYTM19ISHf8005FJMPfrcf4U5rO0tdj+TeJgQgXuZ57IG0WeW7SpLVeBo8hM6WC8CovZh41AfnA==} + '@cloudflare/workerd-darwin-arm64@1.20260730.1': + resolution: {integrity: sha512-SBHKntPkKvNPgaCrTe99xC1CAl8ygJDzlYfK0LbuJ1muKadIw35WnhO0wu894fKBtllsVQdNzDLee+cm0ppLSQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250906.0': - resolution: {integrity: sha512-rlKzWgsLnlQ5Nt9W69YBJKcmTmZbOGu0edUsenXPmc6wzULUxoQpi7ZE9k3TfTonJx4WoQsQlzCUamRYFsX+0Q==} + '@cloudflare/workerd-linux-64@1.20260730.1': + resolution: {integrity: sha512-ouyPOSMbiKPeSwUJUvxtMcxGAXs2J4aPE4T5ABIYX5ClcQx5j5bbHTmnqOQEY8sAuLTPjH7dY+iB6UI5ISlwwA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250906.0': - resolution: {integrity: sha512-DdedhiQ+SeLzpg7BpcLrIPEZ33QKioJQ1wvL4X7nuLzEB9rWzS37NNNahQzc1+44rhG4fyiHbXBPOeox4B9XVA==} + '@cloudflare/workerd-linux-arm64@1.20260730.1': + resolution: {integrity: sha512-YQ+Mi78U3TPdgBPtwq+Sm6rJU+Ihl2y0pjYtuuKkdmUbYzL7oLR6Xqq9wljhasnuCFICssDJaqhMep5WizYoEQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250906.0': - resolution: {integrity: sha512-Q8Qjfs8jGVILnZL6vUpQ90q/8MTCYaGR3d1LGxZMBqte8Vr7xF3KFHPEy7tFs0j0mMjnqCYzlofmPNY+9ZaDRg==} + '@cloudflare/workerd-windows-64@1.20260730.1': + resolution: {integrity: sha512-27fAN+vUECW1oYVc1KOcHYpkL8COM2Uxtxql7TL595kxbjoqS5yckw7NLz7bTf2pALFCZWjqXDjZGJ/xbG4ZKQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -68,261 +68,324 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.2': + resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.2': + resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-freebsd-wasm32@0.35.2': + resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.1': + resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.3.1': + resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.3.1': + resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.3.1': + resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} cpu: [arm] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.1': + resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-riscv64@1.3.1': + resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.1': + resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.3.1': + resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': + resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} cpu: [x64] os: [linux] + libc: [musl] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.2': + resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.2': + resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.2': + resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.2': + resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.2': + resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.2': + resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.2': + resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.2': + resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.35.2': + resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} + engines: {node: '>=20.9.0'} - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-webcontainers-wasm32@0.35.2': + resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.2': + resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.2': + resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.2': + resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -336,101 +399,173 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@poppinss/colors@4.1.5': - resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} - '@poppinss/dumper@0.6.4': - resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} - '@poppinss/exception@1.2.2': - resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@sindresorhus/is@7.1.0': - resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} - '@speed-highlight/core@1.2.7': - resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@speed-highlight/core@1.2.23': + resolution: {integrity: sha512-iRoq6i6JDJP6Mt2A5JaPvzw0pgYHH6k92ij+yXiTrB7T2y9N789aWE3EHWj/5ztlJBokcCBja3iYLVdu5wgnkg==} - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] - blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} - engines: {node: '>=18'} + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true - exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - - miniflare@4.20250906.2: - resolution: {integrity: sha512-SXGv8Rdd91b6UXZ5eW3rde/gSJM6WVLItMNFV7u9axUVhACvpT4CB5p80OBfi2OOsGfOuFQ6M6s8tMxJbzioVw==} - engines: {node: '>=18.0.0'} - hasBin: true - - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + miniflare@5.20260730.0-alpha: + resolution: {integrity: sha512-8/dspSXDshP6nSkCpjKO7BYc2qZoYSXm7iM+QxY7qJyJpAB3onnQSaiu0cvKJlfuMGwULl55hG69FJCcCMXU1Q==} + engines: {node: '>=22.0.0'} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -438,21 +573,14 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - - stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} + sharp@0.35.2: + resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} + engines: {node: '>=20.9.0'} supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} @@ -461,38 +589,43 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - - undici@7.14.0: - resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.21: - resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + + valibot@1.4.2: + resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true - workerd@1.20250906.0: - resolution: {integrity: sha512-ryVyEaqXPPsr/AxccRmYZZmDAkfQVjhfRqrNTlEeN8aftBk6Ca1u7/VqmfOayjCXrA+O547TauebU+J3IpvFXw==} + workerd@1.20260730.1: + resolution: {integrity: sha512-zmfNIjwYSWFY5chGBOjWtH3xAE7p97FTC6vR4Ep98290ho6AeAR/NVcBD274YCLEUYzqm8yxdtZlxMybU8a3jA==} engines: {node: '>=16'} hasBin: true - wrangler@4.37.0: - resolution: {integrity: sha512-W8IbQohQbUHFn4Hz2kh8gi0SdyFV/jyi9Uus+WrTz0F0Dc9W5qKPCjLbxibeE53+YPHyoI25l65O7nSlwX+Z6Q==} - engines: {node: '>=18.0.0'} + wrangler@4.118.0: + resolution: {integrity: sha512-9pkBw/b8zWqGx2S+oLhgHMR1M/4VOE8SynUFABnGWiSFGlcOQ4xiI/B71Xf66RYP2xzngU37IQFPtUruij3lYw==} + engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250906.0 + '@cloudflare/workers-types': ^5.20260730.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -509,196 +642,222 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - - zod@4.1.8: - resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} - snapshots: - '@cloudflare/kv-asset-handler@0.4.0': - dependencies: - mime: 3.0.0 + '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0)': + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260730.1)': dependencies: - unenv: 2.0.0-rc.21 + unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20250906.0 + workerd: 1.20260730.1 - '@cloudflare/workerd-darwin-64@1.20250906.0': + '@cloudflare/workerd-darwin-64@1.20260730.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250906.0': + '@cloudflare/workerd-darwin-arm64@1.20260730.1': optional: true - '@cloudflare/workerd-linux-64@1.20250906.0': + '@cloudflare/workerd-linux-64@1.20260730.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20250906.0': + '@cloudflare/workerd-linux-arm64@1.20260730.1': optional: true - '@cloudflare/workerd-windows-64@1.20250906.0': + '@cloudflare/workerd-windows-64@1.20260730.1': optional: true '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.5.0': + '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.4': + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm64@0.25.4': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-arm@0.25.4': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/android-x64@0.25.4': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.25.4': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/darwin-x64@0.25.4': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.25.4': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.25.4': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm64@0.25.4': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-arm@0.25.4': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-ia32@0.25.4': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-loong64@0.25.4': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-mips64el@0.25.4': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-ppc64@0.25.4': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.25.4': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-s390x@0.25.4': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/linux-x64@0.25.4': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.25.4': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.25.4': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.25.4': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.25.4': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.25.4': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.25.4': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.25.4': + '@esbuild/win32-x64@0.28.1': optional: true - '@img/sharp-darwin-arm64@0.33.5': + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.35.2': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.3.1 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.35.2': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.3.1 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.2': + dependencies: + '@img/sharp-wasm32': 0.35.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.1': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.3.1': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-linux-arm@1.3.1': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.3.1': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-riscv64@1.3.1': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-s390x@1.3.1': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-x64@1.3.1': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + optional: true + + '@img/sharp-linux-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.1 optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-linux-arm@0.35.2': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.3.1 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-ppc64@0.35.2': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-ppc64': 1.3.1 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-riscv64@0.35.2': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-riscv64': 1.3.1 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-s390x@0.35.2': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.3.1 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linux-x64@0.35.2': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.3.1 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linuxmusl-arm64@0.35.2': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + optional: true + + '@img/sharp-wasm32@0.35.2': + dependencies: + '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-webcontainers-wasm32@0.35.2': dependencies: - '@emnapi/runtime': 1.5.0 + '@img/sharp-wasm32': 0.35.2 + optional: true + + '@img/sharp-win32-arm64@0.35.2': optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-ia32@0.35.2': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-x64@0.35.2': optional: true '@jridgewell/resolve-uri@3.1.2': {} @@ -710,211 +869,247 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@poppinss/colors@4.1.5': + '@poppinss/colors@4.1.6': dependencies: kleur: 4.1.5 - '@poppinss/dumper@0.6.4': + '@poppinss/dumper@0.6.5': dependencies: - '@poppinss/colors': 4.1.5 - '@sindresorhus/is': 7.1.0 + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 supports-color: 10.2.2 - '@poppinss/exception@1.2.2': {} + '@poppinss/exception@1.2.3': {} - '@sindresorhus/is@7.1.0': {} + '@sindresorhus/is@7.2.0': {} - '@speed-highlight/core@1.2.7': {} + '@speed-highlight/core@1.2.23': {} - acorn-walk@8.3.2: {} + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true - acorn@8.14.0: {} + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true - blake3-wasm@2.1.5: {} + '@typescript/typescript-darwin-x64@7.0.2': + optional: true - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true - color-name@1.1.4: {} + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 + '@typescript/typescript-linux-arm64@7.0.2': + optional: true - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true - cookie@1.0.2: {} + '@typescript/typescript-win32-arm64@7.0.2': + optional: true - defu@6.1.4: {} + '@typescript/typescript-win32-x64@7.0.2': + optional: true - detect-libc@2.1.0: {} + blake3-wasm@2.1.5: {} + + cookie@1.1.1: {} + + detect-libc@2.1.2: {} error-stack-parser-es@1.0.5: {} - esbuild@0.25.4: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - - exit-hook@2.2.1: {} - - exsolve@1.0.7: {} + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 fsevents@2.3.3: optional: true - glob-to-regexp@0.4.1: {} - - is-arrayish@0.3.4: {} - kleur@4.1.5: {} - mime@3.0.0: {} - - miniflare@4.20250906.2: + miniflare@5.20260730.0-alpha: dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.14.0 - acorn-walk: 8.3.2 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - sharp: 0.33.5 - stoppable: 1.1.0 - undici: 7.14.0 - workerd: 1.20250906.0 - ws: 8.18.0 + sharp: 0.35.2 + undici: 7.28.0 + workerd: 1.20260730.1 + ws: 8.21.0 youch: 4.1.0-beta.10 - zod: 3.22.3 transitivePeerDependencies: - bufferutil - utf-8-validate - ohash@2.0.11: {} - path-to-regexp@6.3.0: {} pathe@2.0.3: {} - semver@7.7.2: {} + semver@7.8.5: {} - sharp@0.33.5: + sharp@0.35.2: dependencies: - color: 4.2.3 - detect-libc: 2.1.0 - semver: 7.7.2 + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - - stoppable@1.1.0: {} + '@img/sharp-darwin-arm64': 0.35.2 + '@img/sharp-darwin-x64': 0.35.2 + '@img/sharp-freebsd-wasm32': 0.35.2 + '@img/sharp-libvips-darwin-arm64': 1.3.1 + '@img/sharp-libvips-darwin-x64': 1.3.1 + '@img/sharp-libvips-linux-arm': 1.3.1 + '@img/sharp-libvips-linux-arm64': 1.3.1 + '@img/sharp-libvips-linux-ppc64': 1.3.1 + '@img/sharp-libvips-linux-riscv64': 1.3.1 + '@img/sharp-libvips-linux-s390x': 1.3.1 + '@img/sharp-libvips-linux-x64': 1.3.1 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + '@img/sharp-linux-arm': 0.35.2 + '@img/sharp-linux-arm64': 0.35.2 + '@img/sharp-linux-ppc64': 0.35.2 + '@img/sharp-linux-riscv64': 0.35.2 + '@img/sharp-linux-s390x': 0.35.2 + '@img/sharp-linux-x64': 0.35.2 + '@img/sharp-linuxmusl-arm64': 0.35.2 + '@img/sharp-linuxmusl-x64': 0.35.2 + '@img/sharp-webcontainers-wasm32': 0.35.2 + '@img/sharp-win32-arm64': 0.35.2 + '@img/sharp-win32-ia32': 0.35.2 + '@img/sharp-win32-x64': 0.35.2 supports-color@10.2.2: {} tslib@2.8.1: optional: true - typescript@5.9.2: {} - - ufo@1.6.1: {} - - undici@7.14.0: {} - - unenv@2.0.0-rc.21: + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici@7.28.0: {} + + unenv@2.0.0-rc.24: dependencies: - defu: 6.1.4 - exsolve: 1.0.7 - ohash: 2.0.11 pathe: 2.0.3 - ufo: 1.6.1 - workerd@1.20250906.0: + valibot@1.4.2(typescript@7.0.2): + optionalDependencies: + typescript: 7.0.2 + + workerd@1.20260730.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250906.0 - '@cloudflare/workerd-darwin-arm64': 1.20250906.0 - '@cloudflare/workerd-linux-64': 1.20250906.0 - '@cloudflare/workerd-linux-arm64': 1.20250906.0 - '@cloudflare/workerd-windows-64': 1.20250906.0 + '@cloudflare/workerd-darwin-64': 1.20260730.1 + '@cloudflare/workerd-darwin-arm64': 1.20260730.1 + '@cloudflare/workerd-linux-64': 1.20260730.1 + '@cloudflare/workerd-linux-arm64': 1.20260730.1 + '@cloudflare/workerd-windows-64': 1.20260730.1 - wrangler@4.37.0: + wrangler@4.118.0: dependencies: - '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0) + '@cloudflare/kv-asset-handler': 0.5.0 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260730.1) blake3-wasm: 2.1.5 - esbuild: 0.25.4 - miniflare: 4.20250906.2 + esbuild: 0.28.1 + miniflare: 5.20260730.0-alpha path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.21 - workerd: 1.20250906.0 + unenv: 2.0.0-rc.24 + workerd: 1.20260730.1 optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - utf-8-validate - ws@8.18.0: {} + ws@8.21.0: {} youch-core@0.3.3: dependencies: - '@poppinss/exception': 1.2.2 + '@poppinss/exception': 1.2.3 error-stack-parser-es: 1.0.5 youch@4.1.0-beta.10: dependencies: - '@poppinss/colors': 4.1.5 - '@poppinss/dumper': 0.6.4 - '@speed-highlight/core': 1.2.7 - cookie: 1.0.2 + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.23 + cookie: 1.1.1 youch-core: 0.3.3 - - zod@3.22.3: {} - - zod@4.1.8: {} diff --git a/telemetry-server/pnpm-workspace.yaml b/telemetry-server/pnpm-workspace.yaml new file mode 100644 index 00000000..02365ef1 --- /dev/null +++ b/telemetry-server/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + esbuild: true + workerd: true diff --git a/telemetry-server/src/worker.ts b/telemetry-server/src/worker.ts index 5bd8ee38..c4014442 100644 --- a/telemetry-server/src/worker.ts +++ b/telemetry-server/src/worker.ts @@ -1,16 +1,17 @@ -import { z } from 'zod'; +import * as v from 'valibot'; -const telemetrySchema = z.object({ - version: z - .string() - // Semver regex from https://semver.org - .regex( +const telemetrySchema = v.object({ + version: v.pipe( + v.string(), + v.regex( /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/, + 'Invalid semver', ), - package_manager: z.enum(['Npm', 'Pnpm', 'Yarn', 'Bun']), - install_deps: z.boolean(), - git_init: z.boolean(), - features: z.array(z.string()), + ), + package_manager: v.picklist(['Npm', 'Pnpm', 'Yarn', 'Bun']), + install_deps: v.boolean(), + git_init: v.boolean(), + features: v.array(v.string()), }); export default { @@ -27,7 +28,7 @@ export default { return new Response('Bad request', { status: 400 }); } - const telemetry = telemetrySchema.safeParse(body); + const telemetry = v.safeParse(telemetrySchema, body); if (!telemetry.success) { return new Response('Bad request', { status: 400 }); @@ -38,11 +39,11 @@ export default { 'INSERT INTO telemetry (version, package_manager, install_deps, git_init, features, created_at) VALUES (?, ?, ?, ?, ?, ?)', ) .bind( - telemetry.data.version, - telemetry.data.package_manager, - telemetry.data.install_deps, - telemetry.data.git_init, - JSON.stringify(telemetry.data.features), + telemetry.output.version, + telemetry.output.package_manager, + telemetry.output.install_deps, + telemetry.output.git_init, + JSON.stringify(telemetry.output.features), new Date().toISOString(), ) .run(), diff --git a/telemetry-server/wrangler.jsonc b/telemetry-server/wrangler.jsonc index b97ebb03..6d3219ed 100644 --- a/telemetry-server/wrangler.jsonc +++ b/telemetry-server/wrangler.jsonc @@ -2,7 +2,7 @@ "$schema": "node_modules/wrangler/config-schema.json", "name": "create-o7-app-telemetry-server", "main": "src/worker.ts", - "compatibility_date": "2025-05-25", + "compatibility_date": "2026-08-04", "routes": [ { "pattern": "o7-telemetry.ottomated.net", From 0cd142f29bd264f04f6c257623428ffae31c050a Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 19:58:17 -0700 Subject: [PATCH 02/22] feat!: remove planetscale --- .ottotime | 4 ++- pkg/package.json | 1 - template_builder/templates/config.json | 4 --- .../prisma/{Planetscale,Auth}schema.prisma | 29 ------------------- .../extras/prisma/{Planetscale}schema.prisma | 17 ----------- ...d.ts => {D1|Sqlite|Turso,Auth}schema.d.ts} | 0 ...hema.d.ts => {D1|Sqlite|Turso}schema.d.ts} | 0 .../extras/src/lib/db/{Planetscale}index.ts | 25 ---------------- ....ts => {Auth,Sqlite|Turso}hooks.server.ts} | 0 ...age.json => {D1|Sqlite|Turso}package.json} | 0 ...ttierignore => {D1|Sqlite}.prettierignore} | 0 .../templates/extras/{Planetscale,Auth}.env | 10 ------- .../templates/extras/{Planetscale}.env | 6 ---- .../extras/{Planetscale}package.json | 9 ------ 14 files changed, 3 insertions(+), 102 deletions(-) delete mode 100644 template_builder/templates/extras/prisma/{Planetscale,Auth}schema.prisma delete mode 100644 template_builder/templates/extras/prisma/{Planetscale}schema.prisma rename template_builder/templates/extras/src/lib/db/{{D1|Planetscale|Sqlite|Turso,Auth}schema.d.ts => {D1|Sqlite|Turso,Auth}schema.d.ts} (100%) rename template_builder/templates/extras/src/lib/db/{{D1|Planetscale|Sqlite|Turso}schema.d.ts => {D1|Sqlite|Turso}schema.d.ts} (100%) delete mode 100644 template_builder/templates/extras/src/lib/db/{Planetscale}index.ts rename template_builder/templates/extras/src/{{Auth,Sqlite|Planetscale|Turso}hooks.server.ts => {Auth,Sqlite|Turso}hooks.server.ts} (100%) rename template_builder/templates/extras/{{D1|Planetscale|Sqlite|Turso}package.json => {D1|Sqlite|Turso}package.json} (100%) rename template_builder/templates/extras/{{D1|Planetscale|Sqlite}.prettierignore => {D1|Sqlite}.prettierignore} (100%) delete mode 100644 template_builder/templates/extras/{Planetscale,Auth}.env delete mode 100644 template_builder/templates/extras/{Planetscale}.env delete mode 100644 template_builder/templates/extras/{Planetscale}package.json diff --git a/.ottotime b/.ottotime index 8195967f..97d686ef 100644 --- a/.ottotime +++ b/.ottotime @@ -33,4 +33,6 @@ 1753395700- 10:19 1758009073- 3:21 1758009278- 33:49 -1785980576- 6:11 +1785980576- 7:05 +1785981379- 3:54 +1785984991- 1:30 diff --git a/pkg/package.json b/pkg/package.json index 2626a62b..8ed50086 100644 --- a/pkg/package.json +++ b/pkg/package.json @@ -15,7 +15,6 @@ "tailwind", "tRPC", "typescript", - "planetscale", "prisma", "kysely", "d1", diff --git a/template_builder/templates/config.json b/template_builder/templates/config.json index 4ac88974..cafcb463 100644 --- a/template_builder/templates/config.json +++ b/template_builder/templates/config.json @@ -42,10 +42,6 @@ "id": "D1", "name": "D1", "hidden_if_not": ["Edge"] - }, - { - "id": "Planetscale", - "name": "Planetscale" } ], "description": "" diff --git a/template_builder/templates/extras/prisma/{Planetscale,Auth}schema.prisma b/template_builder/templates/extras/prisma/{Planetscale,Auth}schema.prisma deleted file mode 100644 index 53a9ff37..00000000 --- a/template_builder/templates/extras/prisma/{Planetscale,Auth}schema.prisma +++ /dev/null @@ -1,29 +0,0 @@ -datasource db { - provider = "mysql" - url = env("DATABASE_URL") - relationMode = "prisma" -} - -generator kysely { - provider = "prisma-kysely" - - output = "../src/lib/db" - fileName = "schema.d.ts" -} - -model User { - id String @id - twitch_id String - username String - - sessions Session[] -} - -model Session { - id String @id - expires_at Int - user_id String - user User @relation(fields: [user_id], references: [id]) - - @@index([user_id]) -} diff --git a/template_builder/templates/extras/prisma/{Planetscale}schema.prisma b/template_builder/templates/extras/prisma/{Planetscale}schema.prisma deleted file mode 100644 index ad301d42..00000000 --- a/template_builder/templates/extras/prisma/{Planetscale}schema.prisma +++ /dev/null @@ -1,17 +0,0 @@ -datasource db { - provider = "mysql" - url = env("DATABASE_URL") - relationMode = "prisma" -} - -generator kysely { - provider = "prisma-kysely" - - output = "../src/lib/db" - fileName = "schema.d.ts" -} - -model Example { - id Int @id @default(autoincrement()) - name String -} diff --git a/template_builder/templates/extras/src/lib/db/{D1|Planetscale|Sqlite|Turso,Auth}schema.d.ts b/template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso,Auth}schema.d.ts similarity index 100% rename from template_builder/templates/extras/src/lib/db/{D1|Planetscale|Sqlite|Turso,Auth}schema.d.ts rename to template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso,Auth}schema.d.ts diff --git a/template_builder/templates/extras/src/lib/db/{D1|Planetscale|Sqlite|Turso}schema.d.ts b/template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso}schema.d.ts similarity index 100% rename from template_builder/templates/extras/src/lib/db/{D1|Planetscale|Sqlite|Turso}schema.d.ts rename to template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso}schema.d.ts diff --git a/template_builder/templates/extras/src/lib/db/{Planetscale}index.ts b/template_builder/templates/extras/src/lib/db/{Planetscale}index.ts deleted file mode 100644 index 1ff4cddf..00000000 --- a/template_builder/templates/extras/src/lib/db/{Planetscale}index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Kysely, type RawBuilder, sql } from 'kysely'; -import { PlanetScaleDialect, inflateDates } from 'kysely-planetscale'; -import type { DB } from './schema'; -import { - DATABASE_HOST, - DATABASE_USERNAME, - DATABASE_PASSWORD, -} from '$env/static/private'; - -export const db = new Kysely({ - dialect: new PlanetScaleDialect({ - host: DATABASE_HOST, - username: DATABASE_USERNAME, - password: DATABASE_PASSWORD, - cast: (field, value) => { - if (field.type === 'INT8' && value === '1') return true; - if (field.type === 'INT8' && value === '0') return false; - return inflateDates(field, value); - }, - }), -}); - -export function json(obj: T): RawBuilder { - return sql`${JSON.stringify(obj)}`; -} diff --git a/template_builder/templates/extras/src/{Auth,Sqlite|Planetscale|Turso}hooks.server.ts b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts similarity index 100% rename from template_builder/templates/extras/src/{Auth,Sqlite|Planetscale|Turso}hooks.server.ts rename to template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts diff --git a/template_builder/templates/extras/{D1|Planetscale|Sqlite|Turso}package.json b/template_builder/templates/extras/{D1|Sqlite|Turso}package.json similarity index 100% rename from template_builder/templates/extras/{D1|Planetscale|Sqlite|Turso}package.json rename to template_builder/templates/extras/{D1|Sqlite|Turso}package.json diff --git a/template_builder/templates/extras/{D1|Planetscale|Sqlite}.prettierignore b/template_builder/templates/extras/{D1|Sqlite}.prettierignore similarity index 100% rename from template_builder/templates/extras/{D1|Planetscale|Sqlite}.prettierignore rename to template_builder/templates/extras/{D1|Sqlite}.prettierignore diff --git a/template_builder/templates/extras/{Planetscale,Auth}.env b/template_builder/templates/extras/{Planetscale,Auth}.env deleted file mode 100644 index 9dffe4a8..00000000 --- a/template_builder/templates/extras/{Planetscale,Auth}.env +++ /dev/null @@ -1,10 +0,0 @@ -DATABASE_HOST=aws.connect.psdb.cloud -DATABASE_USERNAME= -DATABASE_PASSWORD= -DATABASE_NAME= - -DATABASE_URL='mysql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@${DATABASE_HOST}/${DATABASE_NAME}?sslaccept=string' - -# From https://dev.twitch.tv/console -CLIENT_ID= -CLIENT_SECRET= diff --git a/template_builder/templates/extras/{Planetscale}.env b/template_builder/templates/extras/{Planetscale}.env deleted file mode 100644 index 76a60a69..00000000 --- a/template_builder/templates/extras/{Planetscale}.env +++ /dev/null @@ -1,6 +0,0 @@ -DATABASE_HOST=aws.connect.psdb.cloud -DATABASE_USERNAME= -DATABASE_PASSWORD= -DATABASE_NAME= - -DATABASE_URL='mysql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@${DATABASE_HOST}/${DATABASE_NAME}?sslaccept=string' diff --git a/template_builder/templates/extras/{Planetscale}package.json b/template_builder/templates/extras/{Planetscale}package.json deleted file mode 100644 index ec477f1b..00000000 --- a/template_builder/templates/extras/{Planetscale}package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "scripts": { - "db:push": "prisma db push" - }, - "dependencies": { - "kysely-planetscale": "^1.7.1", - "@planetscale/database": "^1.19.0" - } -} From ca42cb52c35d11a6e2a13ebe0a6486761f205044 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 20:07:28 -0700 Subject: [PATCH 03/22] feat!: remove yarn --- .ottotime | 2 +- README.md | 2 -- template_builder/src/lib.rs | 1 - .../workflows/{Yarn,Sidecar}deploy-worker.yml | 36 ------------------- ...age.json => {Sidecar,Npm|Bun}package.json} | 0 5 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 template_builder/templates/extras/.github/workflows/{Yarn,Sidecar}deploy-worker.yml rename template_builder/templates/extras/{{Sidecar,Npm|Yarn|Bun}package.json => {Sidecar,Npm|Bun}package.json} (100%) diff --git a/.ottotime b/.ottotime index 97d686ef..86e7c289 100644 --- a/.ottotime +++ b/.ottotime @@ -35,4 +35,4 @@ 1758009278- 33:49 1785980576- 7:05 1785981379- 3:54 -1785984991- 1:30 +1785984991- 11:47 diff --git a/README.md b/README.md index 8485c468..bc78622f 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,6 @@ pnpm create o7-app bun create o7-app # OR npm create o7-app@latest -# OR -yarn create o7-app ``` Then, open your new app in your favorite IDE and get started! A good place to look first is `src/routes/+page.svelte` for your frontend or `src/lib/server/routes/_app.ts` for tRPC. diff --git a/template_builder/src/lib.rs b/template_builder/src/lib.rs index 8856c595..02569292 100644 --- a/template_builder/src/lib.rs +++ b/template_builder/src/lib.rs @@ -195,7 +195,6 @@ impl Builder { pub enum Feature { Npm, Pnpm, - Yarn, Bun, #(#features),* } diff --git a/template_builder/templates/extras/.github/workflows/{Yarn,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Yarn,Sidecar}deploy-worker.yml deleted file mode 100644 index ca6413f9..00000000 --- a/template_builder/templates/extras/.github/workflows/{Yarn,Sidecar}deploy-worker.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Deploy Sidecar Worker - -on: - push: - branches: - - main - paths: - - 'worker/**' - - 'common/**' - - '.github/workflows/deploy-worker.yml' - - 'yarn.lock' - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install yarn - run: yarn set version berry - - - name: Install node - uses: actions/setup-node@v4 - with: - cache: 'yarn' - - - name: Install dependencies - working-directory: worker - run: yarn install --immutable - - - name: Deploy - working-directory: worker - run: yarn run deploy - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/template_builder/templates/extras/{Sidecar,Npm|Yarn|Bun}package.json b/template_builder/templates/extras/{Sidecar,Npm|Bun}package.json similarity index 100% rename from template_builder/templates/extras/{Sidecar,Npm|Yarn|Bun}package.json rename to template_builder/templates/extras/{Sidecar,Npm|Bun}package.json From 7a063133b58253a43b97529283aeabd486c764c5 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 20:09:06 -0700 Subject: [PATCH 04/22] chore: update node & tar --- .github/workflows/build.yml | 2 +- .github/workflows/test.yml | 2 +- .ottotime | 2 +- pkg/package.json | 4 ++-- pkg/pnpm-lock.yaml | 38 +++++++++++++++---------------------- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 56dc5af1..527c20c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 26 - name: Get version id: get_version run: echo "version=$(grep "version" Cargo.toml | head -n1 | cut -d '"' -f2)" >> $GITHUB_OUTPUT diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d158e27e..6ceb6547 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -48,7 +48,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 26 - name: Install pnpm run: npm i -g pnpm - name: Test diff --git a/.ottotime b/.ottotime index 86e7c289..5e9123fc 100644 --- a/.ottotime +++ b/.ottotime @@ -35,4 +35,4 @@ 1758009278- 33:49 1785980576- 7:05 1785981379- 3:54 -1785984991- 11:47 +1785984991- 12:17 diff --git a/pkg/package.json b/pkg/package.json index 8ed50086..1555b1ad 100644 --- a/pkg/package.json +++ b/pkg/package.json @@ -31,9 +31,9 @@ "postinstall": "node ./install.js" }, "dependencies": { - "tar": "^7.4.3" + "tar": "^7.5.22" }, "engines": { - "node": ">=18" + "node": ">=24" } } diff --git a/pkg/pnpm-lock.yaml b/pkg/pnpm-lock.yaml index c275d732..b0346699 100644 --- a/pkg/pnpm-lock.yaml +++ b/pkg/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: tar: - specifier: ^7.4.3 - version: 7.4.3 + specifier: ^7.5.22 + version: 7.5.22 packages: @@ -22,21 +22,16 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} engines: {node: '>=18'} yallist@5.0.0: @@ -47,25 +42,22 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 chownr@3.0.0: {} - minipass@7.1.2: {} + minipass@7.1.3: {} - minizlib@3.0.2: + minizlib@3.1.0: dependencies: - minipass: 7.1.2 - - mkdirp@3.0.1: {} + minipass: 7.1.3 - tar@7.4.3: + tar@7.5.22: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 + minipass: 7.1.3 + minizlib: 3.1.0 yallist: 5.0.0 yallist@5.0.0: {} From 9fc47006316fa4f62d70afefeb84bfa4ae24ce0a Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 20:34:32 -0700 Subject: [PATCH 05/22] begin actions update --- .github/workflows/build.yml | 18 ++++++------ .github/workflows/test.yml | 14 +++++----- .github/workflows/update-deps.yml | 28 ++++++++++--------- .github/workflows/update_deps.mjs | 5 ++-- README.md | 4 --- package.json | 3 +- pnpm-lock.yaml | 10 +++++++ .../workflows/{Bun,Sidecar}deploy-worker.yml | 2 +- .../workflows/{Npm,Sidecar}deploy-worker.yml | 4 +-- .../workflows/{Pnpm,Sidecar}deploy-worker.yml | 13 ++++----- 10 files changed, 55 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 527c20c2..743f3830 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,13 +12,15 @@ jobs: id-token: write steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - - name: Install Node.js - uses: actions/setup-node@v4 + - name: Install pnpm + uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 with: - node-version: 26 + version: ^11.20.0 + runtime: node@lts + install: false - name: Get version id: get_version run: echo "version=$(grep "version" Cargo.toml | head -n1 | cut -d '"' -f2)" >> $GITHUB_OUTPUT @@ -30,8 +32,6 @@ jobs: echo "NPM version is the same as the version in Cargo.toml, exiting" exit 1 fi - - name: Install pnpm - run: npm i -g pnpm - name: Generate changelogs run: | @@ -57,7 +57,7 @@ jobs: - name: Restore cached OSXCross id: restore-osxcross - uses: actions/cache/restore@v4 + uses: actions/cache/restore@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0 with: key: ${{ runner.os }}-osxcross-11.3 path: osxcross @@ -72,7 +72,7 @@ jobs: UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh - name: Cache OSXCross if: always() && steps.restore-osxcross.outputs.cache-hit != 'true' - uses: actions/cache/save@v4 + uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0 with: key: ${{ runner.os }}-osxcross-11.3 path: osxcross @@ -111,7 +111,7 @@ jobs: git push - name: Release Binaries - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: body_path: CHANGELOG-release.md tag_name: ${{ steps.get_version.outputs.version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6ceb6547..b9f3f6cc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,9 +27,9 @@ jobs: shard-count: ${{ fromJson(needs.create-shards.outputs.shard-count) }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/cache@v4 + - uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0 with: save-always: true path: | @@ -45,12 +45,12 @@ jobs: with: components: rustfmt - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 26 - name: Install pnpm - run: npm i -g pnpm + uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 + with: + version: ^11.20.0 + runtime: node@lts + install: false - name: Test run: cargo test env: diff --git a/.github/workflows/update-deps.yml b/.github/workflows/update-deps.yml index 491de4d6..c72f90eb 100644 --- a/.github/workflows/update-deps.yml +++ b/.github/workflows/update-deps.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Detect open PR id: detect_open_pr - uses: actions/github-script@v7 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: result-encoding: string script: | @@ -31,23 +31,25 @@ jobs: return pullRequests[0]?.head?.ref ?? 'main'; - id: create_token - uses: tibdex/github-app-token@v2 + uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2.2.2 with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} + client-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + permission-pull-requests: write - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: token: ${{ steps.create_token.outputs.token }} ref: ${{ steps.detect_open_pr.outputs.result }} - - name: Install Node.js - uses: actions/setup-node@v4 + - name: Install pnpm + uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 with: - node-version: 20 - - name: Install Bun - uses: oven-sh/setup-bun@v2 + version: ^11.20.0 + runtime: node@lts + install: false + - name: Install Rust uses: dtolnay/rust-toolchain@stable with: @@ -57,7 +59,7 @@ jobs: run: | { echo 'PR_BODY<> $GITHUB_ENV @@ -66,7 +68,7 @@ jobs: - name: Open PR if: steps.detect_open_pr.outputs.result == 'main' - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: token: ${{ steps.create_token.outputs.token }} commit-message: 'ci: Update dependencies' @@ -91,7 +93,7 @@ jobs: - name: Comment on PR if: steps.detect_open_pr.outputs.result != 'main' - uses: actions/github-script@v7 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: github-token: ${{ steps.create_token.outputs.token }} script: | diff --git a/.github/workflows/update_deps.mjs b/.github/workflows/update_deps.mjs index fa4aae57..fda76ee4 100644 --- a/.github/workflows/update_deps.mjs +++ b/.github/workflows/update_deps.mjs @@ -1,6 +1,7 @@ import { resolve, basename, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { readdir, readFile, writeFile } from 'node:fs/promises'; +import * as semver from 'semver'; const isNewPr = process.argv[2] === 'main'; const dryRun = process.argv.includes('--dry-run'); @@ -155,8 +156,8 @@ async function latestVersion(packageName, tag) { if (packageName === 'tailwindcss' && tag === '3') { const v3Versions = Object.keys(data?.versions ?? {}) - .filter((v) => Bun.semver.satisfies(v, '3')) - .sort(Bun.semver.order); + .filter((v) => semver.satisfies(v, '3')) + .sort(semver.compare); const mostRecent = v3Versions[v3Versions.length - 1]; return mostRecent; } diff --git a/README.md b/README.md index bc78622f..5cc14ed3 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,6 @@ First, run the CLI to scaffold your app: ```bash pnpm create o7-app -# OR -bun create o7-app -# OR -npm create o7-app@latest ``` Then, open your new app in your favorite IDE and get started! A good place to look first is `src/routes/+page.svelte` for your frontend or `src/lib/server/routes/_app.ts` for tRPC. diff --git a/package.json b/package.json index 3c402d7f..fbeb7d93 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "devDependencies": { - "@types/node": "^26.1.2" + "@types/node": "^26.1.2", + "semver": "^7.8.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5898d68c..51c6386e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,12 +11,20 @@ importers: '@types/node': specifier: ^26.1.2 version: 26.1.2 + semver: + specifier: ^7.8.5 + version: 7.8.5 packages: '@types/node@26.1.2': resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} @@ -26,4 +34,6 @@ snapshots: dependencies: undici-types: 8.3.0 + semver@7.8.5: {} + undici-types@8.3.0: {} diff --git a/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml index e04f38ef..a9cce85e 100644 --- a/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml +++ b/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Install Bun uses: oven-sh/setup-bun@v2 diff --git a/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml index 091ee06b..bc1e518a 100644 --- a/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml +++ b/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Install node - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: cache: 'npm' diff --git a/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml index e64948da..37b4051f 100644 --- a/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml +++ b/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml @@ -15,15 +15,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - - uses: pnpm/action-setup@v4 - name: Install pnpm - - - name: Install node - uses: actions/setup-node@v4 + - name: Install pnpm + uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 with: - cache: 'pnpm' + version: ^11.20.0 + runtime: node@lts + install: false - name: Install dependencies working-directory: worker From 124d75d23b4697e59e4e5f684e40514f55e8ee83 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 20:44:49 -0700 Subject: [PATCH 06/22] chore: harden github actions --- .github/workflows/build.yml | 34 ++++++++++++++++++------------- .github/workflows/test.yml | 10 ++++++--- .github/workflows/update-deps.yml | 16 ++++++++++----- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 743f3830..37bc022b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Install pnpm uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 with: @@ -27,24 +28,26 @@ jobs: - name: Compare version to NPM run: | NPM_VERSION=$(npm view create-o7-app version) - MY_VERSION=${{ steps.get_version.outputs.version }} + MY_VERSION=${VERSION} if [ "$NPM_VERSION" == "$MY_VERSION" ]; then echo "NPM version is the same as the version in Cargo.toml, exiting" exit 1 fi + env: + VERSION: ${{ steps.get_version.outputs.version }} - name: Generate changelogs run: | # Full changelog - pnpx git-cliff --tag ${{ steps.get_version.outputs.version }} -o CHANGELOG.md + pnpx git-cliff --tag ${VERSION} -o CHANGELOG.md # Changelog for the release - pnpx git-cliff --tag ${{ steps.get_version.outputs.version }} --unreleased --strip header -o CHANGELOG-release.md + pnpx git-cliff --tag ${VERSION} --unreleased --strip header -o CHANGELOG-release.md + env: + VERSION: ${{ steps.get_version.outputs.version }} - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt - targets: x86_64-unknown-linux-musl,x86_64-pc-windows-gnu,i686-pc-windows-gnu,x86_64-apple-darwin,aarch64-apple-darwin + run: | + rustup toolchain install stable --component rustfmt --target x86_64-unknown-linux-musl --target x86_64-pc-windows-gnu --target i686-pc-windows-gnu --target x86_64-apple-darwin --target aarch64-apple-darwin # - name: Test # run: cargo test - name: Install MinGW @@ -107,20 +110,23 @@ jobs: git add CHANGELOG.md git config --local user.email "create-o7-app@users.noreply.github.com" git config --local user.name "create-o7-app[bot]" - git commit -m "ci: Update changelog for ${{ steps.get_version.outputs.version }}" + git commit -m "ci: Update changelog for ${VERSION}" git push + env: + VERSION: ${{ steps.get_version.outputs.version }} - name: Release Binaries - uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 - with: - body_path: CHANGELOG-release.md - tag_name: ${{ steps.get_version.outputs.version }} - files: compressed/artifacts/* + run: gh release create ${VERSION} compressed/artifacts/* --notes-file CHANGELOG-release.md + env: + VERSION: ${{ steps.get_version.outputs.version }} + - name: Publish NPM Package run: | cd pkg cp ../README.md . - jq '.version = "${{ steps.get_version.outputs.version }}"' package.json > tmp && mv tmp package.json + jq '.version = "${VERSION}"' package.json > tmp && mv tmp package.json npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc npm publish + env: + VERSION: ${{ steps.get_version.outputs.version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b9f3f6cc..b16d3bb3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,7 @@ on: jobs: create-shards: runs-on: ubuntu-latest + permissions: {} outputs: shards: ${{ steps.shards.outputs.shards }} shard-count: ${{ steps.shards.outputs.count }} @@ -20,6 +21,7 @@ jobs: test: runs-on: ubuntu-latest needs: create-shards + permissions: {} strategy: fail-fast: false matrix: @@ -28,6 +30,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0 with: @@ -40,10 +44,10 @@ jobs: target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt + run: | + rustup toolchain install stable --component rustfmt - name: Install pnpm uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 diff --git a/.github/workflows/update-deps.yml b/.github/workflows/update-deps.yml index c72f90eb..d845e64f 100644 --- a/.github/workflows/update-deps.yml +++ b/.github/workflows/update-deps.yml @@ -7,6 +7,7 @@ on: jobs: update: runs-on: ubuntu-latest + permissions: {} steps: - name: Detect open PR id: detect_open_pr @@ -42,6 +43,7 @@ jobs: with: token: ${{ steps.create_token.outputs.token }} ref: ${{ steps.detect_open_pr.outputs.result }} + persist-credentials: false - name: Install pnpm uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 @@ -50,18 +52,20 @@ jobs: runtime: node@lts install: false + - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt + run: | + rustup toolchain install stable --component rustfmt - name: Do updates run: | { echo 'PR_BODY<> $GITHUB_ENV + env: + PR_BRANCH_NAME: ${{ steps.detect_open_pr.outputs.result }} - name: Cargo update run: cargo update @@ -89,7 +93,9 @@ jobs: git config --local user.name "create-o7-app[bot]" git commit -m "ci: Update dependencies" - git push origin ${{ steps.detect_open_pr.outputs.result }} + git push origin ${PR_BRANCH_NAME} + env: + PR_BRANCH_NAME: ${{ steps.detect_open_pr.outputs.result }} - name: Comment on PR if: steps.detect_open_pr.outputs.result != 'main' From 589e9d46e13438bae9cd90f8ddcaecdb4725b92c Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 20:51:04 -0700 Subject: [PATCH 07/22] fix yarn --- .github/workflows/test.yml | 1 - src/utils.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b16d3bb3..c0dc17db 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,7 +44,6 @@ jobs: target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - name: Install Rust run: | rustup toolchain install stable --component rustfmt diff --git a/src/utils.rs b/src/utils.rs index 00306e9d..c09007be 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -29,7 +29,7 @@ impl PackageManager { match self { PackageManager::Npm => Feature::Npm, PackageManager::Pnpm => Feature::Pnpm, - PackageManager::Yarn => Feature::Yarn, + PackageManager::Yarn => Feature::Npm, PackageManager::Bun => Feature::Bun, } } From 131dd03e0441f97251ba2db0f11bcad4b15cd44d Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 21:05:21 -0700 Subject: [PATCH 08/22] chore: remove dependency on Bun --- .github/workflows/update_deps.mjs | 99 ++++++++++++++++--------------- package.json | 3 +- pnpm-lock.yaml | 8 +++ 3 files changed, 60 insertions(+), 50 deletions(-) diff --git a/.github/workflows/update_deps.mjs b/.github/workflows/update_deps.mjs index fda76ee4..8dcb5fc8 100644 --- a/.github/workflows/update_deps.mjs +++ b/.github/workflows/update_deps.mjs @@ -2,15 +2,16 @@ import { resolve, basename, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { readdir, readFile, writeFile } from 'node:fs/promises'; import * as semver from 'semver'; +import JSONC from 'tiny-jsonc'; -const isNewPr = process.argv[2] === 'main'; -const dryRun = process.argv.includes('--dry-run'); +const is_new_pr = process.argv[2] === 'main'; +const dry_run = process.argv.includes('--dry-run'); const IGNORE_DEPS = ['common']; -export async function getUpdates() { - const projectRoot = resolve(fileURLToPath(import.meta.url), '../../..'); - const templateRoot = join(projectRoot, 'template_builder/templates'); +export async function get_updates() { + const project_root = resolve(fileURLToPath(import.meta.url), '../../..'); + const template_root = join(project_root, 'template_builder/templates'); /** * @@ -18,7 +19,7 @@ export async function getUpdates() { * @param {'dependencies' | 'devDependencies'} key * @returns true if any dependencies were updated */ - async function processDependencies(pkg, key) { + async function process_dependencies(pkg, key) { if (!pkg[key]) return []; let dirty = []; for (const [name, currentVersion] of Object.entries(pkg[key])) { @@ -36,7 +37,7 @@ export async function getUpdates() { if (prefix !== '^' && prefix !== '~') { prefix = ''; } - let latest = await latestVersion(name, tag); + let latest = await latest_version(name, tag); if (!latest) continue; latest = prefix + latest; @@ -48,88 +49,88 @@ export async function getUpdates() { return dirty; } - if (isNewPr) { - const cargoTomlPath = join(projectRoot, 'Cargo.toml'); - const cargoToml = await readFile(cargoTomlPath, 'utf8'); - const version = cargoToml.match(/version = "(.*)"/)?.[1]; + if (is_new_pr) { + const cargo_toml_path = join(project_root, 'Cargo.toml'); + const cargo_toml = await readFile(cargo_toml_path, 'utf8'); + const version = cargo_toml.match(/version = "(.*)"/)?.[1]; if (!version) { console.error('Could not find version in Cargo.toml'); process.exit(1); } const [major, minor, patch] = version.split('.'); - const newVersion = `${major}.${minor}.${parseInt(patch) + 1}`; - if (!dryRun) { + const new_version = `${major}.${minor}.${parseInt(patch) + 1}`; + if (!dry_run) { await writeFile( - cargoTomlPath, - cargoToml.replace(/version = "(.*)"/, `version = "${newVersion}"`), + cargo_toml_path, + cargo_toml.replace(/version = "(.*)"/, `version = "${new_version}"`), ); } - console.log(`_Bumped version to ${newVersion}_\n\n`); + console.log(`_Bumped version to ${new_version}_\n\n`); } - for await (const f of getFiles(templateRoot)) { + for await (const f of get_files(template_root)) { const groups = basename(f).match(/^(\{[^{}]*\})?package\.json$/); if (!groups) continue; const pkg = JSON.parse(await readFile(f, 'utf8')); const updates = await Promise.all([ - processDependencies(pkg, 'dependencies'), - processDependencies(pkg, 'devDependencies'), + process_dependencies(pkg, 'dependencies'), + process_dependencies(pkg, 'devDependencies'), ]).then((results) => results.flat()); if (updates.length) { - if (!dryRun) { + if (!dry_run) { await writeFile(f, JSON.stringify(pkg, null, '\t') + '\n'); } - const features = prettifyFeatures(groups[1]); + const features = prettify_features(groups[1]); console.log(`| \`${features}\` | old | new |`); console.log('|-|-|-|'); - for (const [name, currentVersion, latest] of updates) { - console.log(`| ${name} | \`${currentVersion}\` | \`${latest}\` |`); + for (const [name, current_version, latest] of updates) { + console.log(`| ${name} | \`${current_version}\` | \`${latest}\` |`); } console.log('\n\n'); } } - const cloudflareVersion = await latestVersion( + const cloudflare_version = await latest_version( '@cloudflare/workers-types', 'latest', ); - const cloudflareDate = cloudflareVersion.split('.')[1]; - if (!cloudflareDate || !/^[0-9]{8}$/.test(cloudflareDate)) { + const cloudflare_date = cloudflare_version.split('.')[1]; + if (!cloudflare_date || !/^[0-9]{8}$/.test(cloudflare_date)) { console.error( - `Invalid @cloudflare/workers-types version: ${cloudflareVersion}`, + `Invalid @cloudflare/workers-types version: ${cloudflare_version}`, ); process.exit(1); } - const compatibilityDate = `${cloudflareDate.substring( + const compatibility_date = `${cloudflare_date.substring( 0, 4, - )}-${cloudflareDate.substring(4, 6)}-${cloudflareDate.substring(6, 8)}`; + )}-${cloudflare_date.substring(4, 6)}-${cloudflare_date.substring(6, 8)}`; - let changedFiles = []; - for await (const f of getFiles(templateRoot)) { + const changed_files = []; + for await (const f of get_files(template_root)) { const groups = basename(f).match(/^(\{[^{}]*\})?wrangler\.jsonc$/); if (!groups) continue; - const wrangler = await import(f, { assert: { type: 'jsonc' } }); + const wrangler = JSONC.parse(await readFile(f, 'utf8')); - const oldVersion = wrangler.compatibility_date; + const old_version = wrangler.compatibility_date; - if (oldVersion !== compatibilityDate) { - if (!dryRun) { + if (old_version !== compatibility_date) { + if (!dry_run) { const text = (await readFile(f, 'utf8')).replace( - `"${oldVersion}"`, - `"${compatibilityDate}"`, + `"${old_version}"`, + `"${compatibility_date}"`, ); await writeFile(f, text); } - changedFiles.push([prettifyFeatures(groups[1]), oldVersion]); + changed_files.push([prettify_features(groups[1]), old_version]); } } - if (changedFiles.length) { + if (changed_files.length) { console.log(`| \`compatibility_date\` | old | new |`); console.log('|-|-|-|'); - for (const [name, oldVersion] of changedFiles) { - console.log(`| ${name} | \`${oldVersion}\` | \`${compatibilityDate}\` |`); + for (const [name, oldVersion] of changed_files) { + console.log(`| ${name} | \`${oldVersion}\` | \`${compatibility_date}\` |`); } console.log('\n\n'); } @@ -137,13 +138,13 @@ export async function getUpdates() { /** * - * @param {string} packageName + * @param {string} package_name * @param {string} tag * @returns {Promise} */ -async function latestVersion(packageName, tag) { +async function latest_version(package_name, tag) { const url = new URL( - encodeURIComponent(packageName).replace(/^%40/, '@'), + encodeURIComponent(package_name).replace(/^%40/, '@'), 'https://registry.npmjs.org/', ); const res = await fetch(url, { @@ -154,7 +155,7 @@ async function latestVersion(packageName, tag) { }); const data = await res.json(); - if (packageName === 'tailwindcss' && tag === '3') { + if (package_name === 'tailwindcss' && tag === '3') { const v3Versions = Object.keys(data?.versions ?? {}) .filter((v) => semver.satisfies(v, '3')) .sort(semver.compare); @@ -170,12 +171,12 @@ async function latestVersion(packageName, tag) { * @param {string} dir * @returns {AsyncGenerator} */ -async function* getFiles(dir) { +async function* get_files(dir) { const dirents = await readdir(dir, { withFileTypes: true }); for (const dirent of dirents) { const res = resolve(dir, dirent.name); if (dirent.isDirectory()) { - yield* getFiles(res); + yield* get_files(res); } else { yield res; } @@ -184,7 +185,7 @@ async function* getFiles(dir) { /** * @param {string | undefined} features */ -function prettifyFeatures(features) { +function prettify_features(features) { if (features === undefined) return 'base'; return features .substring(1, features.length - 1) // strip {} @@ -192,4 +193,4 @@ function prettifyFeatures(features) { .replace(/\|/g, ' \\| '); // escape and prettify pipes } -getUpdates(); +get_updates(); diff --git a/package.json b/package.json index fbeb7d93..20bdcbdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "devDependencies": { "@types/node": "^26.1.2", - "semver": "^7.8.5" + "semver": "^7.8.5", + "tiny-jsonc": "^1.0.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51c6386e..372f1eba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: semver: specifier: ^7.8.5 version: 7.8.5 + tiny-jsonc: + specifier: ^1.0.2 + version: 1.0.2 packages: @@ -25,6 +28,9 @@ packages: engines: {node: '>=10'} hasBin: true + tiny-jsonc@1.0.2: + resolution: {integrity: sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw==} + undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} @@ -36,4 +42,6 @@ snapshots: semver@7.8.5: {} + tiny-jsonc@1.0.2: {} + undici-types@8.3.0: {} From a656d994809bc550e9157c5bb33c54b57ac3ba17 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 21:05:54 -0700 Subject: [PATCH 09/22] remove bun --- assets/example.tape | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/example.tape b/assets/example.tape index b1d4f59f..675aa355 100644 --- a/assets/example.tape +++ b/assets/example.tape @@ -16,7 +16,7 @@ Sleep 1s Show Sleep 500ms -Type "bun create o7-app" +Type "pnpm create o7-app" Sleep 500ms Enter From a301c3395061198a150afd7f1e08690e5d7c1a77 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Wed, 5 Aug 2026 21:07:14 -0700 Subject: [PATCH 10/22] add todos --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5cc14ed3..9703da1d 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ Then, open your new app in your favorite IDE and get started! A good place to lo ## Upcoming -- [ ] Move the tutorial to a README file -- [ ] Fully remove tRPC and @tanstack/svelte-query when [Remote Functions](https://github.com/sveltejs/kit/pull/13986) land -- [ ] Remove sidecar worker when [environment API support](https://github.com/sveltejs/kit/pull/14008) lands +- [ ] zod -> valibot +- [ ] sveltekit 3 +- [ ] prettier -> oxfmt +- [ ] svelte-check tsgo +- [ ] remote functions auth +- [ ] auth user + pass option? +- [ ] durable object patch +- [ ] prisma 7? From f38cfe4747688e5868cd453b26f2e8e82ff7d74b Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 11:59:44 -0700 Subject: [PATCH 11/22] feat!: remove tRPC --- README.md | 4 +-- pkg/package.json | 1 - src/test.rs | 5 ---- template_builder/templates/config.json | 7 ----- .../src/lib/server/routes/{Trpc,Auth}_app.ts | 9 ------ .../src/lib/server/routes/{Trpc}_app.ts | 5 ---- .../src/lib/server/{Trpc,Auth}context.ts | 10 ------- .../extras/src/lib/server/{Trpc,Auth}trpc.ts | 23 --------------- .../extras/src/lib/server/{Trpc}context.ts | 7 ----- .../extras/src/lib/server/{Trpc}server.ts | 9 ------ .../extras/src/lib/server/{Trpc}trpc.ts | 11 -------- .../templates/extras/src/lib/{Trpc}trpc.ts | 28 ------------------- .../api/trpc/[...trpc]/{Trpc}+server.ts | 4 --- .../extras/src/routes/{Trpc}+layout.server.ts | 8 ------ .../extras/src/routes/{Trpc}+layout.svelte | 10 ------- .../templates/extras/{Trpc}package.json | 10 ------- 16 files changed, 1 insertion(+), 150 deletions(-) delete mode 100644 template_builder/templates/extras/src/lib/server/routes/{Trpc,Auth}_app.ts delete mode 100644 template_builder/templates/extras/src/lib/server/routes/{Trpc}_app.ts delete mode 100644 template_builder/templates/extras/src/lib/server/{Trpc,Auth}context.ts delete mode 100644 template_builder/templates/extras/src/lib/server/{Trpc,Auth}trpc.ts delete mode 100644 template_builder/templates/extras/src/lib/server/{Trpc}context.ts delete mode 100644 template_builder/templates/extras/src/lib/server/{Trpc}server.ts delete mode 100644 template_builder/templates/extras/src/lib/server/{Trpc}trpc.ts delete mode 100644 template_builder/templates/extras/src/lib/{Trpc}trpc.ts delete mode 100644 template_builder/templates/extras/src/routes/api/trpc/[...trpc]/{Trpc}+server.ts delete mode 100644 template_builder/templates/extras/src/routes/{Trpc}+layout.server.ts delete mode 100644 template_builder/templates/extras/src/routes/{Trpc}+layout.svelte delete mode 100644 template_builder/templates/extras/{Trpc}package.json diff --git a/README.md b/README.md index 9703da1d..c58d1822 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,6 @@ - [Typescript](https://www.typescriptlang.org/) - [Prisma](https://www.prisma.io/) - [Kysely](https://github.com/kysely-org/kysely) -- [tRPC](https://trpc.io) -- [Lucia](https://lucia-auth.com/) > **Why both Prisma and Kysely?** `create-o7-app`'s template includes Kysely for **Edge support** and **fast cold starts**, with all the convenience of using Prisma for migrations. @@ -36,7 +34,7 @@ First, run the CLI to scaffold your app: pnpm create o7-app ``` -Then, open your new app in your favorite IDE and get started! A good place to look first is `src/routes/+page.svelte` for your frontend or `src/lib/server/routes/_app.ts` for tRPC. +Then, open your new app in your favorite IDE and get started! ## [Changelog](https://github.com/ottomated/create-o7-app/blob/main/CHANGELOG.md) diff --git a/pkg/package.json b/pkg/package.json index 1555b1ad..a9661a2f 100644 --- a/pkg/package.json +++ b/pkg/package.json @@ -13,7 +13,6 @@ "svelte", "sveltekit", "tailwind", - "tRPC", "typescript", "prisma", "kysely", diff --git a/src/test.rs b/src/test.rs index ead6233b..70f3d070 100644 --- a/src/test.rs +++ b/src/test.rs @@ -130,11 +130,6 @@ fn test() { let combinations = generate_combinations(get_feature_list()); let mut combinations = create_shard(combinations); - // let mut combinations = vec![HashSet::new()]; - // combinations[0].insert(Feature::Edge); - // combinations[0].insert(Feature::D1); - // combinations[0].insert(Feature::Trpc); - let num_threads = min( { let possible = diff --git a/template_builder/templates/config.json b/template_builder/templates/config.json index cafcb463..d1d395e2 100644 --- a/template_builder/templates/config.json +++ b/template_builder/templates/config.json @@ -8,13 +8,6 @@ "description": "(with Lucia)", "default": false }, - { - "id": "Trpc", - "name": "tRPC", - "description": "(Type-safe API)", - "default": true, - "required_if": ["Auth"] - }, { "id": "Edge", "name": "Edge", diff --git a/template_builder/templates/extras/src/lib/server/routes/{Trpc,Auth}_app.ts b/template_builder/templates/extras/src/lib/server/routes/{Trpc,Auth}_app.ts deleted file mode 100644 index 50b31886..00000000 --- a/template_builder/templates/extras/src/lib/server/routes/{Trpc,Auth}_app.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { router, publicProcedure } from '../trpc'; - -export const appRouter = router({ - me: publicProcedure.query(({ ctx }) => { - return ctx.user; - }), -}); - -export type AppRouter = typeof appRouter; diff --git a/template_builder/templates/extras/src/lib/server/routes/{Trpc}_app.ts b/template_builder/templates/extras/src/lib/server/routes/{Trpc}_app.ts deleted file mode 100644 index aa942f6d..00000000 --- a/template_builder/templates/extras/src/lib/server/routes/{Trpc}_app.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { router } from '../trpc'; - -export const appRouter = router({}); - -export type AppRouter = typeof appRouter; diff --git a/template_builder/templates/extras/src/lib/server/{Trpc,Auth}context.ts b/template_builder/templates/extras/src/lib/server/{Trpc,Auth}context.ts deleted file mode 100644 index 0fa32da0..00000000 --- a/template_builder/templates/extras/src/lib/server/{Trpc,Auth}context.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { RequestEvent } from '@sveltejs/kit'; - -export async function createContext(event: RequestEvent) { - return { - user: event.locals.user, - session: event.locals.session, - }; -} - -export type Context = Awaited>; diff --git a/template_builder/templates/extras/src/lib/server/{Trpc,Auth}trpc.ts b/template_builder/templates/extras/src/lib/server/{Trpc,Auth}trpc.ts deleted file mode 100644 index 7f6384c7..00000000 --- a/template_builder/templates/extras/src/lib/server/{Trpc,Auth}trpc.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TRPCError, initTRPC } from '@trpc/server'; -import type { Context } from './context'; -import { transformer } from '$lib/trpc'; - -const t = initTRPC.context().create({ - transformer, -}); - -export const router = t.router; - -export const publicProcedure = t.procedure; - -export const authedProcedure = publicProcedure.use(({ ctx, next }) => { - if (!ctx.session || !ctx.user) { - throw new TRPCError({ code: 'UNAUTHORIZED' }); - } - return next({ - ctx: { - user: ctx.user, - session: ctx.session, - }, - }); -}); diff --git a/template_builder/templates/extras/src/lib/server/{Trpc}context.ts b/template_builder/templates/extras/src/lib/server/{Trpc}context.ts deleted file mode 100644 index dda2e443..00000000 --- a/template_builder/templates/extras/src/lib/server/{Trpc}context.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { RequestEvent } from '@sveltejs/kit'; - -export async function createContext(_event: RequestEvent) { - return {}; -} - -export type Context = Awaited>; diff --git a/template_builder/templates/extras/src/lib/server/{Trpc}server.ts b/template_builder/templates/extras/src/lib/server/{Trpc}server.ts deleted file mode 100644 index 39e0ec11..00000000 --- a/template_builder/templates/extras/src/lib/server/{Trpc}server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createTRPCSvelteServer } from 'trpc-svelte-query/server'; -import { appRouter } from './routes/_app'; -import { createContext } from './context'; - -export const trpcServer = createTRPCSvelteServer({ - endpoint: '/api/trpc', - router: appRouter, - createContext, -}); diff --git a/template_builder/templates/extras/src/lib/server/{Trpc}trpc.ts b/template_builder/templates/extras/src/lib/server/{Trpc}trpc.ts deleted file mode 100644 index 4307515f..00000000 --- a/template_builder/templates/extras/src/lib/server/{Trpc}trpc.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { initTRPC } from '@trpc/server'; -import type { Context } from './context'; -import { transformer } from '$lib/trpc'; - -const t = initTRPC.context().create({ - transformer, -}); - -export const router = t.router; - -export const publicProcedure = t.procedure; diff --git a/template_builder/templates/extras/src/lib/{Trpc}trpc.ts b/template_builder/templates/extras/src/lib/{Trpc}trpc.ts deleted file mode 100644 index 18c2ee61..00000000 --- a/template_builder/templates/extras/src/lib/{Trpc}trpc.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createTRPCSvelte } from 'trpc-svelte-query'; -import { httpBatchLink } from '@trpc/client'; -import type { AppRouter } from '$lib/server/routes/_app'; -import { parse, stringify, uneval } from 'devalue'; -import type { inferRouterOutputs, inferRouterInputs } from '@trpc/server'; - -export const transformer = { - input: { - serialize: (object: unknown) => stringify(object), - deserialize: (object: string) => parse(object), - }, - output: { - serialize: (object: unknown) => uneval(object), - deserialize: (object: string) => (0, eval)(`(${object})`), - }, -}; - -export const trpc = createTRPCSvelte({ - links: [ - httpBatchLink({ - url: '/api/trpc', - transformer, - }), - ], -}); - -export type RouterOutput = inferRouterOutputs; -export type RouterInput = inferRouterInputs; diff --git a/template_builder/templates/extras/src/routes/api/trpc/[...trpc]/{Trpc}+server.ts b/template_builder/templates/extras/src/routes/api/trpc/[...trpc]/{Trpc}+server.ts deleted file mode 100644 index cf267110..00000000 --- a/template_builder/templates/extras/src/routes/api/trpc/[...trpc]/{Trpc}+server.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { trpcServer } from '$lib/server/server'; - -export const GET = trpcServer.handler; -export const POST = trpcServer.handler; diff --git a/template_builder/templates/extras/src/routes/{Trpc}+layout.server.ts b/template_builder/templates/extras/src/routes/{Trpc}+layout.server.ts deleted file mode 100644 index 53f7bc8d..00000000 --- a/template_builder/templates/extras/src/routes/{Trpc}+layout.server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { trpcServer } from '$lib/server/server'; -import type { LayoutServerLoad } from './$types'; - -export const load: LayoutServerLoad = async (event) => { - return { - trpc: trpcServer.hydrateToClient(event), - }; -}; diff --git a/template_builder/templates/extras/src/routes/{Trpc}+layout.svelte b/template_builder/templates/extras/src/routes/{Trpc}+layout.svelte deleted file mode 100644 index da086ea2..00000000 --- a/template_builder/templates/extras/src/routes/{Trpc}+layout.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -{@render children()} diff --git a/template_builder/templates/extras/{Trpc}package.json b/template_builder/templates/extras/{Trpc}package.json deleted file mode 100644 index 44ae2530..00000000 --- a/template_builder/templates/extras/{Trpc}package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "dependencies": { - "@tanstack/svelte-query": "^6.0.3", - "@trpc/client": "^11.7.1", - "@trpc/server": "^11.7.1", - "devalue": "^5.4.2", - "trpc-svelte-query": "^3.0.3", - "zod": "^4.1.12" - } -} From dc1d078c05c1d3455d85e891e03af5978185875f Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 12:20:51 -0700 Subject: [PATCH 12/22] feat!: remove default --- template_builder/templates/base/src/app.html | 1 - 1 file changed, 1 deletion(-) diff --git a/template_builder/templates/base/src/app.html b/template_builder/templates/base/src/app.html index 94d3cbff..0052a49f 100644 --- a/template_builder/templates/base/src/app.html +++ b/template_builder/templates/base/src/app.html @@ -4,7 +4,6 @@ __o7__name__ - %sveltekit.head% From 34a2dd6aee45d47c7d73ef0e5c431b2b94b6a4a0 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 12:58:42 -0700 Subject: [PATCH 13/22] feat: switch from prettier to oxfmt --- template_builder/templates/base/.oxfmtrc.json | 8 ++++++++ template_builder/templates/base/.prettierrc | 19 ------------------- .../templates/base/eslint.config.js | 8 -------- 3 files changed, 8 insertions(+), 27 deletions(-) create mode 100644 template_builder/templates/base/.oxfmtrc.json delete mode 100644 template_builder/templates/base/.prettierrc diff --git a/template_builder/templates/base/.oxfmtrc.json b/template_builder/templates/base/.oxfmtrc.json new file mode 100644 index 00000000..f4b6d344 --- /dev/null +++ b/template_builder/templates/base/.oxfmtrc.json @@ -0,0 +1,8 @@ +{ + "singleQuote": true, + "tabWidth": 2, + "useTabs": true, + "sortTailwindcss": true, + "svelte": true, + "ignorePatterns": ["worker-configuration.d.ts"] +} diff --git a/template_builder/templates/base/.prettierrc b/template_builder/templates/base/.prettierrc deleted file mode 100644 index 95d76e71..00000000 --- a/template_builder/templates/base/.prettierrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "tabWidth": 2, - "useTabs": true, - "trailingComma": "all", - "plugins": [ - "prettier-plugin-svelte", - "prettier-plugin-tailwindcss" - ], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] -} diff --git a/template_builder/templates/base/eslint.config.js b/template_builder/templates/base/eslint.config.js index b4318c57..6af13239 100644 --- a/template_builder/templates/base/eslint.config.js +++ b/template_builder/templates/base/eslint.config.js @@ -1,6 +1,5 @@ import globals from 'globals'; import js from '@eslint/js'; -import prettier from 'eslint-plugin-prettier/recommended'; import svelte from 'eslint-plugin-svelte'; import ts from 'typescript-eslint'; import svelteConfig from './svelte.config.js'; @@ -9,8 +8,6 @@ export default ts.config( js.configs.recommended, ...ts.configs.recommended, ...svelte.configs.recommended, - ...svelte.configs.prettier, - prettier, { languageOptions: { globals: { @@ -53,10 +50,5 @@ export default ts.config( ], }, }, - { - rules: { - 'prettier/prettier': 'warn', - }, - }, { ignores: ['**/.svelte-kit', 'build/', 'dist/'] }, ); From 3f5f000f248a1fbae6e5aa9976401eb0c1f716e7 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 13:00:15 -0700 Subject: [PATCH 14/22] feat: upgrade to sveltekit 3, vite 8, and typescript 7 --- .github/workflows/update_deps.mjs | 22 +++++--- template_builder/templates/base/package.json | 48 ++++++++--------- template_builder/templates/base/src/app.d.ts | 6 +-- .../templates/base/svelte.config.js | 12 ----- template_builder/templates/base/tsconfig.json | 17 +----- .../templates/base/vite.config.ts | 12 ++++- .../extras/common/src/{Sidecar}common.ts | 13 ----- .../extras/common/{Sidecar}package.json | 10 ---- .../extras/worker/src/{Sidecar}worker.ts | 53 ------------------- .../extras/worker/{Sidecar,Npm}package.json | 18 ------- .../extras/worker/{Sidecar}.gitignore | 2 - .../extras/worker/{Sidecar}package.json | 18 ------- .../extras/worker/{Sidecar}tsconfig.json | 19 ------- .../extras/worker/{Sidecar}wrangler.jsonc | 23 -------- .../extras/{D1|Sqlite|Turso}package.json | 12 ++--- .../templates/extras/{D1}package.json | 10 +--- .../extras/{Edge,D1,Sidecar}wrangler.jsonc | 31 ----------- .../templates/extras/{Edge,D1}wrangler.jsonc | 2 +- .../extras/{Edge,Sidecar}wrangler.jsonc | 23 -------- .../templates/extras/{Edge}package.json | 12 ++--- .../templates/extras/{Edge}wrangler.jsonc | 2 +- .../extras/{Sidecar,Edge}package.json | 5 -- .../extras/{Sidecar,Npm|Bun}package.json | 3 -- .../extras/{Sidecar,Npm}package.json | 5 -- .../extras/{Sidecar,Pnpm}pnpm-workspace.yaml | 4 -- .../templates/extras/{Sidecar}.npmrc | 1 - .../templates/extras/{Sidecar}.prettierignore | 1 - .../templates/extras/{Sidecar}package.json | 5 -- .../templates/extras/{Sqlite}package.json | 9 +--- .../templates/extras/{Tailwind4}package.json | 4 +- .../templates/extras/{Turso}package.json | 12 ++--- 31 files changed, 67 insertions(+), 347 deletions(-) delete mode 100644 template_builder/templates/base/svelte.config.js delete mode 100644 template_builder/templates/extras/common/src/{Sidecar}common.ts delete mode 100644 template_builder/templates/extras/common/{Sidecar}package.json delete mode 100644 template_builder/templates/extras/worker/src/{Sidecar}worker.ts delete mode 100644 template_builder/templates/extras/worker/{Sidecar,Npm}package.json delete mode 100644 template_builder/templates/extras/worker/{Sidecar}.gitignore delete mode 100644 template_builder/templates/extras/worker/{Sidecar}package.json delete mode 100644 template_builder/templates/extras/worker/{Sidecar}tsconfig.json delete mode 100644 template_builder/templates/extras/worker/{Sidecar}wrangler.jsonc delete mode 100644 template_builder/templates/extras/{Edge,D1,Sidecar}wrangler.jsonc delete mode 100644 template_builder/templates/extras/{Edge,Sidecar}wrangler.jsonc delete mode 100644 template_builder/templates/extras/{Sidecar,Edge}package.json delete mode 100644 template_builder/templates/extras/{Sidecar,Npm|Bun}package.json delete mode 100644 template_builder/templates/extras/{Sidecar,Npm}package.json delete mode 100644 template_builder/templates/extras/{Sidecar,Pnpm}pnpm-workspace.yaml delete mode 100644 template_builder/templates/extras/{Sidecar}.npmrc delete mode 100644 template_builder/templates/extras/{Sidecar}.prettierignore delete mode 100644 template_builder/templates/extras/{Sidecar}package.json diff --git a/.github/workflows/update_deps.mjs b/.github/workflows/update_deps.mjs index 8dcb5fc8..f652aca6 100644 --- a/.github/workflows/update_deps.mjs +++ b/.github/workflows/update_deps.mjs @@ -22,27 +22,33 @@ export async function get_updates() { async function process_dependencies(pkg, key) { if (!pkg[key]) return []; let dirty = []; - for (const [name, currentVersion] of Object.entries(pkg[key])) { - if (currentVersion === null) continue; + for (const [name, current_version] of Object.entries(pkg[key])) { + if (current_version === null) continue; if (IGNORE_DEPS.includes(name)) continue; let tag = 'latest'; - if (currentVersion.includes('-next')) { + if (current_version.includes('-next')) { tag = 'next'; } - if (name === 'tailwindcss' && currentVersion[1] === '3') { + if (name === 'tailwindcss' && current_version[1] === '3') { tag = '3'; } - let prefix = currentVersion[0]; + let prefix = current_version[0]; if (prefix !== '^' && prefix !== '~') { prefix = ''; } - let latest = await latest_version(name, tag); + let package_name = name; + // handle npm:typescript + if (current_version.startsWith('npm:')) { + package_name = current_version.substring(4, current_version.lastIndexOf('@')); + prefix = current_version.substring(0, current_version.lastIndexOf('@') + 2); + } + let latest = await latest_version(package_name, tag); if (!latest) continue; latest = prefix + latest; - if (latest !== currentVersion) { - dirty.push([name, currentVersion, latest]); + if (latest !== current_version) { + dirty.push([name, current_version, latest]); pkg[key][name] = latest; } } diff --git a/template_builder/templates/base/package.json b/template_builder/templates/base/package.json index df55ea5f..ac0f082a 100644 --- a/template_builder/templates/base/package.json +++ b/template_builder/templates/base/package.json @@ -6,35 +6,31 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "lint": "svelte-kit sync && eslint --max-warnings 0 --fix . && svelte-check" + "lint": "svelte-kit sync && eslint --max-warnings 0 --fix .", + "fmt": "oxfmt", + "check": "svelte-kit sync && svelte-check --incremental --tsgo" + }, + "imports": { + "#lib/*": "./src/lib/*" }, "dependencies": {}, "devDependencies": { - "@eslint/js": "^9.38.0", - "@sveltejs/adapter-auto": "^7.0.0", - "@sveltejs/kit": "^2.48.3", - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "autoprefixer": "^10.4.21", - "eslint": "^9.38.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-svelte": "^3.12.5", - "globals": "^16.4.0", - "postcss": "^8.5.6", + "@eslint/js": "^10.0.1", + "@sveltejs/adapter-auto": "^8.0.0-next.2", + "@sveltejs/kit": "^3.0.0-next.14", + "@typescript/native": "npm:typescript@^7.0.2", + "autoprefixer": "^10.5.4", + "eslint": "^10.8.0", + "eslint-plugin-svelte": "^3.22.0", + "globals": "^17.9.0", + "oxfmt": "^0.62.0", + "postcss": "^8.5.26", "postcss-load-config": "^6.0.1", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "prettier-plugin-tailwindcss": "^0.7.1", - "svelte": "^5.43.0", - "svelte-check": "^4.3.3", - "tailwindcss": "^3.4.18", - "typescript": "~5.9.3", - "typescript-eslint": "^8.46.2", - "vite": "^7.1.12" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild" - ] + "svelte": "^5.56.8", + "svelte-check": "^4.7.4", + "tailwindcss": "^3.4.19", + "typescript": "npm:@typescript/typescript6@^6.0.2", + "typescript-eslint": "^8.66.0", + "vite": "^8.2.1" } } diff --git a/template_builder/templates/base/src/app.d.ts b/template_builder/templates/base/src/app.d.ts index 7dea72dc..8ea2d3dc 100644 --- a/template_builder/templates/base/src/app.d.ts +++ b/template_builder/templates/base/src/app.d.ts @@ -1,10 +1,6 @@ declare global { namespace App { - interface Platform { - env: Cloudflare.Env; - context: ExecutionContext; - } - + // interface Platform {} // interface Locals {} // interface Error {} // interface PageData {} diff --git a/template_builder/templates/base/svelte.config.js b/template_builder/templates/base/svelte.config.js deleted file mode 100644 index c08b6ced..00000000 --- a/template_builder/templates/base/svelte.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - preprocess: [vitePreprocess()], - kit: { - adapter: adapter(), - }, -}; - -export default config; diff --git a/template_builder/templates/base/tsconfig.json b/template_builder/templates/base/tsconfig.json index ba70898a..00ef9b61 100644 --- a/template_builder/templates/base/tsconfig.json +++ b/template_builder/templates/base/tsconfig.json @@ -1,17 +1,4 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "module": "esnext", - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "allowSyntheticDefaultImports": true, - "noUncheckedIndexedAccess": true, - "moduleResolution": "bundler" - } + "extends": "$app/tsconfig", + "include": ["src"] } diff --git a/template_builder/templates/base/vite.config.ts b/template_builder/templates/base/vite.config.ts index fce9e870..c217de8e 100644 --- a/template_builder/templates/base/vite.config.ts +++ b/template_builder/templates/base/vite.config.ts @@ -1,6 +1,16 @@ +import adapter from '@sveltejs/adapter-auto'; import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [sveltekit()], + plugins: [sveltekit({ + adapter: adapter(), + experimental: { + remoteFunctions: true, + }, + compilerOptions: { + async: true, + runes: ({ filename }) => filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + }, + })], }); diff --git a/template_builder/templates/extras/common/src/{Sidecar}common.ts b/template_builder/templates/extras/common/src/{Sidecar}common.ts deleted file mode 100644 index d654011d..00000000 --- a/template_builder/templates/extras/common/src/{Sidecar}common.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from 'zod'; - -export const clientToServerSchema = z.object({ - type: z.literal('broadcast'), - payload: z.string(), -}); - -export type ClientToServer = z.infer; - -export type ServerToClient = { - type: 'message'; - payload: string; -}; diff --git a/template_builder/templates/extras/common/{Sidecar}package.json b/template_builder/templates/extras/common/{Sidecar}package.json deleted file mode 100644 index e5930c5f..00000000 --- a/template_builder/templates/extras/common/{Sidecar}package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "common", - "version": "0.0.0", - "private": true, - "types": "./src/common.ts", - "module": "./src/common.ts", - "dependencies": { - "zod": "^4.1.12" - } -} diff --git a/template_builder/templates/extras/worker/src/{Sidecar}worker.ts b/template_builder/templates/extras/worker/src/{Sidecar}worker.ts deleted file mode 100644 index 3a72ef92..00000000 --- a/template_builder/templates/extras/worker/src/{Sidecar}worker.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { DurableObject } from 'cloudflare:workers'; -import { Hono } from 'hono'; -import { type ServerToClient, clientToServerSchema } from 'common'; - -export class SocketObject extends DurableObject { - constructor(ctx: DurableObjectState, env: Env) { - super(ctx, env); - } - - webSocketMessage( - _ws: WebSocket, - message: string | ArrayBuffer, - ): void | Promise { - if (typeof message !== 'string') return; - const parsed = clientToServerSchema.safeParse(JSON.parse(message)); - if (!parsed.success) return; - const { type, payload } = parsed.data; - if (type === 'broadcast') { - const message = JSON.stringify({ - type: 'message', - payload, - } as ServerToClient); - for (const ws of this.ctx.getWebSockets()) { - ws.send(message); - } - } - } - - async fetch(_req: Request): Promise { - const { 0: client, 1: server } = new WebSocketPair(); - - this.ctx.acceptWebSocket(server); - return new Response(null, { - status: 101, - webSocket: client, - }); - } -} - -const app = new Hono<{ Bindings: Env }>(); - -app.get('/ws/:room', (c) => { - const upgrade = c.req.header('Upgrade'); - if (upgrade !== 'websocket') { - c.status(426); - return c.body('WebSocket connection required'); - } - const id = c.env.SOCKET_OBJECT.idFromName(c.req.param('room')); - const socket = c.env.SOCKET_OBJECT.get(id); - return socket.fetch(c.req.raw); -}); - -export default app; diff --git a/template_builder/templates/extras/worker/{Sidecar,Npm}package.json b/template_builder/templates/extras/worker/{Sidecar,Npm}package.json deleted file mode 100644 index 91f89274..00000000 --- a/template_builder/templates/extras/worker/{Sidecar,Npm}package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "worker", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "wrangler dev", - "deploy": "wrangler deploy", - "typegen": "wrangler types" - }, - "dependencies": { - "common": "^0.0.0", - "hono": "^4.10.4" - }, - "devDependencies": { - "typescript": "^5.9.3", - "wrangler": "^4.45.2" - } -} diff --git a/template_builder/templates/extras/worker/{Sidecar}.gitignore b/template_builder/templates/extras/worker/{Sidecar}.gitignore deleted file mode 100644 index 6bf8e87d..00000000 --- a/template_builder/templates/extras/worker/{Sidecar}.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.dev.vars -.wrangler/ diff --git a/template_builder/templates/extras/worker/{Sidecar}package.json b/template_builder/templates/extras/worker/{Sidecar}package.json deleted file mode 100644 index 0aaa7180..00000000 --- a/template_builder/templates/extras/worker/{Sidecar}package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "worker", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "wrangler dev", - "deploy": "wrangler deploy", - "typegen": "wrangler types" - }, - "dependencies": { - "common": "workspace:*", - "hono": "^4.10.4" - }, - "devDependencies": { - "typescript": "^5.9.3", - "wrangler": "^4.45.2" - } -} diff --git a/template_builder/templates/extras/worker/{Sidecar}tsconfig.json b/template_builder/templates/extras/worker/{Sidecar}tsconfig.json deleted file mode 100644 index 33b610d1..00000000 --- a/template_builder/templates/extras/worker/{Sidecar}tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "target": "es2021", - "lib": ["es2021"], - "moduleResolution": "node", - "module": "es2022", - "allowJs": true, - "checkJs": false, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "allowSyntheticDefaultImports": true, - "noUncheckedIndexedAccess": true, - "noEmit": true, - "isolatedModules": true - } -} diff --git a/template_builder/templates/extras/worker/{Sidecar}wrangler.jsonc b/template_builder/templates/extras/worker/{Sidecar}wrangler.jsonc deleted file mode 100644 index b47527c6..00000000 --- a/template_builder/templates/extras/worker/{Sidecar}wrangler.jsonc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "name": "__o7__name__-worker", - "main": "src/worker.ts", - "compatibility_date": "2025-10-14", - "durable_objects": { - "bindings": [ - { - "name": "SOCKET_OBJECT", - "class_name": "SocketObject" - } - ] - }, - "migrations": [ - { - "tag": "v1", - "new_sqlite_classes": ["SocketObject"] - } - ], - "observability": { - "enabled": true - } -} diff --git a/template_builder/templates/extras/{D1|Sqlite|Turso}package.json b/template_builder/templates/extras/{D1|Sqlite|Turso}package.json index 86ad5750..b43c9983 100644 --- a/template_builder/templates/extras/{D1|Sqlite|Turso}package.json +++ b/template_builder/templates/extras/{D1|Sqlite|Turso}package.json @@ -1,15 +1,9 @@ { "dependencies": { - "kysely": "^0.28.8" + "kysely": "^0.29.4" }, "devDependencies": { - "prisma-kysely": "^2.2.1", - "prisma": "^6.18.0" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "@prisma/engines", - "prisma" - ] + "prisma-kysely": "^3.1.1", + "prisma": "^7.9.1" } } diff --git a/template_builder/templates/extras/{D1}package.json b/template_builder/templates/extras/{D1}package.json index 3fc3bf2c..8ca584ea 100644 --- a/template_builder/templates/extras/{D1}package.json +++ b/template_builder/templates/extras/{D1}package.json @@ -7,13 +7,7 @@ "kysely-d1": "^0.4.0" }, "devDependencies": { - "dotenv": "^17.2.3", - "better-sqlite3": "^12.4.1", - "@types/better-sqlite3": "^7.6.13" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "better-sqlite3" - ] + "better-sqlite3": "^13.0.3", + "@types/better-sqlite3": "^9.6.0" } } diff --git a/template_builder/templates/extras/{Edge,D1,Sidecar}wrangler.jsonc b/template_builder/templates/extras/{Edge,D1,Sidecar}wrangler.jsonc deleted file mode 100644 index 2dc1d21f..00000000 --- a/template_builder/templates/extras/{Edge,D1,Sidecar}wrangler.jsonc +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "name": "__o7__name__", - "main": "./.svelte-kit/cloudflare/_worker.js", - "compatibility_date": "2025-10-14", - "compatibility_flags": ["nodejs_als"], - "observability": { - "enabled": true - }, - "assets": { - "binding": "ASSETS", - "directory": ".svelte-kit/cloudflare" - }, - "d1_databases": [ - /* Run `pnpm wrangler d1 create ` before deploying! */ - { - "binding": "DB", - "database_name": "", - "database_id": "" - } - ], - "durable_objects": { - "bindings": [ - { - "script_name": "__o7__name__-worker", - "class_name": "SocketObject", - "name": "SOCKET_OBJECT" - } - ] - } -} diff --git a/template_builder/templates/extras/{Edge,D1}wrangler.jsonc b/template_builder/templates/extras/{Edge,D1}wrangler.jsonc index 5ea33740..84343ace 100644 --- a/template_builder/templates/extras/{Edge,D1}wrangler.jsonc +++ b/template_builder/templates/extras/{Edge,D1}wrangler.jsonc @@ -2,7 +2,7 @@ "$schema": "node_modules/wrangler/config-schema.json", "name": "__o7__name__", "main": "./.svelte-kit/cloudflare/_worker.js", - "compatibility_date": "2025-10-14", + "compatibility_date": "2026-08-04", "compatibility_flags": ["nodejs_als"], "observability": { "enabled": true diff --git a/template_builder/templates/extras/{Edge,Sidecar}wrangler.jsonc b/template_builder/templates/extras/{Edge,Sidecar}wrangler.jsonc deleted file mode 100644 index 578bd5c8..00000000 --- a/template_builder/templates/extras/{Edge,Sidecar}wrangler.jsonc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "name": "__o7__name__", - "main": "./.svelte-kit/cloudflare/_worker.js", - "compatibility_date": "2025-10-14", - "compatibility_flags": ["nodejs_als"], - "observability": { - "enabled": true - }, - "assets": { - "binding": "ASSETS", - "directory": ".svelte-kit/cloudflare" - }, - "durable_objects": { - "bindings": [ - { - "script_name": "__o7__name__-worker", - "class_name": "SocketObject", - "name": "SOCKET_OBJECT" - } - ] - } -} diff --git a/template_builder/templates/extras/{Edge}package.json b/template_builder/templates/extras/{Edge}package.json index 1abd33b3..ad40c37d 100644 --- a/template_builder/templates/extras/{Edge}package.json +++ b/template_builder/templates/extras/{Edge}package.json @@ -3,15 +3,9 @@ "typegen": "wrangler types src/worker-configuration.d.ts" }, "devDependencies": { - "@sveltejs/adapter-cloudflare": "^7.2.4", - "@types/node": "^24.9.2", - "wrangler": "^4.45.2", + "@sveltejs/adapter-cloudflare": "^8.0.0-next.4", + "@types/node": "^26.1.2", + "wrangler": "^4.119.0", "@sveltejs/adapter-auto": null - }, - "pnpm": { - "onlyBuiltDependencies": [ - "workerd", - "sharp" - ] } } diff --git a/template_builder/templates/extras/{Edge}wrangler.jsonc b/template_builder/templates/extras/{Edge}wrangler.jsonc index 32a2235c..48adf65f 100644 --- a/template_builder/templates/extras/{Edge}wrangler.jsonc +++ b/template_builder/templates/extras/{Edge}wrangler.jsonc @@ -2,7 +2,7 @@ "$schema": "node_modules/wrangler/config-schema.json", "name": "__o7__name__", "main": "./.svelte-kit/cloudflare/_worker.js", - "compatibility_date": "2025-10-14", + "compatibility_date": "2026-08-04", "compatibility_flags": ["nodejs_als"], "observability": { "enabled": true diff --git a/template_builder/templates/extras/{Sidecar,Edge}package.json b/template_builder/templates/extras/{Sidecar,Edge}package.json deleted file mode 100644 index 9654cf34..00000000 --- a/template_builder/templates/extras/{Sidecar,Edge}package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "scripts": { - "typegen": "wrangler types src/worker-configuration.d.ts && wrangler types --cwd worker" - } -} diff --git a/template_builder/templates/extras/{Sidecar,Npm|Bun}package.json b/template_builder/templates/extras/{Sidecar,Npm|Bun}package.json deleted file mode 100644 index 4f983c5e..00000000 --- a/template_builder/templates/extras/{Sidecar,Npm|Bun}package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "workspaces": ["common", "worker", "."] -} diff --git a/template_builder/templates/extras/{Sidecar,Npm}package.json b/template_builder/templates/extras/{Sidecar,Npm}package.json deleted file mode 100644 index a36cdbed..00000000 --- a/template_builder/templates/extras/{Sidecar,Npm}package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "common": "^0.0.0" - } -} diff --git a/template_builder/templates/extras/{Sidecar,Pnpm}pnpm-workspace.yaml b/template_builder/templates/extras/{Sidecar,Pnpm}pnpm-workspace.yaml deleted file mode 100644 index 004af1e8..00000000 --- a/template_builder/templates/extras/{Sidecar,Pnpm}pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - 'common' - - 'worker' - - '.' diff --git a/template_builder/templates/extras/{Sidecar}.npmrc b/template_builder/templates/extras/{Sidecar}.npmrc deleted file mode 100644 index ae90f705..00000000 --- a/template_builder/templates/extras/{Sidecar}.npmrc +++ /dev/null @@ -1 +0,0 @@ -ignore-workspace-root-check=true diff --git a/template_builder/templates/extras/{Sidecar}.prettierignore b/template_builder/templates/extras/{Sidecar}.prettierignore deleted file mode 100644 index 6447d289..00000000 --- a/template_builder/templates/extras/{Sidecar}.prettierignore +++ /dev/null @@ -1 +0,0 @@ -worker/worker-configuration.d.ts diff --git a/template_builder/templates/extras/{Sidecar}package.json b/template_builder/templates/extras/{Sidecar}package.json deleted file mode 100644 index ab1bf77e..00000000 --- a/template_builder/templates/extras/{Sidecar}package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "common": "workspace:*" - } -} diff --git a/template_builder/templates/extras/{Sqlite}package.json b/template_builder/templates/extras/{Sqlite}package.json index eee7d179..b5d54282 100644 --- a/template_builder/templates/extras/{Sqlite}package.json +++ b/template_builder/templates/extras/{Sqlite}package.json @@ -3,14 +3,9 @@ "db:push": "prisma db push" }, "dependencies": { - "better-sqlite3": "^12.4.1" + "better-sqlite3": "^13.0.3" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.13" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "better-sqlite3" - ] + "@types/better-sqlite3": "^9.6.0" } } diff --git a/template_builder/templates/extras/{Tailwind4}package.json b/template_builder/templates/extras/{Tailwind4}package.json index 8b5fb1f8..f7bd1d87 100644 --- a/template_builder/templates/extras/{Tailwind4}package.json +++ b/template_builder/templates/extras/{Tailwind4}package.json @@ -1,9 +1,9 @@ { "devDependencies": { "autoprefixer": null, - "@tailwindcss/vite": "^4.1.16", + "@tailwindcss/vite": "^4.3.3", "postcss": null, "postcss-load-config": null, - "tailwindcss": "^4.1.16" + "tailwindcss": "^4.3.3" } } diff --git a/template_builder/templates/extras/{Turso}package.json b/template_builder/templates/extras/{Turso}package.json index 9be81136..09a0d2b2 100644 --- a/template_builder/templates/extras/{Turso}package.json +++ b/template_builder/templates/extras/{Turso}package.json @@ -4,16 +4,10 @@ }, "dependencies": { "kysely-libsql": "^0.7.1", - "@libsql/client": "^0.15.15" + "@libsql/client": "^0.17.4" }, "devDependencies": { - "dotenv": "^17.2.3", - "better-sqlite3": "^12.4.1", - "@types/better-sqlite3": "^7.6.13" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "better-sqlite3" - ] + "better-sqlite3": "^13.0.3", + "@types/better-sqlite3": "^9.6.0" } } From ef0eeabb3413d6850ab9a9816a29aaddbd73f7a2 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 13:01:54 -0700 Subject: [PATCH 15/22] chore: remove pnpm key from package.json --- README.md | 4 +--- src/utils.rs | 8 -------- template_builder/src/lib.rs | 2 +- template_builder/src/utils.rs | 29 ----------------------------- 4 files changed, 2 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index c58d1822..9304eadb 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,8 @@ Then, open your new app in your favorite IDE and get started! ## Upcoming - [ ] zod -> valibot -- [ ] sveltekit 3 -- [ ] prettier -> oxfmt -- [ ] svelte-check tsgo - [ ] remote functions auth - [ ] auth user + pass option? - [ ] durable object patch - [ ] prisma 7? +- [ ] pnpm-workspace diff --git a/src/utils.rs b/src/utils.rs index c09007be..d373c547 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -86,14 +86,6 @@ pub struct PackageJsonPartial<'a> { #[serde(serialize_with = "sorted_map", skip_serializing_if = "skip_if_empty")] pub dev_dependencies: Option>>, pub package_manager: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub pnpm: Option>, -} - -#[derive(serde::Serialize, Debug)] -#[serde(rename_all = "camelCase")] -pub struct PnpmPackageJson<'a> { - pub only_built_dependencies: Option>, } pub fn skip_if_empty(map: &Option>>) -> bool { diff --git a/template_builder/src/lib.rs b/template_builder/src/lib.rs index 02569292..d491603e 100644 --- a/template_builder/src/lib.rs +++ b/template_builder/src/lib.rs @@ -379,7 +379,7 @@ impl Builder { let (base, extras) = package_jsons; quote! { - use crate::utils::{Feature, PackageJsonPartial, PnpmPackageJson}; + use crate::utils::{Feature, PackageJsonPartial}; use std::collections::{HashSet, HashMap}; #[derive(Debug)] pub struct TemplateFile { diff --git a/template_builder/src/utils.rs b/template_builder/src/utils.rs index 31573f2c..639956b2 100644 --- a/template_builder/src/utils.rs +++ b/template_builder/src/utils.rs @@ -81,41 +81,12 @@ pub struct PackageJsonPartial<'a> { dependencies: Option>>, dev_dependencies: Option>>, workspaces: Option>, - pnpm: Option>, } -#[derive(serde::Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -pub struct PnpmPackageJson<'a> { - #[serde(borrow)] - only_built_dependencies: Option>, -} - -impl ToTokens for PnpmPackageJson<'_> { - fn to_tokens(&self, tokens: &mut TokenStream) { - match &self.only_built_dependencies { - Some(deps) => { - let items: Vec<_> = deps.iter().collect(); - tokens.extend(quote! { PnpmPackageJson { - only_built_dependencies: Some(HashSet::from([#(#items),*])), - } }); - } - None => { - tokens.extend(quote! { PnpmPackageJson { - only_built_dependencies: None, - } }); - } - } - } -} impl ToTokens for PackageJsonPartial<'_> { fn to_tokens(&self, tokens: &mut TokenStream) { let mut pieces = vec![]; pieces.push(quote! { package_manager: None }); - match &self.pnpm { - Some(pnpm) => pieces.push(quote! { pnpm: Some(#pnpm) }), - None => pieces.push(quote! { pnpm: None }), - } match self.name { Some(name) => pieces.push(quote! { name: Some(#name) }), None => pieces.push(quote! { name: None }), From e79d3f0da5711be61f833ebb5d2507cdfbb5dc28 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 14:00:34 -0700 Subject: [PATCH 16/22] vite config, rename config files --- src/create/package_json.rs | 10 +-- src/utils.rs | 21 ----- template_builder/templates/base/.oxfmtrc.json | 8 -- .../templates/base/eslint.config.js | 54 ------------- .../templates/base/eslint.config.ts | 77 +++++++++++++++++++ .../templates/base/oxfmt.config.ts | 16 ++++ template_builder/templates/base/package.json | 6 +- .../{postcss.config.mjs => postcss.config.js} | 0 .../templates/base/vite.config.ts | 23 +++--- .../prisma/{{D1}push.mjs => {D1}push.ts} | 56 +++++++------- .../{{Turso}push.mjs => {Turso}push.ts} | 20 ++--- .../extras/src/lib/auth/{Auth}index.ts | 4 +- .../routes/api/auth/callback/{Auth}+server.ts | 4 +- .../routes/api/auth/login/{Auth}+server.ts | 2 +- .../routes/api/auth/logout/{Auth}+server.ts | 2 +- .../src/{Auth,Sqlite|Turso}hooks.server.ts | 2 +- .../templates/extras/src/{Auth}app.d.ts | 4 +- .../templates/extras/src/{D1}hooks.server.ts | 2 +- .../extras/src/{Edge,Auth,D1,Sidecar}app.d.ts | 6 +- .../extras/src/{Edge,Auth,D1}app.d.ts | 6 +- .../extras/src/{Edge,Auth,Sidecar}app.d.ts | 6 +- .../templates/extras/src/{Edge,Auth}app.d.ts | 6 +- .../extras/src/{Edge,D1,Sidecar}app.d.ts | 2 +- .../templates/extras/src/{Edge,D1}app.d.ts | 2 +- .../extras/src/{Edge,Sidecar}app.d.ts | 2 +- .../templates/extras/src/{Edge}app.d.ts | 2 +- .../extras/{Edge,Tailwind4}vite.config.ts | 21 +++++ .../templates/extras/{Edge}svelte.config.js | 12 --- .../templates/extras/{Edge}vite.config.ts | 19 +++++ ...js => {Tailwind4}DELETE:postcss.config.js} | 0 .../extras/{Tailwind4}vite.config.ts | 16 +++- 31 files changed, 231 insertions(+), 180 deletions(-) delete mode 100644 template_builder/templates/base/.oxfmtrc.json delete mode 100644 template_builder/templates/base/eslint.config.js create mode 100644 template_builder/templates/base/eslint.config.ts create mode 100644 template_builder/templates/base/oxfmt.config.ts rename template_builder/templates/base/{postcss.config.mjs => postcss.config.js} (100%) rename template_builder/templates/extras/prisma/{{D1}push.mjs => {D1}push.ts} (69%) rename template_builder/templates/extras/prisma/{{Turso}push.mjs => {Turso}push.ts} (82%) create mode 100644 template_builder/templates/extras/{Edge,Tailwind4}vite.config.ts delete mode 100644 template_builder/templates/extras/{Edge}svelte.config.js create mode 100644 template_builder/templates/extras/{Edge}vite.config.ts rename template_builder/templates/extras/{{Tailwind4}DELETE:postcss.config.mjs => {Tailwind4}DELETE:postcss.config.js} (100%) diff --git a/src/create/package_json.rs b/src/create/package_json.rs index db27db24..625ef70b 100644 --- a/src/create/package_json.rs +++ b/src/create/package_json.rs @@ -1,5 +1,5 @@ use super::templates; -use crate::{input::UserInput, utils::PackageManager}; +use crate::input::UserInput; use anyhow::{Context, Result}; use serde::Serialize; use serde_json::{ser::PrettyFormatter, Serializer}; @@ -21,14 +21,6 @@ pub fn create_package_json(input: &UserInput) -> Result<()> { package_json.package_manager = input.install_deps.as_ref().and_then(|p| p.version_string()); - if !input - .install_deps - .as_ref() - .is_some_and(|pm| pm.package_manager == PackageManager::Pnpm) - { - package_json.pnpm = None; - } - let target_path = &input.location.path.join("package.json"); let formatter = PrettyFormatter::with_indent(b"\t"); let buf = Vec::new(); diff --git a/src/utils.rs b/src/utils.rs index d373c547..875bad95 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -126,27 +126,6 @@ impl<'a> PackageJsonPartial<'a> { merge_hashmaps(&mut self.scripts, other.scripts); merge_hashmaps(&mut self.dependencies, other.dependencies); merge_hashmaps(&mut self.dev_dependencies, other.dev_dependencies); - - match (&mut self.pnpm, other.pnpm) { - (_, None) => {} - (None, Some(pnpm)) => { - self.pnpm = Some(pnpm); - } - (Some(old), Some(new)) => { - match ( - &mut old.only_built_dependencies, - new.only_built_dependencies, - ) { - (_, None) => {} - (None, Some(new)) => { - old.only_built_dependencies = Some(new); - } - (Some(ref mut old), Some(new)) => { - old.extend(new); - } - } - } - } } } diff --git a/template_builder/templates/base/.oxfmtrc.json b/template_builder/templates/base/.oxfmtrc.json deleted file mode 100644 index f4b6d344..00000000 --- a/template_builder/templates/base/.oxfmtrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "singleQuote": true, - "tabWidth": 2, - "useTabs": true, - "sortTailwindcss": true, - "svelte": true, - "ignorePatterns": ["worker-configuration.d.ts"] -} diff --git a/template_builder/templates/base/eslint.config.js b/template_builder/templates/base/eslint.config.js deleted file mode 100644 index 6af13239..00000000 --- a/template_builder/templates/base/eslint.config.js +++ /dev/null @@ -1,54 +0,0 @@ -import globals from 'globals'; -import js from '@eslint/js'; -import svelte from 'eslint-plugin-svelte'; -import ts from 'typescript-eslint'; -import svelteConfig from './svelte.config.js'; - -export default ts.config( - js.configs.recommended, - ...ts.configs.recommended, - ...svelte.configs.recommended, - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.es2017, - }, - }, - linterOptions: { - reportUnusedDisableDirectives: 'off', - }, - }, - { - files: ['**/*.cjs', '**/*.mjs'], - languageOptions: { - globals: { - ...globals.node, - }, - }, - }, - { - files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], - languageOptions: { - parserOptions: { - projectService: true, - extraFileExtensions: ['.svelte'], - parser: ts.parser, - svelteConfig, - }, - }, - }, - { - rules: { - '@typescript-eslint/no-unused-vars': [ - 'warn', - { - argsIgnorePattern: '^_', - caughtErrorsIgnorePattern: '^_', - varsIgnorePattern: '^_', - }, - ], - }, - }, - { ignores: ['**/.svelte-kit', 'build/', 'dist/'] }, -); diff --git a/template_builder/templates/base/eslint.config.ts b/template_builder/templates/base/eslint.config.ts new file mode 100644 index 00000000..1d90c14f --- /dev/null +++ b/template_builder/templates/base/eslint.config.ts @@ -0,0 +1,77 @@ +import globals from 'globals'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import { defineConfig } from 'eslint/config'; +import ts from 'typescript-eslint'; + +export default defineConfig( + js.configs.recommended, + ts.configs.recommended, + svelte.configs.recommended, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.es2017, + }, + }, + }, + { + files: ['./*.{cjs,ts,js}', './prisma/*.ts'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig: { + experimental: { async: true }, + kit: { + experimental: { remoteFunctions: true }, + }, + }, + }, + }, + }, + { + rules: { + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + // '@typescript-eslint/naming-convention': [ + // 'error', + // { + // selector: 'variableLike', + // format: ['snake_case'], + // trailingUnderscore: 'allow', + // leadingUnderscore: 'allow', + // }, + // { + // selector: 'variable', + // modifiers: ['destructured'], + // format: null, + // }, + // { + // selector: 'variable', + // modifiers: ['const', 'global'], + // format: ['UPPER_CASE', 'snake_case'], + // trailingUnderscore: 'allow', + // leadingUnderscore: 'allow', + // }, + // ], + }, + }, + { ignores: ['**/.svelte-kit', '.wrangler/', 'build/', 'dist/'] }, +); diff --git a/template_builder/templates/base/oxfmt.config.ts b/template_builder/templates/base/oxfmt.config.ts new file mode 100644 index 00000000..8ad1b370 --- /dev/null +++ b/template_builder/templates/base/oxfmt.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'oxfmt'; + +export default defineConfig({ + singleQuote: true, + tabWidth: 2, + useTabs: true, + sortTailwindcss: true, + svelte: true, + ignorePatterns: ['worker-configuration.d.ts'], + overrides: [ + { + files: ['wrangler.jsonc'], + options: { trailingComma: 'none' }, + }, + ], +}); diff --git a/template_builder/templates/base/package.json b/template_builder/templates/base/package.json index ac0f082a..43d0aaad 100644 --- a/template_builder/templates/base/package.json +++ b/template_builder/templates/base/package.json @@ -6,9 +6,9 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "lint": "svelte-kit sync && eslint --max-warnings 0 --fix .", - "fmt": "oxfmt", - "check": "svelte-kit sync && svelte-check --incremental --tsgo" + "lint": "svelte-kit sync && eslint --max-warnings 0 --flag unstable_native_nodejs_ts_config --fix .", + "check": "svelte-kit sync && svelte-check --incremental --tsgo", + "fmt": "oxfmt ." }, "imports": { "#lib/*": "./src/lib/*" diff --git a/template_builder/templates/base/postcss.config.mjs b/template_builder/templates/base/postcss.config.js similarity index 100% rename from template_builder/templates/base/postcss.config.mjs rename to template_builder/templates/base/postcss.config.js diff --git a/template_builder/templates/base/vite.config.ts b/template_builder/templates/base/vite.config.ts index c217de8e..e40dcb70 100644 --- a/template_builder/templates/base/vite.config.ts +++ b/template_builder/templates/base/vite.config.ts @@ -3,14 +3,17 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [sveltekit({ - adapter: adapter(), - experimental: { - remoteFunctions: true, - }, - compilerOptions: { - async: true, - runes: ({ filename }) => filename.split(/[/\\]/).includes('node_modules') ? undefined : true, - }, - })], + plugins: [ + sveltekit({ + adapter: adapter(), + experimental: { + remoteFunctions: true, + }, + compilerOptions: { + experimental: { async: true }, + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + }, + }), + ], }); diff --git a/template_builder/templates/extras/prisma/{D1}push.mjs b/template_builder/templates/extras/prisma/{D1}push.ts similarity index 69% rename from template_builder/templates/extras/prisma/{D1}push.mjs rename to template_builder/templates/extras/prisma/{D1}push.ts index d041d91e..0e06d120 100644 --- a/template_builder/templates/extras/prisma/{D1}push.mjs +++ b/template_builder/templates/extras/prisma/{D1}push.ts @@ -1,45 +1,47 @@ import { spawnSync } from 'node:child_process'; import Database from 'better-sqlite3'; import { resolve } from 'node:path'; +import { loadEnvFile } from 'node:process'; import { unlinkSync, writeFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; -import 'dotenv/config'; -const isLocal = process.argv.includes('--local'); -const localFlag = isLocal ? '--local' : '--remote'; +loadEnvFile(); -let databaseName; +const is_local = process.argv.includes('--local'); +const local_flag = is_local ? '--local' : '--remote'; -if (isLocal) { - databaseName = 'DB'; +let database_name: string; + +if (is_local) { + database_name = 'DB'; } else { - databaseName = process.env.DATABASE_NAME; - if (!databaseName) { + if (!process.env.DATABASE_NAME) { console.error('DATABASE_NAME not set (must be the name of a D1 database)'); process.exit(1); } + database_name = process.env.DATABASE_NAME; } const dirname = resolve(fileURLToPath(import.meta.url), '..'); -const tempDb = resolve(dirname, './temp.db'); -const migrationFile = resolve(dirname, './temp.sql'); +const temp_db = resolve(dirname, './temp.db'); +const migration_file = resolve(dirname, './temp.sql'); const schema = resolve(dirname, './schema.prisma'); try { - unlinkSync(tempDb); + unlinkSync(temp_db); } catch (_) { /* ignore */ } // 1. Pull current schema -const currentRes = JSON.parse( +const current_res = JSON.parse( spawnSync( 'npx', [ 'wrangler', 'd1', 'execute', - databaseName, - localFlag, + database_name, + local_flag, '--command', "SELECT * FROM sqlite_schema WHERE name != '_cf_KV' AND name != 'sqlite_sequence'", '--json', @@ -47,15 +49,15 @@ const currentRes = JSON.parse( { encoding: 'utf-8' }, ).stdout, ); -if (currentRes.error) { - console.error(currentRes.error); +if (current_res.error) { + console.error(current_res.error); console.error('Have you put your database ID in wrangler.toml?'); process.exit(1); } -const current = currentRes[0].results; +const current = current_res[0].results; // 2. create dummy db with that schema -const db = new Database(tempDb); +const db = new Database(temp_db); for (const item of current) { if (item.sql && item.sql !== 'null') { db.prepare(item.sql).run(); @@ -73,7 +75,7 @@ try { 'migrate', 'diff', '--from-url', - `file:${tempDb}`, + `file:${temp_db}`, '--to-schema-datamodel', schema, '--script', @@ -81,7 +83,7 @@ try { { encoding: 'utf-8' }, ); } finally { - unlinkSync(tempDb); + unlinkSync(temp_db); } if (migration.status !== 0) { console.error('Prisma error:'); @@ -93,13 +95,13 @@ if (migration.stdout.includes('-- This is an empty migration.')) { process.exit(0); } -const migrationSql = migration.stdout +const migration_sql = migration.stdout .replace(/^PRAGMA foreign_keys=OFF;/gm, 'PRAGMA defer_foreign_keys=true;') .replace(/^PRAGMA foreign_keys=ON;/gm, 'PRAGMA defer_foreign_keys=false;') .replace(/^PRAGMA foreign_key_check;/gm, ''); -console.log(migrationSql); +console.log(migration_sql); -writeFileSync(migrationFile, migrationSql); +writeFileSync(migration_file, migration_sql); // 4. apply migration on actual db let res; @@ -110,15 +112,15 @@ try { 'wrangler', 'd1', 'execute', - databaseName, - localFlag, + database_name, + local_flag, '--file', - migrationFile, + migration_file, ], { stdio: 'inherit' }, ); } finally { - unlinkSync(migrationFile); + unlinkSync(migration_file); } if (res.status !== 0) { diff --git a/template_builder/templates/extras/prisma/{Turso}push.mjs b/template_builder/templates/extras/prisma/{Turso}push.ts similarity index 82% rename from template_builder/templates/extras/prisma/{Turso}push.mjs rename to template_builder/templates/extras/prisma/{Turso}push.ts index 5d5c23ed..3e18b24c 100644 --- a/template_builder/templates/extras/prisma/{Turso}push.mjs +++ b/template_builder/templates/extras/prisma/{Turso}push.ts @@ -1,10 +1,12 @@ import { spawnSync } from 'node:child_process'; import Database from 'better-sqlite3'; import { resolve } from 'node:path'; +import { loadEnvFile } from 'node:process'; import { unlinkSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { createClient } from '@libsql/client'; -import 'dotenv/config'; + +loadEnvFile(); if (!process.env.TURSO_URL) { throw new Error('TURSO_URL not set'); @@ -17,10 +19,10 @@ const client = createClient({ const dirname = resolve(fileURLToPath(import.meta.url), '..'); -const tempDb = resolve(dirname, './temp.db'); +const temp_db = resolve(dirname, './temp.db'); const schema = resolve(dirname, './schema.prisma'); try { - unlinkSync(tempDb); + unlinkSync(temp_db); } catch (_) { /* ignore */ } @@ -31,7 +33,7 @@ const current = await client.execute( ); // 2. create dummy db with that schema -const db = new Database(tempDb); +const db = new Database(temp_db); for (const item of current.rows) { if (item.sql && item.sql !== 'null') { db.prepare(item.sql).run(); @@ -49,7 +51,7 @@ try { 'migrate', 'diff', '--from-url', - `file:${tempDb}`, + `file:${temp_db}`, '--to-schema-datamodel', schema, '--script', @@ -57,7 +59,7 @@ try { { encoding: 'utf-8' }, ); } finally { - unlinkSync(tempDb); + unlinkSync(temp_db); } if (migration.status !== 0) { console.error('Prisma error:'); @@ -69,13 +71,13 @@ if (migration.stdout.includes('-- This is an empty migration.')) { process.exit(0); } -const migrationSql = migration.stdout; +const migration_sql = migration.stdout; -console.log(migrationSql); +console.log(migration_sql); // 4. apply migration on actual db try { - await client.executeMultiple(migrationSql); + await client.executeMultiple(migration_sql); } catch (e) { console.error('Migration failed', e); process.exit(1); diff --git a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts b/template_builder/templates/extras/src/lib/auth/{Auth}index.ts index b9fafeda..d3040291 100644 --- a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts +++ b/template_builder/templates/extras/src/lib/auth/{Auth}index.ts @@ -6,9 +6,9 @@ import { import { sha256 } from '@oslojs/crypto/sha2'; import { generateRandomString, type RandomReader } from '@oslojs/crypto/random'; import type { Selectable } from 'kysely'; -import { db } from '$lib/db'; +import { db } from '#lib/db'; import { CLIENT_ID, CLIENT_SECRET } from '$env/static/private'; -import type { DB } from '$lib/db/schema'; +import type { DB } from '#lib/db/schema'; const ONE_DAY = 1000 * 60 * 60 * 24; diff --git a/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts b/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts index 642d247b..8c637ded 100644 --- a/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts +++ b/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts @@ -1,5 +1,5 @@ import { OAuth2Tokens } from 'arctic'; -import { db } from '$lib/db'; +import { db } from '#lib/db'; import { CLIENT_ID } from '$env/static/private'; import { error, redirect } from '@sveltejs/kit'; import { resolve } from '$app/paths'; @@ -8,7 +8,7 @@ import { generateId, generateSessionToken, twitch, -} from '$lib/auth'; +} from '#lib/auth'; import { dev } from '$app/environment'; export const GET = async (event) => { diff --git a/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts b/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts index 42258b5a..06cca671 100644 --- a/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts +++ b/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts @@ -1,6 +1,6 @@ import { redirect } from '@sveltejs/kit'; import { generateState } from 'arctic'; -import { twitch } from '$lib/auth'; +import { twitch } from '#lib/auth'; import { dev } from '$app/environment'; export const GET = async (event) => { diff --git a/template_builder/templates/extras/src/routes/api/auth/logout/{Auth}+server.ts b/template_builder/templates/extras/src/routes/api/auth/logout/{Auth}+server.ts index 1f856e73..cf4da4f6 100644 --- a/template_builder/templates/extras/src/routes/api/auth/logout/{Auth}+server.ts +++ b/template_builder/templates/extras/src/routes/api/auth/logout/{Auth}+server.ts @@ -1,4 +1,4 @@ -import { invalidateSession } from '$lib/auth'; +import { invalidateSession } from '#lib/auth'; import { redirect } from '@sveltejs/kit'; import { resolve } from '$app/paths'; diff --git a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts index 551bfba1..fa51cf24 100644 --- a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts +++ b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts @@ -1,4 +1,4 @@ -import { initAuth, validateSessionToken } from '$lib/auth'; +import { initAuth, validateSessionToken } from '#lib/auth'; import { dev } from '$app/environment'; export async function handle({ event, resolve }) { diff --git a/template_builder/templates/extras/src/{Auth}app.d.ts b/template_builder/templates/extras/src/{Auth}app.d.ts index 059a0372..d574387b 100644 --- a/template_builder/templates/extras/src/{Auth}app.d.ts +++ b/template_builder/templates/extras/src/{Auth}app.d.ts @@ -3,8 +3,8 @@ declare global { // interface Platform {} interface Locals { - user: import('$lib/auth').User | null; - session: import('$lib/auth').Session | null; + user: import('#lib/auth').User | null; + session: import('#lib/auth').Session | null; } // interface Error {} diff --git a/template_builder/templates/extras/src/{D1}hooks.server.ts b/template_builder/templates/extras/src/{D1}hooks.server.ts index 42723e25..4283a90e 100644 --- a/template_builder/templates/extras/src/{D1}hooks.server.ts +++ b/template_builder/templates/extras/src/{D1}hooks.server.ts @@ -1,4 +1,4 @@ -import { initDb } from '$lib/db'; +import { initDb } from '#lib/db'; export async function handle({ event, resolve }) { const db = event.platform!.env.DB; diff --git a/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts index 77dcfd41..de849407 100644 --- a/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts @@ -6,12 +6,12 @@ declare global { import('../worker/src/worker').SocketObject >; }; - context: ExecutionContext; + ctx: ExecutionContext; } interface Locals { - user: import('$lib/auth').User | null; - session: import('$lib/auth').Session | null; + user: import('#lib/auth').User | null; + session: import('#lib/auth').Session | null; } // interface Error {} diff --git a/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts index ed0d88f3..7d15f326 100644 --- a/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts @@ -2,12 +2,12 @@ declare global { namespace App { interface Platform { env: Cloudflare.Env; - context: ExecutionContext; + ctx: ExecutionContext; } interface Locals { - user: import('$lib/auth').User | null; - session: import('$lib/auth').Session | null; + user: import('#lib/auth').User | null; + session: import('#lib/auth').Session | null; } // interface Error {} diff --git a/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts index 77dcfd41..de849407 100644 --- a/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts @@ -6,12 +6,12 @@ declare global { import('../worker/src/worker').SocketObject >; }; - context: ExecutionContext; + ctx: ExecutionContext; } interface Locals { - user: import('$lib/auth').User | null; - session: import('$lib/auth').Session | null; + user: import('#lib/auth').User | null; + session: import('#lib/auth').Session | null; } // interface Error {} diff --git a/template_builder/templates/extras/src/{Edge,Auth}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth}app.d.ts index ed0d88f3..7d15f326 100644 --- a/template_builder/templates/extras/src/{Edge,Auth}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,Auth}app.d.ts @@ -2,12 +2,12 @@ declare global { namespace App { interface Platform { env: Cloudflare.Env; - context: ExecutionContext; + ctx: ExecutionContext; } interface Locals { - user: import('$lib/auth').User | null; - session: import('$lib/auth').Session | null; + user: import('#lib/auth').User | null; + session: import('#lib/auth').Session | null; } // interface Error {} diff --git a/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts index 1b864097..62c7c28e 100644 --- a/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts @@ -6,7 +6,7 @@ declare global { import('../worker/src/worker').SocketObject >; }; - context: ExecutionContext; + ctx: ExecutionContext; } // interface Locals {} diff --git a/template_builder/templates/extras/src/{Edge,D1}app.d.ts b/template_builder/templates/extras/src/{Edge,D1}app.d.ts index 7dea72dc..d5cb300f 100644 --- a/template_builder/templates/extras/src/{Edge,D1}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,D1}app.d.ts @@ -2,7 +2,7 @@ declare global { namespace App { interface Platform { env: Cloudflare.Env; - context: ExecutionContext; + ctx: ExecutionContext; } // interface Locals {} diff --git a/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts index 1b864097..62c7c28e 100644 --- a/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts +++ b/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts @@ -6,7 +6,7 @@ declare global { import('../worker/src/worker').SocketObject >; }; - context: ExecutionContext; + ctx: ExecutionContext; } // interface Locals {} diff --git a/template_builder/templates/extras/src/{Edge}app.d.ts b/template_builder/templates/extras/src/{Edge}app.d.ts index 7dea72dc..d5cb300f 100644 --- a/template_builder/templates/extras/src/{Edge}app.d.ts +++ b/template_builder/templates/extras/src/{Edge}app.d.ts @@ -2,7 +2,7 @@ declare global { namespace App { interface Platform { env: Cloudflare.Env; - context: ExecutionContext; + ctx: ExecutionContext; } // interface Locals {} diff --git a/template_builder/templates/extras/{Edge,Tailwind4}vite.config.ts b/template_builder/templates/extras/{Edge,Tailwind4}vite.config.ts new file mode 100644 index 00000000..a57f5559 --- /dev/null +++ b/template_builder/templates/extras/{Edge,Tailwind4}vite.config.ts @@ -0,0 +1,21 @@ +import adapter from '@sveltejs/adapter-cloudflare'; +import { sveltekit } from '@sveltejs/kit/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [ + sveltekit({ + adapter: adapter(), + experimental: { + remoteFunctions: true, + }, + compilerOptions: { + experimental: { async: true }, + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + }, + }), + tailwindcss(), + ], +}); diff --git a/template_builder/templates/extras/{Edge}svelte.config.js b/template_builder/templates/extras/{Edge}svelte.config.js deleted file mode 100644 index eb310624..00000000 --- a/template_builder/templates/extras/{Edge}svelte.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import adapter from '@sveltejs/adapter-cloudflare'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - preprocess: [vitePreprocess()], - kit: { - adapter: adapter(), - }, -}; - -export default config; diff --git a/template_builder/templates/extras/{Edge}vite.config.ts b/template_builder/templates/extras/{Edge}vite.config.ts new file mode 100644 index 00000000..7d727161 --- /dev/null +++ b/template_builder/templates/extras/{Edge}vite.config.ts @@ -0,0 +1,19 @@ +import adapter from '@sveltejs/adapter-cloudflare'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [ + sveltekit({ + adapter: adapter(), + experimental: { + remoteFunctions: true, + }, + compilerOptions: { + experimental: { async: true }, + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + }, + }), + ], +}); diff --git a/template_builder/templates/extras/{Tailwind4}DELETE:postcss.config.mjs b/template_builder/templates/extras/{Tailwind4}DELETE:postcss.config.js similarity index 100% rename from template_builder/templates/extras/{Tailwind4}DELETE:postcss.config.mjs rename to template_builder/templates/extras/{Tailwind4}DELETE:postcss.config.js diff --git a/template_builder/templates/extras/{Tailwind4}vite.config.ts b/template_builder/templates/extras/{Tailwind4}vite.config.ts index e79dfe77..adc05def 100644 --- a/template_builder/templates/extras/{Tailwind4}vite.config.ts +++ b/template_builder/templates/extras/{Tailwind4}vite.config.ts @@ -1,7 +1,21 @@ +import adapter from '@sveltejs/adapter-auto'; import { sveltekit } from '@sveltejs/kit/vite'; import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [sveltekit(), tailwindcss()], + plugins: [ + sveltekit({ + adapter: adapter(), + experimental: { + remoteFunctions: true, + }, + compilerOptions: { + experimental: { async: true }, + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + }, + }), + tailwindcss(), + ], }); From 67fe059f54ba3da8fd9583282f408c447f8ce009 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 14:52:58 -0700 Subject: [PATCH 17/22] feat: explicit environment variables --- src/test.rs | 7 +++++-- template_builder/templates/base/eslint.config.ts | 11 ++++++++++- template_builder/templates/base/oxfmt.config.ts | 2 +- .../templates/extras/src/lib/auth/{Auth}index.ts | 2 +- .../templates/extras/src/lib/db/{Sqlite}index.ts | 2 +- .../templates/extras/src/lib/db/{Turso}index.ts | 8 ++++---- .../src/routes/api/auth/callback/{Auth}+server.ts | 4 ++-- .../extras/src/routes/api/auth/login/{Auth}+server.ts | 2 +- .../templates/extras/src/{Auth,D1}hooks.server.ts | 2 +- .../extras/src/{Auth,Sqlite|Turso}hooks.server.ts | 2 +- template_builder/templates/extras/src/{D1,Auth}env.ts | 7 +++++++ template_builder/templates/extras/src/{D1}env.ts | 5 +++++ .../templates/extras/src/{Sqlite,Auth}env.ts | 7 +++++++ template_builder/templates/extras/src/{Sqlite}env.ts | 5 +++++ .../templates/extras/src/{Turso,Auth}env.ts | 8 ++++++++ template_builder/templates/extras/src/{Turso}env.ts | 6 ++++++ .../templates/extras/{D1|Sqlite}.prettierignore | 1 - template_builder/templates/extras/{D1}.env | 1 + template_builder/templates/extras/{D1}package.json | 4 ++-- .../extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml | 4 ++++ .../{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml | 6 ++++++ .../templates/extras/{Pnpm,Edge}pnpm-workspace.yaml | 3 +++ template_builder/templates/extras/{Turso}package.json | 2 +- 23 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 template_builder/templates/extras/src/{D1,Auth}env.ts create mode 100644 template_builder/templates/extras/src/{D1}env.ts create mode 100644 template_builder/templates/extras/src/{Sqlite,Auth}env.ts create mode 100644 template_builder/templates/extras/src/{Sqlite}env.ts create mode 100644 template_builder/templates/extras/src/{Turso,Auth}env.ts create mode 100644 template_builder/templates/extras/src/{Turso}env.ts delete mode 100644 template_builder/templates/extras/{D1|Sqlite}.prettierignore create mode 100644 template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml create mode 100644 template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml create mode 100644 template_builder/templates/extras/{Pnpm,Edge}pnpm-workspace.yaml diff --git a/src/test.rs b/src/test.rs index 70f3d070..170d5cc7 100644 --- a/src/test.rs +++ b/src/test.rs @@ -20,6 +20,8 @@ use crate::{ fn make_input(features: HashSet) -> UserInput { let tmp = tempfile::tempdir().unwrap(); + let mut features = features.clone(); + features.insert(Feature::Pnpm); UserInput { location: ProjectLocation { name: "o7-test".to_string(), @@ -182,8 +184,9 @@ fn test() { create(input).map_err(|e| format!("{e}"))?; // Build first so sveltekit generates its tsconfig test_pnpm(&dir, &["build"])?; - test_pnpm(&dir, &["eslint", "--max-warnings", "0", "."])?; - test_pnpm(&dir, &["svelte-check"])?; + test_pnpm(&dir, &["eslint", "--flag", "unstable_native_nodejs_ts_config", "--max-warnings", "0", "."])?; + test_pnpm(&dir, &["svelte-check", "--incremental", "--tsgo"])?; + test_pnpm(&dir, &["oxfmt", "--check"])?; Ok(()) })(); diff --git a/template_builder/templates/base/eslint.config.ts b/template_builder/templates/base/eslint.config.ts index 1d90c14f..80423f27 100644 --- a/template_builder/templates/base/eslint.config.ts +++ b/template_builder/templates/base/eslint.config.ts @@ -73,5 +73,14 @@ export default defineConfig( // ], }, }, - { ignores: ['**/.svelte-kit', '.wrangler/', 'build/', 'dist/'] }, + { + ignores: [ + '**/.svelte-kit', + '.wrangler/', + 'build/', + 'dist/', + 'worker-configuration.d.ts', + 'db/schema.d.ts', + ], + }, ); diff --git a/template_builder/templates/base/oxfmt.config.ts b/template_builder/templates/base/oxfmt.config.ts index 8ad1b370..4e66a4e9 100644 --- a/template_builder/templates/base/oxfmt.config.ts +++ b/template_builder/templates/base/oxfmt.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ useTabs: true, sortTailwindcss: true, svelte: true, - ignorePatterns: ['worker-configuration.d.ts'], + ignorePatterns: ['worker-configuration.d.ts', 'db/schema.d.ts'], overrides: [ { files: ['wrangler.jsonc'], diff --git a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts b/template_builder/templates/extras/src/lib/auth/{Auth}index.ts index d3040291..cfa6e245 100644 --- a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts +++ b/template_builder/templates/extras/src/lib/auth/{Auth}index.ts @@ -7,7 +7,7 @@ import { sha256 } from '@oslojs/crypto/sha2'; import { generateRandomString, type RandomReader } from '@oslojs/crypto/random'; import type { Selectable } from 'kysely'; import { db } from '#lib/db'; -import { CLIENT_ID, CLIENT_SECRET } from '$env/static/private'; +import { CLIENT_ID, CLIENT_SECRET } from '$app/env/private'; import type { DB } from '#lib/db/schema'; const ONE_DAY = 1000 * 60 * 60 * 24; diff --git a/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts b/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts index bd439d9f..ff9487a5 100644 --- a/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts +++ b/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts @@ -1,6 +1,6 @@ import { Kysely, type RawBuilder, sql, SqliteDialect } from 'kysely'; import Database from 'better-sqlite3'; -import { DATABASE_URL } from '$env/static/private'; +import { DATABASE_URL } from '$app/env/private'; import type { DB } from './schema'; export const sqlite = new Database(DATABASE_URL); diff --git a/template_builder/templates/extras/src/lib/db/{Turso}index.ts b/template_builder/templates/extras/src/lib/db/{Turso}index.ts index 692d5a47..6f92e0ac 100644 --- a/template_builder/templates/extras/src/lib/db/{Turso}index.ts +++ b/template_builder/templates/extras/src/lib/db/{Turso}index.ts @@ -1,8 +1,8 @@ import { Kysely, type RawBuilder, sql } from 'kysely'; import { LibsqlDialect } from 'kysely-libsql'; import type { DB } from './schema'; -import { dev } from '$app/environment'; -import { TURSO_TOKEN, TURSO_URL } from '$env/static/private'; +import { dev } from '$app/env'; +import { TURSO_TOKEN, TURSO_URL } from '$app/env/private'; import { createClient } from '@libsql/client'; if (!TURSO_URL || !TURSO_TOKEN) { @@ -13,13 +13,13 @@ if (!TURSO_URL || !TURSO_TOKEN) { } } -export const dbClient = createClient({ +export const db_client = createClient({ url: TURSO_URL, authToken: TURSO_TOKEN, }); export const db = new Kysely({ - dialect: new LibsqlDialect({ client: dbClient }), + dialect: new LibsqlDialect({ client: db_client }), }); export function json(obj: T): RawBuilder { diff --git a/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts b/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts index 8c637ded..dc22d23a 100644 --- a/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts +++ b/template_builder/templates/extras/src/routes/api/auth/callback/{Auth}+server.ts @@ -1,6 +1,6 @@ import { OAuth2Tokens } from 'arctic'; import { db } from '#lib/db'; -import { CLIENT_ID } from '$env/static/private'; +import { CLIENT_ID } from '$app/env/private'; import { error, redirect } from '@sveltejs/kit'; import { resolve } from '$app/paths'; import { @@ -9,7 +9,7 @@ import { generateSessionToken, twitch, } from '#lib/auth'; -import { dev } from '$app/environment'; +import { dev } from '$app/env'; export const GET = async (event) => { const code = event.url.searchParams.get('code'); diff --git a/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts b/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts index 06cca671..eccd9bed 100644 --- a/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts +++ b/template_builder/templates/extras/src/routes/api/auth/login/{Auth}+server.ts @@ -1,7 +1,7 @@ import { redirect } from '@sveltejs/kit'; import { generateState } from 'arctic'; import { twitch } from '#lib/auth'; -import { dev } from '$app/environment'; +import { dev } from '$app/env'; export const GET = async (event) => { const state = generateState(); diff --git a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts b/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts index 685cf876..9195cc07 100644 --- a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts +++ b/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts @@ -1,6 +1,6 @@ import { initDb } from '$lib/db'; import { initAuth, validateSessionToken } from '$lib/auth'; -import { dev } from '$app/environment'; +import { dev } from '$app/env'; export async function handle({ event, resolve }) { const db = event.platform!.env.DB; diff --git a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts index fa51cf24..6d5c502d 100644 --- a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts +++ b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts @@ -1,5 +1,5 @@ import { initAuth, validateSessionToken } from '#lib/auth'; -import { dev } from '$app/environment'; +import { dev } from '$app/env'; export async function handle({ event, resolve }) { initAuth(event.url.origin); diff --git a/template_builder/templates/extras/src/{D1,Auth}env.ts b/template_builder/templates/extras/src/{D1,Auth}env.ts new file mode 100644 index 00000000..a6c7f18a --- /dev/null +++ b/template_builder/templates/extras/src/{D1,Auth}env.ts @@ -0,0 +1,7 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + DATABASE_NAME: {}, + CLIENT_ID: {}, + CLIENT_SECRET: {}, +}); diff --git a/template_builder/templates/extras/src/{D1}env.ts b/template_builder/templates/extras/src/{D1}env.ts new file mode 100644 index 00000000..e16f9fa6 --- /dev/null +++ b/template_builder/templates/extras/src/{D1}env.ts @@ -0,0 +1,5 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + DATABASE_NAME: {}, +}); diff --git a/template_builder/templates/extras/src/{Sqlite,Auth}env.ts b/template_builder/templates/extras/src/{Sqlite,Auth}env.ts new file mode 100644 index 00000000..e4b6dc8d --- /dev/null +++ b/template_builder/templates/extras/src/{Sqlite,Auth}env.ts @@ -0,0 +1,7 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + DATABASE_URL: {}, + CLIENT_ID: {}, + CLIENT_SECRET: {}, +}); diff --git a/template_builder/templates/extras/src/{Sqlite}env.ts b/template_builder/templates/extras/src/{Sqlite}env.ts new file mode 100644 index 00000000..81151634 --- /dev/null +++ b/template_builder/templates/extras/src/{Sqlite}env.ts @@ -0,0 +1,5 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + DATABASE_URL: {}, +}); diff --git a/template_builder/templates/extras/src/{Turso,Auth}env.ts b/template_builder/templates/extras/src/{Turso,Auth}env.ts new file mode 100644 index 00000000..7f6fa403 --- /dev/null +++ b/template_builder/templates/extras/src/{Turso,Auth}env.ts @@ -0,0 +1,8 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + TURSO_URL: {}, + TURSO_TOKEN: {}, + CLIENT_ID: {}, + CLIENT_SECRET: {}, +}); diff --git a/template_builder/templates/extras/src/{Turso}env.ts b/template_builder/templates/extras/src/{Turso}env.ts new file mode 100644 index 00000000..d22efb73 --- /dev/null +++ b/template_builder/templates/extras/src/{Turso}env.ts @@ -0,0 +1,6 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +export const variables = defineEnvVars({ + TURSO_URL: {}, + TURSO_TOKEN: {}, +}); diff --git a/template_builder/templates/extras/{D1|Sqlite}.prettierignore b/template_builder/templates/extras/{D1|Sqlite}.prettierignore deleted file mode 100644 index db791e99..00000000 --- a/template_builder/templates/extras/{D1|Sqlite}.prettierignore +++ /dev/null @@ -1 +0,0 @@ -src/lib/db/schema.d.ts diff --git a/template_builder/templates/extras/{D1}.env b/template_builder/templates/extras/{D1}.env index c892c8e4..19e59afe 100644 --- a/template_builder/templates/extras/{D1}.env +++ b/template_builder/templates/extras/{D1}.env @@ -1 +1,2 @@ +# The name of your D1 database DATABASE_NAME= diff --git a/template_builder/templates/extras/{D1}package.json b/template_builder/templates/extras/{D1}package.json index 8ca584ea..20c22892 100644 --- a/template_builder/templates/extras/{D1}package.json +++ b/template_builder/templates/extras/{D1}package.json @@ -1,7 +1,7 @@ { "scripts": { - "db:push": "node ./prisma/push.mjs", - "db:push:local": "node ./prisma/push.mjs --local" + "db:push": "node ./prisma/push.ts", + "db:push:local": "node ./prisma/push.ts --local" }, "dependencies": { "kysely-d1": "^0.4.0" diff --git a/template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml new file mode 100644 index 00000000..bf1d15ab --- /dev/null +++ b/template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml @@ -0,0 +1,4 @@ +allowBuilds: + prisma: true + better-sqlite3: true + '@prisma/engines': true diff --git a/template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml new file mode 100644 index 00000000..d61e9fe2 --- /dev/null +++ b/template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml @@ -0,0 +1,6 @@ +allowBuilds: + esbuild: true + workerd: true + prisma: true + better-sqlite3: true + '@prisma/engines': true diff --git a/template_builder/templates/extras/{Pnpm,Edge}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,Edge}pnpm-workspace.yaml new file mode 100644 index 00000000..02365ef1 --- /dev/null +++ b/template_builder/templates/extras/{Pnpm,Edge}pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + esbuild: true + workerd: true diff --git a/template_builder/templates/extras/{Turso}package.json b/template_builder/templates/extras/{Turso}package.json index 09a0d2b2..2464dac2 100644 --- a/template_builder/templates/extras/{Turso}package.json +++ b/template_builder/templates/extras/{Turso}package.json @@ -1,6 +1,6 @@ { "scripts": { - "db:push": "node ./prisma/push.mjs" + "db:push": "node ./prisma/push.ts" }, "dependencies": { "kysely-libsql": "^0.7.1", From 65633da0df003173edca560d8aa6daee2ab88378 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 21:14:58 -0700 Subject: [PATCH 18/22] almost all tests passing --- Cargo.lock | 656 ++++++------------ Cargo.toml | 23 +- src/create/package_json.rs | 5 +- src/test.rs | 3 +- src/utils.rs | 9 +- telemetry-server/package.json | 2 +- telemetry-server/pnpm-lock.yaml | 76 +- template_builder/Cargo.lock | 113 ++- template_builder/Cargo.toml | 14 +- template_builder/src/utils.rs | 8 + .../templates/base/eslint.config.ts | 17 +- template_builder/templates/base/package.json | 7 +- template_builder/templates/base/src/app.html | 24 +- template_builder/templates/base/tsconfig.json | 2 +- .../templates/extras/prisma/{Turso}push.ts | 6 +- .../extras/src/{Auth,D1}hooks.server.ts | 4 +- .../templates/extras/{D1,Turso}tsconfig.json | 4 + 17 files changed, 370 insertions(+), 603 deletions(-) create mode 100644 template_builder/templates/extras/{D1,Turso}tsconfig.json diff --git a/Cargo.lock b/Cargo.lock index a0e1ba30..ec970616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -19,44 +19,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys", ] [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "base64" @@ -66,15 +66,15 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bytes" -version = "1.10.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cfg-if" @@ -84,9 +84,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clap" -version = "4.5.51" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -94,9 +94,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstream", "anstyle", @@ -106,33 +106,33 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "convert_case" -version = "0.7.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] @@ -150,9 +150,9 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" dependencies = [ "cookie", "document-features", @@ -177,15 +177,14 @@ dependencies = [ "dunce", "human-repr", "inquire", - "itertools 0.14.0", - "once_cell", + "itertools", "pathdiff", "serde", "serde_json", "tempfile", "template_builder", "ureq", - "which 8.0.0", + "which", ] [[package]] @@ -200,7 +199,7 @@ dependencies = [ "document-features", "mio", "parking_lot", - "rustix 1.1.2", + "rustix", "signal-hook", "signal-hook-mio", "winapi", @@ -217,32 +216,30 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" -dependencies = [ - "powerfmt", -] +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "convert_case", "proc-macro2", "quote", - "syn", + "rustc_version", + "syn 2.0.119", ] [[package]] @@ -263,18 +260,18 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -300,15 +297,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "env_home" -version = "0.1.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "equivalent" @@ -323,20 +314,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fnv" -version = "1.0.7" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "form_urlencoded" @@ -358,9 +343,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", @@ -369,21 +354,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", "r-efi", - "wasip2", ] [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -391,23 +375,13 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "http" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -425,12 +399,13 @@ checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1" [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -438,9 +413,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -451,9 +426,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -465,15 +440,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -485,15 +460,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -517,9 +492,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -527,9 +502,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown", @@ -537,9 +512,9 @@ dependencies = [ [[package]] name = "inquire" -version = "0.9.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2628910d0114e9139056161d8644a2026be7b117f8498943f9437748b04c9e0a" +checksum = "6654738b8024300cf062d04a1c13c10c8e2cea598ec1c47dc9b6641159429756" dependencies = [ "bitflags", "crossterm", @@ -557,61 +532,45 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" dependencies = [ - "bitflags", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -630,39 +589,39 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mio" -version = "1.1.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -713,9 +672,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -728,27 +687,27 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.3.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "redox_syscall" @@ -765,43 +724,33 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror", ] [[package]] -name = "rustix" -version = "0.38.44" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "semver", ] [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "linux-raw-sys", + "windows-sys", ] -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - [[package]] name = "same-file" version = "1.0.6" @@ -817,11 +766,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -829,35 +784,35 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -883,18 +838,19 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "stable_deref_trait" @@ -910,9 +866,20 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.108" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -927,20 +894,20 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", - "rustix 1.1.2", - "windows-sys 0.61.2", + "rustix", + "windows-sys", ] [[package]] @@ -948,70 +915,69 @@ name = "template_builder" version = "0.1.0" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools", "proc-macro2", "quote", "serde", "serde_json", "walkdir", - "which 6.0.3", + "which", ] [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.44" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -1019,9 +985,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -1029,15 +995,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -1047,9 +1013,9 @@ checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "ureq" -version = "3.1.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64", "cookie_store", @@ -1058,14 +1024,14 @@ dependencies = [ "serde", "serde_json", "ureq-proto", - "utf-8", + "utf8-zero", ] [[package]] name = "ureq-proto" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64", "http", @@ -1075,9 +1041,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -1086,10 +1052,10 @@ dependencies = [ ] [[package]] -name = "utf-8" -version = "0.7.6" +name = "utf8-zero" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" [[package]] name = "utf8_iter" @@ -1125,36 +1091,13 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - [[package]] name = "which" -version = "6.0.3" +version = "8.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" +checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" dependencies = [ - "either", - "home", - "rustix 0.38.44", - "winsafe", -] - -[[package]] -name = "which" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" -dependencies = [ - "env_home", - "rustix 1.1.2", - "winsafe", + "libc", ] [[package]] @@ -1179,7 +1122,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -1194,24 +1137,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -1221,158 +1146,17 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -1381,42 +1165,42 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -1425,9 +1209,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -1436,11 +1220,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index d53e6867..ac686f40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,26 +5,25 @@ version = "0.13.4" edition = "2021" [dependencies] -anyhow = "1.0.86" -clap = { version = "4.5.9", features = ["derive"] } +anyhow = "1.0.104" +clap = { version = "4.6.6", features = ["derive"] } crossterm = "0.29.0" directories = "6.0.0" -dunce = "1.0.4" +dunce = "1.0.5" human-repr = "1.1.0" -inquire = "0.9.1" -once_cell = "1.19.0" -pathdiff = "0.2.1" -serde = { version = "1.0.203", features = ["derive"] } -serde_json = "1.0.117" -ureq = { version = "3.0.4", features = ["json"], default-features = false } -which = "8.0.0" +inquire = "0.9.4" +pathdiff = "0.2.3" +serde = { version = "1.0.229", features = ["derive"] } +serde_json = "1.0.151" +ureq = { version = "3.3.0", features = ["json"], default-features = false } +which = "8.0.5" [build-dependencies] template_builder = { path = "./template_builder" } [dev-dependencies] -tempfile = "3.10.1" -itertools = "0.14.0" +tempfile = "3.27.0" +itertools = "0.15.0" [profile.release] opt-level = 's' # Optimize for size diff --git a/src/create/package_json.rs b/src/create/package_json.rs index 625ef70b..6d7dd9e5 100644 --- a/src/create/package_json.rs +++ b/src/create/package_json.rs @@ -28,8 +28,11 @@ pub fn create_package_json(input: &UserInput) -> Result<()> { package_json .serialize(&mut ser) .context("Failed to serialize package.json")?; + + let mut buf = ser.into_inner(); + buf.push(b'\n'); - fs::write(target_path, ser.into_inner())?; + fs::write(target_path, buf)?; Ok(()) } diff --git a/src/test.rs b/src/test.rs index 170d5cc7..7419ce43 100644 --- a/src/test.rs +++ b/src/test.rs @@ -18,9 +18,8 @@ use crate::{ utils::PackageManager, }; -fn make_input(features: HashSet) -> UserInput { +fn make_input(mut features: HashSet) -> UserInput { let tmp = tempfile::tempdir().unwrap(); - let mut features = features.clone(); features.insert(Feature::Pnpm); UserInput { location: ProjectLocation { diff --git a/src/utils.rs b/src/utils.rs index 875bad95..9852d085 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,9 +1,8 @@ use std::collections::{BTreeMap, HashMap}; use std::env; use std::fmt::Display; -use std::sync::Mutex; +use std::sync::{LazyLock, Mutex}; -use once_cell::sync::Lazy; use serde::{Serialize, Serializer}; include!(concat!(env!("OUT_DIR"), "/config.rs")); @@ -46,8 +45,8 @@ impl Display for PackageManager { } } -pub static PACKAGE_MANAGER_OVERRIDE: Lazy>> = - Lazy::new(|| Mutex::new(None)); +pub static PACKAGE_MANAGER_OVERRIDE: LazyLock>> = + LazyLock::new(|| Mutex::new(None)); pub fn get_package_manager() -> PackageManager { if let Some(package_manager) = PACKAGE_MANAGER_OVERRIDE.lock().unwrap().as_ref() { @@ -78,6 +77,7 @@ pub struct PackageJsonPartial<'a> { pub name: Option<&'a str>, pub version: Option<&'a str>, pub r#type: Option<&'a str>, + pub imports: Option>>, pub scripts: Option>>, #[serde(skip_serializing_if = "Option::is_none")] pub workspaces: Option>, @@ -124,6 +124,7 @@ impl<'a> PackageJsonPartial<'a> { self.package_manager = other.package_manager; } merge_hashmaps(&mut self.scripts, other.scripts); + merge_hashmaps(&mut self.imports, other.imports); merge_hashmaps(&mut self.dependencies, other.dependencies); merge_hashmaps(&mut self.dev_dependencies, other.dev_dependencies); } diff --git a/telemetry-server/package.json b/telemetry-server/package.json index 7f99bc4c..93383c15 100644 --- a/telemetry-server/package.json +++ b/telemetry-server/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "typescript": "^7.0.2", - "wrangler": "^4.118.0" + "wrangler": "^4.119.0" }, "dependencies": { "valibot": "^1.4.2" diff --git a/telemetry-server/pnpm-lock.yaml b/telemetry-server/pnpm-lock.yaml index 734e3b61..a356282b 100644 --- a/telemetry-server/pnpm-lock.yaml +++ b/telemetry-server/pnpm-lock.yaml @@ -16,8 +16,8 @@ importers: specifier: ^7.0.2 version: 7.0.2 wrangler: - specifier: ^4.118.0 - version: 4.118.0 + specifier: ^4.119.0 + version: 4.119.0 packages: @@ -34,32 +34,32 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20260730.1': - resolution: {integrity: sha512-+MBHmPaiTe2KajryW0T24rZvWFxb41hD3d8anNzQqHzft6vSEb18+sp0znSwxgij7ApPhSM1+vhkNg4f3YMguA==} + '@cloudflare/workerd-darwin-64@1.20260801.1': + resolution: {integrity: sha512-wuJWbXpKvncJi1P0GKS+iYpN5tHdb7JPJJ/+6ZQe8zzovHHVMkLJPNBsgWpqeUhpM3g9qTwEKd2rglNKejuh5A==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260730.1': - resolution: {integrity: sha512-SBHKntPkKvNPgaCrTe99xC1CAl8ygJDzlYfK0LbuJ1muKadIw35WnhO0wu894fKBtllsVQdNzDLee+cm0ppLSQ==} + '@cloudflare/workerd-darwin-arm64@1.20260801.1': + resolution: {integrity: sha512-kwoZiTpnhNrF3+APx84Q/oAqvJ3sU9yefGagwm/ASaH/2W19x0vghkW/r4qCoHCK0WW7EPugZ+aXjgPMRtlq1Q==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260730.1': - resolution: {integrity: sha512-ouyPOSMbiKPeSwUJUvxtMcxGAXs2J4aPE4T5ABIYX5ClcQx5j5bbHTmnqOQEY8sAuLTPjH7dY+iB6UI5ISlwwA==} + '@cloudflare/workerd-linux-64@1.20260801.1': + resolution: {integrity: sha512-r0vAxCZH+Jih9Unm1yoyiByPNWNgawcKciOHDm5Q37ZVGOkKLsT9AtLe3yLSaul76WrKqtf+JP2n0WW32VBLJg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260730.1': - resolution: {integrity: sha512-YQ+Mi78U3TPdgBPtwq+Sm6rJU+Ihl2y0pjYtuuKkdmUbYzL7oLR6Xqq9wljhasnuCFICssDJaqhMep5WizYoEQ==} + '@cloudflare/workerd-linux-arm64@1.20260801.1': + resolution: {integrity: sha512-zWgpdZtSozvIgzQNmQiDSF8yEOQJUkRAWNsDXXzAAoy+fCn8YUoSibj3mpFSbZRvbUldeBEaW6SCdC2VEMkhNQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260730.1': - resolution: {integrity: sha512-27fAN+vUECW1oYVc1KOcHYpkL8COM2Uxtxql7TL595kxbjoqS5yckw7NLz7bTf2pALFCZWjqXDjZGJ/xbG4ZKQ==} + '@cloudflare/workerd-windows-64@1.20260801.1': + resolution: {integrity: sha512-2oQz+Ksu4ji6e/+ZoYX+tWQEcxAii2p7l+iR8kx48W1llMalaufAsmVxTlk+3/vrM7D3/2c0iK448e0UQTcIMg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -563,8 +563,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - miniflare@5.20260730.0-alpha: - resolution: {integrity: sha512-8/dspSXDshP6nSkCpjKO7BYc2qZoYSXm7iM+QxY7qJyJpAB3onnQSaiu0cvKJlfuMGwULl55hG69FJCcCMXU1Q==} + miniflare@5.20260801.0-alpha: + resolution: {integrity: sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==} engines: {node: '>=22.0.0'} path-to-regexp@6.3.0: @@ -609,17 +609,17 @@ packages: typescript: optional: true - workerd@1.20260730.1: - resolution: {integrity: sha512-zmfNIjwYSWFY5chGBOjWtH3xAE7p97FTC6vR4Ep98290ho6AeAR/NVcBD274YCLEUYzqm8yxdtZlxMybU8a3jA==} + workerd@1.20260801.1: + resolution: {integrity: sha512-/g9JGTyqnHtoIscpBHqKD8swE2V4StBs2i69PmLiOhH45OP95jCFICl4F1hKlgN57rqfni5LiCitttoX5OOkVA==} engines: {node: '>=16'} hasBin: true - wrangler@4.118.0: - resolution: {integrity: sha512-9pkBw/b8zWqGx2S+oLhgHMR1M/4VOE8SynUFABnGWiSFGlcOQ4xiI/B71Xf66RYP2xzngU37IQFPtUruij3lYw==} + wrangler@4.119.0: + resolution: {integrity: sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^5.20260730.1 + '@cloudflare/workers-types': ^5.20260801.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -646,25 +646,25 @@ snapshots: '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260730.1)': + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260801.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260730.1 + workerd: 1.20260801.1 - '@cloudflare/workerd-darwin-64@1.20260730.1': + '@cloudflare/workerd-darwin-64@1.20260801.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260730.1': + '@cloudflare/workerd-darwin-arm64@1.20260801.1': optional: true - '@cloudflare/workerd-linux-64@1.20260730.1': + '@cloudflare/workerd-linux-64@1.20260801.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260730.1': + '@cloudflare/workerd-linux-arm64@1.20260801.1': optional: true - '@cloudflare/workerd-windows-64@1.20260730.1': + '@cloudflare/workerd-windows-64@1.20260801.1': optional: true '@cspotcode/source-map-support@0.8.1': @@ -987,12 +987,12 @@ snapshots: kleur@4.1.5: {} - miniflare@5.20260730.0-alpha: + miniflare@5.20260801.0-alpha: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.35.2 undici: 7.28.0 - workerd: 1.20260730.1 + workerd: 1.20260801.1 ws: 8.21.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -1075,24 +1075,24 @@ snapshots: optionalDependencies: typescript: 7.0.2 - workerd@1.20260730.1: + workerd@1.20260801.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260730.1 - '@cloudflare/workerd-darwin-arm64': 1.20260730.1 - '@cloudflare/workerd-linux-64': 1.20260730.1 - '@cloudflare/workerd-linux-arm64': 1.20260730.1 - '@cloudflare/workerd-windows-64': 1.20260730.1 + '@cloudflare/workerd-darwin-64': 1.20260801.1 + '@cloudflare/workerd-darwin-arm64': 1.20260801.1 + '@cloudflare/workerd-linux-64': 1.20260801.1 + '@cloudflare/workerd-linux-arm64': 1.20260801.1 + '@cloudflare/workerd-windows-64': 1.20260801.1 - wrangler@4.118.0: + wrangler@4.119.0: dependencies: '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260730.1) + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260801.1) blake3-wasm: 2.1.5 esbuild: 0.28.1 - miniflare: 5.20260730.0-alpha + miniflare: 5.20260801.0-alpha path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260730.1 + workerd: 1.20260801.1 optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: diff --git a/template_builder/Cargo.lock b/template_builder/Cargo.lock index 1035b108..dbf01757 100644 --- a/template_builder/Cargo.lock +++ b/template_builder/Cargo.lock @@ -1,18 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "either" @@ -20,30 +14,11 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys", -] - [[package]] name = "itertools" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" dependencies = [ "either", ] @@ -61,48 +36,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "memchr" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - [[package]] name = "same-file" version = "1.0.6" @@ -114,18 +70,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.203" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", @@ -134,20 +100,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", - "ryu", + "memchr", "serde", + "serde_core", + "zmij", ] [[package]] name = "syn" -version = "2.0.66" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -186,14 +154,11 @@ dependencies = [ [[package]] name = "which" -version = "6.0.1" +version = "8.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" dependencies = [ - "either", - "home", - "rustix", - "winsafe", + "libc", ] [[package]] @@ -279,7 +244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] -name = "winsafe" -version = "0.0.19" +name = "zmij" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/template_builder/Cargo.toml b/template_builder/Cargo.toml index f27713dd..6c9ca75c 100644 --- a/template_builder/Cargo.toml +++ b/template_builder/Cargo.toml @@ -4,11 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -proc-macro2 = "1.0.85" -anyhow = "1.0.86" -quote = "1.0.36" -which = "6.0.1" +proc-macro2 = "1.0.107" +anyhow = "1.0.104" +quote = "1.0.47" +which = "8.0.5" walkdir = "2.5.0" -serde = { version = "1.0.203", features = ["derive"] } -serde_json = "1.0.117" -itertools = "0.13.0" +serde = { version = "1.0.229", features = ["derive"] } +serde_json = "1.0.151" +itertools = "0.15.0" diff --git a/template_builder/src/utils.rs b/template_builder/src/utils.rs index 639956b2..73a645e6 100644 --- a/template_builder/src/utils.rs +++ b/template_builder/src/utils.rs @@ -77,6 +77,7 @@ pub struct PackageJsonPartial<'a> { name: Option<&'a str>, version: Option<&'a str>, r#type: Option<&'a str>, + imports: Option>>, scripts: Option>>, dependencies: Option>>, dev_dependencies: Option>>, @@ -99,6 +100,13 @@ impl ToTokens for PackageJsonPartial<'_> { Some(_type) => pieces.push(quote! { r#type: Some(#_type) }), None => pieces.push(quote! { r#type: None }), } + match &self.imports { + Some(imports) => { + let imports = hashmap_to_tokens(imports); + pieces.push(quote! { imports: Some(#imports) }) + } + None => pieces.push(quote! { imports: None }), + } match &self.scripts { Some(scripts) => { let scripts = hashmap_to_tokens(scripts); diff --git a/template_builder/templates/base/eslint.config.ts b/template_builder/templates/base/eslint.config.ts index 80423f27..f767f77d 100644 --- a/template_builder/templates/base/eslint.config.ts +++ b/template_builder/templates/base/eslint.config.ts @@ -1,9 +1,15 @@ import globals from 'globals'; import js from '@eslint/js'; +import { loadConfig } from '@sveltejs/load-config'; import svelte from 'eslint-plugin-svelte'; import { defineConfig } from 'eslint/config'; import ts from 'typescript-eslint'; +const svelte_config = await loadConfig('.'); +if (!svelte_config || !('config' in svelte_config)) { + throw new Error(`Failed to load Svelte config: ${svelte_config?.error}`); +} + export default defineConfig( js.configs.recommended, ts.configs.recommended, @@ -31,12 +37,7 @@ export default defineConfig( projectService: true, extraFileExtensions: ['.svelte'], parser: ts.parser, - svelteConfig: { - experimental: { async: true }, - kit: { - experimental: { remoteFunctions: true }, - }, - }, + svelteConfig: svelte_config.config, }, }, }, @@ -79,8 +80,8 @@ export default defineConfig( '.wrangler/', 'build/', 'dist/', - 'worker-configuration.d.ts', - 'db/schema.d.ts', + '**/worker-configuration.d.ts', + '**/db/schema.d.ts', ], }, ); diff --git a/template_builder/templates/base/package.json b/template_builder/templates/base/package.json index 43d0aaad..f36c61d7 100644 --- a/template_builder/templates/base/package.json +++ b/template_builder/templates/base/package.json @@ -2,6 +2,9 @@ "name": "template", "version": "0.0.0", "type": "module", + "imports": { + "#lib/*": "./src/lib/*" + }, "scripts": { "dev": "vite dev", "build": "vite build", @@ -10,13 +13,11 @@ "check": "svelte-kit sync && svelte-check --incremental --tsgo", "fmt": "oxfmt ." }, - "imports": { - "#lib/*": "./src/lib/*" - }, "dependencies": {}, "devDependencies": { "@eslint/js": "^10.0.1", "@sveltejs/adapter-auto": "^8.0.0-next.2", + "@sveltejs/load-config": "^0.2.1", "@sveltejs/kit": "^3.0.0-next.14", "@typescript/native": "npm:typescript@^7.0.2", "autoprefixer": "^10.5.4", diff --git a/template_builder/templates/base/src/app.html b/template_builder/templates/base/src/app.html index 0052a49f..8833162e 100644 --- a/template_builder/templates/base/src/app.html +++ b/template_builder/templates/base/src/app.html @@ -1,16 +1,14 @@ - + + + + __o7__name__ + + + %sveltekit.head% + - - - __o7__name__ - - - %sveltekit.head% - - - -
%sveltekit.body%
- - + +
%sveltekit.body%
+ diff --git a/template_builder/templates/base/tsconfig.json b/template_builder/templates/base/tsconfig.json index 00ef9b61..fb29be3c 100644 --- a/template_builder/templates/base/tsconfig.json +++ b/template_builder/templates/base/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "$app/tsconfig", - "include": ["src"] + "include": ["src", "*.config.ts"] } diff --git a/template_builder/templates/extras/prisma/{Turso}push.ts b/template_builder/templates/extras/prisma/{Turso}push.ts index 3e18b24c..75394e85 100644 --- a/template_builder/templates/extras/prisma/{Turso}push.ts +++ b/template_builder/templates/extras/prisma/{Turso}push.ts @@ -28,14 +28,12 @@ try { } // 1. Pull current schema -const current = await client.execute( - "SELECT * FROM sqlite_schema WHERE name != 'sqlite_sequence'", -); +const current = await client.execute("SELECT * FROM sqlite_schema WHERE name != 'sqlite_sequence'"); // 2. create dummy db with that schema const db = new Database(temp_db); for (const item of current.rows) { - if (item.sql && item.sql !== 'null') { + if (typeof item.sql === 'string' && item.sql !== 'null') { db.prepare(item.sql).run(); } } diff --git a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts b/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts index 9195cc07..33dd1f40 100644 --- a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts +++ b/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts @@ -1,5 +1,5 @@ -import { initDb } from '$lib/db'; -import { initAuth, validateSessionToken } from '$lib/auth'; +import { initDb } from '#lib/db'; +import { initAuth, validateSessionToken } from '#lib/auth'; import { dev } from '$app/env'; export async function handle({ event, resolve }) { diff --git a/template_builder/templates/extras/{D1,Turso}tsconfig.json b/template_builder/templates/extras/{D1,Turso}tsconfig.json new file mode 100644 index 00000000..48afced1 --- /dev/null +++ b/template_builder/templates/extras/{D1,Turso}tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "$app/tsconfig", + "include": ["src", "*.config.ts", "prisma/push.ts"] +} From a70fd87b942c8841f55c4b5bafd1544c4d869743 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Thu, 6 Aug 2026 21:25:57 -0700 Subject: [PATCH 19/22] ignore test.log --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 28884dd1..4217ff0e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target /my-o7-app node_modules +test.log From e9e76e175f386a850cc7d73ea60490c644eaf17f Mon Sep 17 00:00:00 2001 From: Ottomated Date: Fri, 7 Aug 2026 10:00:13 -0700 Subject: [PATCH 20/22] feat: remove better-sqlite3 dependency for D1 and Turso --- template_builder/templates/extras/prisma/{D1}push.ts | 8 ++++---- template_builder/templates/extras/prisma/{Turso}push.ts | 8 ++++---- template_builder/templates/extras/{D1}package.json | 4 ---- .../templates/extras/{Pnpm,D1|Turso}pnpm-workspace.yaml | 3 +++ .../extras/{Pnpm,Edge,D1|Turso}pnpm-workspace.yaml | 5 +++++ ...rkspace.yaml => {Pnpm,Edge,Sqlite}pnpm-workspace.yaml} | 0 ...pm-workspace.yaml => {Pnpm,Sqlite}pnpm-workspace.yaml} | 2 +- template_builder/templates/extras/{Sqlite}package.json | 6 ------ template_builder/templates/extras/{Turso}package.json | 4 ---- 9 files changed, 17 insertions(+), 23 deletions(-) create mode 100644 template_builder/templates/extras/{Pnpm,D1|Turso}pnpm-workspace.yaml create mode 100644 template_builder/templates/extras/{Pnpm,Edge,D1|Turso}pnpm-workspace.yaml rename template_builder/templates/extras/{{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml => {Pnpm,Edge,Sqlite}pnpm-workspace.yaml} (100%) rename template_builder/templates/extras/{{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml => {Pnpm,Sqlite}pnpm-workspace.yaml} (100%) diff --git a/template_builder/templates/extras/prisma/{D1}push.ts b/template_builder/templates/extras/prisma/{D1}push.ts index 0e06d120..6a868f52 100644 --- a/template_builder/templates/extras/prisma/{D1}push.ts +++ b/template_builder/templates/extras/prisma/{D1}push.ts @@ -1,8 +1,8 @@ import { spawnSync } from 'node:child_process'; -import Database from 'better-sqlite3'; +import { unlinkSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { loadEnvFile } from 'node:process'; -import { unlinkSync, writeFileSync } from 'node:fs'; +import { DatabaseSync } from 'node:sqlite'; import { fileURLToPath } from 'node:url'; loadEnvFile(); @@ -57,10 +57,10 @@ if (current_res.error) { const current = current_res[0].results; // 2. create dummy db with that schema -const db = new Database(temp_db); +const db = new DatabaseSync(temp_db); for (const item of current) { if (item.sql && item.sql !== 'null') { - db.prepare(item.sql).run(); + db.exec(item.sql); } } db.close(); diff --git a/template_builder/templates/extras/prisma/{Turso}push.ts b/template_builder/templates/extras/prisma/{Turso}push.ts index 75394e85..2839047a 100644 --- a/template_builder/templates/extras/prisma/{Turso}push.ts +++ b/template_builder/templates/extras/prisma/{Turso}push.ts @@ -1,8 +1,8 @@ import { spawnSync } from 'node:child_process'; -import Database from 'better-sqlite3'; +import { unlinkSync } from 'node:fs'; import { resolve } from 'node:path'; import { loadEnvFile } from 'node:process'; -import { unlinkSync } from 'node:fs'; +import { DatabaseSync } from 'node:sqlite'; import { fileURLToPath } from 'node:url'; import { createClient } from '@libsql/client'; @@ -31,10 +31,10 @@ try { const current = await client.execute("SELECT * FROM sqlite_schema WHERE name != 'sqlite_sequence'"); // 2. create dummy db with that schema -const db = new Database(temp_db); +const db = new DatabaseSync(temp_db); for (const item of current.rows) { if (typeof item.sql === 'string' && item.sql !== 'null') { - db.prepare(item.sql).run(); + db.exec(item.sql); } } db.close(); diff --git a/template_builder/templates/extras/{D1}package.json b/template_builder/templates/extras/{D1}package.json index 20c22892..be9677fa 100644 --- a/template_builder/templates/extras/{D1}package.json +++ b/template_builder/templates/extras/{D1}package.json @@ -5,9 +5,5 @@ }, "dependencies": { "kysely-d1": "^0.4.0" - }, - "devDependencies": { - "better-sqlite3": "^13.0.3", - "@types/better-sqlite3": "^9.6.0" } } diff --git a/template_builder/templates/extras/{Pnpm,D1|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,D1|Turso}pnpm-workspace.yaml new file mode 100644 index 00000000..7afba986 --- /dev/null +++ b/template_builder/templates/extras/{Pnpm,D1|Turso}pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + prisma: true + '@prisma/engines': true diff --git a/template_builder/templates/extras/{Pnpm,Edge,D1|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,Edge,D1|Turso}pnpm-workspace.yaml new file mode 100644 index 00000000..413190b6 --- /dev/null +++ b/template_builder/templates/extras/{Pnpm,Edge,D1|Turso}pnpm-workspace.yaml @@ -0,0 +1,5 @@ +allowBuilds: + esbuild: true + workerd: true + prisma: true + '@prisma/engines': true diff --git a/template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,Edge,Sqlite}pnpm-workspace.yaml similarity index 100% rename from template_builder/templates/extras/{Pnpm,Edge,D1|Sqlite|Turso}pnpm-workspace.yaml rename to template_builder/templates/extras/{Pnpm,Edge,Sqlite}pnpm-workspace.yaml diff --git a/template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml b/template_builder/templates/extras/{Pnpm,Sqlite}pnpm-workspace.yaml similarity index 100% rename from template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml rename to template_builder/templates/extras/{Pnpm,Sqlite}pnpm-workspace.yaml index bf1d15ab..2053f96c 100644 --- a/template_builder/templates/extras/{Pnpm,D1|Sqlite|Turso}pnpm-workspace.yaml +++ b/template_builder/templates/extras/{Pnpm,Sqlite}pnpm-workspace.yaml @@ -1,4 +1,4 @@ allowBuilds: prisma: true - better-sqlite3: true '@prisma/engines': true + better-sqlite3: true diff --git a/template_builder/templates/extras/{Sqlite}package.json b/template_builder/templates/extras/{Sqlite}package.json index b5d54282..bf8c0089 100644 --- a/template_builder/templates/extras/{Sqlite}package.json +++ b/template_builder/templates/extras/{Sqlite}package.json @@ -1,11 +1,5 @@ { "scripts": { "db:push": "prisma db push" - }, - "dependencies": { - "better-sqlite3": "^13.0.3" - }, - "devDependencies": { - "@types/better-sqlite3": "^9.6.0" } } diff --git a/template_builder/templates/extras/{Turso}package.json b/template_builder/templates/extras/{Turso}package.json index 2464dac2..a124c803 100644 --- a/template_builder/templates/extras/{Turso}package.json +++ b/template_builder/templates/extras/{Turso}package.json @@ -5,9 +5,5 @@ "dependencies": { "kysely-libsql": "^0.7.1", "@libsql/client": "^0.17.4" - }, - "devDependencies": { - "better-sqlite3": "^13.0.3", - "@types/better-sqlite3": "^9.6.0" } } From c5883430b252ab1359f5398e6063e157e3928701 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Fri, 7 Aug 2026 10:01:03 -0700 Subject: [PATCH 21/22] fix --- template_builder/templates/extras/{Sqlite}package.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/template_builder/templates/extras/{Sqlite}package.json b/template_builder/templates/extras/{Sqlite}package.json index bf8c0089..b5d54282 100644 --- a/template_builder/templates/extras/{Sqlite}package.json +++ b/template_builder/templates/extras/{Sqlite}package.json @@ -1,5 +1,11 @@ { "scripts": { "db:push": "prisma db push" + }, + "dependencies": { + "better-sqlite3": "^13.0.3" + }, + "devDependencies": { + "@types/better-sqlite3": "^9.6.0" } } From 9be939742d34800e28b5ce963a9ed5250aea3cd7 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Fri, 7 Aug 2026 12:49:28 -0700 Subject: [PATCH 22/22] feat: revamp auth --- .github/workflows/test.yml | 2 +- README.md | 1 - template_builder/templates/config.json | 8 +- .../workflows/{Bun,Sidecar}deploy-worker.yml | 31 ---- .../workflows/{Npm,Sidecar}deploy-worker.yml | 33 ----- .../workflows/{Pnpm,Sidecar}deploy-worker.yml | 35 ----- .../prisma/{D1|Turso,Auth}schema.prisma | 13 +- .../extras/prisma/{D1|Turso}schema.prisma | 3 +- .../extras/prisma/{Sqlite,Auth}schema.prisma | 13 +- .../extras/prisma/{Sqlite}schema.prisma | 3 +- .../extras/src/lib/auth/{Auth}index.ts | 117 --------------- .../templates/extras/src/lib/db/{D1}index.ts | 18 --- .../db/{D1|Sqlite|Turso,Auth}schema.d.ts | 22 ++- .../db/{D1|Sqlite|Turso}schema.d.ts | 0 .../extras/src/lib/server/db/{D1}index.ts | 25 ++++ .../src/lib/{ => server}/db/{Sqlite}index.ts | 11 ++ .../src/lib/{ => server}/db/{Turso}index.ts | 21 +-- .../extras/src/lib/server/{Auth}auth.ts | 139 ++++++++++++++++++ .../extras/src/{Auth,D1}hooks.server.ts | 34 ----- .../src/{Auth,Sqlite|Turso|D1}hooks.server.ts | 26 ++++ .../src/{Auth,Sqlite|Turso}hooks.server.ts | 31 ---- .../templates/extras/src/{D1}hooks.server.ts | 7 - .../extras/src/{Edge,Auth,D1,Sidecar}app.d.ts | 23 --- .../extras/src/{Edge,Auth,D1}app.d.ts | 19 --- .../extras/src/{Edge,Auth,Sidecar}app.d.ts | 23 --- .../extras/src/{Edge,D1,Sidecar}app.d.ts | 19 --- .../templates/extras/src/{Edge,D1}app.d.ts | 15 -- .../extras/src/{Edge,Sidecar}app.d.ts | 19 --- .../templates/extras/{Auth}package.json | 7 - ...}tsconfig.json => {D1|Turso}tsconfig.json} | 0 30 files changed, 258 insertions(+), 460 deletions(-) delete mode 100644 template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml delete mode 100644 template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml delete mode 100644 template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml delete mode 100644 template_builder/templates/extras/src/lib/auth/{Auth}index.ts delete mode 100644 template_builder/templates/extras/src/lib/db/{D1}index.ts rename template_builder/templates/extras/src/lib/{ => server}/db/{D1|Sqlite|Turso,Auth}schema.d.ts (58%) rename template_builder/templates/extras/src/lib/{ => server}/db/{D1|Sqlite|Turso}schema.d.ts (100%) create mode 100644 template_builder/templates/extras/src/lib/server/db/{D1}index.ts rename template_builder/templates/extras/src/lib/{ => server}/db/{Sqlite}index.ts (62%) rename template_builder/templates/extras/src/lib/{ => server}/db/{Turso}index.ts (66%) create mode 100644 template_builder/templates/extras/src/lib/server/{Auth}auth.ts delete mode 100644 template_builder/templates/extras/src/{Auth,D1}hooks.server.ts create mode 100644 template_builder/templates/extras/src/{Auth,Sqlite|Turso|D1}hooks.server.ts delete mode 100644 template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts delete mode 100644 template_builder/templates/extras/src/{D1}hooks.server.ts delete mode 100644 template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts delete mode 100644 template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts delete mode 100644 template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts delete mode 100644 template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts delete mode 100644 template_builder/templates/extras/src/{Edge,D1}app.d.ts delete mode 100644 template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts delete mode 100644 template_builder/templates/extras/{Auth}package.json rename template_builder/templates/extras/{{D1,Turso}tsconfig.json => {D1|Turso}tsconfig.json} (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c0dc17db..57af2fb4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: jobs: create-shards: - runs-on: ubuntu-latest + runs-on: ubuntu-slim permissions: {} outputs: shards: ${{ steps.shards.outputs.shards }} diff --git a/README.md b/README.md index 9304eadb..369ddd2e 100644 --- a/README.md +++ b/README.md @@ -45,4 +45,3 @@ Then, open your new app in your favorite IDE and get started! - [ ] auth user + pass option? - [ ] durable object patch - [ ] prisma 7? -- [ ] pnpm-workspace diff --git a/template_builder/templates/config.json b/template_builder/templates/config.json index d1d395e2..b5298372 100644 --- a/template_builder/templates/config.json +++ b/template_builder/templates/config.json @@ -40,16 +40,16 @@ "description": "" }, { - "id": "Sidecar", - "name": "Sidecar", - "description": "(Additional worker for websockets, etc.)", + "id": "Worker", + "name": "Custom Worker", + "description": "(Custom worker for WebSockets, etc.)", "hidden_if_not": ["Edge"], "default": false }, { "id": "Tailwind4", "name": "Tailwind 4", - "description": "(supported only by VERY modern browsers, not recommended)", + "description": "(supported only by very modern browsers)", "default": false } ] diff --git a/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml deleted file mode 100644 index a9cce85e..00000000 --- a/template_builder/templates/extras/.github/workflows/{Bun,Sidecar}deploy-worker.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Deploy Sidecar Worker - -on: - push: - branches: - - main - paths: - - 'worker/**' - - 'common/**' - - '.github/workflows/deploy-worker.yml' - - 'bun.lockb' - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - - - name: Install Bun - uses: oven-sh/setup-bun@v2 - - - name: Install dependencies - working-directory: worker - run: bun install --frozen-lockfile - - - name: Deploy - working-directory: worker - run: bun run deploy - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml deleted file mode 100644 index bc1e518a..00000000 --- a/template_builder/templates/extras/.github/workflows/{Npm,Sidecar}deploy-worker.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Deploy Sidecar Worker - -on: - push: - branches: - - main - paths: - - 'worker/**' - - 'common/**' - - '.github/workflows/deploy-worker.yml' - - 'package-lock.json' - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - - - name: Install node - uses: actions/setup-node@v7 - with: - cache: 'npm' - - - name: Install dependencies - working-directory: worker - run: npm ci - - - name: Deploy - working-directory: worker - run: npm run deploy - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml b/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml deleted file mode 100644 index 37b4051f..00000000 --- a/template_builder/templates/extras/.github/workflows/{Pnpm,Sidecar}deploy-worker.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Deploy Sidecar Worker - -on: - push: - branches: - - main - paths: - - 'worker/**' - - 'common/**' - - '.github/workflows/deploy-worker.yml' - - 'pnpm-lock.yaml' - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - - - name: Install pnpm - uses: pnpm/setup@c9883cc79df532ad1a7b81bf9ab944ceb090d65c # v2.0.0 - with: - version: ^11.20.0 - runtime: node@lts - install: false - - - name: Install dependencies - working-directory: worker - run: pnpm install --frozen-lockfile - - - name: Deploy - working-directory: worker - run: pnpm run deploy - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/template_builder/templates/extras/prisma/{D1|Turso,Auth}schema.prisma b/template_builder/templates/extras/prisma/{D1|Turso,Auth}schema.prisma index 6ac816a7..4e6c2b06 100644 --- a/template_builder/templates/extras/prisma/{D1|Turso,Auth}schema.prisma +++ b/template_builder/templates/extras/prisma/{D1|Turso,Auth}schema.prisma @@ -1,16 +1,17 @@ datasource db { provider = "sqlite" - url = "" } generator kysely { provider = "prisma-kysely" - output = "../src/lib/db" + output = "../src/lib/server/db" fileName = "schema.d.ts" } + model User { + /// @kyselyType(`u_${string}`) id String @id twitch_id String username String @@ -19,8 +20,14 @@ model User { } model Session { + /// @kyselyType(`s_${string}`) id String @id - expires_at Int + /// @kyselyType(`u_${string}`) user_id String + /// @kyselyType(Uint8Array) + hash Bytes + last_verified_at Int + created_at Int + user User @relation(fields: [user_id], references: [id]) } diff --git a/template_builder/templates/extras/prisma/{D1|Turso}schema.prisma b/template_builder/templates/extras/prisma/{D1|Turso}schema.prisma index b2360727..a9ec6d77 100644 --- a/template_builder/templates/extras/prisma/{D1|Turso}schema.prisma +++ b/template_builder/templates/extras/prisma/{D1|Turso}schema.prisma @@ -1,12 +1,11 @@ datasource db { provider = "sqlite" - url = "" } generator kysely { provider = "prisma-kysely" - output = "../src/lib/db" + output = "../src/lib/server/db" fileName = "schema.d.ts" } diff --git a/template_builder/templates/extras/prisma/{Sqlite,Auth}schema.prisma b/template_builder/templates/extras/prisma/{Sqlite,Auth}schema.prisma index bda62b2f..4e6c2b06 100644 --- a/template_builder/templates/extras/prisma/{Sqlite,Auth}schema.prisma +++ b/template_builder/templates/extras/prisma/{Sqlite,Auth}schema.prisma @@ -1,16 +1,17 @@ datasource db { provider = "sqlite" - url = env("DATABASE_URL") } generator kysely { provider = "prisma-kysely" - output = "../src/lib/db" + output = "../src/lib/server/db" fileName = "schema.d.ts" } + model User { + /// @kyselyType(`u_${string}`) id String @id twitch_id String username String @@ -19,8 +20,14 @@ model User { } model Session { + /// @kyselyType(`s_${string}`) id String @id - expires_at Int + /// @kyselyType(`u_${string}`) user_id String + /// @kyselyType(Uint8Array) + hash Bytes + last_verified_at Int + created_at Int + user User @relation(fields: [user_id], references: [id]) } diff --git a/template_builder/templates/extras/prisma/{Sqlite}schema.prisma b/template_builder/templates/extras/prisma/{Sqlite}schema.prisma index b3b21683..a9ec6d77 100644 --- a/template_builder/templates/extras/prisma/{Sqlite}schema.prisma +++ b/template_builder/templates/extras/prisma/{Sqlite}schema.prisma @@ -1,12 +1,11 @@ datasource db { provider = "sqlite" - url = env("DATABASE_URL") } generator kysely { provider = "prisma-kysely" - output = "../src/lib/db" + output = "../src/lib/server/db" fileName = "schema.d.ts" } diff --git a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts b/template_builder/templates/extras/src/lib/auth/{Auth}index.ts deleted file mode 100644 index cfa6e245..00000000 --- a/template_builder/templates/extras/src/lib/auth/{Auth}index.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Twitch } from 'arctic'; -import { - encodeBase32LowerCaseNoPadding, - encodeHexLowerCase, -} from '@oslojs/encoding'; -import { sha256 } from '@oslojs/crypto/sha2'; -import { generateRandomString, type RandomReader } from '@oslojs/crypto/random'; -import type { Selectable } from 'kysely'; -import { db } from '#lib/db'; -import { CLIENT_ID, CLIENT_SECRET } from '$app/env/private'; -import type { DB } from '#lib/db/schema'; - -const ONE_DAY = 1000 * 60 * 60 * 24; - -const random: RandomReader = { - read(bytes: Uint8Array): void { - crypto.getRandomValues(bytes); - }, -}; - -export function generateId(length = 15): string { - return generateRandomString( - random, - 'abcdefghijklmnopqrstuvwxyz0123456789', - length, - ); -} - -export function generateSessionToken(): string { - const bytes = new Uint8Array(20); - crypto.getRandomValues(bytes); - const token = encodeBase32LowerCaseNoPadding(bytes); - return token; -} - -export async function createSession( - token: string, - userId: string, -): Promise { - const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); - const session: Session = { - id: sessionId, - userId, - expiresAt: new Date(Date.now() + ONE_DAY * 7), - }; - await db - .insertInto('Session') - .values({ - id: session.id, - user_id: session.userId, - expires_at: Math.floor(session.expiresAt.getTime() / 1000), - }) - .execute(); - return session; -} - -export async function validateSessionToken( - token: string, -): Promise { - const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); - const row = await db - .selectFrom('Session as s') - .innerJoin('User as u', 'u.id', 's.user_id') - .select(['s.id', 's.user_id', 's.expires_at', 'u.twitch_id', 'u.username']) - .where('s.id', '=', sessionId) - .executeTakeFirst(); - if (!row) { - return { session: null, user: null }; - } - const session: Session = { - id: row.id, - userId: row.user_id, - expiresAt: new Date(row.expires_at * 1000), - }; - if (Date.now() >= session.expiresAt.getTime()) { - await db.deleteFrom('Session').where('id', '=', session.id).execute(); - return { session: null, user: null }; - } - const user: User = { - id: row.user_id, - twitch_id: row.twitch_id, - username: row.username, - }; - if (Date.now() >= session.expiresAt.getTime() - ONE_DAY * 15) { - session.expiresAt = new Date(Date.now() + ONE_DAY * 30); - await db - .updateTable('Session') - .set({ - expires_at: Math.floor(session.expiresAt.getTime() / 1000), - }) - .where('id', '=', session.id) - .execute(); - } - return { session, user }; -} - -export async function invalidateSession(sessionId: string): Promise { - await db.deleteFrom('Session').where('id', '=', sessionId).execute(); -} - -export type SessionValidationResult = - | { session: Session; user: User } - | { session: null; user: null }; - -export interface Session { - id: string; - userId: string; - expiresAt: Date; -} - -export type User = Selectable; - -export let twitch: Twitch; -export function initAuth(origin: string) { - if (twitch) return; - twitch = new Twitch(CLIENT_ID, CLIENT_SECRET, origin + '/api/auth/callback'); -} diff --git a/template_builder/templates/extras/src/lib/db/{D1}index.ts b/template_builder/templates/extras/src/lib/db/{D1}index.ts deleted file mode 100644 index ddad5200..00000000 --- a/template_builder/templates/extras/src/lib/db/{D1}index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Kysely, type RawBuilder, sql } from 'kysely'; -import { D1Dialect } from 'kysely-d1'; -import type { DB } from './schema'; - -export let db: Kysely; - -export function initDb(database: D1Database) { - if (db) return; - db = new Kysely({ - dialect: new D1Dialect({ - database, - }), - }); -} - -export function json(obj: T): RawBuilder { - return sql`${JSON.stringify(obj)}`; -} diff --git a/template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso,Auth}schema.d.ts b/template_builder/templates/extras/src/lib/server/db/{D1|Sqlite|Turso,Auth}schema.d.ts similarity index 58% rename from template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso,Auth}schema.d.ts rename to template_builder/templates/extras/src/lib/server/db/{D1|Sqlite|Turso,Auth}schema.d.ts index b494d043..feb01f98 100644 --- a/template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso,Auth}schema.d.ts +++ b/template_builder/templates/extras/src/lib/server/db/{D1|Sqlite|Turso,Auth}schema.d.ts @@ -6,12 +6,26 @@ export type Generated = export type Timestamp = ColumnType; export type Session = { - id: string; - expires_at: number; - user_id: string; + /** + * @kyselyType(`s_${string}`) + */ + id: `s_${string}`; + /** + * @kyselyType(`u_${string}`) + */ + user_id: `u_${string}`; + /** + * @kyselyType(Uint8Array) + */ + hash: Uint8Array; + last_verified_at: number; + created_at: number; }; export type User = { - id: string; + /** + * @kyselyType(`u_${string}`) + */ + id: `u_${string}`; twitch_id: string; username: string; }; diff --git a/template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso}schema.d.ts b/template_builder/templates/extras/src/lib/server/db/{D1|Sqlite|Turso}schema.d.ts similarity index 100% rename from template_builder/templates/extras/src/lib/db/{D1|Sqlite|Turso}schema.d.ts rename to template_builder/templates/extras/src/lib/server/db/{D1|Sqlite|Turso}schema.d.ts diff --git a/template_builder/templates/extras/src/lib/server/db/{D1}index.ts b/template_builder/templates/extras/src/lib/server/db/{D1}index.ts new file mode 100644 index 00000000..55cabed3 --- /dev/null +++ b/template_builder/templates/extras/src/lib/server/db/{D1}index.ts @@ -0,0 +1,25 @@ +import { Kysely, type RawBuilder, sql } from 'kysely'; +import { D1Dialect } from 'kysely-d1'; +import type { DB } from './schema'; +import * as v from 'valibot'; +import { env } from 'cloudflare:workers'; + +export const db = Kysely({ + dialect: new D1Dialect({ + database: env.DB, + }), +}) + +export function json(obj: T): RawBuilder { + return sql`${JSON.stringify(obj)}`; +} + +export function check_id(prefix: Prefix) { + return v.startsWith(prefix + '_') as v.BaseValidation< + string, + `${Prefix}_${string}`, + v.StartsWithIssue + >; +} + +export type { DB }; diff --git a/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts b/template_builder/templates/extras/src/lib/server/db/{Sqlite}index.ts similarity index 62% rename from template_builder/templates/extras/src/lib/db/{Sqlite}index.ts rename to template_builder/templates/extras/src/lib/server/db/{Sqlite}index.ts index ff9487a5..f8a6c0c6 100644 --- a/template_builder/templates/extras/src/lib/db/{Sqlite}index.ts +++ b/template_builder/templates/extras/src/lib/server/db/{Sqlite}index.ts @@ -2,6 +2,7 @@ import { Kysely, type RawBuilder, sql, SqliteDialect } from 'kysely'; import Database from 'better-sqlite3'; import { DATABASE_URL } from '$app/env/private'; import type { DB } from './schema'; +import * as v from 'valibot'; export const sqlite = new Database(DATABASE_URL); @@ -14,3 +15,13 @@ export const db = new Kysely({ export function json(obj: T): RawBuilder { return sql`${JSON.stringify(obj)}`; } + +export function check_id(prefix: Prefix) { + return v.startsWith(prefix + '_') as v.BaseValidation< + string, + `${Prefix}_${string}`, + v.StartsWithIssue + >; +} + +export type { DB }; diff --git a/template_builder/templates/extras/src/lib/db/{Turso}index.ts b/template_builder/templates/extras/src/lib/server/db/{Turso}index.ts similarity index 66% rename from template_builder/templates/extras/src/lib/db/{Turso}index.ts rename to template_builder/templates/extras/src/lib/server/db/{Turso}index.ts index 6f92e0ac..858be571 100644 --- a/template_builder/templates/extras/src/lib/db/{Turso}index.ts +++ b/template_builder/templates/extras/src/lib/server/db/{Turso}index.ts @@ -1,17 +1,9 @@ import { Kysely, type RawBuilder, sql } from 'kysely'; import { LibsqlDialect } from 'kysely-libsql'; import type { DB } from './schema'; -import { dev } from '$app/env'; import { TURSO_TOKEN, TURSO_URL } from '$app/env/private'; import { createClient } from '@libsql/client'; - -if (!TURSO_URL || !TURSO_TOKEN) { - if (dev) { - throw new Error('TURSO_URL and TURSO_TOKEN must be set'); - } else { - console.warn('TURSO_URL and TURSO_TOKEN must be set'); - } -} +import * as v from 'valibot'; export const db_client = createClient({ url: TURSO_URL, @@ -25,3 +17,14 @@ export const db = new Kysely({ export function json(obj: T): RawBuilder { return sql`${JSON.stringify(obj)}`; } + +export function check_id(prefix: Prefix) { + return v.startsWith(prefix + '_') as v.BaseValidation< + string, + `${Prefix}_${string}`, + v.StartsWithIssue + >; +} + +export type { DB }; + diff --git a/template_builder/templates/extras/src/lib/server/{Auth}auth.ts b/template_builder/templates/extras/src/lib/server/{Auth}auth.ts new file mode 100644 index 00000000..d7983f36 --- /dev/null +++ b/template_builder/templates/extras/src/lib/server/{Auth}auth.ts @@ -0,0 +1,139 @@ +import type { Selectable } from 'kysely'; +import { check_id, db, type DB } from '#lib/server/db'; +import * as v from 'valibot'; +import { nanoid } from 'nanoid'; + +const ONE_DAY = 1000 * 60 * 60 * 24; + +const SESSION_EXPIRES_IN = ONE_DAY * 10; + +export async function createSession( + userId: `u_${string}`, +): Promise<{ session: Session; token: string }> { + const id = `s_${nanoid()}` as const; + + const secret = new Uint8Array(32); + crypto.getRandomValues(secret); + + const secretHash = new Uint8Array(await crypto.subtle.digest('SHA-256', secret)); + + const token = `${id}.${secret.toBase64()}`; + + const now = Date.now(); + const session: Session = { + id, + userId, + expiresAt: new Date(now + SESSION_EXPIRES_IN), + }; + const unixNow = Math.floor(now / 1000); + await db + .insertInto('Session') + .values({ + id: session.id, + user_id: session.userId, + hash: secretHash, + last_verified_at: unixNow, + created_at: unixNow, + }) + .execute(); + return { session, token }; +} + +const sessionTokenSchema = v.pipe( + v.string(), + v.transform((token) => token.split('.')), + v.strictTuple([ + v.pipe(v.string(), v.length(21), check_id('s')), + v.pipe( + v.string(), + v.rawTransform(({ dataset, NEVER }) => { + try { + return Uint8Array.fromBase64(dataset.value); + } catch { + return NEVER; + } + }), + ), + ]), +); +const invalid_session = Object.freeze({ session: null, user: null }); + +export async function validateSessionToken(token: string): Promise { + const tokenResult = v.safeParse(sessionTokenSchema, token); + if (!tokenResult.success) return invalid_session; + + const [sessionId, secret] = tokenResult.output; + + const row = await db + .selectFrom('Session as s') + .innerJoin('User as u', 'u.id', 's.user_id') + .select(['s.id', 's.user_id', 's.hash', 's.last_verified_at', 'u.twitch_id', 'u.username']) + .where('s.id', '=', sessionId) + .executeTakeFirst(); + + if (!row) { + return invalid_session; + } + + const now = Date.now(); + const sinceLastVerified = now - row.last_verified_at * 1000; + if (sinceLastVerified >= SESSION_EXPIRES_IN) { + await invalidateSession(row.id); + return invalid_session; + } + + const secretHash = new Uint8Array(await crypto.subtle.digest('SHA-256', secret)); + const secretCorrect = constantTimeEqual(secretHash, row.hash); + if (!secretCorrect) { + return { session: null, user: null }; + } + + if (sinceLastVerified >= 60 * 60 * 1000) { + row.last_verified_at = Math.floor(now / 1000); + await db + .updateTable('Session') + .set({ + last_verified_at: row.last_verified_at, + }) + .where('id', '=', row.id) + .execute(); + } + + return { + session: { + id: row.id, + userId: row.user_id, + expiresAt: new Date(row.last_verified_at + SESSION_EXPIRES_IN), + }, + user: { + id: row.user_id, + twitch_id: row.twitch_id, + username: row.username, + }, + }; +} + +export async function invalidateSession(sessionId: `s_${string}`): Promise { + await db.deleteFrom('Session').where('id', '=', sessionId).execute(); +} + +function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean { + if (a.byteLength !== b.byteLength) { + return false; + } + let c = 0; + for (let i = 0; i < a.byteLength; i++) { + c |= a[i] ^ b[i]; + } + return c === 0; +} + +export type SessionValidationResult = { session: Session; user: User } | typeof invalid_session; + +export type Session = { + id: `s_${string}`; + userId: `u_${string}`; + expiresAt: Date; +}; + +export type User = Selectable; diff --git a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts b/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts deleted file mode 100644 index 33dd1f40..00000000 --- a/template_builder/templates/extras/src/{Auth,D1}hooks.server.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { initDb } from '#lib/db'; -import { initAuth, validateSessionToken } from '#lib/auth'; -import { dev } from '$app/env'; - -export async function handle({ event, resolve }) { - const db = event.platform!.env.DB; - initAuth(event.url.origin); - initDb(db); - const sessionToken = event.cookies.get('session'); - if (!sessionToken) { - event.locals.user = null; - event.locals.session = null; - return resolve(event); - } - - const { session, user } = await validateSessionToken(sessionToken); - if (session) { - event.cookies.set('session', sessionToken, { - path: '/', - httpOnly: true, - sameSite: 'lax', - expires: session.expiresAt, - secure: !dev, - }); - } else { - event.cookies.delete('session', { - path: '/', - }); - } - - event.locals.user = user; - event.locals.session = session; - return resolve(event); -} diff --git a/template_builder/templates/extras/src/{Auth,Sqlite|Turso|D1}hooks.server.ts b/template_builder/templates/extras/src/{Auth,Sqlite|Turso|D1}hooks.server.ts new file mode 100644 index 00000000..2054d7fe --- /dev/null +++ b/template_builder/templates/extras/src/{Auth,Sqlite|Turso|D1}hooks.server.ts @@ -0,0 +1,26 @@ +import { validateSessionToken } from '#lib/auth'; +import { dev } from '$app/env'; + +export async function handle({ event, resolve }) { + const sessionToken = event.cookies.get('session'); + if (!sessionToken) { + event.locals.user = null; + event.locals.session = null; + } else { + const { session, user } = await validateSessionToken(sessionToken); + if (session) { + event.cookies.set('session', sessionToken, { + httpOnly: true, + sameSite: 'lax', + expires: session.expiresAt, + secure: !dev, + }); + } else { + event.cookies.delete('session'); + } + event.locals.user = user; + event.locals.session = session; + } + + return resolve(event); +} diff --git a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts b/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts deleted file mode 100644 index 6d5c502d..00000000 --- a/template_builder/templates/extras/src/{Auth,Sqlite|Turso}hooks.server.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { initAuth, validateSessionToken } from '#lib/auth'; -import { dev } from '$app/env'; - -export async function handle({ event, resolve }) { - initAuth(event.url.origin); - const sessionToken = event.cookies.get('session'); - if (!sessionToken) { - event.locals.user = null; - event.locals.session = null; - return resolve(event); - } - - const { session, user } = await validateSessionToken(sessionToken); - if (session) { - event.cookies.set('session', sessionToken, { - path: '/', - httpOnly: true, - sameSite: 'lax', - expires: session.expiresAt, - secure: !dev, - }); - } else { - event.cookies.delete('session', { - path: '/', - }); - } - - event.locals.user = user; - event.locals.session = session; - return resolve(event); -} diff --git a/template_builder/templates/extras/src/{D1}hooks.server.ts b/template_builder/templates/extras/src/{D1}hooks.server.ts deleted file mode 100644 index 4283a90e..00000000 --- a/template_builder/templates/extras/src/{D1}hooks.server.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { initDb } from '#lib/db'; - -export async function handle({ event, resolve }) { - const db = event.platform!.env.DB; - initDb(db); - return resolve(event); -} diff --git a/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts deleted file mode 100644 index de849407..00000000 --- a/template_builder/templates/extras/src/{Edge,Auth,D1,Sidecar}app.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env & { - SOCKET_OBJECT: DurableObjectNamespace< - import('../worker/src/worker').SocketObject - >; - }; - ctx: ExecutionContext; - } - - interface Locals { - user: import('#lib/auth').User | null; - session: import('#lib/auth').Session | null; - } - - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts deleted file mode 100644 index 7d15f326..00000000 --- a/template_builder/templates/extras/src/{Edge,Auth,D1}app.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env; - ctx: ExecutionContext; - } - - interface Locals { - user: import('#lib/auth').User | null; - session: import('#lib/auth').Session | null; - } - - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts deleted file mode 100644 index de849407..00000000 --- a/template_builder/templates/extras/src/{Edge,Auth,Sidecar}app.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env & { - SOCKET_OBJECT: DurableObjectNamespace< - import('../worker/src/worker').SocketObject - >; - }; - ctx: ExecutionContext; - } - - interface Locals { - user: import('#lib/auth').User | null; - session: import('#lib/auth').Session | null; - } - - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts deleted file mode 100644 index 62c7c28e..00000000 --- a/template_builder/templates/extras/src/{Edge,D1,Sidecar}app.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env & { - SOCKET_OBJECT: DurableObjectNamespace< - import('../worker/src/worker').SocketObject - >; - }; - ctx: ExecutionContext; - } - - // interface Locals {} - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/src/{Edge,D1}app.d.ts b/template_builder/templates/extras/src/{Edge,D1}app.d.ts deleted file mode 100644 index d5cb300f..00000000 --- a/template_builder/templates/extras/src/{Edge,D1}app.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env; - ctx: ExecutionContext; - } - - // interface Locals {} - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts b/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts deleted file mode 100644 index 62c7c28e..00000000 --- a/template_builder/templates/extras/src/{Edge,Sidecar}app.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare global { - namespace App { - interface Platform { - env: Cloudflare.Env & { - SOCKET_OBJECT: DurableObjectNamespace< - import('../worker/src/worker').SocketObject - >; - }; - ctx: ExecutionContext; - } - - // interface Locals {} - // interface Error {} - // interface PageData {} - // interface PageState {} - } -} - -export {}; diff --git a/template_builder/templates/extras/{Auth}package.json b/template_builder/templates/extras/{Auth}package.json deleted file mode 100644 index eb939eb7..00000000 --- a/template_builder/templates/extras/{Auth}package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "dependencies": { - "arctic": "^3.7.0", - "@oslojs/crypto": "^1.0.1", - "@oslojs/encoding": "^1.1.0" - } -} diff --git a/template_builder/templates/extras/{D1,Turso}tsconfig.json b/template_builder/templates/extras/{D1|Turso}tsconfig.json similarity index 100% rename from template_builder/templates/extras/{D1,Turso}tsconfig.json rename to template_builder/templates/extras/{D1|Turso}tsconfig.json