devflare 1.0.0-next.19 → 1.0.0-next.20
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/LLM.md +6807 -888
- package/README.md +375 -957
- package/dist/account-05zgta47.js +475 -0
- package/dist/account-b2ag1esh.js +475 -0
- package/dist/account-bxtcz61a.js +475 -0
- package/dist/account-gyfqg964.js +475 -0
- package/dist/account-q6pvs9d9.js +475 -0
- package/dist/account-rp4zbvw1.js +475 -0
- package/dist/bridge/client.d.ts +5 -0
- package/dist/bridge/client.d.ts.map +1 -1
- package/dist/bridge/gateway-runtime.d.ts +1 -1
- package/dist/bridge/gateway-runtime.d.ts.map +1 -1
- package/dist/bridge/miniflare.d.ts +67 -0
- package/dist/bridge/miniflare.d.ts.map +1 -1
- package/dist/bridge/proxy.d.ts +2 -1
- package/dist/bridge/proxy.d.ts.map +1 -1
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/browser.d.ts +2520 -40
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -3
- package/dist/build-2s5paw5p.js +54 -0
- package/dist/build-4c350cp7.js +54 -0
- package/dist/build-e7wym63t.js +54 -0
- package/dist/build-ge6qp3t4.js +54 -0
- package/dist/build-ta8c6t11.js +54 -0
- package/dist/build-wvjj8f28.js +54 -0
- package/dist/build-ypg6f2kw.js +54 -0
- package/dist/build-yts8wwgf.js +54 -0
- package/dist/build-yzkdqexs.js +54 -0
- package/dist/cli/build-manifest.d.ts +12 -0
- package/dist/cli/build-manifest.d.ts.map +1 -1
- package/dist/cli/commands/deploy/metadata.d.ts +18 -0
- package/dist/cli/commands/deploy/metadata.d.ts.map +1 -0
- package/dist/cli/commands/deploy/prepare.d.ts +23 -0
- package/dist/cli/commands/deploy/prepare.d.ts.map +1 -0
- package/dist/cli/commands/deploy/runtime.d.ts +4 -0
- package/dist/cli/commands/deploy/runtime.d.ts.map +1 -0
- package/dist/cli/commands/deploy/verification.d.ts +36 -0
- package/dist/cli/commands/deploy/verification.d.ts.map +1 -0
- package/dist/cli/commands/deploy.d.ts +2 -2
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/commands/secrets.d.ts +4 -0
- package/dist/cli/commands/secrets.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/generator.d.ts +67 -1
- package/dist/cli/commands/type-generation/generator.d.ts.map +1 -1
- package/dist/cli/help-pages/pages/core.d.ts +1 -1
- package/dist/cli/help-pages/pages/core.d.ts.map +1 -1
- package/dist/cli/help-pages/shared.d.ts +1 -1
- package/dist/cli/help-pages/shared.d.ts.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/package-metadata.d.ts.map +1 -1
- package/dist/cli/preview-bindings.d.ts.map +1 -1
- package/dist/cloudflare/index.js +2 -2
- package/dist/cloudflare/preview-registry-store.d.ts +1 -1
- package/dist/cloudflare/preview-registry-store.d.ts.map +1 -1
- package/dist/cloudflare/types.d.ts +1 -1
- package/dist/cloudflare/types.d.ts.map +1 -1
- package/dist/config/binding-resolution-helpers.d.ts +5 -0
- package/dist/config/binding-resolution-helpers.d.ts.map +1 -1
- package/dist/config/compiler/bindings.d.ts +14 -0
- package/dist/config/compiler/bindings.d.ts.map +1 -0
- package/dist/config/compiler/core-helpers.d.ts +6 -0
- package/dist/config/compiler/core-helpers.d.ts.map +1 -0
- package/dist/config/compiler/do-workers.d.ts +34 -0
- package/dist/config/compiler/do-workers.d.ts.map +1 -0
- package/dist/config/compiler/paths.d.ts +18 -0
- package/dist/config/compiler/paths.d.ts.map +1 -0
- package/dist/config/compiler/types.d.ts +267 -0
- package/dist/config/compiler/types.d.ts.map +1 -0
- package/dist/config/compiler.d.ts +11 -175
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/deploy-resources.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/local-dev-vars.d.ts +15 -0
- package/dist/config/local-dev-vars.d.ts.map +1 -0
- package/dist/config/preview-resources.d.ts.map +1 -1
- package/dist/config/preview.d.ts.map +1 -1
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resource-resolution.d.ts.map +1 -1
- package/dist/config/schema-bindings.d.ts +559 -19
- package/dist/config/schema-bindings.d.ts.map +1 -1
- package/dist/config/schema-env.d.ts +1306 -34
- package/dist/config/schema-env.d.ts.map +1 -1
- package/dist/config/schema-normalization.d.ts +97 -1
- package/dist/config/schema-normalization.d.ts.map +1 -1
- package/dist/config/schema-runtime.d.ts +245 -7
- package/dist/config/schema-runtime.d.ts.map +1 -1
- package/dist/config/schema.d.ts +2976 -57
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config-6m0n7d84.js +59 -0
- package/dist/config-7cf004ag.js +59 -0
- package/dist/config-b98dp58n.js +59 -0
- package/dist/config-cf3djhqy.js +59 -0
- package/dist/config-entry.js +1 -1
- package/dist/config-wa7hm0w9.js +59 -0
- package/dist/deploy-1jfagtn9.js +1055 -0
- package/dist/deploy-2afw0jfg.js +1055 -0
- package/dist/deploy-2fzj68kq.js +1055 -0
- package/dist/deploy-57nzn9wj.js +1045 -0
- package/dist/deploy-asyryrvm.js +1055 -0
- package/dist/deploy-hc927rw6.js +1045 -0
- package/dist/deploy-pnnf8tgy.js +1045 -0
- package/dist/deploy-q33bw715.js +1055 -0
- package/dist/deploy-tmdgecs3.js +1055 -0
- package/dist/deploy-v0y8kczr.js +1055 -0
- package/dist/deploy-xhj6zbcx.js +1055 -0
- package/dist/dev-1mvcts8w.js +2515 -0
- package/dist/dev-2a283xts.js +2515 -0
- package/dist/dev-62nhytf8.js +2505 -0
- package/dist/dev-75acm2xj.js +2478 -0
- package/dist/dev-802rg9dp.js +2515 -0
- package/dist/dev-d1bb2t0f.js +2515 -0
- package/dist/dev-dwry8494.js +2489 -0
- package/dist/dev-g6112y4w.js +2515 -0
- package/dist/dev-h2kneh95.js +2496 -0
- package/dist/dev-kybq3mwr.js +2489 -0
- package/dist/dev-n8qndkyg.js +2512 -0
- package/dist/dev-p32fkbwf.js +2489 -0
- package/dist/dev-qm9d4mfh.js +2478 -0
- package/dist/dev-rcthnse5.js +2473 -0
- package/dist/dev-server/dev-server-state.d.ts +1 -0
- package/dist/dev-server/dev-server-state.d.ts.map +1 -1
- package/dist/dev-server/miniflare-bindings.d.ts +44 -1
- package/dist/dev-server/miniflare-bindings.d.ts.map +1 -1
- package/dist/dev-server/miniflare-dev-config.d.ts +1 -0
- package/dist/dev-server/miniflare-dev-config.d.ts.map +1 -1
- package/dist/dev-server/miniflare-log.d.ts +8 -0
- package/dist/dev-server/miniflare-log.d.ts.map +1 -1
- package/dist/dev-server/miniflare-worker-config.d.ts +31 -1
- package/dist/dev-server/miniflare-worker-config.d.ts.map +1 -1
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/dev-server/vite-process.d.ts +1 -0
- package/dist/dev-server/vite-process.d.ts.map +1 -1
- package/dist/dev-tgwja5mz.js +2496 -0
- package/dist/doctor-2shhdak6.js +245 -0
- package/dist/doctor-5g73w40j.js +245 -0
- package/dist/doctor-gamefzcs.js +245 -0
- package/dist/doctor-rn53ctfs.js +245 -0
- package/dist/index-01kehw41.js +348 -0
- package/dist/index-06bg0z9y.js +185 -0
- package/dist/index-0d7tw5r4.js +136 -0
- package/dist/index-0m6e4mxz.js +133 -0
- package/dist/index-0vah20er.js +1410 -0
- package/dist/index-0wa0ebm1.js +68 -0
- package/dist/index-1714y3cz.js +1410 -0
- package/dist/index-1qs5gcm7.js +895 -0
- package/dist/index-29k04v43.js +574 -0
- package/dist/index-2jywf4pz.js +1372 -0
- package/dist/index-2qhk9nbx.js +1372 -0
- package/dist/index-2vq6bveq.js +574 -0
- package/dist/index-36h8gkhb.js +1088 -0
- package/dist/index-38fq7pww.js +560 -0
- package/dist/index-3bxqn033.js +1410 -0
- package/dist/index-3jme4hgw.js +1234 -0
- package/dist/index-3p7s9mk9.js +360 -0
- package/dist/index-47w35sft.js +244 -0
- package/dist/index-4by4c7rm.js +52 -0
- package/dist/index-4phjwd6h.js +412 -0
- package/dist/index-4z5jrw0j.js +594 -0
- package/dist/index-51mzqy0d.js +895 -0
- package/dist/index-53pqqpq9.js +74 -0
- package/dist/index-5enq8ntr.js +1766 -0
- package/dist/index-5fnq9r9m.js +1410 -0
- package/dist/index-5w9f2b17.js +695 -0
- package/dist/index-627srx16.js +45 -0
- package/dist/index-6bqgf5x8.js +227 -0
- package/dist/index-6xknvbyk.js +1088 -0
- package/dist/index-7ef3ktz5.js +1372 -0
- package/dist/index-7hpjfdzh.js +185 -0
- package/dist/index-8052df4m.js +627 -0
- package/dist/index-82epjzrr.js +1410 -0
- package/dist/index-82z7rvz6.js +1238 -0
- package/dist/index-8atc1yb9.js +68 -0
- package/dist/index-8tj0awnv.js +476 -0
- package/dist/index-8x745h59.js +1069 -0
- package/dist/index-9bawzcny.js +574 -0
- package/dist/index-9bjjqdfc.js +236 -0
- package/dist/index-9d7x3vfr.js +236 -0
- package/dist/index-9nf8zs4p.js +1069 -0
- package/dist/index-acwbmagz.js +412 -0
- package/dist/index-aqjdaem7.js +74 -0
- package/dist/index-b6448fd0.js +133 -0
- package/dist/index-b9j55r7q.js +240 -0
- package/dist/index-bdatd1za.js +1372 -0
- package/dist/index-c3nxftnp.js +699 -0
- package/dist/index-c643s0gv.js +488 -0
- package/dist/index-d2md1j3d.js +185 -0
- package/dist/index-dbr6bfz6.js +528 -0
- package/dist/index-dd1g0g7e.js +360 -0
- package/dist/index-dktb9az5.js +1372 -0
- package/dist/index-dm9q84c7.js +360 -0
- package/dist/index-f51mkh13.js +1088 -0
- package/dist/index-f86n1fpd.js +55 -0
- package/dist/index-fnk0tkw7.js +412 -0
- package/dist/index-g5aq66bj.js +1534 -0
- package/dist/index-gj5qh491.js +54 -0
- package/dist/index-gq39t0rx.js +895 -0
- package/dist/index-h5dqna7q.js +1410 -0
- package/dist/index-hjs9j2g9.js +895 -0
- package/dist/index-hn5nbxbt.js +147 -0
- package/dist/index-hpjh0qjx.js +1723 -0
- package/dist/index-hs6ekcfs.js +412 -0
- package/dist/index-jdzrvnfj.js +52 -0
- package/dist/index-jg720mq7.js +476 -0
- package/dist/index-jrzddxvt.js +2167 -0
- package/dist/index-kgstnk6g.js +239 -0
- package/dist/index-khnw972v.js +117 -0
- package/dist/index-kwqff3ba.js +1410 -0
- package/dist/index-m2v0fj08.js +74 -0
- package/dist/index-mjve6tqn.js +447 -0
- package/dist/index-mkxzgn0q.js +1372 -0
- package/dist/index-mzmq3v0d.js +1088 -0
- package/dist/index-ng9n3znd.js +1372 -0
- package/dist/index-nhbkm2ba.js +467 -0
- package/dist/index-nrfhk0k5.js +1088 -0
- package/dist/index-p0zppqxm.js +467 -0
- package/dist/index-pkxf6h87.js +895 -0
- package/dist/index-pqp4312v.js +52 -0
- package/dist/index-pw9jn6kz.js +574 -0
- package/dist/index-q31ne0xa.js +412 -0
- package/dist/index-qf2dkqxh.js +249 -0
- package/dist/index-qmtdf7k5.js +639 -0
- package/dist/index-qwgr4q7s.js +37 -0
- package/dist/index-rab2dfh3.js +494 -0
- package/dist/index-rz7rx80s.js +1410 -0
- package/dist/index-s37h3jgk.js +572 -0
- package/dist/index-sb705m7d.js +52 -0
- package/dist/index-syscwrjp.js +1576 -0
- package/dist/index-t14zr0ys.js +1063 -0
- package/dist/index-tjc99447.js +68 -0
- package/dist/index-v35460hf.js +574 -0
- package/dist/index-v7q00d1e.js +1410 -0
- package/dist/index-vkkmx4xe.js +1372 -0
- package/dist/index-vrps1gky.js +2202 -0
- package/dist/index-w4c9vmvg.js +1517 -0
- package/dist/index-wqd8n2qk.js +574 -0
- package/dist/index-x12e6fzy.js +476 -0
- package/dist/index-xagpz645.js +2199 -0
- package/dist/index-xbth1r6e.js +572 -0
- package/dist/index-xm9fqhcb.js +447 -0
- package/dist/index-y59hnmd0.js +132 -0
- package/dist/index-y7mkb00x.js +133 -0
- package/dist/index-z40mjts9.js +212 -0
- package/dist/index-z5k5bjc7.js +1218 -0
- package/dist/index-z73sytma.js +895 -0
- package/dist/index-zjv6apef.js +1410 -0
- package/dist/index.js +8 -8
- package/dist/init-cwpergap.js +180 -0
- package/dist/login-83bjfhvz.js +77 -0
- package/dist/login-ddw888xb.js +77 -0
- package/dist/login-e7pytkdc.js +77 -0
- package/dist/login-fe0brfcr.js +77 -0
- package/dist/login-h7sm5trm.js +77 -0
- package/dist/login-vd0m3xr4.js +77 -0
- package/dist/previews-2wfvsjfy.js +1337 -0
- package/dist/previews-31feb8r3.js +1337 -0
- package/dist/previews-3w4pxqby.js +1337 -0
- package/dist/previews-93ttrf5f.js +1337 -0
- package/dist/previews-bdrefjzx.js +1337 -0
- package/dist/previews-cfcn56b4.js +1337 -0
- package/dist/previews-mssq1hrm.js +1337 -0
- package/dist/previews-tcaz1gt8.js +1337 -0
- package/dist/productions-4h80j2c7.js +505 -0
- package/dist/productions-86jaqt7m.js +505 -0
- package/dist/productions-bn2q31my.js +505 -0
- package/dist/productions-dv8g7f6g.js +505 -0
- package/dist/productions-e2m9s4tr.js +505 -0
- package/dist/productions-fgshs1m7.js +505 -0
- package/dist/productions-hphmt68n.js +505 -0
- package/dist/productions-vhq7yx86.js +505 -0
- package/dist/runtime/index.js +8 -8
- package/dist/secrets/local-secrets.d.ts +46 -0
- package/dist/secrets/local-secrets.d.ts.map +1 -0
- package/dist/secrets-8wcj47nh.js +91 -0
- package/dist/secrets-b2ww34ta.js +91 -0
- package/dist/secrets-b7g4z621.js +91 -0
- package/dist/shims/local-media-bindings.d.ts +19 -0
- package/dist/shims/local-media-bindings.d.ts.map +1 -0
- package/dist/shims/local-worker-loader.d.ts +3 -0
- package/dist/shims/local-worker-loader.d.ts.map +1 -0
- package/dist/sveltekit/index.js +163 -26
- package/dist/sveltekit/local-bindings.d.ts +4 -0
- package/dist/sveltekit/local-bindings.d.ts.map +1 -0
- package/dist/sveltekit/platform.d.ts +8 -0
- package/dist/sveltekit/platform.d.ts.map +1 -1
- package/dist/test/ai-search.d.ts +39 -0
- package/dist/test/ai-search.d.ts.map +1 -0
- package/dist/test/binding-hints.d.ts.map +1 -1
- package/dist/test/cf.d.ts +3 -3
- package/dist/test/containers.d.ts +87 -0
- package/dist/test/containers.d.ts.map +1 -0
- package/dist/test/index.d.ts +4 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2833 -543
- package/dist/test/local-worker-loader.d.ts +3 -0
- package/dist/test/local-worker-loader.d.ts.map +1 -0
- package/dist/test/offline-bindings.d.ts +65 -0
- package/dist/test/offline-bindings.d.ts.map +1 -0
- package/dist/test/queue.d.ts.map +1 -1
- package/dist/test/remote-ai.d.ts.map +1 -1
- package/dist/test/should-skip.d.ts +14 -0
- package/dist/test/should-skip.d.ts.map +1 -1
- package/dist/test/simple-context-bindings.d.ts.map +1 -1
- package/dist/test/simple-context-durable-objects.d.ts.map +1 -1
- package/dist/test/simple-context-gateway-script.d.ts +1 -1
- package/dist/test/simple-context-gateway-script.d.ts.map +1 -1
- package/dist/test/simple-context-lifecycle.d.ts.map +1 -1
- package/dist/test/simple-context-mfconfig.d.ts +4 -1
- package/dist/test/simple-context-mfconfig.d.ts.map +1 -1
- package/dist/test/simple-context-multi-worker.d.ts.map +1 -1
- package/dist/test/simple-context-startup.d.ts.map +1 -1
- package/dist/test/tail.d.ts.map +1 -1
- package/dist/test/utilities/artifacts.d.ts +11 -0
- package/dist/test/utilities/artifacts.d.ts.map +1 -0
- package/dist/test/utilities/context.d.ts +39 -0
- package/dist/test/utilities/context.d.ts.map +1 -0
- package/dist/test/utilities/d1.d.ts +21 -0
- package/dist/test/utilities/d1.d.ts.map +1 -0
- package/dist/test/utilities/env.d.ts +40 -0
- package/dist/test/utilities/env.d.ts.map +1 -0
- package/dist/test/utilities/kv.d.ts +11 -0
- package/dist/test/utilities/kv.d.ts.map +1 -0
- package/dist/test/utilities/media.d.ts +16 -0
- package/dist/test/utilities/media.d.ts.map +1 -0
- package/dist/test/utilities/platform.d.ts +38 -0
- package/dist/test/utilities/platform.d.ts.map +1 -0
- package/dist/test/utilities/queue.d.ts +5 -0
- package/dist/test/utilities/queue.d.ts.map +1 -0
- package/dist/test/utilities/r2.d.ts +12 -0
- package/dist/test/utilities/r2.d.ts.map +1 -0
- package/dist/test/utilities/workflows.d.ts +26 -0
- package/dist/test/utilities/workflows.d.ts.map +1 -0
- package/dist/test/utilities.d.ts +10 -106
- package/dist/test/utilities.d.ts.map +1 -1
- package/dist/types-2ejrbba1.js +695 -0
- package/dist/types-7jkbm95a.js +695 -0
- package/dist/types-a2fk9yns.js +695 -0
- package/dist/types-dyb3c6zw.js +695 -0
- package/dist/types-e2n9f3pd.js +695 -0
- package/dist/types-j4s6qcrc.js +695 -0
- package/dist/utils/send-email.d.ts.map +1 -1
- package/dist/utils/send-email.js +1 -1
- package/dist/vite/index.js +6 -6
- package/dist/vite/plugin-context.d.ts.map +1 -1
- package/dist/worker-663em30d.js +513 -0
- package/dist/worker-argxc7fb.js +513 -0
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/dist/worker-entry/surface-paths.d.ts +2 -0
- package/dist/worker-entry/surface-paths.d.ts.map +1 -1
- package/dist/worker-fcdsnj14.js +513 -0
- package/dist/worker-fk42rzse.js +513 -0
- package/dist/worker-jkemk8d2.js +513 -0
- package/dist/worker-m4ze8djx.js +513 -0
- package/dist/worker-wnan5dca.js +513 -0
- package/dist/worker-yw3atfb1.js +513 -0
- package/dist/workflows/local-workflow-entrypoints.d.ts +7 -0
- package/dist/workflows/local-workflow-entrypoints.d.ts.map +1 -0
- package/package.json +13 -12
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bundleWorkerEntry
|
|
3
|
+
} from "./index-gq39t0rx.js";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_WORKFLOW_PATTERN,
|
|
6
|
+
findFiles
|
|
7
|
+
} from "./index-qwgr4q7s.js";
|
|
8
|
+
import {
|
|
9
|
+
normalizeArtifactsBinding,
|
|
10
|
+
normalizeDispatchNamespaceBinding,
|
|
11
|
+
normalizeHyperdriveBinding,
|
|
12
|
+
normalizeImagesBinding,
|
|
13
|
+
normalizeMediaBinding,
|
|
14
|
+
normalizeMtlsCertificateBinding,
|
|
15
|
+
normalizePipelineBinding,
|
|
16
|
+
normalizeSecretsStoreBinding,
|
|
17
|
+
normalizeWorkflowBinding
|
|
18
|
+
} from "./index-syscwrjp.js";
|
|
19
|
+
|
|
20
|
+
// src/workflows/local-workflow-entrypoints.ts
|
|
21
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
22
|
+
import { join, relative, resolve } from "pathe";
|
|
23
|
+
function findExportedClasses(code) {
|
|
24
|
+
const classes = [];
|
|
25
|
+
const classPattern = /export\s+class\s+(\w+)/g;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = classPattern.exec(code)) !== null) {
|
|
28
|
+
classes.push(match[1]);
|
|
29
|
+
}
|
|
30
|
+
return classes;
|
|
31
|
+
}
|
|
32
|
+
function toImportSpecifier(fromDir, filePath) {
|
|
33
|
+
const relativePath = relative(fromDir, filePath).replace(/\\/g, "/");
|
|
34
|
+
return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
|
|
35
|
+
}
|
|
36
|
+
async function discoverWorkflowClasses(config, configDir) {
|
|
37
|
+
const classToFilePath = new Map;
|
|
38
|
+
const workflowPatternConfig = config.files?.workflows;
|
|
39
|
+
const workflowPattern = typeof workflowPatternConfig === "string" ? workflowPatternConfig : DEFAULT_WORKFLOW_PATTERN;
|
|
40
|
+
if (workflowPatternConfig === false) {
|
|
41
|
+
return classToFilePath;
|
|
42
|
+
}
|
|
43
|
+
const files = await findFiles(workflowPattern, { cwd: configDir });
|
|
44
|
+
for (const filePath of files) {
|
|
45
|
+
try {
|
|
46
|
+
const code = await readFile(filePath, "utf-8");
|
|
47
|
+
for (const className of findExportedClasses(code)) {
|
|
48
|
+
classToFilePath.set(className, filePath);
|
|
49
|
+
}
|
|
50
|
+
} catch {}
|
|
51
|
+
}
|
|
52
|
+
return classToFilePath;
|
|
53
|
+
}
|
|
54
|
+
async function resolveLocalWorkflowEntrypoints(config, configDir) {
|
|
55
|
+
const workflows = config.bindings?.workflows;
|
|
56
|
+
if (!workflows || Object.keys(workflows).length === 0) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const classToFilePath = await discoverWorkflowClasses(config, configDir);
|
|
60
|
+
const entrypoints = [];
|
|
61
|
+
for (const [bindingName, binding] of Object.entries(workflows)) {
|
|
62
|
+
const normalized = normalizeWorkflowBinding(binding);
|
|
63
|
+
if (normalized.scriptName) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const scriptPath = classToFilePath.get(normalized.className);
|
|
67
|
+
if (!scriptPath) {
|
|
68
|
+
throw new Error(`Workflow binding ${bindingName} (className: '${normalized.className}') not found.
|
|
69
|
+
` + `Either set files.workflows to match the workflow source file, or set scriptName when the workflow lives in another worker.`);
|
|
70
|
+
}
|
|
71
|
+
entrypoints.push({
|
|
72
|
+
bindingName,
|
|
73
|
+
className: normalized.className,
|
|
74
|
+
scriptPath
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return entrypoints;
|
|
78
|
+
}
|
|
79
|
+
function buildWorkflowVirtualEntry(entrypoints, entryDir) {
|
|
80
|
+
const imports = entrypoints.map((entrypoint, index) => {
|
|
81
|
+
const importName = `__DevflareWorkflow${index}`;
|
|
82
|
+
const importPath = toImportSpecifier(entryDir, entrypoint.scriptPath);
|
|
83
|
+
return {
|
|
84
|
+
importName,
|
|
85
|
+
className: entrypoint.className,
|
|
86
|
+
line: `import { ${entrypoint.className} as ${importName} } from '${importPath}'`
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
const exports = imports.map((entrypoint) => {
|
|
90
|
+
return `export { ${entrypoint.importName} as ${entrypoint.className} }`;
|
|
91
|
+
});
|
|
92
|
+
return [...imports.map((entrypoint) => entrypoint.line), "", ...exports].join(`
|
|
93
|
+
`);
|
|
94
|
+
}
|
|
95
|
+
async function bundleWorkflowEntrypointScript(config, configDir, options = {}) {
|
|
96
|
+
const entrypoints = await resolveLocalWorkflowEntrypoints(config, configDir);
|
|
97
|
+
if (entrypoints.length === 0) {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
const entryDir = resolve(configDir, ".devflare", "workflow-entrypoints");
|
|
101
|
+
const entryPath = join(entryDir, "__entry.ts");
|
|
102
|
+
const outFile = join(entryDir, "index.js");
|
|
103
|
+
await mkdir(entryDir, { recursive: true });
|
|
104
|
+
await writeFile(entryPath, buildWorkflowVirtualEntry(entrypoints, entryDir));
|
|
105
|
+
await bundleWorkerEntry({
|
|
106
|
+
cwd: configDir,
|
|
107
|
+
inputFile: entryPath,
|
|
108
|
+
outFile,
|
|
109
|
+
rolldownOptions: config.rolldown?.options,
|
|
110
|
+
sourcemap: config.rolldown?.sourcemap,
|
|
111
|
+
minify: config.rolldown?.minify,
|
|
112
|
+
logger: options.logger
|
|
113
|
+
});
|
|
114
|
+
return await readFile(outFile, "utf-8");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/dev-server/miniflare-bindings.ts
|
|
118
|
+
function buildQueueProducers(bindings) {
|
|
119
|
+
if (!bindings.queues?.producers) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const producers = {};
|
|
123
|
+
for (const [bindingName, queueName] of Object.entries(bindings.queues.producers)) {
|
|
124
|
+
producers[bindingName] = { queueName };
|
|
125
|
+
}
|
|
126
|
+
return producers;
|
|
127
|
+
}
|
|
128
|
+
function buildQueueConsumers(bindings) {
|
|
129
|
+
if (!bindings.queues?.consumers || bindings.queues.consumers.length === 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const consumers = {};
|
|
133
|
+
for (const consumer of bindings.queues.consumers) {
|
|
134
|
+
consumers[consumer.queue] = {
|
|
135
|
+
...consumer.maxBatchSize !== undefined && { maxBatchSize: consumer.maxBatchSize },
|
|
136
|
+
...consumer.maxBatchTimeout !== undefined && { maxBatchTimeout: consumer.maxBatchTimeout },
|
|
137
|
+
...consumer.maxRetries !== undefined && { maxRetries: consumer.maxRetries },
|
|
138
|
+
...consumer.deadLetterQueue && { deadLetterQueue: consumer.deadLetterQueue },
|
|
139
|
+
...consumer.maxConcurrency !== undefined && { maxConcurrency: consumer.maxConcurrency },
|
|
140
|
+
...consumer.retryDelay !== undefined && { retryDelay: consumer.retryDelay }
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return consumers;
|
|
144
|
+
}
|
|
145
|
+
function buildRateLimitsConfig(bindings) {
|
|
146
|
+
if (!bindings.rateLimits) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
return Object.fromEntries(Object.entries(bindings.rateLimits).map(([name, binding]) => [
|
|
150
|
+
name,
|
|
151
|
+
{
|
|
152
|
+
simple: {
|
|
153
|
+
limit: binding.simple.limit,
|
|
154
|
+
period: binding.simple.period
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
]));
|
|
158
|
+
}
|
|
159
|
+
function buildVersionMetadataConfig(bindings) {
|
|
160
|
+
return bindings.versionMetadata?.binding;
|
|
161
|
+
}
|
|
162
|
+
function buildWorkerLoadersConfig(bindings) {
|
|
163
|
+
if (!bindings.workerLoaders) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
return Object.fromEntries(Object.keys(bindings.workerLoaders).map((bindingName) => [bindingName, {}]));
|
|
167
|
+
}
|
|
168
|
+
function buildMtlsCertificatesConfig(bindings) {
|
|
169
|
+
if (!bindings.mtlsCertificates) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
return Object.fromEntries(Object.entries(bindings.mtlsCertificates).map(([bindingName, binding]) => {
|
|
173
|
+
const normalized = normalizeMtlsCertificateBinding(binding);
|
|
174
|
+
return [
|
|
175
|
+
bindingName,
|
|
176
|
+
{
|
|
177
|
+
certificate_id: normalized.certificateId
|
|
178
|
+
}
|
|
179
|
+
];
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
function buildDispatchNamespacesConfig(bindings) {
|
|
183
|
+
if (!bindings.dispatchNamespaces) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
return Object.fromEntries(Object.entries(bindings.dispatchNamespaces).map(([bindingName, binding]) => {
|
|
187
|
+
const normalized = normalizeDispatchNamespaceBinding(binding);
|
|
188
|
+
return [
|
|
189
|
+
bindingName,
|
|
190
|
+
{
|
|
191
|
+
namespace: normalized.namespace
|
|
192
|
+
}
|
|
193
|
+
];
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
function buildWorkflowsConfig(bindings) {
|
|
197
|
+
if (!bindings.workflows) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
return Object.fromEntries(Object.entries(bindings.workflows).map(([bindingName, binding]) => {
|
|
201
|
+
const normalized = normalizeWorkflowBinding(binding);
|
|
202
|
+
return [
|
|
203
|
+
bindingName,
|
|
204
|
+
{
|
|
205
|
+
name: normalized.name,
|
|
206
|
+
className: normalized.className,
|
|
207
|
+
...normalized.scriptName && { scriptName: normalized.scriptName },
|
|
208
|
+
...normalized.limits && { stepLimit: normalized.limits.steps }
|
|
209
|
+
}
|
|
210
|
+
];
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
function buildPipelinesConfig(bindings) {
|
|
214
|
+
if (!bindings.pipelines) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
return Object.fromEntries(Object.entries(bindings.pipelines).map(([bindingName, binding]) => {
|
|
218
|
+
const normalized = normalizePipelineBinding(binding);
|
|
219
|
+
return [
|
|
220
|
+
bindingName,
|
|
221
|
+
typeof binding === "string" ? normalized.pipeline : { pipeline: normalized.pipeline }
|
|
222
|
+
];
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
function getHyperdriveLocalConnectionString(bindingName, binding) {
|
|
226
|
+
const cloudflareEnvName = `CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_${bindingName}`;
|
|
227
|
+
const wranglerEnvName = `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_${bindingName}`;
|
|
228
|
+
const envValue = process.env[cloudflareEnvName] ?? process.env[wranglerEnvName];
|
|
229
|
+
if (envValue?.trim()) {
|
|
230
|
+
return envValue;
|
|
231
|
+
}
|
|
232
|
+
const normalized = normalizeHyperdriveBinding(binding);
|
|
233
|
+
return normalized.localConnectionString;
|
|
234
|
+
}
|
|
235
|
+
function buildHyperdrivesConfig(bindings) {
|
|
236
|
+
if (!bindings.hyperdrive) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const hyperdrives = Object.fromEntries(Object.entries(bindings.hyperdrive).map(([bindingName, binding]) => {
|
|
240
|
+
const localConnectionString = getHyperdriveLocalConnectionString(bindingName, binding);
|
|
241
|
+
return localConnectionString ? [bindingName, localConnectionString] : null;
|
|
242
|
+
}).filter((entry) => entry !== null));
|
|
243
|
+
return Object.keys(hyperdrives).length > 0 ? hyperdrives : undefined;
|
|
244
|
+
}
|
|
245
|
+
function buildImagesConfig(bindings) {
|
|
246
|
+
if (!bindings.images) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const [entry] = Object.entries(bindings.images);
|
|
250
|
+
if (!entry) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const [bindingName, binding] = entry;
|
|
254
|
+
const normalized = normalizeImagesBinding(bindingName, binding);
|
|
255
|
+
return {
|
|
256
|
+
binding: normalized.binding
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function buildMediaConfig(bindings) {
|
|
260
|
+
if (!bindings.media) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const [entry] = Object.entries(bindings.media);
|
|
264
|
+
if (!entry) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const [bindingName, binding] = entry;
|
|
268
|
+
const normalized = normalizeMediaBinding(bindingName, binding);
|
|
269
|
+
return {
|
|
270
|
+
binding: normalized.binding
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function buildArtifactsConfig(bindings) {
|
|
274
|
+
if (!bindings.artifacts) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
return Object.fromEntries(Object.entries(bindings.artifacts).map(([bindingName, binding]) => {
|
|
278
|
+
const normalized = normalizeArtifactsBinding(binding);
|
|
279
|
+
return [
|
|
280
|
+
bindingName,
|
|
281
|
+
{
|
|
282
|
+
namespace: normalized.namespace
|
|
283
|
+
}
|
|
284
|
+
];
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
function buildAiSearchNamespacesConfig(bindings) {
|
|
288
|
+
if (!bindings.aiSearchNamespaces) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
return Object.fromEntries(Object.entries(bindings.aiSearchNamespaces).map(([bindingName, binding]) => [
|
|
292
|
+
bindingName,
|
|
293
|
+
{
|
|
294
|
+
namespace: binding.namespace
|
|
295
|
+
}
|
|
296
|
+
]));
|
|
297
|
+
}
|
|
298
|
+
function buildAiSearchInstancesConfig(bindings) {
|
|
299
|
+
if (!bindings.aiSearch) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
return Object.fromEntries(Object.entries(bindings.aiSearch).map(([bindingName, binding]) => [
|
|
303
|
+
bindingName,
|
|
304
|
+
{
|
|
305
|
+
instance_name: binding.instanceName
|
|
306
|
+
}
|
|
307
|
+
]));
|
|
308
|
+
}
|
|
309
|
+
function buildSecretsStoreConfig(bindings, defaultSecretsStoreId, excludedBindingNames = new Set) {
|
|
310
|
+
if (!bindings.secretsStore) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const entries = Object.entries(bindings.secretsStore).flatMap(([bindingName, binding]) => {
|
|
314
|
+
if (excludedBindingNames.has(bindingName)) {
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
const normalized = normalizeSecretsStoreBinding(binding, defaultSecretsStoreId, bindingName);
|
|
318
|
+
return [[
|
|
319
|
+
bindingName,
|
|
320
|
+
{
|
|
321
|
+
store_id: normalized.storeId,
|
|
322
|
+
secret_name: normalized.secretName
|
|
323
|
+
}
|
|
324
|
+
]];
|
|
325
|
+
});
|
|
326
|
+
return entries.length > 0 ? Object.fromEntries(entries) : undefined;
|
|
327
|
+
}
|
|
328
|
+
function buildSendEmailConfig(bindings) {
|
|
329
|
+
if (!bindings.sendEmail) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
send_email: Object.entries(bindings.sendEmail).map(([name, binding]) => ({
|
|
334
|
+
name,
|
|
335
|
+
...binding.destinationAddress && {
|
|
336
|
+
destination_address: binding.destinationAddress
|
|
337
|
+
},
|
|
338
|
+
...binding.allowedDestinationAddresses && {
|
|
339
|
+
allowed_destination_addresses: binding.allowedDestinationAddresses
|
|
340
|
+
},
|
|
341
|
+
...binding.allowedSenderAddresses && {
|
|
342
|
+
allowed_sender_addresses: binding.allowedSenderAddresses
|
|
343
|
+
}
|
|
344
|
+
}))
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export { buildQueueProducers, buildQueueConsumers, buildRateLimitsConfig, buildVersionMetadataConfig, buildWorkerLoadersConfig, buildMtlsCertificatesConfig, buildDispatchNamespacesConfig, buildWorkflowsConfig, buildPipelinesConfig, buildHyperdrivesConfig, buildImagesConfig, buildMediaConfig, buildArtifactsConfig, buildAiSearchNamespacesConfig, buildAiSearchInstancesConfig, buildSecretsStoreConfig, buildSendEmailConfig, bundleWorkflowEntrypointScript };
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveConfigForEnvironment
|
|
3
|
+
} from "./index-syscwrjp.js";
|
|
4
|
+
|
|
5
|
+
// src/cli/commands/previews-support/family.ts
|
|
6
|
+
function compareConfiguredWorkerFamilies(left, right) {
|
|
7
|
+
if (left.role === "primary" && right.role !== "primary") {
|
|
8
|
+
return -1;
|
|
9
|
+
}
|
|
10
|
+
if (left.role !== "primary" && right.role === "primary") {
|
|
11
|
+
return 1;
|
|
12
|
+
}
|
|
13
|
+
return left.baseName.localeCompare(right.baseName);
|
|
14
|
+
}
|
|
15
|
+
function comparePreviewScopeRows(left, right) {
|
|
16
|
+
const leftTime = left.updatedAt?.getTime() ?? 0;
|
|
17
|
+
const rightTime = right.updatedAt?.getTime() ?? 0;
|
|
18
|
+
if (rightTime !== leftTime) {
|
|
19
|
+
return rightTime - leftTime;
|
|
20
|
+
}
|
|
21
|
+
return left.scope.localeCompare(right.scope);
|
|
22
|
+
}
|
|
23
|
+
function collectConfiguredWorkerFamilies(config, environment) {
|
|
24
|
+
const resolvedConfig = resolveConfigForEnvironment(config, environment);
|
|
25
|
+
const families = new Map;
|
|
26
|
+
families.set(resolvedConfig.name, {
|
|
27
|
+
baseName: resolvedConfig.name,
|
|
28
|
+
roleLabel: "primary",
|
|
29
|
+
role: "primary"
|
|
30
|
+
});
|
|
31
|
+
for (const [bindingName, binding] of Object.entries(resolvedConfig.bindings?.services ?? {})) {
|
|
32
|
+
const existing = families.get(binding.service);
|
|
33
|
+
if (existing) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
families.set(binding.service, {
|
|
37
|
+
baseName: binding.service,
|
|
38
|
+
roleLabel: bindingName,
|
|
39
|
+
role: "service"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return Array.from(families.values()).sort(compareConfiguredWorkerFamilies);
|
|
43
|
+
}
|
|
44
|
+
function getWorkerUrl(workerName, workersSubdomain) {
|
|
45
|
+
if (!workersSubdomain) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
return `https://${workerName}.${workersSubdomain}.workers.dev`;
|
|
49
|
+
}
|
|
50
|
+
function getWorkerScopeSuffix(workerName, baseName) {
|
|
51
|
+
if (!workerName.startsWith(`${baseName}-`)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const suffix = workerName.slice(baseName.length + 1).trim();
|
|
55
|
+
return suffix || undefined;
|
|
56
|
+
}
|
|
57
|
+
function buildStableWorkerRowsFromLiveWorkers(families, workers, workersSubdomain) {
|
|
58
|
+
const workersByName = new Map(workers.map((worker) => [worker.name, worker]));
|
|
59
|
+
return families.map((family) => {
|
|
60
|
+
const worker = workersByName.get(family.baseName);
|
|
61
|
+
const status = worker ? "active" : "missing";
|
|
62
|
+
return {
|
|
63
|
+
workerName: family.baseName,
|
|
64
|
+
role: family.roleLabel,
|
|
65
|
+
status,
|
|
66
|
+
updatedAt: worker?.modifiedOn,
|
|
67
|
+
url: worker ? getWorkerUrl(family.baseName, workersSubdomain) : undefined
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function getDedicatedPreviewFamilyNamesFromWorkers(families, workers) {
|
|
72
|
+
const familyNames = new Set;
|
|
73
|
+
const workerNames = workers.map((worker) => worker.name);
|
|
74
|
+
for (const family of families) {
|
|
75
|
+
if (family.role === "primary") {
|
|
76
|
+
familyNames.add(family.baseName);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (workerNames.some((workerName) => Boolean(getWorkerScopeSuffix(workerName, family.baseName)))) {
|
|
80
|
+
familyNames.add(family.baseName);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return familyNames;
|
|
84
|
+
}
|
|
85
|
+
function buildPreviewScopeRowsFromLiveWorkers(families, workers, workersSubdomain) {
|
|
86
|
+
const workersByName = new Map(workers.map((worker) => [worker.name, worker]));
|
|
87
|
+
const previewFamilyNames = getDedicatedPreviewFamilyNamesFromWorkers(families, workers);
|
|
88
|
+
const expectedFamilies = families.filter((family) => previewFamilyNames.has(family.baseName));
|
|
89
|
+
const workerCandidatesByScope = buildPreviewWorkerCandidatesByScope(families, workers);
|
|
90
|
+
return Array.from(workerCandidatesByScope.keys()).map((scope) => {
|
|
91
|
+
const resolvedFamilies = expectedFamilies.map((family) => ({
|
|
92
|
+
family,
|
|
93
|
+
worker: workersByName.get(`${family.baseName}-${scope}`)
|
|
94
|
+
}));
|
|
95
|
+
const presentFamilies = resolvedFamilies.filter((entry) => entry.worker);
|
|
96
|
+
const updatedAt = presentFamilies.reduce((latest, entry) => {
|
|
97
|
+
const currentDate = entry.worker?.modifiedOn;
|
|
98
|
+
if (!currentDate) {
|
|
99
|
+
return latest;
|
|
100
|
+
}
|
|
101
|
+
if (!latest || currentDate.getTime() > latest.getTime()) {
|
|
102
|
+
return currentDate;
|
|
103
|
+
}
|
|
104
|
+
return latest;
|
|
105
|
+
}, undefined);
|
|
106
|
+
const primaryEntry = resolvedFamilies.find((entry) => entry.family.role === "primary");
|
|
107
|
+
const entryWorker = primaryEntry?.worker ?? presentFamilies[0]?.worker;
|
|
108
|
+
const missingLabels = resolvedFamilies.filter((entry) => !entry.worker).map((entry) => entry.family.role === "primary" ? "primary" : entry.family.roleLabel);
|
|
109
|
+
const notes = [];
|
|
110
|
+
if (missingLabels.length > 0) {
|
|
111
|
+
notes.push(`missing ${missingLabels.join(", ")}`);
|
|
112
|
+
}
|
|
113
|
+
const strategy = "dedicated workers";
|
|
114
|
+
const status = presentFamilies.length === resolvedFamilies.length ? "ready" : "partial";
|
|
115
|
+
return {
|
|
116
|
+
scope,
|
|
117
|
+
strategy,
|
|
118
|
+
workersLabel: `${presentFamilies.length}/${resolvedFamilies.length}`,
|
|
119
|
+
status,
|
|
120
|
+
updatedAt,
|
|
121
|
+
notes: notes.length > 0 ? notes.join(" · ") : undefined,
|
|
122
|
+
entryUrl: entryWorker ? getWorkerUrl(entryWorker.name, workersSubdomain) : undefined
|
|
123
|
+
};
|
|
124
|
+
}).sort(comparePreviewScopeRows);
|
|
125
|
+
}
|
|
126
|
+
function buildPreviewWorkerCandidatesByScope(families, workers) {
|
|
127
|
+
const candidates = new Map;
|
|
128
|
+
for (const worker of workers) {
|
|
129
|
+
for (const family of families) {
|
|
130
|
+
const scope = getWorkerScopeSuffix(worker.name, family.baseName);
|
|
131
|
+
if (!scope) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const names = candidates.get(scope) ?? new Set;
|
|
135
|
+
names.add(worker.name);
|
|
136
|
+
candidates.set(scope, names);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return new Map(Array.from(candidates.entries()).map(([scope, workerNames]) => {
|
|
140
|
+
return [scope, Array.from(workerNames).sort((left, right) => left.localeCompare(right))];
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
function orderPreviewWorkerNamesForDeletion(workerNames, scope, families) {
|
|
144
|
+
const familyPriority = new Map;
|
|
145
|
+
for (const family of families) {
|
|
146
|
+
familyPriority.set(family.baseName, {
|
|
147
|
+
priority: family.role === "primary" ? 0 : 1,
|
|
148
|
+
roleLabel: family.roleLabel
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const resolveFamilyForWorker = (workerName) => {
|
|
152
|
+
for (const family of families) {
|
|
153
|
+
if (getWorkerScopeSuffix(workerName, family.baseName) === scope) {
|
|
154
|
+
const resolved = familyPriority.get(family.baseName);
|
|
155
|
+
if (resolved) {
|
|
156
|
+
return {
|
|
157
|
+
priority: resolved.priority,
|
|
158
|
+
roleLabel: resolved.roleLabel,
|
|
159
|
+
baseName: family.baseName
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
priority: 2,
|
|
166
|
+
roleLabel: workerName
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
return [...workerNames].sort((left, right) => {
|
|
170
|
+
const leftFamily = resolveFamilyForWorker(left);
|
|
171
|
+
const rightFamily = resolveFamilyForWorker(right);
|
|
172
|
+
if (leftFamily.priority !== rightFamily.priority) {
|
|
173
|
+
return leftFamily.priority - rightFamily.priority;
|
|
174
|
+
}
|
|
175
|
+
if (leftFamily.roleLabel !== rightFamily.roleLabel) {
|
|
176
|
+
return leftFamily.roleLabel.localeCompare(rightFamily.roleLabel);
|
|
177
|
+
}
|
|
178
|
+
if (leftFamily.baseName && rightFamily.baseName && leftFamily.baseName !== rightFamily.baseName) {
|
|
179
|
+
return leftFamily.baseName.localeCompare(rightFamily.baseName);
|
|
180
|
+
}
|
|
181
|
+
return left.localeCompare(right);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export { collectConfiguredWorkerFamilies, buildStableWorkerRowsFromLiveWorkers, buildPreviewScopeRowsFromLiveWorkers, buildPreviewWorkerCandidatesByScope, orderPreviewWorkerNamesForDeletion };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeSecretsStoreBinding
|
|
3
|
+
} from "./index-syscwrjp.js";
|
|
4
|
+
|
|
5
|
+
// src/secrets/local-secrets.ts
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
var LOCAL_SECRETS_PATH = join(".devflare", "secrets.local.json");
|
|
9
|
+
var LOCAL_SECRET_WRAPPED_BINDING_SCRIPT = `
|
|
10
|
+
class LocalSecretsStoreSecret {
|
|
11
|
+
constructor(env) {
|
|
12
|
+
this.value = env.value
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async get() {
|
|
16
|
+
return this.value
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function makeBinding(env) {
|
|
21
|
+
return new LocalSecretsStoreSecret(env)
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
function createEmptyLocalSecretsFile() {
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
stores: {}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function getLocalSecretsFilePath(cwd) {
|
|
31
|
+
return join(cwd, LOCAL_SECRETS_PATH);
|
|
32
|
+
}
|
|
33
|
+
function parseLocalSecretsFile(raw) {
|
|
34
|
+
const parsed = JSON.parse(raw);
|
|
35
|
+
if (parsed.version !== 1 || !parsed.stores || typeof parsed.stores !== "object") {
|
|
36
|
+
return createEmptyLocalSecretsFile();
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
version: 1,
|
|
40
|
+
stores: parsed.stores
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function readLocalSecretsFile(cwd) {
|
|
44
|
+
const filePath = getLocalSecretsFilePath(cwd);
|
|
45
|
+
if (!existsSync(filePath)) {
|
|
46
|
+
return createEmptyLocalSecretsFile();
|
|
47
|
+
}
|
|
48
|
+
return parseLocalSecretsFile(readFileSync(filePath, "utf8"));
|
|
49
|
+
}
|
|
50
|
+
function writeLocalSecretsFile(cwd, file) {
|
|
51
|
+
const filePath = getLocalSecretsFilePath(cwd);
|
|
52
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
53
|
+
writeFileSync(filePath, `${JSON.stringify(file, null, "\t")}
|
|
54
|
+
`, {
|
|
55
|
+
encoding: "utf8",
|
|
56
|
+
mode: 384
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function writeLocalSecret({ cwd, storeId, name, value }) {
|
|
60
|
+
const file = readLocalSecretsFile(cwd);
|
|
61
|
+
file.stores[storeId] ??= {};
|
|
62
|
+
file.stores[storeId][name] = {
|
|
63
|
+
value,
|
|
64
|
+
updatedAt: new Date().toISOString()
|
|
65
|
+
};
|
|
66
|
+
writeLocalSecretsFile(cwd, file);
|
|
67
|
+
}
|
|
68
|
+
function readLocalSecret({ cwd, storeId, name }) {
|
|
69
|
+
return readLocalSecretsFile(cwd).stores[storeId]?.[name]?.value;
|
|
70
|
+
}
|
|
71
|
+
function deleteLocalSecret({ cwd, storeId, name }) {
|
|
72
|
+
const file = readLocalSecretsFile(cwd);
|
|
73
|
+
const store = file.stores[storeId];
|
|
74
|
+
if (!store || !(name in store)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
delete store[name];
|
|
78
|
+
if (Object.keys(store).length === 0) {
|
|
79
|
+
delete file.stores[storeId];
|
|
80
|
+
}
|
|
81
|
+
writeLocalSecretsFile(cwd, file);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
function listLocalSecrets({ cwd, storeId }) {
|
|
85
|
+
const file = readLocalSecretsFile(cwd);
|
|
86
|
+
const stores = storeId ? { [storeId]: file.stores[storeId] ?? {} } : file.stores;
|
|
87
|
+
return Object.entries(stores).flatMap(([currentStoreId, secrets]) => Object.entries(secrets).map(([name, secret]) => ({
|
|
88
|
+
storeId: currentStoreId,
|
|
89
|
+
name,
|
|
90
|
+
hasValue: typeof secret.value === "string",
|
|
91
|
+
updatedAt: secret.updatedAt
|
|
92
|
+
})));
|
|
93
|
+
}
|
|
94
|
+
function resolveLocalSecretValuesForBindings(config, cwd) {
|
|
95
|
+
const values = {};
|
|
96
|
+
for (const [bindingName, binding] of Object.entries(config.bindings?.secretsStore ?? {})) {
|
|
97
|
+
const normalized = normalizeSecretsStoreBinding(binding, config.secretsStoreId, bindingName);
|
|
98
|
+
const value = readLocalSecret({
|
|
99
|
+
cwd,
|
|
100
|
+
storeId: normalized.storeId,
|
|
101
|
+
name: normalized.secretName
|
|
102
|
+
});
|
|
103
|
+
if (value !== undefined) {
|
|
104
|
+
values[bindingName] = value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return values;
|
|
108
|
+
}
|
|
109
|
+
function toLocalSecretWorkerName(bindingName, index) {
|
|
110
|
+
const slug = bindingName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "secret";
|
|
111
|
+
return `devflare-local-secret-${index}-${slug}`;
|
|
112
|
+
}
|
|
113
|
+
function buildLocalSecretWrappedBindingConfig(config, cwd) {
|
|
114
|
+
const values = resolveLocalSecretValuesForBindings(config, cwd);
|
|
115
|
+
const entries = Object.entries(values);
|
|
116
|
+
return {
|
|
117
|
+
localBindingNames: entries.map(([bindingName]) => bindingName),
|
|
118
|
+
wrappedBindings: Object.fromEntries(entries.map(([bindingName, value], index) => {
|
|
119
|
+
const scriptName = toLocalSecretWorkerName(bindingName, index);
|
|
120
|
+
return [
|
|
121
|
+
bindingName,
|
|
122
|
+
{
|
|
123
|
+
scriptName,
|
|
124
|
+
bindings: { value }
|
|
125
|
+
}
|
|
126
|
+
];
|
|
127
|
+
})),
|
|
128
|
+
workers: entries.map(([bindingName], index) => ({
|
|
129
|
+
name: toLocalSecretWorkerName(bindingName, index),
|
|
130
|
+
modules: true,
|
|
131
|
+
script: LOCAL_SECRET_WRAPPED_BINDING_SCRIPT
|
|
132
|
+
}))
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { writeLocalSecret, deleteLocalSecret, listLocalSecrets, resolveLocalSecretValuesForBindings, buildLocalSecretWrappedBindingConfig };
|