devflare 1.0.0-next.7 → 1.0.0-next.71
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/LICENSE +21 -0
- package/LLM.md +17316 -2144
- package/README.md +398 -607
- package/bin/devflare.js +30 -14
- package/dist/_chunks/account-B9ULT9HA.js +462 -0
- package/dist/_chunks/account-resources-BdKj8q1h.js +159 -0
- package/dist/_chunks/ai-DKDn1iys.js +322 -0
- package/dist/_chunks/api-BKClUlUf.js +568 -0
- package/dist/_chunks/build-B9jQtUny.js +24 -0
- package/dist/_chunks/build-artifacts-C7AbI34o.js +484 -0
- package/dist/_chunks/cli-CBRR2-Xr.js +1214 -0
- package/dist/_chunks/cloudflare-D_5UWT84.js +157 -0
- package/dist/_chunks/colors-D0NVzAFN.js +13 -0
- package/dist/_chunks/command-utils-qlsHELwW.js +45 -0
- package/dist/_chunks/compiler-UxXQgEPq.js +521 -0
- package/dist/_chunks/config-CHdi5-5R.js +78 -0
- package/dist/_chunks/config-path-DzZbchb6.js +42 -0
- package/dist/_chunks/context-DGMev2AF.js +2515 -0
- package/dist/_chunks/decorators-eXNZ1S0N.js +19 -0
- package/dist/_chunks/dependencies-HLIhxbIe.js +57 -0
- package/dist/_chunks/deploy-dIZuouRW.js +1033 -0
- package/dist/_chunks/dev-CRW_hBA3.js +953 -0
- package/dist/_chunks/doctor-t8hKA53t.js +219 -0
- package/dist/_chunks/durable-object-DuMPM8re.js +234 -0
- package/dist/_chunks/env-D4uJqqgu.js +125 -0
- package/dist/_chunks/family-DHkROYgX.js +143 -0
- package/dist/_chunks/generated-artifacts-D_VIzDOi.js +31 -0
- package/dist/_chunks/generated-dir-DC2kM-mt.js +33 -0
- package/dist/_chunks/glob-DRw9sbfF.js +56 -0
- package/dist/_chunks/init-B9_QIZcO.js +165 -0
- package/dist/_chunks/loader-BC0skbnH.js +1330 -0
- package/dist/_chunks/local-dev-vars-BFLS-HoI.js +81 -0
- package/dist/_chunks/local-hyperdrive-CcORzo76.js +119 -0
- package/dist/_chunks/local-media-bindings-ZQe-epuw.js +335 -0
- package/dist/_chunks/local-secrets-C0n5oRgI.js +123 -0
- package/dist/_chunks/login-Ctw59McM.js +51 -0
- package/dist/_chunks/package-metadata-CLI488gB.js +39 -0
- package/dist/_chunks/preferences-CbYERA_m.js +241 -0
- package/dist/_chunks/preview-j9Kbx4-G.js +462 -0
- package/dist/_chunks/preview-registry-CTXU4mBc.js +1186 -0
- package/dist/_chunks/preview-resources-BNvfkfqP.js +359 -0
- package/dist/_chunks/previews-DXlf8SaQ.js +1133 -0
- package/dist/_chunks/productions-TkIy7b1Q.js +504 -0
- package/dist/_chunks/r2-presign-runtime-DlgH_FY8.js +291 -0
- package/dist/_chunks/ref-CYJNAAe_.js +178 -0
- package/dist/_chunks/remote-DB8SU7ea.js +79 -0
- package/dist/_chunks/remote-config-Bw6qIVM4.js +132 -0
- package/dist/_chunks/resolve-package-DeJUGxoE.js +152 -0
- package/dist/_chunks/rolldown-runtime-CvQ6eiug.js +14 -0
- package/dist/_chunks/routes-CRXB3-iw.js +851 -0
- package/dist/_chunks/runtime-BlKTWIgD.js +874 -0
- package/dist/_chunks/schema-normalization-CTdiY17P.js +667 -0
- package/dist/_chunks/secrets-CzSWX4-i.js +95 -0
- package/dist/_chunks/tail-DXKaqcPB.js +239 -0
- package/dist/_chunks/token-CEIRtse8.js +333 -0
- package/dist/_chunks/tokens-CE7-gV5E.js +221 -0
- package/dist/_chunks/types-BB15NBqw.js +484 -0
- package/dist/_chunks/ui-BhCdDC2N.js +103 -0
- package/dist/_chunks/usage-rRusKejc.js +272 -0
- package/dist/_chunks/vite-DTz2Pbtm.js +1267 -0
- package/dist/_chunks/vite-process-BhGXJ764.js +2928 -0
- package/dist/_chunks/vite-utils-D_VR07Ks.js +183 -0
- package/dist/_chunks/worker-CgIvLp-D.js +410 -0
- package/dist/_chunks/worker-bundler-CeMqQtBQ.js +457 -0
- package/dist/_chunks/worker-entrypoint-C8j23t6d.js +247 -0
- package/dist/_chunks/workerName-kEXwmV2m.js +23 -0
- package/dist/_chunks/workspace-CbollZBv.js +518 -0
- package/dist/_chunks/workspace-Ds3xMjOE.js +175 -0
- package/dist/bridge/client.d.ts +93 -8
- package/dist/bridge/client.d.ts.map +1 -1
- package/dist/bridge/do-rpc-dispatch.d.ts +23 -0
- package/dist/bridge/do-rpc-dispatch.d.ts.map +1 -0
- package/dist/bridge/do-websocket-connect.d.ts +33 -0
- package/dist/bridge/do-websocket-connect.d.ts.map +1 -0
- package/dist/bridge/gateway-runtime.d.ts +8 -0
- package/dist/bridge/gateway-runtime.d.ts.map +1 -0
- package/dist/bridge/index.d.ts +6 -6
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/log.d.ts +5 -0
- package/dist/bridge/log.d.ts.map +1 -0
- package/dist/bridge/miniflare-gateway.d.ts +45 -0
- package/dist/bridge/miniflare-gateway.d.ts.map +1 -0
- package/dist/bridge/miniflare.d.ts +92 -2
- package/dist/bridge/miniflare.d.ts.map +1 -1
- package/dist/bridge/proxy.d.ts +12 -11
- package/dist/bridge/proxy.d.ts.map +1 -1
- package/dist/bridge/r2-presign-runtime.d.ts +9 -0
- package/dist/bridge/r2-presign-runtime.d.ts.map +1 -0
- package/dist/bridge/server.d.ts +2 -1
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/bridge/v2/body-streams.d.ts +53 -0
- package/dist/bridge/v2/body-streams.d.ts.map +1 -0
- package/dist/bridge/v2/codec.d.ts +106 -0
- package/dist/bridge/v2/codec.d.ts.map +1 -0
- package/dist/bridge/v2/control-messages.d.ts +46 -0
- package/dist/bridge/v2/control-messages.d.ts.map +1 -0
- package/dist/bridge/v2/frames.d.ts +109 -0
- package/dist/bridge/v2/frames.d.ts.map +1 -0
- package/dist/bridge/v2/index.d.ts +11 -0
- package/dist/bridge/v2/index.d.ts.map +1 -0
- package/dist/bridge/v2/serialization.d.ts +48 -0
- package/dist/bridge/v2/serialization.d.ts.map +1 -0
- package/dist/bridge/v2/transport.d.ts +31 -0
- package/dist/bridge/v2/transport.d.ts.map +1 -0
- package/dist/bridge/v2/value-codec.d.ts +61 -0
- package/dist/bridge/v2/value-codec.d.ts.map +1 -0
- package/dist/bridge/v2/value-serialization.d.ts +139 -0
- package/dist/bridge/v2/value-serialization.d.ts.map +1 -0
- package/dist/bridge/{protocol.d.ts → v2/wire.d.ts} +32 -8
- package/dist/bridge/v2/wire.d.ts.map +1 -0
- package/dist/bridge/v2/ws-relay.d.ts +53 -0
- package/dist/bridge/v2/ws-relay.d.ts.map +1 -0
- package/dist/bridge/websocket-constructor.d.ts +38 -0
- package/dist/bridge/websocket-constructor.d.ts.map +1 -0
- package/dist/browser-shim/handler.d.ts +2 -2
- package/dist/browser-shim/handler.d.ts.map +1 -1
- package/dist/browser-shim/index.d.ts +2 -2
- package/dist/browser-shim/server.d.ts +63 -0
- package/dist/browser-shim/server.d.ts.map +1 -1
- package/dist/browser.d.ts +5778 -43
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +73 -142
- package/dist/bundler/defaults.d.ts +23 -0
- package/dist/bundler/defaults.d.ts.map +1 -0
- package/dist/bundler/do-bundler.d.ts +7 -0
- package/dist/bundler/do-bundler.d.ts.map +1 -1
- package/dist/bundler/index.d.ts +3 -1
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/rolldown-shared.d.ts +52 -0
- package/dist/bundler/rolldown-shared.d.ts.map +1 -0
- package/dist/bundler/worker-bundler.d.ts +13 -0
- package/dist/bundler/worker-bundler.d.ts.map +1 -0
- package/dist/bundler/worker-compat.d.ts +4 -0
- package/dist/bundler/worker-compat.d.ts.map +1 -0
- package/dist/cli/build-manifest.d.ts +66 -0
- package/dist/cli/build-manifest.d.ts.map +1 -0
- package/dist/cli/command-utils.d.ts +18 -0
- package/dist/cli/command-utils.d.ts.map +1 -0
- package/dist/cli/commands/account.d.ts +2 -2
- package/dist/cli/commands/account.d.ts.map +1 -1
- package/dist/cli/commands/ai.d.ts +1 -1
- package/dist/cli/commands/ai.d.ts.map +1 -1
- package/dist/cli/commands/build-artifacts.d.ts +40 -0
- package/dist/cli/commands/build-artifacts.d.ts.map +1 -0
- package/dist/cli/commands/build.d.ts +2 -2
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/config.d.ts +4 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- 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/dev.d.ts +9 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -2
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/login.d.ts +4 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/cleanup.d.ts +9 -0
- package/dist/cli/commands/previews-support/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/family.d.ts +10 -0
- package/dist/cli/commands/previews-support/family.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/render.d.ts +8 -0
- package/dist/cli/commands/previews-support/render.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/theme.d.ts +10 -0
- package/dist/cli/commands/previews-support/theme.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/types.d.ts +70 -0
- package/dist/cli/commands/previews-support/types.d.ts.map +1 -0
- package/dist/cli/commands/previews.d.ts +4 -0
- package/dist/cli/commands/previews.d.ts.map +1 -0
- package/dist/cli/commands/productions.d.ts +4 -0
- package/dist/cli/commands/productions.d.ts.map +1 -0
- package/dist/cli/commands/remote.d.ts +1 -1
- package/dist/cli/commands/remote.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/tail.d.ts +44 -0
- package/dist/cli/commands/tail.d.ts.map +1 -0
- package/dist/cli/commands/token.d.ts +4 -0
- package/dist/cli/commands/token.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/discovery.d.ts +7 -0
- package/dist/cli/commands/type-generation/discovery.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/generator.d.ts +121 -0
- package/dist/cli/commands/type-generation/generator.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/models.d.ts +27 -0
- package/dist/cli/commands/type-generation/models.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts +2 -2
- package/dist/cli/commands/types.d.ts.map +1 -1
- package/dist/cli/commands/worker.d.ts +4 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/workspace.d.ts +8 -0
- package/dist/cli/commands/workspace.d.ts.map +1 -0
- package/dist/cli/config-path.d.ts +6 -0
- package/dist/cli/config-path.d.ts.map +1 -0
- package/dist/cli/dependencies.d.ts +2 -1
- package/dist/cli/dependencies.d.ts.map +1 -1
- package/dist/cli/deploy-strategy.d.ts +17 -0
- package/dist/cli/deploy-strategy.d.ts.map +1 -0
- package/dist/cli/deploy-target.d.ts +17 -0
- package/dist/cli/deploy-target.d.ts.map +1 -0
- package/dist/cli/generated-artifacts.d.ts +12 -0
- package/dist/cli/generated-artifacts.d.ts.map +1 -0
- package/dist/cli/gradual-deploy.d.ts +49 -0
- package/dist/cli/gradual-deploy.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/account.d.ts +3 -0
- package/dist/cli/help-pages/pages/account.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/core.d.ts +4 -0
- package/dist/cli/help-pages/pages/core.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/index.d.ts +3 -0
- package/dist/cli/help-pages/pages/index.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/misc.d.ts +3 -0
- package/dist/cli/help-pages/pages/misc.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/previews.d.ts +3 -0
- package/dist/cli/help-pages/pages/previews.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/productions.d.ts +3 -0
- package/dist/cli/help-pages/pages/productions.d.ts.map +1 -0
- package/dist/cli/help-pages/render.d.ts +12 -0
- package/dist/cli/help-pages/render.d.ts.map +1 -0
- package/dist/cli/help-pages/shared.d.ts +15 -0
- package/dist/cli/help-pages/shared.d.ts.map +1 -0
- package/dist/cli/help-pages/types.d.ts +23 -0
- package/dist/cli/help-pages/types.d.ts.map +1 -0
- package/dist/cli/help.d.ts +6 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/package-metadata.d.ts +16 -0
- package/dist/cli/package-metadata.d.ts.map +1 -0
- package/dist/cli/preview-bindings.d.ts +49 -0
- package/dist/cli/preview-bindings.d.ts.map +1 -0
- package/dist/cli/preview.d.ts +10 -0
- package/dist/cli/preview.d.ts.map +1 -0
- package/dist/cli/ui.d.ts +37 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/workspace-build-guard.d.ts +14 -0
- package/dist/cli/workspace-build-guard.d.ts.map +1 -0
- package/dist/cli/wrangler-auth.d.ts +1 -1
- package/dist/cloudflare/account-core.d.ts +6 -0
- package/dist/cloudflare/account-core.d.ts.map +1 -0
- package/dist/cloudflare/account-resources.d.ts +40 -0
- package/dist/cloudflare/account-resources.d.ts.map +1 -0
- package/dist/cloudflare/account-status.d.ts +11 -0
- package/dist/cloudflare/account-status.d.ts.map +1 -0
- package/dist/cloudflare/account-workers.d.ts +14 -0
- package/dist/cloudflare/account-workers.d.ts.map +1 -0
- package/dist/cloudflare/account.d.ts +7 -64
- package/dist/cloudflare/account.d.ts.map +1 -1
- package/dist/cloudflare/api.d.ts +71 -3
- package/dist/cloudflare/api.d.ts.map +1 -1
- package/dist/cloudflare/auth.d.ts +1 -1
- package/dist/cloudflare/auth.d.ts.map +1 -1
- package/dist/cloudflare/index.d.ts +61 -6
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +4 -13
- package/dist/cloudflare/known-permission-group-ids.generated.d.ts +10 -0
- package/dist/cloudflare/known-permission-group-ids.generated.d.ts.map +1 -0
- package/dist/cloudflare/kv-namespace.d.ts +4 -0
- package/dist/cloudflare/kv-namespace.d.ts.map +1 -0
- package/dist/cloudflare/preferences.d.ts +7 -0
- package/dist/cloudflare/preferences.d.ts.map +1 -1
- package/dist/cloudflare/preview-registry-cache.d.ts +6 -0
- package/dist/cloudflare/preview-registry-cache.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-inference.d.ts +14 -0
- package/dist/cloudflare/preview-registry-inference.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-records.d.ts +4 -0
- package/dist/cloudflare/preview-registry-records.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-shape.d.ts +47 -0
- package/dist/cloudflare/preview-registry-shape.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-store.d.ts +14 -0
- package/dist/cloudflare/preview-registry-store.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-transport.d.ts +4 -0
- package/dist/cloudflare/preview-registry-transport.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-types.d.ts +103 -0
- package/dist/cloudflare/preview-registry-types.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry.d.ts +42 -0
- package/dist/cloudflare/preview-registry.d.ts.map +1 -0
- package/dist/cloudflare/preview-urls.d.ts +3 -0
- package/dist/cloudflare/preview-urls.d.ts.map +1 -0
- package/dist/cloudflare/registry-schema.d.ts +253 -0
- package/dist/cloudflare/registry-schema.d.ts.map +1 -0
- package/dist/cloudflare/remote-config.d.ts.map +1 -1
- package/dist/cloudflare/tokens.d.ts +44 -0
- package/dist/cloudflare/tokens.d.ts.map +1 -0
- package/dist/cloudflare/types.d.ts +124 -7
- package/dist/cloudflare/types.d.ts.map +1 -1
- package/dist/cloudflare/usage.d.ts +31 -3
- package/dist/cloudflare/usage.d.ts.map +1 -1
- package/dist/config/binding-resolution-helpers.d.ts +41 -0
- package/dist/config/binding-resolution-helpers.d.ts.map +1 -0
- package/dist/config/compatibility.d.ts +3 -0
- package/dist/config/compatibility.d.ts.map +1 -0
- 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 +308 -0
- package/dist/config/compiler/types.d.ts.map +1 -0
- package/dist/config/compiler.d.ts +22 -134
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/cron.d.ts +19 -0
- package/dist/config/cron.d.ts.map +1 -0
- package/dist/config/define.d.ts +8 -5
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/deploy-resources.d.ts +58 -0
- package/dist/config/deploy-resources.d.ts.map +1 -0
- package/dist/config/env-vars.d.ts +309 -0
- package/dist/config/env-vars.d.ts.map +1 -0
- package/dist/config/framework-providers.d.ts +9 -0
- package/dist/config/framework-providers.d.ts.map +1 -0
- package/dist/config/index.d.ts +13 -5
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/loader.d.ts +2 -1
- package/dist/config/loader.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 +83 -0
- package/dist/config/preview-resources.d.ts.map +1 -0
- package/dist/config/preview.d.ts +29 -0
- package/dist/config/preview.d.ts.map +1 -0
- package/dist/config/ref.d.ts +16 -25
- package/dist/config/ref.d.ts.map +1 -1
- package/dist/config/resolve-phased.d.ts +72 -0
- package/dist/config/resolve-phased.d.ts.map +1 -0
- package/dist/config/resolve.d.ts +11 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resource-resolution.d.ts +80 -0
- package/dist/config/resource-resolution.d.ts.map +1 -0
- package/dist/config/schema-bindings.d.ts +2124 -0
- package/dist/config/schema-bindings.d.ts.map +1 -0
- package/dist/config/schema-build.d.ts +67 -0
- package/dist/config/schema-build.d.ts.map +1 -0
- package/dist/config/schema-env.d.ts +3821 -0
- package/dist/config/schema-env.d.ts.map +1 -0
- package/dist/config/schema-normalization.d.ts +272 -0
- package/dist/config/schema-normalization.d.ts.map +1 -0
- package/dist/config/schema-runtime.d.ts +597 -0
- package/dist/config/schema-runtime.d.ts.map +1 -0
- package/dist/config/schema-types-bindings-platform.d.ts +520 -0
- package/dist/config/schema-types-bindings-platform.d.ts.map +1 -0
- package/dist/config/schema-types-bindings-resources.d.ts +802 -0
- package/dist/config/schema-types-bindings-resources.d.ts.map +1 -0
- package/dist/config/schema-types-bindings.d.ts +293 -0
- package/dist/config/schema-types-bindings.d.ts.map +1 -0
- package/dist/config/schema-types-build.d.ts +86 -0
- package/dist/config/schema-types-build.d.ts.map +1 -0
- package/dist/config/schema-types-runtime-server.d.ts +196 -0
- package/dist/config/schema-types-runtime-server.d.ts.map +1 -0
- package/dist/config/schema-types-runtime.d.ts +913 -0
- package/dist/config/schema-types-runtime.d.ts.map +1 -0
- package/dist/config/schema-types.d.ts +458 -0
- package/dist/config/schema-types.d.ts.map +1 -0
- package/dist/config/schema.d.ts +5796 -2023
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/service-bindings-validation.d.ts +36 -0
- package/dist/config/service-bindings-validation.d.ts.map +1 -0
- package/dist/config/workspace.d.ts +282 -0
- package/dist/config/workspace.d.ts.map +1 -0
- package/dist/config-entry.d.ts +7 -0
- package/dist/config-entry.d.ts.map +1 -0
- package/dist/config-entry.js +3 -0
- package/dist/decorators/durable-object.d.ts.map +1 -1
- package/dist/decorators/index.d.ts +2 -2
- package/dist/decorators/index.js +2 -9
- package/dist/dev-server/d1-migrations.d.ts +36 -0
- package/dist/dev-server/d1-migrations.d.ts.map +1 -0
- package/dist/dev-server/dev-server-state.d.ts +59 -0
- package/dist/dev-server/dev-server-state.d.ts.map +1 -0
- package/dist/dev-server/gateway-script.d.ts +22 -0
- package/dist/dev-server/gateway-script.d.ts.map +1 -0
- package/dist/dev-server/index.d.ts +1 -1
- package/dist/dev-server/miniflare-bindings.d.ts +90 -0
- package/dist/dev-server/miniflare-bindings.d.ts.map +1 -0
- package/dist/dev-server/miniflare-dev-config.d.ts +57 -0
- package/dist/dev-server/miniflare-dev-config.d.ts.map +1 -0
- package/dist/dev-server/miniflare-log.d.ts +20 -0
- package/dist/dev-server/miniflare-log.d.ts.map +1 -0
- package/dist/dev-server/miniflare-worker-config.d.ts +100 -0
- package/dist/dev-server/miniflare-worker-config.d.ts.map +1 -0
- package/dist/dev-server/reload-queue.d.ts +13 -0
- package/dist/dev-server/reload-queue.d.ts.map +1 -0
- package/dist/dev-server/runtime-health.d.ts +79 -0
- package/dist/dev-server/runtime-health.d.ts.map +1 -0
- package/dist/dev-server/runtime-stdio.d.ts +8 -0
- package/dist/dev-server/runtime-stdio.d.ts.map +1 -0
- package/dist/dev-server/server-startup-helpers.d.ts +84 -0
- package/dist/dev-server/server-startup-helpers.d.ts.map +1 -0
- package/dist/dev-server/server.d.ts +2 -0
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/dev-server/vite-process.d.ts +24 -0
- package/dist/dev-server/vite-process.d.ts.map +1 -0
- package/dist/dev-server/vite-utils.d.ts +19 -1
- package/dist/dev-server/vite-utils.d.ts.map +1 -1
- package/dist/dev-server/worker-source-watcher.d.ts +17 -0
- package/dist/dev-server/worker-source-watcher.d.ts.map +1 -0
- package/dist/dev-server/worker-surface-paths.d.ts +6 -0
- package/dist/dev-server/worker-surface-paths.d.ts.map +1 -0
- package/dist/dev-server/workspace/merge-config.d.ts +81 -0
- package/dist/dev-server/workspace/merge-config.d.ts.map +1 -0
- package/dist/dev-server/workspace/prepare-app.d.ts +84 -0
- package/dist/dev-server/workspace/prepare-app.d.ts.map +1 -0
- package/dist/dev-server/workspace/server.d.ts +47 -0
- package/dist/dev-server/workspace/server.d.ts.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index.d.ts +8 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -297
- package/dist/runtime/context-events.d.ts +13 -0
- package/dist/runtime/context-events.d.ts.map +1 -0
- package/dist/runtime/context-types.d.ts +82 -0
- package/dist/runtime/context-types.d.ts.map +1 -0
- package/dist/runtime/context.d.ts +20 -44
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/exports.d.ts +70 -55
- package/dist/runtime/exports.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +11 -5
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +5 -184
- package/dist/runtime/middleware.d.ts +119 -67
- package/dist/runtime/middleware.d.ts.map +1 -1
- package/dist/runtime/r2-presign.d.ts +164 -0
- package/dist/runtime/r2-presign.d.ts.map +1 -0
- package/dist/runtime/router/index.d.ts +7 -0
- package/dist/runtime/router/index.d.ts.map +1 -0
- package/dist/runtime/router/types.d.ts +24 -0
- package/dist/runtime/router/types.d.ts.map +1 -0
- package/dist/runtime/validation.d.ts +18 -4
- package/dist/runtime/validation.d.ts.map +1 -1
- package/dist/secrets/local-secrets.d.ts +46 -0
- package/dist/secrets/local-secrets.d.ts.map +1 -0
- package/dist/shims/local-hyperdrive.d.ts +12 -0
- package/dist/shims/local-hyperdrive.d.ts.map +1 -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.d.ts +1 -1
- package/dist/sveltekit/index.d.ts.map +1 -1
- package/dist/sveltekit/index.js +377 -169
- 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 +42 -2
- 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/alarm.d.ts +55 -0
- package/dist/test/alarm.d.ts.map +1 -0
- package/dist/test/binding-hints.d.ts +10 -0
- package/dist/test/binding-hints.d.ts.map +1 -0
- package/dist/test/cf.d.ts +71 -35
- package/dist/test/cf.d.ts.map +1 -1
- package/dist/test/containers.d.ts +87 -0
- package/dist/test/containers.d.ts.map +1 -0
- package/dist/test/email.d.ts +16 -7
- package/dist/test/email.d.ts.map +1 -1
- package/dist/test/index.d.ts +20 -21
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +5115 -75
- package/dist/test/offline-bindings.d.ts +124 -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/remote-cloudflare.d.ts +13 -0
- package/dist/test/remote-cloudflare.d.ts.map +1 -0
- package/dist/test/remote-vectorize.d.ts.map +1 -1
- package/dist/test/resolve-service-bindings.d.ts +64 -4
- package/dist/test/resolve-service-bindings.d.ts.map +1 -1
- package/dist/test/scheduled.d.ts.map +1 -1
- package/dist/test/should-skip.d.ts +14 -18
- package/dist/test/should-skip.d.ts.map +1 -1
- package/dist/test/simple-context-bindings.d.ts +13 -0
- package/dist/test/simple-context-bindings.d.ts.map +1 -0
- package/dist/test/simple-context-durable-objects.d.ts +6 -0
- package/dist/test/simple-context-durable-objects.d.ts.map +1 -0
- package/dist/test/simple-context-env.d.ts +35 -0
- package/dist/test/simple-context-env.d.ts.map +1 -0
- package/dist/test/simple-context-gateway-script.d.ts +2 -0
- package/dist/test/simple-context-gateway-script.d.ts.map +1 -0
- package/dist/test/simple-context-handlers.d.ts +12 -0
- package/dist/test/simple-context-handlers.d.ts.map +1 -0
- package/dist/test/simple-context-lifecycle.d.ts +32 -0
- package/dist/test/simple-context-lifecycle.d.ts.map +1 -0
- package/dist/test/simple-context-mfconfig.d.ts +18 -0
- package/dist/test/simple-context-mfconfig.d.ts.map +1 -0
- package/dist/test/simple-context-multi-worker.d.ts +16 -0
- package/dist/test/simple-context-multi-worker.d.ts.map +1 -0
- package/dist/test/simple-context-paths.d.ts +40 -0
- package/dist/test/simple-context-paths.d.ts.map +1 -0
- package/dist/test/simple-context-runtime.d.ts +19 -0
- package/dist/test/simple-context-runtime.d.ts.map +1 -0
- package/dist/test/simple-context-startup.d.ts +11 -0
- package/dist/test/simple-context-startup.d.ts.map +1 -0
- package/dist/test/simple-context-transport.d.ts +14 -0
- package/dist/test/simple-context-transport.d.ts.map +1 -0
- package/dist/test/simple-context.d.ts +8 -27
- package/dist/test/simple-context.d.ts.map +1 -1
- package/dist/test/tail.d.ts +3 -2
- package/dist/test/tail.d.ts.map +1 -1
- package/dist/test/utilities/analytics-engine.d.ts +22 -0
- package/dist/test/utilities/analytics-engine.d.ts.map +1 -0
- 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 +45 -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 +41 -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 +2 -0
- package/dist/test/utilities/r2.d.ts.map +1 -0
- package/dist/test/utilities/send-email.d.ts +27 -0
- package/dist/test/utilities/send-email.d.ts.map +1 -0
- package/dist/test/utilities/stream-flagship.d.ts +27 -0
- package/dist/test/utilities/stream-flagship.d.ts.map +1 -0
- package/dist/test/utilities/vectorize.d.ts +38 -0
- package/dist/test/utilities/vectorize.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 +14 -98
- package/dist/test/utilities.d.ts.map +1 -1
- package/dist/test/worker.d.ts +6 -0
- package/dist/test/worker.d.ts.map +1 -1
- package/dist/transform/durable-object.d.ts.map +1 -1
- package/dist/transform/index.d.ts +2 -2
- package/dist/transform/worker-entrypoint.d.ts +5 -0
- package/dist/transform/worker-entrypoint.d.ts.map +1 -1
- package/dist/utils/entrypoint-discovery.d.ts +6 -3
- package/dist/utils/entrypoint-discovery.d.ts.map +1 -1
- package/dist/utils/generated-dir.d.ts +25 -0
- package/dist/utils/generated-dir.d.ts.map +1 -0
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/utils/resolve-package.d.ts.map +1 -1
- package/dist/utils/send-email.d.ts +15 -0
- package/dist/utils/send-email.d.ts.map +1 -0
- package/dist/utils/send-email.js +163 -0
- package/dist/vite/config-file.d.ts +25 -0
- package/dist/vite/config-file.d.ts.map +1 -0
- package/dist/vite/index.d.ts +3 -2
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +2 -407
- package/dist/vite/plugin-config-hook.d.ts +28 -0
- package/dist/vite/plugin-config-hook.d.ts.map +1 -0
- package/dist/vite/plugin-context.d.ts +27 -0
- package/dist/vite/plugin-context.d.ts.map +1 -0
- package/dist/vite/plugin-durable-objects.d.ts +18 -0
- package/dist/vite/plugin-durable-objects.d.ts.map +1 -0
- package/dist/vite/plugin-programmatic.d.ts +44 -0
- package/dist/vite/plugin-programmatic.d.ts.map +1 -0
- package/dist/vite/plugin-service-bindings.d.ts +13 -0
- package/dist/vite/plugin-service-bindings.d.ts.map +1 -0
- package/dist/vite/plugin-transform.d.ts +41 -0
- package/dist/vite/plugin-transform.d.ts.map +1 -0
- package/dist/vite/plugin.d.ts +10 -41
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/worker-entry/composed-worker.d.ts +5 -8
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/dist/worker-entry/durable-object-discovery.d.ts +20 -0
- package/dist/worker-entry/durable-object-discovery.d.ts.map +1 -0
- package/dist/worker-entry/extensions.d.ts +5 -0
- package/dist/worker-entry/extensions.d.ts.map +1 -0
- package/dist/worker-entry/routes.d.ts +22 -0
- package/dist/worker-entry/routes.d.ts.map +1 -0
- package/dist/worker-entry/surface-paths.d.ts +26 -0
- package/dist/worker-entry/surface-paths.d.ts.map +1 -0
- package/dist/worker-entry/validate-fetch-style.d.ts +12 -0
- package/dist/worker-entry/validate-fetch-style.d.ts.map +1 -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 +160 -117
- package/R2.md +0 -170
- package/dist/account-rvrj687w.js +0 -397
- package/dist/ai-dx4fr9jh.js +0 -107
- package/dist/bridge/protocol.d.ts.map +0 -1
- package/dist/bridge/serialization.d.ts +0 -83
- package/dist/bridge/serialization.d.ts.map +0 -1
- package/dist/browser-shim/worker.d.ts +0 -14
- package/dist/browser-shim/worker.d.ts.map +0 -1
- package/dist/build-9myaxf07.js +0 -70
- package/dist/deploy-h1wz5p7m.js +0 -86
- package/dist/dev-rsdssknb.js +0 -2707
- package/dist/doctor-v7jy4s3r.js +0 -190
- package/dist/durable-object-t4kbb0yt.js +0 -13
- package/dist/index-18hvb6gb.js +0 -194
- package/dist/index-1xpj0m4r.js +0 -57
- package/dist/index-37x76zdn.js +0 -4
- package/dist/index-3t6rypgc.js +0 -13
- package/dist/index-62b3gt2g.js +0 -12
- package/dist/index-67qcae0f.js +0 -183
- package/dist/index-9ats0s83.js +0 -70
- package/dist/index-a0fjkq68.js +0 -198
- package/dist/index-a855bdsx.js +0 -18
- package/dist/index-ccrh4w3t.js +0 -1133
- package/dist/index-d8bdkx2h.js +0 -109
- package/dist/index-f8qh2tyh.js +0 -2152
- package/dist/index-gz1gndna.js +0 -307
- package/dist/index-hcex3rgh.js +0 -266
- package/dist/index-k7r18na8.js +0 -0
- package/dist/index-n3np2d6t.js +0 -462
- package/dist/index-n7rs26ft.js +0 -77
- package/dist/index-npc1c8jx.js +0 -44
- package/dist/index-p7g30wd2.js +0 -281
- package/dist/index-rbht7m9r.js +0 -36
- package/dist/index-tfyxa77h.js +0 -850
- package/dist/index-tk6ej9dj.js +0 -94
- package/dist/index-v8vvsn9x.js +0 -169
- package/dist/index-z14anrqp.js +0 -226
- package/dist/init-f9mgmew3.js +0 -186
- package/dist/remote-q59qk463.js +0 -97
- package/dist/test/bridge-context.d.ts +0 -76
- package/dist/test/bridge-context.d.ts.map +0 -1
- package/dist/test/multi-worker-context.d.ts +0 -114
- package/dist/test/multi-worker-context.d.ts.map +0 -1
- package/dist/types-wdcpnfvy.js +0 -487
- package/dist/worker-entrypoint-m9th0rg0.js +0 -13
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
import { i as resolveAppDirectSocketPort, r as loadWorkspaceManifest, t as assertSharedBindingIds } from "./workspace-Ds3xMjOE.js";
|
|
2
|
+
import { d as resolveConfigEnvVars } from "./preview-j9Kbx4-G.js";
|
|
3
|
+
import { r as loadConfig } from "./loader-BC0skbnH.js";
|
|
4
|
+
import { g as normalizeR2Binding, n as getLocalKVNamespaceIdentifier, r as getSingleBrowserBindingName, t as getLocalD1DatabaseIdentifier } from "./schema-normalization-CTdiY17P.js";
|
|
5
|
+
import { t as applyLocalDevVarsToConfig } from "./local-dev-vars-BFLS-HoI.js";
|
|
6
|
+
import { a as cyanBold, f as logLine, g as yellow, o as dim, r as createCliTheme } from "./ui-BhCdDC2N.js";
|
|
7
|
+
import { setLocalSendEmailBindings } from "../utils/send-email.js";
|
|
8
|
+
import { s as resolveServiceBindings, t as discoverRoutes } from "./routes-CRXB3-iw.js";
|
|
9
|
+
import { l as prepareComposedWorkerEntrypoint } from "./vite-DTz2Pbtm.js";
|
|
10
|
+
import { t as bundleWorkerEntry } from "./worker-bundler-CeMqQtBQ.js";
|
|
11
|
+
import { _ as createMiniflareLog, c as resolveViteIntegration, d as createRuntimeStdioForwarder, f as buildMiniflareDevConfig, g as runD1Migrations, h as resolveMainWorkerSurfacePaths, p as resolveR2PresignOrigin, t as startViteProcess, u as createBrowserShim, v as createDOBundler } from "./vite-process-BhGXJ764.js";
|
|
12
|
+
import { n as bundleWorkflowEntrypointScript } from "./r2-presign-runtime-DlgH_FY8.js";
|
|
13
|
+
import { t as generatedDir } from "./generated-dir-DC2kM-mt.js";
|
|
14
|
+
import { dirname, resolve } from "pathe";
|
|
15
|
+
import { createConsola } from "consola";
|
|
16
|
+
//#region src/dev-server/workspace/merge-config.ts
|
|
17
|
+
const NAMESPACE_SEPARATOR = "-";
|
|
18
|
+
/** Join an app namespace to one of its worker names for the merged instance. */
|
|
19
|
+
function namespacedWorkerName(appName, workerName) {
|
|
20
|
+
return `${appName}${NAMESPACE_SEPARATOR}${workerName}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Prefix `name` with `${appName}/` — but only when it is one of this app's own
|
|
24
|
+
* worker names. External/cross-app targets are left untouched.
|
|
25
|
+
*/
|
|
26
|
+
function namespaceIfLocal(name, appName, localNames) {
|
|
27
|
+
return localNames.has(name) ? namespacedWorkerName(appName, name) : name;
|
|
28
|
+
}
|
|
29
|
+
/** Rewrite an intra-app worker reference on a service-binding value (object or string form). */
|
|
30
|
+
function rewriteServiceBindingTarget(value, appName, localNames) {
|
|
31
|
+
if (typeof value === "string") return namespaceIfLocal(value, appName, localNames);
|
|
32
|
+
if (value && typeof value === "object" && typeof value.name === "string") value.name = namespaceIfLocal(value.name, appName, localNames);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Namespace one app's workers in place: rename each worker `${appName}/<name>`,
|
|
37
|
+
* rewrite every intra-app reference (service bindings, `durableObjects`
|
|
38
|
+
* scriptName, `outboundService`) to the new names, drop `routes`, and attach the
|
|
39
|
+
* app's direct socket to its gateway (entry) worker.
|
|
40
|
+
*
|
|
41
|
+
* @param appName - The app namespace (must be unique across the workspace).
|
|
42
|
+
* @param workers - The app's worker array (mutated). The gateway is `workers[0]`.
|
|
43
|
+
* @param options - `host`/`directSocketPort` for the gateway's direct socket.
|
|
44
|
+
* @returns The (same) workers plus the namespaced gateway worker name — the key
|
|
45
|
+
* for `miniflare.unsafeGetDirectURL(...)`.
|
|
46
|
+
*/
|
|
47
|
+
function namespaceAppWorkers(appName, workers, options) {
|
|
48
|
+
const localNames = new Set(workers.map((worker) => String(worker.name)));
|
|
49
|
+
for (const worker of workers) {
|
|
50
|
+
delete worker.routes;
|
|
51
|
+
if (worker.serviceBindings && typeof worker.serviceBindings === "object") for (const [bindingName, target] of Object.entries(worker.serviceBindings)) worker.serviceBindings[bindingName] = rewriteServiceBindingTarget(target, appName, localNames);
|
|
52
|
+
if (worker.durableObjects && typeof worker.durableObjects === "object") {
|
|
53
|
+
for (const value of Object.values(worker.durableObjects)) if (value && typeof value === "object" && typeof value.scriptName === "string") value.scriptName = namespaceIfLocal(value.scriptName, appName, localNames);
|
|
54
|
+
}
|
|
55
|
+
if (worker.outboundService !== void 0) worker.outboundService = rewriteServiceBindingTarget(worker.outboundService, appName, localNames);
|
|
56
|
+
worker.name = namespacedWorkerName(appName, String(worker.name));
|
|
57
|
+
}
|
|
58
|
+
const gatewayWorkerName = namespacedWorkerName(appName, "gateway");
|
|
59
|
+
const gatewayWorker = workers.find((worker) => worker.name === gatewayWorkerName) ?? workers[0];
|
|
60
|
+
gatewayWorker.unsafeDirectSockets = [{
|
|
61
|
+
host: options.host,
|
|
62
|
+
port: options.directSocketPort,
|
|
63
|
+
entrypoint: "default"
|
|
64
|
+
}];
|
|
65
|
+
return {
|
|
66
|
+
workers,
|
|
67
|
+
gatewayWorkerName: gatewayWorker.name
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Compute the one persist block for the whole workspace, or `undefined` when off. */
|
|
71
|
+
function resolveWorkspacePersistPaths(persist, persistDir) {
|
|
72
|
+
if (!persist) return;
|
|
73
|
+
return {
|
|
74
|
+
kvPersist: resolve(persistDir, "kv"),
|
|
75
|
+
r2Persist: resolve(persistDir, "r2"),
|
|
76
|
+
d1Persist: resolve(persistDir, "d1"),
|
|
77
|
+
cachePersist: resolve(persistDir, "cache"),
|
|
78
|
+
durableObjectsPersist: resolve(persistDir, "do"),
|
|
79
|
+
workflowsPersist: resolve(persistDir, "workflows"),
|
|
80
|
+
imagesPersist: resolve(persistDir, "images"),
|
|
81
|
+
streamPersist: resolve(persistDir, "stream")
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Assemble the final single-instance Miniflare config: one entry socket, one
|
|
86
|
+
* persist dir, and the union of every app's namespaced workers (each with its
|
|
87
|
+
* own direct socket).
|
|
88
|
+
*
|
|
89
|
+
* @param input - Apps, host, persist settings, and entry port.
|
|
90
|
+
* @returns `{ config, directSockets }` where `config` is the Miniflare options
|
|
91
|
+
* object and `directSockets` maps each app name to its gateway worker name
|
|
92
|
+
* and port (for `unsafeGetDirectURL` + logging).
|
|
93
|
+
* @throws When two apps share a namespace or a direct-socket port (which would
|
|
94
|
+
* collide inside the one instance).
|
|
95
|
+
*/
|
|
96
|
+
function buildMergedWorkspaceConfig(input) {
|
|
97
|
+
const seenAppNames = /* @__PURE__ */ new Set();
|
|
98
|
+
const seenPorts = /* @__PURE__ */ new Map();
|
|
99
|
+
const mergedWorkers = [];
|
|
100
|
+
const directSockets = [];
|
|
101
|
+
for (const app of input.apps) {
|
|
102
|
+
if (seenAppNames.has(app.appName)) throw new Error(`Duplicate workspace app namespace "${app.appName}". Give each app a unique name.`);
|
|
103
|
+
seenAppNames.add(app.appName);
|
|
104
|
+
const portOwner = seenPorts.get(app.directSocketPort);
|
|
105
|
+
if (portOwner !== void 0) throw new Error(`Workspace apps "${portOwner}" and "${app.appName}" both use port ${app.directSocketPort}. Each app needs a distinct direct-socket port.`);
|
|
106
|
+
seenPorts.set(app.directSocketPort, app.appName);
|
|
107
|
+
const { workers, gatewayWorkerName } = namespaceAppWorkers(app.appName, app.workers, {
|
|
108
|
+
host: input.host,
|
|
109
|
+
directSocketPort: app.directSocketPort
|
|
110
|
+
});
|
|
111
|
+
mergedWorkers.push(...workers);
|
|
112
|
+
directSockets.push({
|
|
113
|
+
appName: app.appName,
|
|
114
|
+
gatewayWorkerName,
|
|
115
|
+
port: app.directSocketPort
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const seenWorkerNames = /* @__PURE__ */ new Set();
|
|
119
|
+
for (const worker of mergedWorkers) {
|
|
120
|
+
const workerName = String(worker.name);
|
|
121
|
+
if (seenWorkerNames.has(workerName)) throw new Error(`Workspace produced two workers named "${workerName}" after namespacing. Rename one of the conflicting apps so their namespaced worker names stay distinct.`);
|
|
122
|
+
seenWorkerNames.add(workerName);
|
|
123
|
+
}
|
|
124
|
+
const persistPaths = resolveWorkspacePersistPaths(input.persist, input.persistDir);
|
|
125
|
+
return {
|
|
126
|
+
config: {
|
|
127
|
+
host: input.host,
|
|
128
|
+
port: input.entryPort ?? 0,
|
|
129
|
+
...persistPaths ?? {},
|
|
130
|
+
workers: mergedWorkers
|
|
131
|
+
},
|
|
132
|
+
directSockets
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/dev-server/workspace/prepare-app.ts
|
|
137
|
+
/**
|
|
138
|
+
* Load an app's config and build its Miniflare worker set, mirroring the
|
|
139
|
+
* single-app dev startup up to (but not including) `new Miniflare(...)`.
|
|
140
|
+
*
|
|
141
|
+
* Side effects: bundles the worker/workflow/DO entrypoints under the app's
|
|
142
|
+
* `.devflare/`, and starts a browser-rendering shim when the app binds one. The
|
|
143
|
+
* returned `doBundler`/`browserShim` are disposed by the coordinator.
|
|
144
|
+
*
|
|
145
|
+
* @param input - App identity, ports, and shared instance settings.
|
|
146
|
+
* @returns The prepared app (see {@link PreparedWorkspaceApp}).
|
|
147
|
+
*/
|
|
148
|
+
async function prepareWorkspaceApp(input) {
|
|
149
|
+
const { appCwd, configPath, directSocketPort, host, logger } = input;
|
|
150
|
+
const config = await applyLocalDevVarsToConfig(await resolveConfigEnvVars(await loadConfig({
|
|
151
|
+
cwd: appCwd,
|
|
152
|
+
configFile: configPath
|
|
153
|
+
}), {
|
|
154
|
+
cwd: appCwd,
|
|
155
|
+
configPath,
|
|
156
|
+
mode: "dev"
|
|
157
|
+
}), {
|
|
158
|
+
cwd: appCwd,
|
|
159
|
+
configPath
|
|
160
|
+
});
|
|
161
|
+
const appName = input.appName ?? config.name;
|
|
162
|
+
const serviceBindingResolution = config.bindings?.services ? await resolveServiceBindings(config, appCwd) : null;
|
|
163
|
+
let enableVite = false;
|
|
164
|
+
let generatedViteConfigPath = null;
|
|
165
|
+
if (input.vite) {
|
|
166
|
+
const viteIntegration = await resolveViteIntegration({
|
|
167
|
+
cwd: appCwd,
|
|
168
|
+
configPath,
|
|
169
|
+
miniflarePort: directSocketPort,
|
|
170
|
+
enableViteRequested: true,
|
|
171
|
+
logger
|
|
172
|
+
});
|
|
173
|
+
enableVite = viteIntegration.enableVite;
|
|
174
|
+
generatedViteConfigPath = viteIntegration.generatedViteConfigPath;
|
|
175
|
+
if (!enableVite) logger?.warn(`Workspace app "${appName}" set vite: true but no Vite config was found; running it worker-only.`);
|
|
176
|
+
}
|
|
177
|
+
const workflowEntrypointScript = await bundleWorkflowEntrypointScript(config, appCwd, { logger });
|
|
178
|
+
const mainWorkerSurfacePaths = await resolveMainWorkerSurfacePaths(appCwd, config);
|
|
179
|
+
const mainWorkerRoutes = await discoverRoutes(appCwd, config);
|
|
180
|
+
const mainWorkerScriptPath = await prepareComposedWorkerEntrypoint(appCwd, config, void 0, { devInternalEmail: true }) ?? null;
|
|
181
|
+
let bundledMainWorkerScriptPath = null;
|
|
182
|
+
if (mainWorkerScriptPath && !enableVite) bundledMainWorkerScriptPath = await bundleWorkerEntry({
|
|
183
|
+
cwd: appCwd,
|
|
184
|
+
inputFile: mainWorkerScriptPath,
|
|
185
|
+
outFile: generatedDir(appCwd, "worker-entrypoints", "main.js"),
|
|
186
|
+
rolldownOptions: config.rolldown?.options,
|
|
187
|
+
sourcemap: config.rolldown?.sourcemap,
|
|
188
|
+
minify: config.rolldown?.minify,
|
|
189
|
+
logger
|
|
190
|
+
});
|
|
191
|
+
let doResult = null;
|
|
192
|
+
let doBundler = null;
|
|
193
|
+
const doPattern = config.files?.durableObjects;
|
|
194
|
+
if (typeof doPattern === "string" && doPattern) {
|
|
195
|
+
doBundler = createDOBundler({
|
|
196
|
+
cwd: appCwd,
|
|
197
|
+
pattern: doPattern,
|
|
198
|
+
outDir: resolve(appCwd, ".devflare", "do-bundles"),
|
|
199
|
+
rolldownOptions: config.rolldown?.options,
|
|
200
|
+
sourcemap: config.rolldown?.sourcemap,
|
|
201
|
+
minify: config.rolldown?.minify,
|
|
202
|
+
logger,
|
|
203
|
+
onRebuild: async () => {}
|
|
204
|
+
});
|
|
205
|
+
doResult = await doBundler.build();
|
|
206
|
+
}
|
|
207
|
+
let browserShim = null;
|
|
208
|
+
if (getSingleBrowserBindingName(config.bindings?.browser)) {
|
|
209
|
+
browserShim = createBrowserShim({
|
|
210
|
+
port: input.browserShimPort,
|
|
211
|
+
host: "127.0.0.1",
|
|
212
|
+
logger,
|
|
213
|
+
verbose: input.verbose
|
|
214
|
+
});
|
|
215
|
+
await browserShim.start();
|
|
216
|
+
}
|
|
217
|
+
const workers = buildMiniflareDevConfig({
|
|
218
|
+
config,
|
|
219
|
+
cwd: appCwd,
|
|
220
|
+
miniflarePort: directSocketPort,
|
|
221
|
+
miniflareHost: host,
|
|
222
|
+
persist: input.persist,
|
|
223
|
+
enableVite,
|
|
224
|
+
debug: input.debug,
|
|
225
|
+
mainWorkerSurfacePaths,
|
|
226
|
+
mainWorkerRoutes,
|
|
227
|
+
mainWorkerScriptPath,
|
|
228
|
+
bundledMainWorkerScriptPath,
|
|
229
|
+
workflowEntrypointScript,
|
|
230
|
+
browserShimPort: input.browserShimPort,
|
|
231
|
+
doResult,
|
|
232
|
+
serviceBindingResolution,
|
|
233
|
+
r2PresignSecret: input.r2PresignSecret,
|
|
234
|
+
additionalInjectedVars: input.env,
|
|
235
|
+
logger
|
|
236
|
+
}).workers;
|
|
237
|
+
const sharedIds = {
|
|
238
|
+
d1: {},
|
|
239
|
+
r2: {},
|
|
240
|
+
kv: {}
|
|
241
|
+
};
|
|
242
|
+
for (const [name, cfg] of Object.entries(config.bindings?.d1 ?? {})) sharedIds.d1[name] = getLocalD1DatabaseIdentifier(cfg);
|
|
243
|
+
for (const [name, cfg] of Object.entries(config.bindings?.r2 ?? {})) sharedIds.r2[name] = normalizeR2Binding(cfg).bucketName;
|
|
244
|
+
for (const [name, cfg] of Object.entries(config.bindings?.kv ?? {})) sharedIds.kv[name] = getLocalKVNamespaceIdentifier(cfg);
|
|
245
|
+
return {
|
|
246
|
+
appName,
|
|
247
|
+
appCwd,
|
|
248
|
+
configPath,
|
|
249
|
+
config,
|
|
250
|
+
workers,
|
|
251
|
+
directSocketPort,
|
|
252
|
+
vitePort: input.vitePort,
|
|
253
|
+
enableVite,
|
|
254
|
+
generatedViteConfigPath,
|
|
255
|
+
doBundler,
|
|
256
|
+
browserShim,
|
|
257
|
+
sendEmailBindings: config.bindings?.sendEmail ?? {},
|
|
258
|
+
sharedIds
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//#endregion
|
|
262
|
+
//#region src/dev-server/workspace/server.ts
|
|
263
|
+
/** The first browser-shim port; each app that binds browser rendering gets `+index`. */
|
|
264
|
+
const BROWSER_SHIM_BASE_PORT = 9700;
|
|
265
|
+
/** Delay before running migrations, matching the single-app path's stabilization wait. */
|
|
266
|
+
const MIGRATION_STABILIZE_DELAY_MS = 1e3;
|
|
267
|
+
/**
|
|
268
|
+
* Create a workspace dev server that co-hosts every manifest app in one
|
|
269
|
+
* Miniflare instance with live-shared bindings.
|
|
270
|
+
*
|
|
271
|
+
* @param options - The manifest, its directory, and logging/persist settings.
|
|
272
|
+
* @returns A {@link WorkspaceDevServer} handle.
|
|
273
|
+
*/
|
|
274
|
+
function createWorkspaceDevServer(options) {
|
|
275
|
+
const { manifest, manifestDir, logger } = options;
|
|
276
|
+
const persist = options.persist ?? true;
|
|
277
|
+
const verbose = options.verbose ?? false;
|
|
278
|
+
const debug = options.debug ?? process.env.DEVFLARE_DEBUG === "true";
|
|
279
|
+
const host = manifest.host ?? "127.0.0.1";
|
|
280
|
+
const persistDir = resolve(manifestDir, manifest.persist ?? ".devflare/workspace-data");
|
|
281
|
+
const r2PresignSecret = `${crypto.randomUUID()}${crypto.randomUUID()}`;
|
|
282
|
+
let miniflare = null;
|
|
283
|
+
let preparedApps = [];
|
|
284
|
+
const viteChildren = [];
|
|
285
|
+
const appOrigins = [];
|
|
286
|
+
/**
|
|
287
|
+
* Prepare each manifest app (sequentially — config load + bundling mutate
|
|
288
|
+
* app-local `.devflare/` dirs and we want deterministic, non-interleaved
|
|
289
|
+
* work).
|
|
290
|
+
*/
|
|
291
|
+
async function prepareAllApps() {
|
|
292
|
+
const prepared = [];
|
|
293
|
+
for (let index = 0; index < manifest.apps.length; index++) {
|
|
294
|
+
const app = manifest.apps[index];
|
|
295
|
+
const label = app.name ?? app.config;
|
|
296
|
+
const directSocketPort = resolveAppDirectSocketPort(app, label);
|
|
297
|
+
const configPath = resolve(manifestDir, app.config);
|
|
298
|
+
logger?.info(`Preparing workspace app "${label}" (port ${directSocketPort})…`);
|
|
299
|
+
prepared.push(await prepareWorkspaceApp({
|
|
300
|
+
appName: app.name,
|
|
301
|
+
configPath,
|
|
302
|
+
appCwd: dirname(configPath),
|
|
303
|
+
directSocketPort,
|
|
304
|
+
vite: app.vite ?? false,
|
|
305
|
+
vitePort: app.vitePort ?? 5173,
|
|
306
|
+
env: app.env,
|
|
307
|
+
persist,
|
|
308
|
+
debug,
|
|
309
|
+
verbose,
|
|
310
|
+
browserShimPort: BROWSER_SHIM_BASE_PORT + index,
|
|
311
|
+
r2PresignSecret,
|
|
312
|
+
host,
|
|
313
|
+
logger
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
return prepared;
|
|
317
|
+
}
|
|
318
|
+
/** Merge sendEmail bindings from all apps and register them once (global registry). */
|
|
319
|
+
function registerSharedSendEmailBindings(apps) {
|
|
320
|
+
const merged = {};
|
|
321
|
+
for (const app of apps) Object.assign(merged, app.sendEmailBindings);
|
|
322
|
+
setLocalSendEmailBindings(merged);
|
|
323
|
+
}
|
|
324
|
+
async function startMiniflare(apps) {
|
|
325
|
+
const { Miniflare, Log, LogLevel } = await import("miniflare");
|
|
326
|
+
const { config, directSockets } = buildMergedWorkspaceConfig({
|
|
327
|
+
apps: apps.map((app) => ({
|
|
328
|
+
appName: app.appName,
|
|
329
|
+
workers: app.workers,
|
|
330
|
+
directSocketPort: app.directSocketPort
|
|
331
|
+
})),
|
|
332
|
+
host,
|
|
333
|
+
persist,
|
|
334
|
+
persistDir,
|
|
335
|
+
entryPort: manifest.entryPort
|
|
336
|
+
});
|
|
337
|
+
const log = createMiniflareLog(Log, LogLevel, "DEBUG", logger);
|
|
338
|
+
if (log) config.log = log;
|
|
339
|
+
config.handleRuntimeStdio = createRuntimeStdioForwarder(logger);
|
|
340
|
+
miniflare = new Miniflare(config);
|
|
341
|
+
await miniflare.ready;
|
|
342
|
+
for (const socket of directSockets) {
|
|
343
|
+
const url = await miniflare.unsafeGetDirectURL(socket.gatewayWorkerName);
|
|
344
|
+
const app = apps.find((candidate) => candidate.appName === socket.appName);
|
|
345
|
+
const isVite = app?.enableVite ?? false;
|
|
346
|
+
const origin = isVite ? `http://${host}:${app?.vitePort ?? socket.port}` : url.href;
|
|
347
|
+
appOrigins.push({
|
|
348
|
+
appName: socket.appName,
|
|
349
|
+
url: origin,
|
|
350
|
+
vite: isVite
|
|
351
|
+
});
|
|
352
|
+
logger?.success(isVite ? `App "${socket.appName}" → Vite ${origin} (bridge ${url.href})` : `App "${socket.appName}" → ${url.href}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/** Run each app's D1 migrations once against the shared store (ledger dedupes). */
|
|
356
|
+
async function runMigrations(apps) {
|
|
357
|
+
await new Promise((r) => setTimeout(r, MIGRATION_STABILIZE_DELAY_MS));
|
|
358
|
+
for (const app of apps) {
|
|
359
|
+
if (!app.config.bindings?.d1) continue;
|
|
360
|
+
await runD1Migrations({
|
|
361
|
+
cwd: app.appCwd,
|
|
362
|
+
config: app.config,
|
|
363
|
+
miniflarePort: app.directSocketPort,
|
|
364
|
+
logger
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/** Spawn a Vite child per Vite app, pointed at its gateway's direct socket (bridge). */
|
|
369
|
+
async function startViteChildren(apps) {
|
|
370
|
+
for (const app of apps) {
|
|
371
|
+
if (!app.enableVite) continue;
|
|
372
|
+
const child = await startViteProcess({
|
|
373
|
+
cwd: app.appCwd,
|
|
374
|
+
configPath: app.configPath,
|
|
375
|
+
vitePort: app.vitePort,
|
|
376
|
+
miniflarePort: app.directSocketPort,
|
|
377
|
+
generatedViteConfigPath: app.generatedViteConfigPath,
|
|
378
|
+
r2Presign: app.config.bindings?.r2 ? {
|
|
379
|
+
secret: r2PresignSecret,
|
|
380
|
+
origin: resolveR2PresignOrigin(app.config.server, host, app.directSocketPort)
|
|
381
|
+
} : null,
|
|
382
|
+
logger
|
|
383
|
+
});
|
|
384
|
+
viteChildren.push(child);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async function start() {
|
|
388
|
+
logger?.info("Starting workspace dev server…");
|
|
389
|
+
preparedApps = await prepareAllApps();
|
|
390
|
+
if (manifest.shared) assertSharedBindingIds(manifest.shared, preparedApps.map((app) => ({
|
|
391
|
+
appLabel: app.appName,
|
|
392
|
+
d1: app.sharedIds.d1,
|
|
393
|
+
r2: app.sharedIds.r2,
|
|
394
|
+
kv: app.sharedIds.kv
|
|
395
|
+
})));
|
|
396
|
+
registerSharedSendEmailBindings(preparedApps);
|
|
397
|
+
await startMiniflare(preparedApps);
|
|
398
|
+
await startViteChildren(preparedApps);
|
|
399
|
+
await runMigrations(preparedApps);
|
|
400
|
+
logger?.success(`Workspace ready — ${preparedApps.length} app(s) sharing one instance`);
|
|
401
|
+
}
|
|
402
|
+
async function stop() {
|
|
403
|
+
for (const child of viteChildren) child.kill();
|
|
404
|
+
viteChildren.length = 0;
|
|
405
|
+
for (const app of preparedApps) {
|
|
406
|
+
try {
|
|
407
|
+
await app.doBundler?.close();
|
|
408
|
+
} catch (error) {
|
|
409
|
+
logger?.debug(`DO bundler close failed for ${app.appName}: ${String(error)}`);
|
|
410
|
+
}
|
|
411
|
+
try {
|
|
412
|
+
await app.browserShim?.stop();
|
|
413
|
+
} catch (error) {
|
|
414
|
+
logger?.debug(`Browser shim stop failed for ${app.appName}: ${String(error)}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (miniflare) {
|
|
418
|
+
await miniflare.dispose();
|
|
419
|
+
miniflare = null;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
start,
|
|
424
|
+
stop,
|
|
425
|
+
getMiniflare: () => miniflare,
|
|
426
|
+
getAppOrigins: () => appOrigins
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
//#endregion
|
|
430
|
+
//#region src/cli/commands/workspace.ts
|
|
431
|
+
/**
|
|
432
|
+
* Run the `workspace` command. Only the `dev` subcommand exists today; any
|
|
433
|
+
* other (or missing) subcommand prints guidance and exits non-zero.
|
|
434
|
+
*/
|
|
435
|
+
async function runWorkspaceCommand(parsed, logger, options) {
|
|
436
|
+
const subcommand = parsed.args[0] ?? "dev";
|
|
437
|
+
if (subcommand !== "dev") {
|
|
438
|
+
logger.error(`Unknown workspace subcommand: ${subcommand}`);
|
|
439
|
+
logger.info("Usage: devflare workspace dev");
|
|
440
|
+
return { exitCode: 1 };
|
|
441
|
+
}
|
|
442
|
+
const cwd = options.cwd || parsed.options.cwd || process.cwd();
|
|
443
|
+
const configFile = parsed.options.config;
|
|
444
|
+
const persist = parsed.options["no-persist"] !== true;
|
|
445
|
+
const debugEnabled = parsed.options.debug === true || process.env.DEVFLARE_DEBUG === "true";
|
|
446
|
+
const verbose = parsed.options.verbose === true || debugEnabled;
|
|
447
|
+
const theme = createCliTheme(parsed.options);
|
|
448
|
+
const devLogger = createConsola({ level: verbose ? 4 : 3 });
|
|
449
|
+
let loaded;
|
|
450
|
+
try {
|
|
451
|
+
loaded = await loadWorkspaceManifest({
|
|
452
|
+
cwd,
|
|
453
|
+
configFile
|
|
454
|
+
});
|
|
455
|
+
} catch (error) {
|
|
456
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
457
|
+
return { exitCode: 1 };
|
|
458
|
+
}
|
|
459
|
+
logLine(logger);
|
|
460
|
+
logLine(logger, `${cyanBold("workspace", theme)} ${dim("Shared Dev Runtime", theme)}`);
|
|
461
|
+
logLine(logger, " ├─ One Miniflare: live-shared D1/KV/R2/Durable Objects");
|
|
462
|
+
logLine(logger, " ├─ Per-app direct sockets: cross-origin preserved");
|
|
463
|
+
logLine(logger, ` └─ ${loaded.manifest.apps.length} app(s) from the workspace manifest`);
|
|
464
|
+
logLine(logger);
|
|
465
|
+
const devServer = createWorkspaceDevServer({
|
|
466
|
+
manifest: loaded.manifest,
|
|
467
|
+
manifestDir: loaded.manifestDir,
|
|
468
|
+
persist,
|
|
469
|
+
logger: devLogger,
|
|
470
|
+
verbose,
|
|
471
|
+
debug: debugEnabled
|
|
472
|
+
});
|
|
473
|
+
let isCleaningUp = false;
|
|
474
|
+
const cleanupHandlers = /* @__PURE__ */ new Map();
|
|
475
|
+
const removeCleanupHandlers = () => {
|
|
476
|
+
for (const [event, handler] of cleanupHandlers) process.off(event, handler);
|
|
477
|
+
cleanupHandlers.clear();
|
|
478
|
+
};
|
|
479
|
+
const cleanup = async (exitCode, reason) => {
|
|
480
|
+
if (isCleaningUp) return;
|
|
481
|
+
isCleaningUp = true;
|
|
482
|
+
removeCleanupHandlers();
|
|
483
|
+
if (reason) {
|
|
484
|
+
const message = reason instanceof Error ? reason.stack ?? reason.message : String(reason);
|
|
485
|
+
logger.error(message);
|
|
486
|
+
}
|
|
487
|
+
logLine(logger);
|
|
488
|
+
logLine(logger, `${yellow("workspace", theme)} ${dim("Shutting down…", theme)}`);
|
|
489
|
+
try {
|
|
490
|
+
await devServer.stop();
|
|
491
|
+
} finally {
|
|
492
|
+
process.exit(exitCode);
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
const registerCleanupHandler = (event, handler) => {
|
|
496
|
+
cleanupHandlers.set(event, handler);
|
|
497
|
+
process.on(event, handler);
|
|
498
|
+
};
|
|
499
|
+
registerCleanupHandler("SIGINT", () => void cleanup(0));
|
|
500
|
+
registerCleanupHandler("SIGTERM", () => void cleanup(0));
|
|
501
|
+
registerCleanupHandler("SIGHUP", () => void cleanup(0));
|
|
502
|
+
registerCleanupHandler("uncaughtException", (error) => void cleanup(1, error));
|
|
503
|
+
registerCleanupHandler("unhandledRejection", (reason) => void cleanup(1, reason));
|
|
504
|
+
try {
|
|
505
|
+
await devServer.start();
|
|
506
|
+
await new Promise(() => {});
|
|
507
|
+
return { exitCode: 0 };
|
|
508
|
+
} catch (error) {
|
|
509
|
+
if (error instanceof Error) {
|
|
510
|
+
logger.error("Workspace dev server failed:", error.message);
|
|
511
|
+
if (verbose) logger.error(error.stack);
|
|
512
|
+
}
|
|
513
|
+
await devServer.stop().catch(() => {});
|
|
514
|
+
return { exitCode: 1 };
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
//#endregion
|
|
518
|
+
export { runWorkspaceCommand };
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "pathe";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
//#region src/config/workspace.ts
|
|
6
|
+
/**
|
|
7
|
+
* Per-app entry in a workspace manifest.
|
|
8
|
+
*
|
|
9
|
+
* A pure worker app is reached directly on {@link WorkspaceApp.port}; a Vite app
|
|
10
|
+
* is served by Vite on {@link WorkspaceApp.vitePort} and reaches its bindings
|
|
11
|
+
* through the gateway bridge on {@link WorkspaceApp.bridgePort}.
|
|
12
|
+
*/
|
|
13
|
+
const workspaceAppSchema = z.object({
|
|
14
|
+
config: z.string().min(1),
|
|
15
|
+
name: z.string().min(1).optional(),
|
|
16
|
+
port: z.number().int().positive().max(65535).optional(),
|
|
17
|
+
vite: z.boolean().optional(),
|
|
18
|
+
vitePort: z.number().int().positive().max(65535).optional(),
|
|
19
|
+
bridgePort: z.number().int().positive().max(65535).optional(),
|
|
20
|
+
env: z.record(z.string()).optional()
|
|
21
|
+
}).strict();
|
|
22
|
+
const workspaceManifestSchema = z.object({
|
|
23
|
+
apps: z.array(workspaceAppSchema).min(1),
|
|
24
|
+
shared: z.object({
|
|
25
|
+
d1: z.array(z.string()).optional(),
|
|
26
|
+
r2: z.array(z.string()).optional(),
|
|
27
|
+
kv: z.array(z.string()).optional()
|
|
28
|
+
}).strict().optional(),
|
|
29
|
+
persist: z.string().min(1).optional(),
|
|
30
|
+
host: z.string().min(1).optional(),
|
|
31
|
+
entryPort: z.number().int().nonnegative().max(65535).optional()
|
|
32
|
+
}).strict();
|
|
33
|
+
/**
|
|
34
|
+
* Type-safe helper for defining a devflare workspace manifest. Mirrors
|
|
35
|
+
* {@link defineConfig}: it only attaches types and returns the value unchanged.
|
|
36
|
+
*
|
|
37
|
+
* @param manifest - The workspace manifest.
|
|
38
|
+
* @returns The same manifest, typed.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* // devflare.workspace.ts (repo root)
|
|
42
|
+
* export default defineWorkspace({
|
|
43
|
+
* apps: [
|
|
44
|
+
* { config: './apps/api/devflare.config.ts', port: 8789, env: { DOC_API_DEV_SEED: '1' } },
|
|
45
|
+
* { config: './apps/web/devflare.config.ts', vite: true, vitePort: 5173, bridgePort: 8788 }
|
|
46
|
+
* ],
|
|
47
|
+
* shared: { d1: ['PLATFORM_DB'], r2: ['MEDIA'] }
|
|
48
|
+
* })
|
|
49
|
+
*/
|
|
50
|
+
function defineWorkspace(manifest) {
|
|
51
|
+
return manifest;
|
|
52
|
+
}
|
|
53
|
+
/** Manifest file names searched at the workspace root, in priority order. */
|
|
54
|
+
const WORKSPACE_MANIFEST_FILES = [
|
|
55
|
+
"devflare.workspace.ts",
|
|
56
|
+
"devflare.workspace.mts",
|
|
57
|
+
"devflare.workspace.js",
|
|
58
|
+
"devflare.workspace.mjs"
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* The browser/direct-socket port a given app is reached on inside the shared
|
|
62
|
+
* instance: `bridgePort` for a Vite app, `port` for a pure worker. Throws a
|
|
63
|
+
* descriptive error when the required port is missing.
|
|
64
|
+
*
|
|
65
|
+
* @param app - A validated workspace app entry.
|
|
66
|
+
* @param label - Human-readable app label for error messages.
|
|
67
|
+
* @returns The direct-socket port for the app's gateway worker.
|
|
68
|
+
* @throws When a Vite app omits `bridgePort` or a worker app omits `port`.
|
|
69
|
+
*/
|
|
70
|
+
function resolveAppDirectSocketPort(app, label) {
|
|
71
|
+
if (app.vite) {
|
|
72
|
+
if (app.bridgePort === void 0) throw new Error(`Workspace app "${label}" sets vite: true but is missing "bridgePort".`);
|
|
73
|
+
return app.bridgePort;
|
|
74
|
+
}
|
|
75
|
+
if (app.port === void 0) throw new Error(`Workspace app "${label}" is a pure worker but is missing "port".`);
|
|
76
|
+
return app.port;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* c12 resolves TypeScript/ESM manifests via jiti. Prefer the target project's
|
|
80
|
+
* own `c12` install (mirrors {@link loadConfig}) so a monorepo that vendors
|
|
81
|
+
* devflare per-app still transpiles the manifest; fall back to devflare's own.
|
|
82
|
+
*/
|
|
83
|
+
function resolveC12LoadConfig(cwd) {
|
|
84
|
+
const requireFromCwd = createRequire(join(cwd, "__devflare_workspace__.cjs"));
|
|
85
|
+
try {
|
|
86
|
+
return requireFromCwd("c12").loadConfig;
|
|
87
|
+
} catch {
|
|
88
|
+
return createRequire(import.meta.url)("c12").loadConfig;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Load, transpile, and validate a workspace manifest.
|
|
93
|
+
*
|
|
94
|
+
* @param options - Search directory and optional explicit file.
|
|
95
|
+
* @returns The validated manifest plus its resolved path/dir.
|
|
96
|
+
* @throws {WorkspaceManifestNotFoundError} When no manifest file is found.
|
|
97
|
+
* @throws {WorkspaceManifestValidationError} When the manifest fails schema validation.
|
|
98
|
+
*/
|
|
99
|
+
async function loadWorkspaceManifest(options = {}) {
|
|
100
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
101
|
+
const configFile = options.configFile ?? "devflare.workspace";
|
|
102
|
+
const explicitManifestPath = options.configFile ? resolve(cwd, options.configFile) : void 0;
|
|
103
|
+
if (!(explicitManifestPath !== void 0 && existsSync(explicitManifestPath) || WORKSPACE_MANIFEST_FILES.some((name) => existsSync(join(cwd, name))))) throw new WorkspaceManifestNotFoundError(cwd);
|
|
104
|
+
const { config, configFile: loadedFile } = await resolveC12LoadConfig(cwd)({
|
|
105
|
+
name: "devflare",
|
|
106
|
+
cwd,
|
|
107
|
+
configFile,
|
|
108
|
+
rcFile: false,
|
|
109
|
+
globalRc: false,
|
|
110
|
+
dotenv: false
|
|
111
|
+
});
|
|
112
|
+
if (!config || !loadedFile) throw new WorkspaceManifestNotFoundError(cwd);
|
|
113
|
+
const result = workspaceManifestSchema.safeParse(config);
|
|
114
|
+
if (!result.success) throw new WorkspaceManifestValidationError(result.error.issues, loadedFile);
|
|
115
|
+
return {
|
|
116
|
+
manifest: result.data,
|
|
117
|
+
manifestPath: loadedFile,
|
|
118
|
+
manifestDir: dirname(loadedFile)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** Error thrown when no workspace manifest file is found. */
|
|
122
|
+
var WorkspaceManifestNotFoundError = class extends Error {
|
|
123
|
+
code = "WORKSPACE_MANIFEST_NOT_FOUND";
|
|
124
|
+
constructor(cwd) {
|
|
125
|
+
super(`No workspace manifest found in ${cwd}.\nExpected one of: ${WORKSPACE_MANIFEST_FILES.join(", ")}\nCreate one that exports \`defineWorkspace({ apps: [...] })\`.`);
|
|
126
|
+
this.cwd = cwd;
|
|
127
|
+
this.name = "WorkspaceManifestNotFoundError";
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
/** Error thrown when a workspace manifest fails schema validation. */
|
|
131
|
+
var WorkspaceManifestValidationError = class extends Error {
|
|
132
|
+
code = "WORKSPACE_MANIFEST_VALIDATION_ERROR";
|
|
133
|
+
constructor(issues, manifestPath) {
|
|
134
|
+
const issueMessages = issues.map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`);
|
|
135
|
+
super(`Invalid workspace manifest in ${manifestPath}:\n${issueMessages.join("\n")}`);
|
|
136
|
+
this.issues = issues;
|
|
137
|
+
this.manifestPath = manifestPath;
|
|
138
|
+
this.name = "WorkspaceManifestValidationError";
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Assert that every binding name listed in `manifest.shared` resolves to the
|
|
143
|
+
* SAME local identifier across the apps that declare it — otherwise the apps
|
|
144
|
+
* would silently get SEPARATE stores. Sharing is by id, so a mismatch is a real
|
|
145
|
+
* bug in the configs, surfaced here as a loud error rather than a subtle
|
|
146
|
+
* "writes don't appear" symptom.
|
|
147
|
+
*
|
|
148
|
+
* @param assertions - The `shared` block from the manifest.
|
|
149
|
+
* @param resolved - Per-app resolved identifiers: `{ appLabel, d1, r2, kv }`
|
|
150
|
+
* where each map is `bindingName -> localIdentifier` for that app.
|
|
151
|
+
* @throws When a shared binding resolves to differing ids (or is absent everywhere).
|
|
152
|
+
*/
|
|
153
|
+
function assertSharedBindingIds(assertions, resolved) {
|
|
154
|
+
for (const kind of [
|
|
155
|
+
"d1",
|
|
156
|
+
"r2",
|
|
157
|
+
"kv"
|
|
158
|
+
]) for (const bindingName of assertions[kind] ?? []) {
|
|
159
|
+
const seen = [];
|
|
160
|
+
for (const app of resolved) {
|
|
161
|
+
const id = app[kind][bindingName];
|
|
162
|
+
if (id !== void 0) seen.push({
|
|
163
|
+
appLabel: app.appLabel,
|
|
164
|
+
id
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (seen.length === 0) throw new Error(`Workspace "shared.${kind}" lists "${bindingName}", but no app declares that ${kind.toUpperCase()} binding.`);
|
|
168
|
+
if (new Set(seen.map((entry) => entry.id)).size > 1) {
|
|
169
|
+
const detail = seen.map((entry) => `${entry.appLabel} → ${entry.id}`).join(", ");
|
|
170
|
+
throw new Error(`Workspace "shared.${kind}" binding "${bindingName}" resolves to different ids across apps (${detail}); they would NOT share a store. Align the ${kind.toUpperCase()} id in the app configs.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//#endregion
|
|
175
|
+
export { resolveAppDirectSocketPort as i, defineWorkspace as n, loadWorkspaceManifest as r, assertSharedBindingIds as t };
|