alchemy 0.45.6 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/alchemy.mjs +19285 -15137
- package/bin/alchemy.ts +14 -56
- package/bin/commands/create.ts +307 -137
- package/bin/commands/deploy.ts +23 -0
- package/bin/commands/destroy.ts +19 -0
- package/bin/commands/dev.ts +21 -0
- package/bin/commands/login.ts +66 -0
- package/bin/commands/run.ts +29 -0
- package/bin/services/dependencies.ts +0 -5
- package/bin/services/execute-alchemy.ts +160 -0
- package/bin/services/git.ts +27 -0
- package/bin/services/github-workflow.ts +229 -0
- package/bin/services/package-manager.ts +51 -68
- package/bin/services/template-manager.ts +10 -21
- package/bin/trpc.ts +3 -0
- package/bin/types.ts +4 -2
- package/lib/apply.d.ts +2 -0
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +26 -8
- package/lib/apply.js.map +1 -1
- package/lib/build-date.d.ts +1 -1
- package/lib/build-date.js +1 -1
- package/lib/cloudflare/ai.d.ts +8 -4
- package/lib/cloudflare/ai.d.ts.map +1 -1
- package/lib/cloudflare/ai.js +6 -8
- package/lib/cloudflare/ai.js.map +1 -1
- package/lib/cloudflare/analytics-engine.d.ts +11 -7
- package/lib/cloudflare/analytics-engine.d.ts.map +1 -1
- package/lib/cloudflare/analytics-engine.js +11 -9
- package/lib/cloudflare/analytics-engine.js.map +1 -1
- package/lib/cloudflare/{types.d.ts → api-response.d.ts} +6 -1
- package/lib/cloudflare/api-response.d.ts.map +1 -0
- package/lib/cloudflare/api-response.js +38 -0
- package/lib/cloudflare/api-response.js.map +1 -0
- package/lib/cloudflare/auth-wrangler.d.ts +25 -0
- package/lib/cloudflare/auth-wrangler.d.ts.map +1 -0
- package/lib/cloudflare/auth-wrangler.js +224 -0
- package/lib/cloudflare/auth-wrangler.js.map +1 -0
- package/lib/cloudflare/auth.d.ts.map +1 -1
- package/lib/cloudflare/auth.js +7 -116
- package/lib/cloudflare/auth.js.map +1 -1
- package/lib/cloudflare/browser-rendering.d.ts +12 -3
- package/lib/cloudflare/browser-rendering.d.ts.map +1 -1
- package/lib/cloudflare/browser-rendering.js +12 -2
- package/lib/cloudflare/browser-rendering.js.map +1 -1
- package/lib/cloudflare/bundle/fs.d.ts.map +1 -1
- package/lib/cloudflare/bundle/fs.js +3 -0
- package/lib/cloudflare/bundle/fs.js.map +1 -1
- package/lib/cloudflare/bundle/internal-worker-bundle.d.ts +6 -0
- package/lib/cloudflare/bundle/internal-worker-bundle.d.ts.map +1 -0
- package/lib/cloudflare/bundle/internal-worker-bundle.js +14 -0
- package/lib/cloudflare/bundle/internal-worker-bundle.js.map +1 -0
- package/lib/cloudflare/compatibility-presets.d.ts +22 -0
- package/lib/cloudflare/compatibility-presets.d.ts.map +1 -0
- package/lib/cloudflare/compatibility-presets.js +27 -0
- package/lib/cloudflare/compatibility-presets.js.map +1 -0
- package/lib/cloudflare/container.d.ts +5 -1
- package/lib/cloudflare/container.d.ts.map +1 -1
- package/lib/cloudflare/container.js +42 -2
- package/lib/cloudflare/container.js.map +1 -1
- package/lib/cloudflare/dispatch-namespace.d.ts +5 -0
- package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
- package/lib/cloudflare/dispatch-namespace.js +8 -0
- package/lib/cloudflare/dispatch-namespace.js.map +1 -1
- package/lib/cloudflare/durable-object-namespace.d.ts +23 -15
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
- package/lib/cloudflare/durable-object-namespace.js +22 -21
- package/lib/cloudflare/durable-object-namespace.js.map +1 -1
- package/lib/cloudflare/hyperdrive.d.ts +19 -5
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +14 -0
- package/lib/cloudflare/hyperdrive.js.map +1 -1
- package/lib/cloudflare/images.d.ts +27 -17
- package/lib/cloudflare/images.d.ts.map +1 -1
- package/lib/cloudflare/images.js +13 -8
- package/lib/cloudflare/images.js.map +1 -1
- package/lib/cloudflare/index.d.ts +1 -3
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +1 -3
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/miniflare/miniflare.d.ts +3 -3
- package/lib/cloudflare/miniflare/miniflare.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/miniflare.js +7 -7
- package/lib/cloudflare/miniflare/miniflare.js.map +1 -1
- package/lib/cloudflare/miniflare/{mixed-mode.d.ts → remote-binding-proxy.d.ts} +5 -5
- package/lib/cloudflare/miniflare/remote-binding-proxy.d.ts.map +1 -0
- package/lib/cloudflare/miniflare/{mixed-mode.js → remote-binding-proxy.js} +16 -52
- package/lib/cloudflare/miniflare/remote-binding-proxy.js.map +1 -0
- package/lib/cloudflare/state.d.ts +26 -0
- package/lib/cloudflare/state.d.ts.map +1 -0
- package/lib/cloudflare/state.js +14 -0
- package/lib/cloudflare/state.js.map +1 -0
- package/lib/cloudflare/user.d.ts +2 -2
- package/lib/cloudflare/user.d.ts.map +1 -1
- package/lib/cloudflare/user.js +7 -21
- package/lib/cloudflare/user.js.map +1 -1
- package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-index.js +5 -2
- package/lib/cloudflare/vectorize-index.js.map +1 -1
- package/lib/cloudflare/version-metadata.d.ts +15 -3
- package/lib/cloudflare/version-metadata.d.ts.map +1 -1
- package/lib/cloudflare/version-metadata.js +11 -2
- package/lib/cloudflare/version-metadata.js.map +1 -1
- package/lib/cloudflare/vite.d.ts.map +1 -1
- package/lib/cloudflare/vite.js +2 -1
- package/lib/cloudflare/vite.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts +13 -2
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +10 -15
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker-subdomain.d.ts +7 -0
- package/lib/cloudflare/worker-subdomain.d.ts.map +1 -1
- package/lib/cloudflare/worker-subdomain.js +17 -22
- package/lib/cloudflare/worker-subdomain.js.map +1 -1
- package/lib/cloudflare/{worker/tail.d.ts → worker-tail.d.ts} +2 -2
- package/lib/cloudflare/worker-tail.d.ts.map +1 -0
- package/lib/cloudflare/{worker/tail.js → worker-tail.js} +11 -9
- package/lib/cloudflare/worker-tail.js.map +1 -0
- package/lib/cloudflare/worker.d.ts +18 -8
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +31 -7
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/workflow.d.ts +22 -11
- package/lib/cloudflare/workflow.d.ts.map +1 -1
- package/lib/cloudflare/workflow.js +23 -18
- package/lib/cloudflare/workflow.js.map +1 -1
- package/lib/context.d.ts +2 -2
- package/lib/context.d.ts.map +1 -1
- package/lib/docker/api.d.ts.map +1 -1
- package/lib/docker/api.js +30 -8
- package/lib/docker/api.js.map +1 -1
- package/lib/fs/file-system-state-store.d.ts +5 -20
- package/lib/fs/file-system-state-store.d.ts.map +1 -1
- package/lib/fs/file-system-state-store.js +5 -121
- package/lib/fs/file-system-state-store.js.map +1 -1
- package/lib/fs/index.d.ts +0 -1
- package/lib/fs/index.d.ts.map +1 -1
- package/lib/fs/index.js +0 -1
- package/lib/fs/index.js.map +1 -1
- package/lib/llms.cloudflare.txt +6 -5
- package/lib/planetscale/password.js +1 -1
- package/lib/planetscale/password.js.map +1 -1
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +3 -6
- package/lib/scope.js.map +1 -1
- package/lib/state/cloudflare-state-store.d.ts +34 -0
- package/lib/state/cloudflare-state-store.d.ts.map +1 -0
- package/lib/state/cloudflare-state-store.js +116 -0
- package/lib/state/cloudflare-state-store.js.map +1 -0
- package/lib/state/d1-state-store.d.ts +15 -0
- package/lib/state/d1-state-store.d.ts.map +1 -0
- package/lib/{cloudflare → state}/d1-state-store.js +31 -27
- package/lib/state/d1-state-store.js.map +1 -0
- package/lib/{cloudflare/do-state-store/types.d.ts → state/dofs-state-store/api.d.ts} +1 -1
- package/lib/state/dofs-state-store/api.d.ts.map +1 -0
- package/lib/state/dofs-state-store/api.js +1 -0
- package/lib/state/dofs-state-store/api.js.map +1 -0
- package/lib/{cloudflare/do-state-store/store.d.ts → state/dofs-state-store/index.d.ts} +10 -5
- package/lib/state/dofs-state-store/index.d.ts.map +1 -0
- package/lib/{cloudflare/do-state-store/store.js → state/dofs-state-store/index.js} +15 -11
- package/lib/state/dofs-state-store/index.js.map +1 -0
- package/lib/{cloudflare/do-state-store/internal.d.ts → state/dofs-state-store/store.d.ts} +4 -5
- package/lib/state/dofs-state-store/store.d.ts.map +1 -0
- package/lib/{cloudflare/do-state-store/internal.js → state/dofs-state-store/store.js} +7 -22
- package/lib/state/dofs-state-store/store.js.map +1 -0
- package/lib/state/file-system-state-store.d.ts +21 -0
- package/lib/state/file-system-state-store.d.ts.map +1 -0
- package/lib/state/file-system-state-store.js +122 -0
- package/lib/state/file-system-state-store.js.map +1 -0
- package/lib/state/index.d.ts +7 -0
- package/lib/state/index.d.ts.map +1 -0
- package/lib/state/index.js +7 -0
- package/lib/state/index.js.map +1 -0
- package/lib/state/migrations.d.ts +2 -0
- package/lib/state/migrations.d.ts.map +1 -0
- package/lib/state/migrations.js +3 -0
- package/lib/state/migrations.js.map +1 -0
- package/lib/state/operations.d.ts +36 -0
- package/lib/state/operations.d.ts.map +1 -0
- package/lib/state/operations.js +126 -0
- package/lib/state/operations.js.map +1 -0
- package/lib/state/proxy.d.ts +53 -0
- package/lib/state/proxy.d.ts.map +1 -0
- package/lib/state/proxy.js +65 -0
- package/lib/state/proxy.js.map +1 -0
- package/lib/{cloudflare → state}/r2-rest-state-store.d.ts +3 -1
- package/lib/state/r2-rest-state-store.d.ts.map +1 -0
- package/lib/{cloudflare → state}/r2-rest-state-store.js +6 -4
- package/lib/state/r2-rest-state-store.js.map +1 -0
- package/lib/state/schema.d.ts.map +1 -0
- package/lib/state/schema.js.map +1 -0
- package/lib/{sqlite → state}/sqlite-state-store.d.ts +5 -3
- package/lib/state/sqlite-state-store.d.ts.map +1 -0
- package/lib/{sqlite → state}/sqlite-state-store.js +15 -6
- package/lib/state/sqlite-state-store.js.map +1 -0
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +3 -6
- package/lib/test/vitest.js.map +1 -1
- package/lib/util/detect-node-runtime.d.ts +3 -0
- package/lib/util/detect-node-runtime.d.ts.map +1 -0
- package/lib/util/detect-node-runtime.js +10 -0
- package/lib/util/detect-node-runtime.js.map +1 -0
- package/lib/util/detect-package-manager.d.ts +2 -2
- package/lib/util/detect-package-manager.d.ts.map +1 -1
- package/lib/util/detect-package-manager.js +15 -5
- package/lib/util/detect-package-manager.js.map +1 -1
- package/lib/util/http-server.d.ts.map +1 -0
- package/lib/{cloudflare/miniflare → util}/http-server.js +1 -1
- package/lib/util/http-server.js.map +1 -0
- package/lib/util/memoize.d.ts +2 -0
- package/lib/util/memoize.d.ts.map +1 -1
- package/lib/util/memoize.js +14 -7
- package/lib/util/memoize.js.map +1 -1
- package/lib/util/neverthrow.d.ts +9 -0
- package/lib/util/neverthrow.d.ts.map +1 -0
- package/lib/util/neverthrow.js +29 -0
- package/lib/util/neverthrow.js.map +1 -0
- package/package.json +18 -16
- package/src/apply.ts +31 -10
- package/src/build-date.ts +1 -1
- package/src/cloudflare/ai.ts +10 -5
- package/src/cloudflare/analytics-engine.ts +20 -11
- package/src/cloudflare/{types.ts → api-response.ts} +31 -0
- package/src/cloudflare/auth-wrangler.ts +314 -0
- package/src/cloudflare/auth.ts +8 -156
- package/src/cloudflare/browser-rendering.ts +16 -2
- package/src/cloudflare/bundle/fs.ts +5 -0
- package/src/cloudflare/bundle/internal-worker-bundle.ts +21 -0
- package/src/cloudflare/compatibility-presets.ts +34 -0
- package/src/cloudflare/container.ts +70 -3
- package/src/cloudflare/dispatch-namespace.ts +28 -0
- package/src/cloudflare/durable-object-namespace.ts +38 -27
- package/src/cloudflare/hyperdrive.ts +19 -5
- package/src/cloudflare/images.ts +32 -17
- package/src/cloudflare/index.ts +1 -3
- package/src/cloudflare/miniflare/miniflare.ts +10 -7
- package/src/cloudflare/miniflare/{mixed-mode.ts → remote-binding-proxy.ts} +25 -75
- package/src/cloudflare/state.ts +35 -0
- package/src/cloudflare/user.ts +55 -70
- package/src/cloudflare/vectorize-index.ts +7 -2
- package/src/cloudflare/version-metadata.ts +19 -2
- package/src/cloudflare/vite.ts +2 -1
- package/src/cloudflare/worker-metadata.ts +18 -43
- package/src/cloudflare/worker-subdomain.ts +43 -37
- package/src/cloudflare/{worker/tail.ts → worker-tail.ts} +13 -10
- package/src/cloudflare/worker.ts +65 -19
- package/src/cloudflare/workflow.ts +38 -19
- package/src/context.ts +2 -2
- package/src/docker/api.ts +33 -8
- package/src/fs/file-system-state-store.ts +5 -148
- package/src/fs/index.ts +0 -1
- package/src/llms.cloudflare.txt +6 -5
- package/src/planetscale/password.ts +1 -1
- package/src/scope.ts +3 -6
- package/src/state/cloudflare-state-store.ts +170 -0
- package/src/state/d1-state-store.ts +102 -0
- package/src/{cloudflare/do-state-store/store.ts → state/dofs-state-store/index.ts} +20 -13
- package/src/{cloudflare/do-state-store/internal.ts → state/dofs-state-store/store.ts} +9 -27
- package/src/state/file-system-state-store.ts +149 -0
- package/src/state/index.ts +6 -0
- package/src/state/migrations.ts +9 -0
- package/src/state/operations.ts +152 -0
- package/src/state/proxy.ts +132 -0
- package/src/{cloudflare → state}/r2-rest-state-store.ts +11 -8
- package/src/{sqlite → state}/sqlite-state-store.ts +18 -10
- package/src/test/vitest.ts +8 -6
- package/src/util/detect-node-runtime.ts +12 -0
- package/src/util/detect-package-manager.ts +19 -6
- package/src/{cloudflare/miniflare → util}/http-server.ts +1 -1
- package/src/util/memoize.ts +18 -7
- package/src/util/neverthrow.ts +36 -0
- package/templates/astro/package.json +3 -3
- package/templates/nuxt/package.json +3 -3
- package/templates/react-router/package.json +3 -3
- package/templates/rwsdk/alchemy.run.ts +1 -1
- package/templates/rwsdk/package.json +3 -3
- package/templates/sveltekit/package.json +3 -3
- package/templates/tanstack-start/package.json +3 -3
- package/templates/typescript/package.json +3 -2
- package/templates/typescript/tsconfig.json +1 -0
- package/templates/vite/package.json +3 -3
- package/workers/cloudflare-state-store.js +5638 -0
- package/workers/cloudflare-state-store.ts +108 -0
- package/workers/{do-state-store.js → dofs-state-store.js} +4 -4
- package/workers/{do-state-store.ts → dofs-state-store.ts} +12 -8
- package/workers/{mixed-mode-proxy-worker.js → remote-binding-proxy.js} +3 -3
- package/workers/remote-binding-proxy.ts +45 -0
- package/lib/cloudflare/d1-state-store.d.ts +0 -10
- package/lib/cloudflare/d1-state-store.d.ts.map +0 -1
- package/lib/cloudflare/d1-state-store.js.map +0 -1
- package/lib/cloudflare/do-state-store/index.d.ts +0 -2
- package/lib/cloudflare/do-state-store/index.d.ts.map +0 -1
- package/lib/cloudflare/do-state-store/index.js +0 -2
- package/lib/cloudflare/do-state-store/index.js.map +0 -1
- package/lib/cloudflare/do-state-store/internal.d.ts.map +0 -1
- package/lib/cloudflare/do-state-store/internal.js.map +0 -1
- package/lib/cloudflare/do-state-store/store.d.ts.map +0 -1
- package/lib/cloudflare/do-state-store/store.js.map +0 -1
- package/lib/cloudflare/do-state-store/types.d.ts.map +0 -1
- package/lib/cloudflare/do-state-store/types.js +0 -1
- package/lib/cloudflare/do-state-store/types.js.map +0 -1
- package/lib/cloudflare/miniflare/http-server.d.ts.map +0 -1
- package/lib/cloudflare/miniflare/http-server.js.map +0 -1
- package/lib/cloudflare/miniflare/mixed-mode.d.ts.map +0 -1
- package/lib/cloudflare/miniflare/mixed-mode.js.map +0 -1
- package/lib/cloudflare/r2-rest-state-store.d.ts.map +0 -1
- package/lib/cloudflare/r2-rest-state-store.js.map +0 -1
- package/lib/cloudflare/types.d.ts.map +0 -1
- package/lib/cloudflare/types.js +0 -19
- package/lib/cloudflare/types.js.map +0 -1
- package/lib/cloudflare/worker/shared.d.ts +0 -4
- package/lib/cloudflare/worker/shared.d.ts.map +0 -1
- package/lib/cloudflare/worker/shared.js +0 -21
- package/lib/cloudflare/worker/shared.js.map +0 -1
- package/lib/cloudflare/worker/tail.d.ts.map +0 -1
- package/lib/cloudflare/worker/tail.js.map +0 -1
- package/lib/sqlite/base-sqlite-state-store.d.ts +0 -31
- package/lib/sqlite/base-sqlite-state-store.d.ts.map +0 -1
- package/lib/sqlite/base-sqlite-state-store.js +0 -124
- package/lib/sqlite/base-sqlite-state-store.js.map +0 -1
- package/lib/sqlite/index.d.ts +0 -2
- package/lib/sqlite/index.d.ts.map +0 -1
- package/lib/sqlite/index.js +0 -2
- package/lib/sqlite/index.js.map +0 -1
- package/lib/sqlite/schema.d.ts.map +0 -1
- package/lib/sqlite/schema.js.map +0 -1
- package/lib/sqlite/sqlite-state-store.d.ts.map +0 -1
- package/lib/sqlite/sqlite-state-store.js.map +0 -1
- package/src/cloudflare/d1-state-store.ts +0 -105
- package/src/cloudflare/do-state-store/index.ts +0 -1
- package/src/cloudflare/worker/shared.ts +0 -30
- package/src/sqlite/base-sqlite-state-store.ts +0 -199
- package/src/sqlite/index.ts +0 -1
- package/templates/typescript/src/worker.js +0 -5
- package/workers/mixed-mode-proxy-worker.ts +0 -46
- /package/drizzle/{0000_busy_mauler.sql → default/0000_busy_mauler.sql} +0 -0
- /package/drizzle/{0001_concerned_iceman.sql → default/0001_concerned_iceman.sql} +0 -0
- /package/drizzle/{meta → default/meta}/0000_snapshot.json +0 -0
- /package/drizzle/{meta → default/meta}/0001_snapshot.json +0 -0
- /package/drizzle/{meta → default/meta}/_journal.json +0 -0
- /package/lib/{sqlite → state}/schema.d.ts +0 -0
- /package/lib/{sqlite → state}/schema.js +0 -0
- /package/lib/{cloudflare/miniflare → util}/http-server.d.ts +0 -0
- /package/src/{cloudflare/do-state-store/types.ts → state/dofs-state-store/api.ts} +0 -0
- /package/src/{sqlite → state}/schema.ts +0 -0
package/src/cloudflare/index.ts
CHANGED
|
@@ -18,10 +18,8 @@ export * from "./d1-clone.ts";
|
|
|
18
18
|
export * from "./d1-database.ts";
|
|
19
19
|
export * from "./d1-export.ts";
|
|
20
20
|
export * from "./d1-import.ts";
|
|
21
|
-
export * from "./d1-state-store.ts";
|
|
22
21
|
export * from "./dispatch-namespace.ts";
|
|
23
22
|
export * from "./dns-records.ts";
|
|
24
|
-
export * from "./do-state-store/index.ts";
|
|
25
23
|
export * from "./durable-object-namespace.ts";
|
|
26
24
|
export * from "./email-address.ts";
|
|
27
25
|
export * from "./email-catch-all.ts";
|
|
@@ -37,7 +35,6 @@ export * from "./permission-groups.ts";
|
|
|
37
35
|
export * from "./pipeline.ts";
|
|
38
36
|
export * from "./queue-consumer.ts";
|
|
39
37
|
export * from "./queue.ts";
|
|
40
|
-
export * from "./r2-rest-state-store.ts";
|
|
41
38
|
export * from "./react-router.ts";
|
|
42
39
|
export * from "./redirect-rule.ts";
|
|
43
40
|
export * from "./redwood.ts";
|
|
@@ -45,6 +42,7 @@ export * from "./route.ts";
|
|
|
45
42
|
export * from "./secret-key.ts";
|
|
46
43
|
export * from "./secret.ts";
|
|
47
44
|
export * from "./secrets-store.ts";
|
|
45
|
+
export * from "./state.ts";
|
|
48
46
|
export * from "./sveltekit.ts";
|
|
49
47
|
export * from "./tanstack-start.ts";
|
|
50
48
|
export * from "./vectorize-index.ts";
|
|
@@ -7,24 +7,27 @@ import {
|
|
|
7
7
|
} from "miniflare";
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import { findOpenPort } from "../../util/find-open-port.ts";
|
|
10
|
+
import { HTTPServer } from "../../util/http-server.ts";
|
|
10
11
|
import { logger } from "../../util/logger.ts";
|
|
11
12
|
import {
|
|
12
13
|
promiseWithResolvers,
|
|
13
14
|
type PromiseWithResolvers,
|
|
14
15
|
} from "../../util/promise-with-resolvers.ts";
|
|
15
|
-
import { HTTPServer } from "./http-server.ts";
|
|
16
16
|
import {
|
|
17
17
|
buildMiniflareWorkerOptions,
|
|
18
18
|
buildRemoteBindings,
|
|
19
19
|
type MiniflareWorkerOptions,
|
|
20
20
|
} from "./miniflare-worker-options.ts";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
createRemoteProxyWorker,
|
|
23
|
+
type RemoteBindingProxy,
|
|
24
|
+
} from "./remote-binding-proxy.ts";
|
|
22
25
|
|
|
23
26
|
class MiniflareServer {
|
|
24
27
|
miniflare?: Miniflare;
|
|
25
28
|
workers = new Map<string, WorkerOptions>();
|
|
26
29
|
servers = new Map<string, HTTPServer>();
|
|
27
|
-
|
|
30
|
+
remoteBindingProxies = new Map<string, RemoteBindingProxy>();
|
|
28
31
|
|
|
29
32
|
stream = new WritableStream<{
|
|
30
33
|
worker: MiniflareWorkerOptions;
|
|
@@ -104,7 +107,7 @@ class MiniflareServer {
|
|
|
104
107
|
await Promise.all([
|
|
105
108
|
this.miniflare?.dispose(),
|
|
106
109
|
...Array.from(this.servers.values()).map((server) => server.stop()),
|
|
107
|
-
...Array.from(this.
|
|
110
|
+
...Array.from(this.remoteBindingProxies.values()).map((proxy) =>
|
|
108
111
|
proxy.server.stop(),
|
|
109
112
|
),
|
|
110
113
|
]);
|
|
@@ -120,7 +123,7 @@ class MiniflareServer {
|
|
|
120
123
|
if (bindings.length === 0) {
|
|
121
124
|
return undefined;
|
|
122
125
|
}
|
|
123
|
-
const existing = this.
|
|
126
|
+
const existing = this.remoteBindingProxies.get(worker.name);
|
|
124
127
|
if (
|
|
125
128
|
existing?.bindings.every((b) =>
|
|
126
129
|
bindings.find((b2) => b2.name === b.name && b2.type === b.type),
|
|
@@ -128,11 +131,11 @@ class MiniflareServer {
|
|
|
128
131
|
) {
|
|
129
132
|
return existing.connectionString;
|
|
130
133
|
}
|
|
131
|
-
const proxy = await
|
|
134
|
+
const proxy = await createRemoteProxyWorker({
|
|
132
135
|
name: `mixed-mode-proxy-${crypto.randomUUID()}`,
|
|
133
136
|
bindings,
|
|
134
137
|
});
|
|
135
|
-
this.
|
|
138
|
+
this.remoteBindingProxies.set(worker.name, proxy);
|
|
136
139
|
return proxy.connectionString;
|
|
137
140
|
}
|
|
138
141
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { RemoteProxyConnectionString } from "miniflare";
|
|
2
|
+
import { HTTPServer } from "../../util/http-server.ts";
|
|
3
|
+
import { extractCloudflareResult } from "../api-response.ts";
|
|
2
4
|
import { createCloudflareApi, type CloudflareApi } from "../api.ts";
|
|
3
5
|
import type { WorkerBindingSpec } from "../bindings.ts";
|
|
4
|
-
import
|
|
6
|
+
import { getInternalWorkerBundle } from "../bundle/internal-worker-bundle.ts";
|
|
5
7
|
import type { WorkerMetadata } from "../worker-metadata.ts";
|
|
6
|
-
import { getAccountSubdomain, getWorkerTemplate } from "../worker/shared.ts";
|
|
7
|
-
import { HTTPServer } from "./http-server.ts";
|
|
8
8
|
|
|
9
9
|
type WranglerSessionConfig =
|
|
10
10
|
| {
|
|
@@ -22,41 +22,39 @@ interface WorkersPreviewSession {
|
|
|
22
22
|
token: string;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export async function
|
|
25
|
+
export async function createRemoteProxyWorker(input: {
|
|
26
26
|
name: string;
|
|
27
27
|
bindings: WorkerBindingSpec[];
|
|
28
28
|
}) {
|
|
29
29
|
const api = await createCloudflareApi();
|
|
30
|
-
const script = await
|
|
30
|
+
const script = await getInternalWorkerBundle("remote-binding-proxy");
|
|
31
31
|
const [token, subdomain] = await Promise.all([
|
|
32
32
|
createWorkersPreviewToken(api, {
|
|
33
33
|
name: input.name,
|
|
34
34
|
metadata: {
|
|
35
|
-
main_module: script.name,
|
|
35
|
+
main_module: script.file.name,
|
|
36
36
|
compatibility_date: "2025-06-16",
|
|
37
37
|
bindings: input.bindings,
|
|
38
38
|
observability: {
|
|
39
39
|
enabled: false,
|
|
40
40
|
},
|
|
41
41
|
},
|
|
42
|
-
files: [script],
|
|
42
|
+
files: [script.file],
|
|
43
43
|
session: {
|
|
44
44
|
workers_dev: true,
|
|
45
45
|
minimal_mode: true,
|
|
46
46
|
},
|
|
47
47
|
}),
|
|
48
|
-
getAccountSubdomain(api),
|
|
48
|
+
import("../worker-subdomain.ts").then((m) => m.getAccountSubdomain(api)),
|
|
49
49
|
]);
|
|
50
|
-
return new
|
|
50
|
+
return new RemoteBindingProxy(
|
|
51
51
|
`https://${input.name}.${subdomain}.workers.dev`,
|
|
52
52
|
token,
|
|
53
53
|
input.bindings,
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
export class MixedModeProxy {
|
|
57
|
+
export class RemoteBindingProxy {
|
|
60
58
|
server: HTTPServer;
|
|
61
59
|
|
|
62
60
|
constructor(
|
|
@@ -100,27 +98,6 @@ export class MixedModeProxy {
|
|
|
100
98
|
responseHeaders.delete("transfer-encoding");
|
|
101
99
|
responseHeaders.delete("content-encoding");
|
|
102
100
|
|
|
103
|
-
if (DEBUG) {
|
|
104
|
-
const clone = res.clone();
|
|
105
|
-
console.log({
|
|
106
|
-
request: {
|
|
107
|
-
url: url.toString(),
|
|
108
|
-
method: req.method,
|
|
109
|
-
headers,
|
|
110
|
-
body: req.body,
|
|
111
|
-
},
|
|
112
|
-
response: {
|
|
113
|
-
status: res.status,
|
|
114
|
-
headers: res.headers,
|
|
115
|
-
body: await res.text(),
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
return new Response(clone.body, {
|
|
119
|
-
status: clone.status,
|
|
120
|
-
headers: responseHeaders,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
101
|
return new Response(res.body, {
|
|
125
102
|
status: res.status,
|
|
126
103
|
headers: responseHeaders,
|
|
@@ -144,8 +121,9 @@ async function createWorkersPreviewToken(
|
|
|
144
121
|
formData.append(file.name, file);
|
|
145
122
|
}
|
|
146
123
|
formData.append("wrangler-session-config", JSON.stringify(input.session));
|
|
147
|
-
const res = await
|
|
148
|
-
|
|
124
|
+
const res = await extractCloudflareResult<{ preview_token: string }>(
|
|
125
|
+
"create workers preview token",
|
|
126
|
+
api.post(
|
|
149
127
|
`/accounts/${api.accountId}/workers/scripts/${input.name}/edge-preview`,
|
|
150
128
|
formData,
|
|
151
129
|
{
|
|
@@ -153,13 +131,8 @@ async function createWorkersPreviewToken(
|
|
|
153
131
|
"cf-preview-upload-config-token": session.token,
|
|
154
132
|
},
|
|
155
133
|
},
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
parseCloudflareResponse<{ preview_token: string }>(
|
|
159
|
-
res,
|
|
160
|
-
"Failed to create workers preview token",
|
|
161
|
-
),
|
|
162
|
-
);
|
|
134
|
+
),
|
|
135
|
+
);
|
|
163
136
|
// Fire and forget prewarm call
|
|
164
137
|
// (see https://github.com/cloudflare/workers-sdk/blob/6c6afbd6072b96e78e67d3a863ed849c6aa49472/packages/wrangler/src/dev/create-worker-preview.ts#L338)
|
|
165
138
|
void prewarm(session.prewarm, res.preview_token);
|
|
@@ -178,42 +151,19 @@ async function prewarm(url: string, previewToken: string) {
|
|
|
178
151
|
}
|
|
179
152
|
|
|
180
153
|
async function createWorkersPreviewSession(api: CloudflareApi) {
|
|
181
|
-
const { exchange_url } = await
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}>(res, "Failed to create workers preview session"),
|
|
188
|
-
);
|
|
189
|
-
return await fetch(exchange_url).then((res) =>
|
|
190
|
-
parseResponse<WorkersPreviewSession>(
|
|
191
|
-
res,
|
|
192
|
-
"Failed to create workers preview session",
|
|
193
|
-
),
|
|
154
|
+
const { exchange_url } = await extractCloudflareResult<{
|
|
155
|
+
exchange_url: string;
|
|
156
|
+
token: string;
|
|
157
|
+
}>(
|
|
158
|
+
"create workers preview session",
|
|
159
|
+
api.get(`/accounts/${api.accountId}/workers/subdomain/edge-preview`),
|
|
194
160
|
);
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
async function parseResponse<T>(res: Response, message: string): Promise<T> {
|
|
161
|
+
const res = await fetch(exchange_url);
|
|
198
162
|
if (!res.ok) {
|
|
199
|
-
throw new Error(`${message} (${res.status} ${res.statusText})`);
|
|
200
|
-
}
|
|
201
|
-
const json: T = await res.json();
|
|
202
|
-
return json;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async function parseCloudflareResponse<T>(
|
|
206
|
-
res: Response,
|
|
207
|
-
message: string,
|
|
208
|
-
): Promise<T> {
|
|
209
|
-
const json: CloudflareApiResponse<T> = await res.json();
|
|
210
|
-
if (!json.success) {
|
|
211
163
|
throw new Error(
|
|
212
|
-
|
|
164
|
+
`Failed to create workers preview session: ${res.status} ${res.statusText}`,
|
|
213
165
|
);
|
|
214
166
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
return json.result;
|
|
167
|
+
const json: WorkersPreviewSession = await res.json();
|
|
168
|
+
return json;
|
|
219
169
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
D1StateStore as _D1StateStore,
|
|
3
|
+
DOFSStateStore as _DOFSStateStore,
|
|
4
|
+
R2RestStateStore as _R2RestStateStore,
|
|
5
|
+
} from "../state/index.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated Use `R2RestStateStore` from `alchemy/state` instead.
|
|
9
|
+
*/
|
|
10
|
+
export const R2RestStateStore = _R2RestStateStore;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use `R2RestStateStore` from `alchemy/state` instead.
|
|
14
|
+
*/
|
|
15
|
+
export type R2RestStateStore = _R2RestStateStore;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated This state store is no longer recommended for production use. Please use {@link https://alchemy.run/guides/cloudflare-state-store/ CloudflareStateStore} from `alchemy/state` instead.
|
|
19
|
+
*/
|
|
20
|
+
export const DOStateStore = _DOFSStateStore;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @deprecated Use `DOStateStore` from `alchemy/state` instead.
|
|
24
|
+
*/
|
|
25
|
+
export type DOStateStore = _DOFSStateStore;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Use `D1StateStore` from `alchemy/state` instead.
|
|
29
|
+
*/
|
|
30
|
+
export const D1StateStore = _D1StateStore;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use `D1StateStore` from `alchemy/state` instead.
|
|
34
|
+
*/
|
|
35
|
+
export type D1StateStore = _D1StateStore;
|
package/src/cloudflare/user.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Secret } from "../secret.ts";
|
|
2
2
|
import { logger } from "../util/logger.ts";
|
|
3
|
+
import { memoize } from "../util/memoize.ts";
|
|
3
4
|
import { CloudflareApiError } from "./api-error.ts";
|
|
4
5
|
import {
|
|
5
6
|
getCloudflareAuthHeaders,
|
|
@@ -55,82 +56,66 @@ export interface CloudflareOrganization {
|
|
|
55
56
|
roles: string[];
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
email: options.email,
|
|
67
|
-
});
|
|
68
|
-
if (accountCache[cacheKey]) {
|
|
69
|
-
return accountCache[cacheKey];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const headers = await getCloudflareAuthHeaders(options);
|
|
73
|
-
const accounts = await fetch(
|
|
74
|
-
"https://api.cloudflare.com/client/v4/accounts",
|
|
75
|
-
{
|
|
76
|
-
headers,
|
|
77
|
-
},
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
if (accounts.ok) {
|
|
81
|
-
return (accountCache[cacheKey] ??= ((await accounts.json()) as any).result);
|
|
82
|
-
} else {
|
|
83
|
-
throw new CloudflareApiError(
|
|
84
|
-
`Failed to get accounts for authorized user, please make sure you're authenticated (see: https://alchemy.run/guides/cloudflare/) or explicitly set the Cloudflare Account ID (see: https://alchemy.run/guides/cloudflare/#account-id)`,
|
|
85
|
-
accounts,
|
|
59
|
+
export const getCloudflareAccounts = memoize(
|
|
60
|
+
async (options: CloudflareAuthOptions): Promise<CloudflareAccount[]> => {
|
|
61
|
+
const headers = await getCloudflareAuthHeaders(options);
|
|
62
|
+
const accounts = await fetch(
|
|
63
|
+
"https://api.cloudflare.com/client/v4/accounts",
|
|
64
|
+
{
|
|
65
|
+
headers,
|
|
66
|
+
},
|
|
86
67
|
);
|
|
87
|
-
|
|
88
|
-
|
|
68
|
+
if (accounts.ok) {
|
|
69
|
+
return ((await accounts.json()) as any).result;
|
|
70
|
+
} else {
|
|
71
|
+
throw new CloudflareApiError(
|
|
72
|
+
`Failed to get accounts for authorized user, please make sure you're authenticated (see: https://alchemy.run/guides/cloudflare/) or explicitly set the Cloudflare Account ID (see: https://alchemy.run/guides/cloudflare/#account-id)`,
|
|
73
|
+
accounts,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
);
|
|
89
78
|
|
|
90
|
-
const
|
|
79
|
+
export const getUserEmailFromApiKey = memoize(
|
|
80
|
+
async (apiKey: string): Promise<string> => {
|
|
81
|
+
try {
|
|
82
|
+
// Call the /user endpoint to get user information
|
|
83
|
+
const response = await fetch(
|
|
84
|
+
"https://api.cloudflare.com/client/v4/user",
|
|
85
|
+
{
|
|
86
|
+
headers: {
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
"X-Auth-Key": apiKey,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
);
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Failed to get user information: ${response.status} ${response.statusText}`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
const data = (await response.json()) as {
|
|
100
|
+
success: boolean;
|
|
101
|
+
result: {
|
|
102
|
+
id: string;
|
|
103
|
+
email: string;
|
|
104
|
+
name: string;
|
|
105
|
+
[key: string]: any;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
99
108
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"Content-Type": "application/json",
|
|
104
|
-
"X-Auth-Key": apiKey,
|
|
105
|
-
},
|
|
106
|
-
});
|
|
109
|
+
if (!data.success || !data.result || !data.result.email) {
|
|
110
|
+
throw new Error("Cloudflare API did not return valid user information");
|
|
111
|
+
}
|
|
107
112
|
|
|
108
|
-
|
|
113
|
+
return data.result.email;
|
|
114
|
+
} catch (error) {
|
|
115
|
+
logger.error("Error retrieving email from Cloudflare API:", error);
|
|
109
116
|
throw new Error(
|
|
110
|
-
|
|
117
|
+
"Failed to automatically discover email for API Key authentication",
|
|
111
118
|
);
|
|
112
119
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
success: boolean;
|
|
116
|
-
result: {
|
|
117
|
-
id: string;
|
|
118
|
-
email: string;
|
|
119
|
-
name: string;
|
|
120
|
-
[key: string]: any;
|
|
121
|
-
};
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
if (!data.success || !data.result || !data.result.email) {
|
|
125
|
-
throw new Error("Cloudflare API did not return valid user information");
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
emailCache[apiKey] = data.result.email;
|
|
129
|
-
return data.result.email;
|
|
130
|
-
} catch (error) {
|
|
131
|
-
logger.error("Error retrieving email from Cloudflare API:", error);
|
|
132
|
-
throw new Error(
|
|
133
|
-
"Failed to automatically discover email for API Key authentication",
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
120
|
+
},
|
|
121
|
+
);
|
|
@@ -169,7 +169,7 @@ const _VectorizeIndex = Resource(
|
|
|
169
169
|
if (
|
|
170
170
|
props.adopt &&
|
|
171
171
|
error instanceof CloudflareApiError &&
|
|
172
|
-
error.message.includes("
|
|
172
|
+
error.message.includes("vectorize.index.duplicate_name")
|
|
173
173
|
) {
|
|
174
174
|
logger.log(`Index ${indexName} already exists, adopting it`);
|
|
175
175
|
// Find the existing index
|
|
@@ -321,7 +321,12 @@ export async function deleteIndex(
|
|
|
321
321
|
`/accounts/${api.accountId}/vectorize/v2/indexes/${indexName}`,
|
|
322
322
|
);
|
|
323
323
|
|
|
324
|
-
if (
|
|
324
|
+
if (
|
|
325
|
+
!deleteResponse.ok &&
|
|
326
|
+
// not 404 (Not Found) or 410 (Gone)
|
|
327
|
+
deleteResponse.status !== 404 &&
|
|
328
|
+
deleteResponse.status !== 410
|
|
329
|
+
) {
|
|
325
330
|
const errorData: any = await deleteResponse.json().catch(() => ({
|
|
326
331
|
errors: [{ message: deleteResponse.statusText }],
|
|
327
332
|
}));
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Type representing a version metadata binding.
|
|
2
3
|
* @see https://developers.cloudflare.com/workers/runtime-apis/bindings/version-metadata/
|
|
3
4
|
*/
|
|
4
|
-
export
|
|
5
|
-
|
|
5
|
+
export type VersionMetadata = {
|
|
6
|
+
type: "version_metadata";
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a version metadata binding that provides access to version information at runtime.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const metadata = VersionMetadata();
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @see https://developers.cloudflare.com/workers/runtime-apis/bindings/version-metadata/
|
|
18
|
+
*/
|
|
19
|
+
export function VersionMetadata(): VersionMetadata {
|
|
20
|
+
return {
|
|
21
|
+
type: "version_metadata",
|
|
22
|
+
};
|
|
6
23
|
}
|
package/src/cloudflare/vite.ts
CHANGED
|
@@ -18,12 +18,13 @@ export async function Vite<B extends Bindings>(
|
|
|
18
18
|
props: ViteProps<B>,
|
|
19
19
|
): Promise<Vite<B>> {
|
|
20
20
|
const defaultAssets = path.join("dist", "client");
|
|
21
|
-
const packageManager = detectPackageManager();
|
|
21
|
+
const packageManager = await detectPackageManager();
|
|
22
22
|
const devCommand = {
|
|
23
23
|
npm: "npx vite dev",
|
|
24
24
|
bun: "bun vite dev",
|
|
25
25
|
pnpm: "pnpm vite dev",
|
|
26
26
|
yarn: "yarn vite dev",
|
|
27
|
+
deno: "deno vite dev",
|
|
27
28
|
}[packageManager];
|
|
28
29
|
return Website(id, {
|
|
29
30
|
...props,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { assertNever } from "../util/assert-never.ts";
|
|
2
2
|
import { logger } from "../util/logger.ts";
|
|
3
3
|
import { memoize } from "../util/memoize.ts";
|
|
4
|
+
import { extractCloudflareResult } from "./api-response.ts";
|
|
4
5
|
import type { CloudflareApi } from "./api.ts";
|
|
5
6
|
import {
|
|
6
7
|
Self,
|
|
@@ -200,7 +201,7 @@ export interface WorkerMetadata {
|
|
|
200
201
|
|
|
201
202
|
export async function prepareWorkerMetadata(
|
|
202
203
|
api: CloudflareApi,
|
|
203
|
-
props: WorkerProps & {
|
|
204
|
+
props: Omit<WorkerProps, "entrypoint"> & {
|
|
204
205
|
compatibilityDate: string;
|
|
205
206
|
compatibilityFlags: string[];
|
|
206
207
|
workerName: string;
|
|
@@ -210,6 +211,7 @@ export async function prepareWorkerMetadata(
|
|
|
210
211
|
keepAssets?: boolean;
|
|
211
212
|
assetConfig?: AssetsConfig;
|
|
212
213
|
};
|
|
214
|
+
tags?: string[];
|
|
213
215
|
unstable_cacheWorkerSettings?: boolean;
|
|
214
216
|
},
|
|
215
217
|
): Promise<WorkerMetadata> {
|
|
@@ -226,7 +228,7 @@ export async function prepareWorkerMetadata(
|
|
|
226
228
|
// we use Cloudflare Worker tags to store a mapping between Alchemy's stable identifier and the binding name
|
|
227
229
|
// e.g.
|
|
228
230
|
// {
|
|
229
|
-
// BINDING_NAME:
|
|
231
|
+
// BINDING_NAME: DurableObjectNamespace("stable-id")
|
|
230
232
|
// }
|
|
231
233
|
// will be stored as alchemy:do:stable-id:BINDING_NAME
|
|
232
234
|
// TODO(sam): should we base64 encode to ensure no `:` collision risk?
|
|
@@ -323,6 +325,7 @@ export async function prepareWorkerMetadata(
|
|
|
323
325
|
),
|
|
324
326
|
// encode the migraiton tag if there is one so we can avoid the failed PutWorker after adoption
|
|
325
327
|
...(newMigrationTag ? [`alchemy:migration-tag:${newMigrationTag}`] : []),
|
|
328
|
+
...(props.tags ?? []),
|
|
326
329
|
],
|
|
327
330
|
migrations: {
|
|
328
331
|
old_tag: oldMigrationTag,
|
|
@@ -640,6 +643,7 @@ interface WorkerSettings {
|
|
|
640
643
|
compatibility_date: string;
|
|
641
644
|
compatibility_flags: string[];
|
|
642
645
|
migrations: SingleStepMigration | MultiStepMigration;
|
|
646
|
+
tags: string[];
|
|
643
647
|
[key: string]: any;
|
|
644
648
|
}
|
|
645
649
|
|
|
@@ -648,51 +652,22 @@ const getWorkerSettingsWithCache = memoize(
|
|
|
648
652
|
(api, workerName) => `${api.accountId}:${workerName}`,
|
|
649
653
|
);
|
|
650
654
|
|
|
651
|
-
async function getWorkerSettings(
|
|
655
|
+
export async function getWorkerSettings(
|
|
652
656
|
api: CloudflareApi,
|
|
653
657
|
workerName: string,
|
|
654
658
|
): Promise<WorkerSettings | undefined> {
|
|
655
659
|
// Fetch the bindings for a worker by calling the Cloudflare API endpoint:
|
|
656
660
|
// GET /accounts/:account_id/workers/scripts/:script_name/bindings
|
|
657
661
|
// See: https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/script_and_version_settings/methods/get/
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
}
|
|
669
|
-
// The result is an object with a "result" property containing the bindings array
|
|
670
|
-
const { result, success, errors } = (await response.json()) as {
|
|
671
|
-
result: {
|
|
672
|
-
bindings: WorkerBindingSpec[];
|
|
673
|
-
compatibility_date: string;
|
|
674
|
-
compatibility_flags: string[];
|
|
675
|
-
migrations: SingleStepMigration | MultiStepMigration;
|
|
676
|
-
[key: string]: any;
|
|
677
|
-
};
|
|
678
|
-
success: boolean;
|
|
679
|
-
errors: Array<{
|
|
680
|
-
code: number;
|
|
681
|
-
message: string;
|
|
682
|
-
documentation_url: string;
|
|
683
|
-
[key: string]: any;
|
|
684
|
-
}>;
|
|
685
|
-
messages: Array<{
|
|
686
|
-
code: number;
|
|
687
|
-
message: string;
|
|
688
|
-
documentation_url: string;
|
|
689
|
-
[key: string]: any;
|
|
690
|
-
}>;
|
|
691
|
-
};
|
|
692
|
-
if (!success) {
|
|
693
|
-
throw new Error(
|
|
694
|
-
`Error getting worker bindings: ${response.status} ${response.statusText}\nErrors:\n${errors.map((e) => `- [${e.code}] ${e.message} (${e.documentation_url})`).join("\n")}`,
|
|
695
|
-
);
|
|
696
|
-
}
|
|
697
|
-
return result;
|
|
662
|
+
return await extractCloudflareResult<WorkerSettings>(
|
|
663
|
+
`get worker settings for ${workerName}`,
|
|
664
|
+
api.get(
|
|
665
|
+
`/accounts/${api.accountId}/workers/scripts/${workerName}/settings`,
|
|
666
|
+
),
|
|
667
|
+
).catch((error) => {
|
|
668
|
+
if (error.status === 404) {
|
|
669
|
+
return undefined;
|
|
670
|
+
}
|
|
671
|
+
throw error;
|
|
672
|
+
});
|
|
698
673
|
}
|