workerstack 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/access.d.ts +131 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +333 -0
- package/dist/access.js.map +1 -0
- package/dist/api/builder.d.ts +457 -0
- package/dist/api/builder.d.ts.map +1 -0
- package/dist/api/builder.js +45 -0
- package/dist/api/builder.js.map +1 -0
- package/dist/api/catalog.d.ts +8 -0
- package/dist/api/catalog.d.ts.map +1 -0
- package/dist/api/catalog.js +56 -0
- package/dist/api/catalog.js.map +1 -0
- package/dist/api/context.d.ts +47 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +40 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/crud-router.d.ts +476 -0
- package/dist/api/crud-router.d.ts.map +1 -0
- package/dist/api/crud-router.js +354 -0
- package/dist/api/crud-router.js.map +1 -0
- package/dist/api/list-input-schema.d.ts +37 -0
- package/dist/api/list-input-schema.d.ts.map +1 -0
- package/dist/api/list-input-schema.js +63 -0
- package/dist/api/list-input-schema.js.map +1 -0
- package/dist/api/list-spec.d.ts +44 -0
- package/dist/api/list-spec.d.ts.map +1 -0
- package/dist/api/list-spec.js +49 -0
- package/dist/api/list-spec.js.map +1 -0
- package/dist/api/live-view.d.ts +14 -0
- package/dist/api/live-view.d.ts.map +1 -0
- package/dist/api/live-view.js +42 -0
- package/dist/api/live-view.js.map +1 -0
- package/dist/api/live-window.d.ts +40 -0
- package/dist/api/live-window.d.ts.map +1 -0
- package/dist/api/live-window.js +93 -0
- package/dist/api/live-window.js.map +1 -0
- package/dist/api/openapi.d.ts +6 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +146 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/realtime-router.d.ts +94 -0
- package/dist/api/realtime-router.d.ts.map +1 -0
- package/dist/api/realtime-router.js +45 -0
- package/dist/api/realtime-router.js.map +1 -0
- package/dist/api/registry.d.ts +30 -0
- package/dist/api/registry.d.ts.map +1 -0
- package/dist/api/registry.js +236 -0
- package/dist/api/registry.js.map +1 -0
- package/dist/api/router.d.ts +15 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +32 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/storage-router.d.ts +349 -0
- package/dist/api/storage-router.d.ts.map +1 -0
- package/dist/api/storage-router.js +155 -0
- package/dist/api/storage-router.js.map +1 -0
- package/dist/api/types.d.ts +55 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth-password.d.ts +27 -0
- package/dist/auth-password.d.ts.map +1 -0
- package/dist/auth-password.js +60 -0
- package/dist/auth-password.js.map +1 -0
- package/dist/auth.d.ts +59 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +146 -0
- package/dist/auth.js.map +1 -0
- package/dist/backend-internals.d.ts +35 -0
- package/dist/backend-internals.d.ts.map +1 -0
- package/dist/backend-internals.js +2 -0
- package/dist/backend-internals.js.map +1 -0
- package/dist/backend.d.ts +63 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +59 -0
- package/dist/backend.js.map +1 -0
- package/dist/blueprint-generator.d.ts +21 -0
- package/dist/blueprint-generator.d.ts.map +1 -0
- package/dist/blueprint-generator.js +199 -0
- package/dist/blueprint-generator.js.map +1 -0
- package/dist/blueprint.d.ts +99 -0
- package/dist/blueprint.d.ts.map +1 -0
- package/dist/blueprint.js +257 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/cli-skills.d.ts +16 -0
- package/dist/cli-skills.d.ts.map +1 -0
- package/dist/cli-skills.js +108 -0
- package/dist/cli-skills.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +205 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/client.d.ts +53 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +111 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/live-view.d.ts +49 -0
- package/dist/client/live-view.d.ts.map +1 -0
- package/dist/client/live-view.js +184 -0
- package/dist/client/live-view.js.map +1 -0
- package/dist/client/react.d.ts +4 -0
- package/dist/client/react.d.ts.map +1 -0
- package/dist/client/react.js +6 -0
- package/dist/client/react.js.map +1 -0
- package/dist/client/realtime.d.ts +54 -0
- package/dist/client/realtime.d.ts.map +1 -0
- package/dist/client/realtime.js +105 -0
- package/dist/client/realtime.js.map +1 -0
- package/dist/client/rest.d.ts +2 -0
- package/dist/client/rest.d.ts.map +1 -0
- package/dist/client/rest.js +2 -0
- package/dist/client/rest.js.map +1 -0
- package/dist/client/rpc-client.d.ts +38 -0
- package/dist/client/rpc-client.d.ts.map +1 -0
- package/dist/client/rpc-client.js +59 -0
- package/dist/client/rpc-client.js.map +1 -0
- package/dist/client/solid.d.ts +7 -0
- package/dist/client/solid.d.ts.map +1 -0
- package/dist/client/solid.js +21 -0
- package/dist/client/solid.js.map +1 -0
- package/dist/client/svelte.d.ts +6 -0
- package/dist/client/svelte.d.ts.map +1 -0
- package/dist/client/svelte.js +9 -0
- package/dist/client/svelte.js.map +1 -0
- package/dist/client/vue.d.ts +5 -0
- package/dist/client/vue.d.ts.map +1 -0
- package/dist/client/vue.js +11 -0
- package/dist/client/vue.js.map +1 -0
- package/dist/codegen.d.ts +36 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +235 -0
- package/dist/codegen.js.map +1 -0
- package/dist/config.d.ts +129 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +4 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +3 -0
- package/dist/cron.js.map +1 -0
- package/dist/crud-operations.d.ts +43 -0
- package/dist/crud-operations.d.ts.map +1 -0
- package/dist/crud-operations.js +249 -0
- package/dist/crud-operations.js.map +1 -0
- package/dist/database/adapter.d.ts +26 -0
- package/dist/database/adapter.d.ts.map +1 -0
- package/dist/database/adapter.js +2 -0
- package/dist/database/adapter.js.map +1 -0
- package/dist/database/libsql.d.ts +3 -0
- package/dist/database/libsql.d.ts.map +1 -0
- package/dist/database/libsql.js +39 -0
- package/dist/database/libsql.js.map +1 -0
- package/dist/db.d.ts +15 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +8 -0
- package/dist/db.js.map +1 -0
- package/dist/dev/binaries.d.ts +22 -0
- package/dist/dev/binaries.d.ts.map +1 -0
- package/dist/dev/binaries.js +119 -0
- package/dist/dev/binaries.js.map +1 -0
- package/dist/dev/env.d.ts +11 -0
- package/dist/dev/env.d.ts.map +1 -0
- package/dist/dev/env.js +71 -0
- package/dist/dev/env.js.map +1 -0
- package/dist/dev/index.d.ts +39 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +273 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/processes.d.ts +37 -0
- package/dist/dev/processes.d.ts.map +1 -0
- package/dist/dev/processes.js +104 -0
- package/dist/dev/processes.js.map +1 -0
- package/dist/dev/push.d.ts +2 -0
- package/dist/dev/push.d.ts.map +1 -0
- package/dist/dev/push.js +30 -0
- package/dist/dev/push.js.map +1 -0
- package/dist/dialect.d.ts +17 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +12 -0
- package/dist/dialect.js.map +1 -0
- package/dist/email/smtp.d.ts +20 -0
- package/dist/email/smtp.d.ts.map +1 -0
- package/dist/email/smtp.js +31 -0
- package/dist/email/smtp.js.map +1 -0
- package/dist/email.d.ts +26 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +2 -0
- package/dist/email.js.map +1 -0
- package/dist/env-probe.d.ts +9 -0
- package/dist/env-probe.d.ts.map +1 -0
- package/dist/env-probe.js +72 -0
- package/dist/env-probe.js.map +1 -0
- package/dist/env.d.ts +62 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +86 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +153 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +106 -0
- package/dist/errors.js.map +1 -0
- package/dist/handler.d.ts +11 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +21 -0
- package/dist/handler.js.map +1 -0
- package/dist/hosted-contract.d.ts +11 -0
- package/dist/hosted-contract.d.ts.map +1 -0
- package/dist/hosted-contract.js +50 -0
- package/dist/hosted-contract.js.map +1 -0
- package/dist/idempotency.d.ts +17 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +65 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +15 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +44 -0
- package/dist/inspect.js.map +1 -0
- package/dist/internal-tables.d.ts +1767 -0
- package/dist/internal-tables.d.ts.map +1 -0
- package/dist/internal-tables.js +114 -0
- package/dist/internal-tables.js.map +1 -0
- package/dist/jobs/cron.d.ts +15 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +74 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/define.d.ts +186 -0
- package/dist/jobs/define.d.ts.map +1 -0
- package/dist/jobs/define.js +99 -0
- package/dist/jobs/define.js.map +1 -0
- package/dist/jobs/index.d.ts +9 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +7 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/queue.d.ts +13 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +71 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/slots.d.ts +30 -0
- package/dist/jobs/slots.d.ts.map +1 -0
- package/dist/jobs/slots.js +53 -0
- package/dist/jobs/slots.js.map +1 -0
- package/dist/jobs/worker.d.ts +45 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +605 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/lifecycle.d.ts +10 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +37 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/list-query.d.ts +62 -0
- package/dist/list-query.d.ts.map +1 -0
- package/dist/list-query.js +190 -0
- package/dist/list-query.js.map +1 -0
- package/dist/live/apply.d.ts +13 -0
- package/dist/live/apply.d.ts.map +1 -0
- package/dist/live/apply.js +32 -0
- package/dist/live/apply.js.map +1 -0
- package/dist/live/index.d.ts +48 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +108 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/protocol.d.ts +47 -0
- package/dist/live/protocol.d.ts.map +1 -0
- package/dist/live/protocol.js +12 -0
- package/dist/live/protocol.js.map +1 -0
- package/dist/live/sse.d.ts +22 -0
- package/dist/live/sse.d.ts.map +1 -0
- package/dist/live/sse.js +41 -0
- package/dist/live/sse.js.map +1 -0
- package/dist/logging.d.ts +8 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +6 -0
- package/dist/logging.js.map +1 -0
- package/dist/manifest-diff.d.ts +6 -0
- package/dist/manifest-diff.d.ts.map +1 -0
- package/dist/manifest-diff.js +42 -0
- package/dist/manifest-diff.js.map +1 -0
- package/dist/manifest.d.ts +87 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +237 -0
- package/dist/manifest.js.map +1 -0
- package/dist/messaging/email.d.ts +16 -0
- package/dist/messaging/email.d.ts.map +1 -0
- package/dist/messaging/email.js +8 -0
- package/dist/messaging/email.js.map +1 -0
- package/dist/messaging/index.d.ts +8 -0
- package/dist/messaging/index.d.ts.map +1 -0
- package/dist/messaging/index.js +4 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/journal.d.ts +4 -0
- package/dist/messaging/journal.d.ts.map +1 -0
- package/dist/messaging/journal.js +19 -0
- package/dist/messaging/journal.js.map +1 -0
- package/dist/messaging/runtime.d.ts +16 -0
- package/dist/messaging/runtime.d.ts.map +1 -0
- package/dist/messaging/runtime.js +213 -0
- package/dist/messaging/runtime.js.map +1 -0
- package/dist/messaging/standalone.d.ts +27 -0
- package/dist/messaging/standalone.d.ts.map +1 -0
- package/dist/messaging/standalone.js +18 -0
- package/dist/messaging/standalone.js.map +1 -0
- package/dist/messaging/telegram.d.ts +16 -0
- package/dist/messaging/telegram.d.ts.map +1 -0
- package/dist/messaging/telegram.js +5 -0
- package/dist/messaging/telegram.js.map +1 -0
- package/dist/messaging/types.d.ts +22 -0
- package/dist/messaging/types.d.ts.map +1 -0
- package/dist/messaging/types.js +17 -0
- package/dist/messaging/types.js.map +1 -0
- package/dist/platform.d.ts +25 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +24 -0
- package/dist/platform.js.map +1 -0
- package/dist/provision-internals.d.ts +23 -0
- package/dist/provision-internals.d.ts.map +1 -0
- package/dist/provision-internals.js +7 -0
- package/dist/provision-internals.js.map +1 -0
- package/dist/provision-runtime.d.ts +6 -0
- package/dist/provision-runtime.d.ts.map +1 -0
- package/dist/provision-runtime.js +41 -0
- package/dist/provision-runtime.js.map +1 -0
- package/dist/provision-schema.d.ts +16 -0
- package/dist/provision-schema.d.ts.map +1 -0
- package/dist/provision-schema.js +59 -0
- package/dist/provision-schema.js.map +1 -0
- package/dist/provision.d.ts +8 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +16 -0
- package/dist/provision.js.map +1 -0
- package/dist/query/api.d.ts +10 -0
- package/dist/query/api.d.ts.map +1 -0
- package/dist/query/api.js +7 -0
- package/dist/query/api.js.map +1 -0
- package/dist/query/client.d.ts +28 -0
- package/dist/query/client.d.ts.map +1 -0
- package/dist/query/client.js +87 -0
- package/dist/query/client.js.map +1 -0
- package/dist/query/fetch.d.ts +3 -0
- package/dist/query/fetch.d.ts.map +1 -0
- package/dist/query/fetch.js +4 -0
- package/dist/query/fetch.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +4 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/infer.d.ts +25 -0
- package/dist/query/infer.d.ts.map +1 -0
- package/dist/query/infer.js +2 -0
- package/dist/query/infer.js.map +1 -0
- package/dist/query/react.d.ts +3 -0
- package/dist/query/react.d.ts.map +1 -0
- package/dist/query/react.js +2 -0
- package/dist/query/react.js.map +1 -0
- package/dist/query/realtime-flush.d.ts +26 -0
- package/dist/query/realtime-flush.d.ts.map +1 -0
- package/dist/query/realtime-flush.js +45 -0
- package/dist/query/realtime-flush.js.map +1 -0
- package/dist/query/realtime-stream.d.ts +3 -0
- package/dist/query/realtime-stream.d.ts.map +1 -0
- package/dist/query/realtime-stream.js +3 -0
- package/dist/query/realtime-stream.js.map +1 -0
- package/dist/query/realtime.d.ts +88 -0
- package/dist/query/realtime.d.ts.map +1 -0
- package/dist/query/realtime.js +255 -0
- package/dist/query/realtime.js.map +1 -0
- package/dist/rate-limit.d.ts +8 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +46 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/readiness-probes.d.ts +4 -0
- package/dist/readiness-probes.d.ts.map +1 -0
- package/dist/readiness-probes.js +23 -0
- package/dist/readiness-probes.js.map +1 -0
- package/dist/readiness.d.ts +39 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +72 -0
- package/dist/readiness.js.map +1 -0
- package/dist/realtime/facade.d.ts +20 -0
- package/dist/realtime/facade.d.ts.map +1 -0
- package/dist/realtime/facade.js +37 -0
- package/dist/realtime/facade.js.map +1 -0
- package/dist/realtime/filter.d.ts +42 -0
- package/dist/realtime/filter.d.ts.map +1 -0
- package/dist/realtime/filter.js +86 -0
- package/dist/realtime/filter.js.map +1 -0
- package/dist/realtime/heartbeat.d.ts +20 -0
- package/dist/realtime/heartbeat.d.ts.map +1 -0
- package/dist/realtime/heartbeat.js +64 -0
- package/dist/realtime/heartbeat.js.map +1 -0
- package/dist/realtime/publisher.d.ts +19 -0
- package/dist/realtime/publisher.d.ts.map +1 -0
- package/dist/realtime/publisher.js +8 -0
- package/dist/realtime/publisher.js.map +1 -0
- package/dist/runtime.d.ts +141 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +463 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema-export.d.ts +2 -0
- package/dist/schema-export.d.ts.map +1 -0
- package/dist/schema-export.js +2 -0
- package/dist/schema-export.js.map +1 -0
- package/dist/scope.d.ts +4 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +13 -0
- package/dist/scope.js.map +1 -0
- package/dist/standard-schema.d.ts +13 -0
- package/dist/standard-schema.d.ts.map +1 -0
- package/dist/standard-schema.js +34 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/start/auth-client.d.ts +11 -0
- package/dist/start/auth-client.d.ts.map +1 -0
- package/dist/start/auth-client.js +15 -0
- package/dist/start/auth-client.js.map +1 -0
- package/dist/start/create-start-worker.d.ts +16 -0
- package/dist/start/create-start-worker.d.ts.map +1 -0
- package/dist/start/create-start-worker.js +24 -0
- package/dist/start/create-start-worker.js.map +1 -0
- package/dist/start/index.d.ts +66 -0
- package/dist/start/index.d.ts.map +1 -0
- package/dist/start/index.js +49 -0
- package/dist/start/index.js.map +1 -0
- package/dist/start/isomorphic-fetch.d.ts +22 -0
- package/dist/start/isomorphic-fetch.d.ts.map +1 -0
- package/dist/start/isomorphic-fetch.js +49 -0
- package/dist/start/isomorphic-fetch.js.map +1 -0
- package/dist/start/server-entry.d.ts +7 -0
- package/dist/start/server-entry.d.ts.map +1 -0
- package/dist/start/server-entry.js +8 -0
- package/dist/start/server-entry.js.map +1 -0
- package/dist/storage/background.d.ts +3 -0
- package/dist/storage/background.d.ts.map +1 -0
- package/dist/storage/background.js +3 -0
- package/dist/storage/background.js.map +1 -0
- package/dist/storage/buckets.d.ts +78 -0
- package/dist/storage/buckets.d.ts.map +1 -0
- package/dist/storage/buckets.js +177 -0
- package/dist/storage/buckets.js.map +1 -0
- package/dist/storage/delete.d.ts +8 -0
- package/dist/storage/delete.d.ts.map +1 -0
- package/dist/storage/delete.js +10 -0
- package/dist/storage/delete.js.map +1 -0
- package/dist/storage/file-meta.d.ts +37 -0
- package/dist/storage/file-meta.d.ts.map +1 -0
- package/dist/storage/file-meta.js +166 -0
- package/dist/storage/file-meta.js.map +1 -0
- package/dist/storage/index.d.ts +28 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +15 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +56 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/operations.d.ts +54 -0
- package/dist/storage/operations.d.ts.map +1 -0
- package/dist/storage/operations.js +212 -0
- package/dist/storage/operations.js.map +1 -0
- package/dist/storage/registry.d.ts +11 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +23 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/s3.d.ts +35 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +125 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/sigv4.d.ts +24 -0
- package/dist/storage/sigv4.d.ts.map +1 -0
- package/dist/storage/sigv4.js +107 -0
- package/dist/storage/sigv4.js.map +1 -0
- package/dist/storage/sweep.d.ts +9 -0
- package/dist/storage/sweep.d.ts.map +1 -0
- package/dist/storage/sweep.js +17 -0
- package/dist/storage/sweep.js.map +1 -0
- package/dist/sync/collection.d.ts +106 -0
- package/dist/sync/collection.d.ts.map +1 -0
- package/dist/sync/collection.js +258 -0
- package/dist/sync/collection.js.map +1 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/realtime-sync.d.ts +31 -0
- package/dist/sync/realtime-sync.d.ts.map +1 -0
- package/dist/sync/realtime-sync.js +46 -0
- package/dist/sync/realtime-sync.js.map +1 -0
- package/dist/sync/sync-client.d.ts +28 -0
- package/dist/sync/sync-client.d.ts.map +1 -0
- package/dist/sync/sync-client.js +52 -0
- package/dist/sync/sync-client.js.map +1 -0
- package/dist/sync/update-queue.d.ts +27 -0
- package/dist/sync/update-queue.d.ts.map +1 -0
- package/dist/sync/update-queue.js +66 -0
- package/dist/sync/update-queue.js.map +1 -0
- package/dist/testing/auth.d.ts +85 -0
- package/dist/testing/auth.d.ts.map +1 -0
- package/dist/testing/auth.js +140 -0
- package/dist/testing/auth.js.map +1 -0
- package/dist/testing/client.d.ts +6 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +9 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/database.d.ts +6 -0
- package/dist/testing/database.d.ts.map +1 -0
- package/dist/testing/database.js +8 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/email.d.ts +15 -0
- package/dist/testing/email.d.ts.map +1 -0
- package/dist/testing/email.js +32 -0
- package/dist/testing/email.js.map +1 -0
- package/dist/testing/fixture.d.ts +51 -0
- package/dist/testing/fixture.d.ts.map +1 -0
- package/dist/testing/fixture.js +177 -0
- package/dist/testing/fixture.js.map +1 -0
- package/dist/testing/jobs.d.ts +40 -0
- package/dist/testing/jobs.d.ts.map +1 -0
- package/dist/testing/jobs.js +76 -0
- package/dist/testing/jobs.js.map +1 -0
- package/dist/testing/logs.d.ts +18 -0
- package/dist/testing/logs.d.ts.map +1 -0
- package/dist/testing/logs.js +53 -0
- package/dist/testing/logs.js.map +1 -0
- package/dist/testing/messaging.d.ts +21 -0
- package/dist/testing/messaging.d.ts.map +1 -0
- package/dist/testing/messaging.js +34 -0
- package/dist/testing/messaging.js.map +1 -0
- package/dist/testing/storage.d.ts +7 -0
- package/dist/testing/storage.d.ts.map +1 -0
- package/dist/testing/storage.js +29 -0
- package/dist/testing/storage.js.map +1 -0
- package/dist/testing/workers-fakes.d.ts +17 -0
- package/dist/testing/workers-fakes.d.ts.map +1 -0
- package/dist/testing/workers-fakes.js +98 -0
- package/dist/testing/workers-fakes.js.map +1 -0
- package/dist/testing.d.ts +12 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/typeid.d.ts +46 -0
- package/dist/typeid.d.ts.map +1 -0
- package/dist/typeid.js +130 -0
- package/dist/typeid.js.map +1 -0
- package/dist/vite.d.ts +26 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +100 -0
- package/dist/vite.js.map +1 -0
- package/dist/worker-plan.d.ts +37 -0
- package/dist/worker-plan.d.ts.map +1 -0
- package/dist/worker-plan.js +63 -0
- package/dist/worker-plan.js.map +1 -0
- package/dist/workers/app.d.ts +19 -0
- package/dist/workers/app.d.ts.map +1 -0
- package/dist/workers/app.js +56 -0
- package/dist/workers/app.js.map +1 -0
- package/dist/workers/entry.d.ts +7 -0
- package/dist/workers/entry.d.ts.map +1 -0
- package/dist/workers/entry.js +8 -0
- package/dist/workers/entry.js.map +1 -0
- package/dist/workers/index.d.ts +23 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +39 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/r2.d.ts +24 -0
- package/dist/workers/r2.d.ts.map +1 -0
- package/dist/workers/r2.js +76 -0
- package/dist/workers/r2.js.map +1 -0
- package/dist/workers/rate-limiter.d.ts +9 -0
- package/dist/workers/rate-limiter.d.ts.map +1 -0
- package/dist/workers/rate-limiter.js +22 -0
- package/dist/workers/rate-limiter.js.map +1 -0
- package/dist/workers/realtime-hub.d.ts +20 -0
- package/dist/workers/realtime-hub.d.ts.map +1 -0
- package/dist/workers/realtime-hub.js +117 -0
- package/dist/workers/realtime-hub.js.map +1 -0
- package/dist/workers/registry.d.ts +13 -0
- package/dist/workers/registry.d.ts.map +1 -0
- package/dist/workers/registry.js +19 -0
- package/dist/workers/registry.js.map +1 -0
- package/dist/workers/scheduler.d.ts +13 -0
- package/dist/workers/scheduler.d.ts.map +1 -0
- package/dist/workers/scheduler.js +71 -0
- package/dist/workers/scheduler.js.map +1 -0
- package/dist/workers/types.d.ts +55 -0
- package/dist/workers/types.d.ts.map +1 -0
- package/dist/workers/types.js +4 -0
- package/dist/workers/types.js.map +1 -0
- package/dist/workers/wrangler.d.ts +62 -0
- package/dist/workers/wrangler.d.ts.map +1 -0
- package/dist/workers/wrangler.js +90 -0
- package/dist/workers/wrangler.js.map +1 -0
- package/package.json +286 -0
- package/skills/creating-workerstack-apps/SKILL.md +45 -0
- package/skills/creating-workerstack-apps/agents/openai.yaml +4 -0
- package/skills/creating-workerstack-apps/references/application-structure.md +219 -0
- package/skills/creating-workerstack-apps/references/runtime-integrations.md +96 -0
- package/skills/creating-workerstack-apps/references/verification.md +29 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { resolveBuckets } from '../storage/buckets.js';
|
|
2
|
+
import { createBucketStorages } from '../storage/registry.js';
|
|
3
|
+
export function resolveTestBuckets(input, root) {
|
|
4
|
+
const resolved = resolveBuckets(input, {});
|
|
5
|
+
return {
|
|
6
|
+
defaultBucket: resolved.defaultBucket,
|
|
7
|
+
buckets: new Map([...resolved.buckets].map(([name, bucket]) => [
|
|
8
|
+
name,
|
|
9
|
+
{ ...bucket, backend: { type: 'local', path: root } },
|
|
10
|
+
])),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function createTestStorage(resolved) {
|
|
14
|
+
const registry = createBucketStorages(resolved);
|
|
15
|
+
return {
|
|
16
|
+
async read(key) {
|
|
17
|
+
const bucketName = key.split('/')[0] || resolved.defaultBucket;
|
|
18
|
+
const adapter = registry.get(bucketName)?.adapter;
|
|
19
|
+
if (!adapter)
|
|
20
|
+
throw new Error(`Unknown bucket: ${bucketName}`);
|
|
21
|
+
const response = await adapter.get(key);
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(`Storage object not found: ${key}`);
|
|
24
|
+
}
|
|
25
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/testing/storage.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAM1D,MAAM,UAAU,kBAAkB,CAChC,KAAqC,EACrC,IAAY;IAEZ,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1C,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,OAAO,EAAE,IAAI,GAAG,CACd,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI;YACJ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;SAC/D,CAAC,CACH;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAgC;IAEhC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC/C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAA;YAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;YACjD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;YAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;YACrD,CAAC;YACD,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QACrD,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import type {\n ResolvedStorageBuckets,\n StorageConfigInput,\n} from '../storage/buckets'\n\nimport { resolveBuckets } from '../storage/buckets'\nimport { createBucketStorages } from '../storage/registry'\n\nexport type TestStorage = {\n read(key: string): Promise<Uint8Array>\n}\n\nexport function resolveTestBuckets(\n input: StorageConfigInput | undefined,\n root: string,\n): ResolvedStorageBuckets {\n const resolved = resolveBuckets(input, {})\n return {\n defaultBucket: resolved.defaultBucket,\n buckets: new Map(\n [...resolved.buckets].map(([name, bucket]) => [\n name,\n { ...bucket, backend: { type: 'local' as const, path: root } },\n ]),\n ),\n }\n}\n\nexport function createTestStorage(\n resolved: ResolvedStorageBuckets,\n): TestStorage {\n const registry = createBucketStorages(resolved)\n return {\n async read(key) {\n const bucketName = key.split('/')[0] || resolved.defaultBucket\n const adapter = registry.get(bucketName)?.adapter\n if (!adapter) throw new Error(`Unknown bucket: ${bucketName}`)\n const response = await adapter.get(key)\n if (!response.ok) {\n throw new Error(`Storage object not found: ${key}`)\n }\n return new Uint8Array(await response.arrayBuffer())\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DurableObjectNamespaceLike, DurableObjectStateLike, R2BucketLike } from '../workers/types.js';
|
|
2
|
+
export declare function createFakeState(): DurableObjectStateLike & {
|
|
3
|
+
alarmAt(): number | null;
|
|
4
|
+
};
|
|
5
|
+
export declare function createFakeNamespace<T extends {
|
|
6
|
+
fetch(request: Request): Promise<Response>;
|
|
7
|
+
}>(make: (state: DurableObjectStateLike, name: string) => T): DurableObjectNamespaceLike & {
|
|
8
|
+
instance(name: string): T;
|
|
9
|
+
state(name: string): ReturnType<typeof createFakeState>;
|
|
10
|
+
};
|
|
11
|
+
export declare function createFakeR2(): R2BucketLike & {
|
|
12
|
+
objects: Map<string, {
|
|
13
|
+
bytes: Uint8Array;
|
|
14
|
+
contentType?: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=workers-fakes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers-fakes.d.ts","sourceRoot":"","sources":["../../src/testing/workers-fakes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,YAAY,EAEb,MAAM,kBAAkB,CAAA;AAEzB,wBAAgB,eAAe;eAEsB,MAAM,GAAG,IAAI;EAejE;AAED,wBAAgB,mBAAmB,CACjC,CAAC,SAAS;IAAE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,EACxD,IAAI,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;mBAevC,MAAM,GAAG,CAAC;gBACb,MAAM,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC;EAW1D;AAED,wBAAgB,YAAY;;eACe,UAAU;sBAAgB,MAAM;;EAwD1E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export function createFakeState() {
|
|
2
|
+
let alarm = null;
|
|
3
|
+
const state = {
|
|
4
|
+
storage: {
|
|
5
|
+
async getAlarm() {
|
|
6
|
+
return alarm;
|
|
7
|
+
},
|
|
8
|
+
async setAlarm(time) {
|
|
9
|
+
alarm = typeof time === 'number' ? time : time.getTime();
|
|
10
|
+
},
|
|
11
|
+
async deleteAlarm() {
|
|
12
|
+
alarm = null;
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
alarmAt: () => alarm,
|
|
16
|
+
};
|
|
17
|
+
return state;
|
|
18
|
+
}
|
|
19
|
+
export function createFakeNamespace(make) {
|
|
20
|
+
const instances = new Map();
|
|
21
|
+
const entry = (name) => {
|
|
22
|
+
let found = instances.get(name);
|
|
23
|
+
if (!found) {
|
|
24
|
+
const state = createFakeState();
|
|
25
|
+
found = { object: make(state, name), state };
|
|
26
|
+
instances.set(name, found);
|
|
27
|
+
}
|
|
28
|
+
return found;
|
|
29
|
+
};
|
|
30
|
+
const namespace = {
|
|
31
|
+
idFromName: (name) => name,
|
|
32
|
+
get: (id) => ({
|
|
33
|
+
fetch: (input, init) => entry(String(id)).object.fetch(new Request(input, init)),
|
|
34
|
+
}),
|
|
35
|
+
instance: (name) => entry(name).object,
|
|
36
|
+
state: (name) => entry(name).state,
|
|
37
|
+
};
|
|
38
|
+
return namespace;
|
|
39
|
+
}
|
|
40
|
+
export function createFakeR2() {
|
|
41
|
+
const objects = new Map();
|
|
42
|
+
const meta = (key) => {
|
|
43
|
+
const found = objects.get(key);
|
|
44
|
+
return found
|
|
45
|
+
? {
|
|
46
|
+
key,
|
|
47
|
+
size: found.bytes.byteLength,
|
|
48
|
+
httpMetadata: { contentType: found.contentType },
|
|
49
|
+
}
|
|
50
|
+
: null;
|
|
51
|
+
};
|
|
52
|
+
// Pages of two keys, so a cursor loop is exercised.
|
|
53
|
+
const PAGE = 2;
|
|
54
|
+
const bucket = {
|
|
55
|
+
objects,
|
|
56
|
+
async put(key, value, options) {
|
|
57
|
+
const bytes = typeof value === 'string'
|
|
58
|
+
? new TextEncoder().encode(value)
|
|
59
|
+
: value instanceof ArrayBuffer
|
|
60
|
+
? new Uint8Array(value)
|
|
61
|
+
: new Uint8Array(await new Response(value).arrayBuffer());
|
|
62
|
+
objects.set(key, {
|
|
63
|
+
bytes,
|
|
64
|
+
contentType: options?.httpMetadata?.contentType,
|
|
65
|
+
});
|
|
66
|
+
return meta(key);
|
|
67
|
+
},
|
|
68
|
+
async get(key) {
|
|
69
|
+
const found = objects.get(key);
|
|
70
|
+
if (!found)
|
|
71
|
+
return null;
|
|
72
|
+
return {
|
|
73
|
+
...meta(key),
|
|
74
|
+
body: new Response(found.bytes).body,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
async head(key) {
|
|
78
|
+
return meta(key);
|
|
79
|
+
},
|
|
80
|
+
async delete(key) {
|
|
81
|
+
objects.delete(key);
|
|
82
|
+
},
|
|
83
|
+
async list(options) {
|
|
84
|
+
const keys = [...objects.keys()]
|
|
85
|
+
.filter((key) => key.startsWith(options?.prefix ?? ''))
|
|
86
|
+
.sort();
|
|
87
|
+
const start = options?.cursor ? Number(options.cursor) : 0;
|
|
88
|
+
const truncated = start + PAGE < keys.length;
|
|
89
|
+
return {
|
|
90
|
+
objects: keys.slice(start, start + PAGE).map((key) => meta(key)),
|
|
91
|
+
truncated,
|
|
92
|
+
cursor: truncated ? String(start + PAGE) : undefined,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
return bucket;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=workers-fakes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers-fakes.js","sourceRoot":"","sources":["../../src/testing/workers-fakes.ts"],"names":[],"mappings":"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","sourcesContent":["// In-memory stand-ins for Worker bindings, so Durable Object classes and the\n// Worker entry run under `bun test`. Not a full emulation: alarms fire only\n// when a test calls `alarm()`.\nimport type {\n DurableObjectNamespaceLike,\n DurableObjectStateLike,\n R2BucketLike,\n R2ObjectLike,\n} from '../workers/types'\n\nexport function createFakeState() {\n let alarm: number | null = null\n const state: DurableObjectStateLike & { alarmAt(): number | null } = {\n storage: {\n async getAlarm() {\n return alarm\n },\n async setAlarm(time) {\n alarm = typeof time === 'number' ? time : time.getTime()\n },\n async deleteAlarm() {\n alarm = null\n },\n },\n alarmAt: () => alarm,\n }\n return state\n}\n\nexport function createFakeNamespace<\n T extends { fetch(request: Request): Promise<Response> },\n>(make: (state: DurableObjectStateLike, name: string) => T) {\n const instances = new Map<\n string,\n { object: T; state: ReturnType<typeof createFakeState> }\n >()\n const entry = (name: string) => {\n let found = instances.get(name)\n if (!found) {\n const state = createFakeState()\n found = { object: make(state, name), state }\n instances.set(name, found)\n }\n return found\n }\n const namespace: DurableObjectNamespaceLike & {\n instance(name: string): T\n state(name: string): ReturnType<typeof createFakeState>\n } = {\n idFromName: (name) => name,\n get: (id) => ({\n fetch: (input, init) =>\n entry(String(id)).object.fetch(new Request(input, init)),\n }),\n instance: (name) => entry(name).object,\n state: (name) => entry(name).state,\n }\n return namespace\n}\n\nexport function createFakeR2() {\n const objects = new Map<string, { bytes: Uint8Array; contentType?: string }>()\n const meta = (key: string): R2ObjectLike | null => {\n const found = objects.get(key)\n return found\n ? {\n key,\n size: found.bytes.byteLength,\n httpMetadata: { contentType: found.contentType },\n }\n : null\n }\n // Pages of two keys, so a cursor loop is exercised.\n const PAGE = 2\n const bucket: R2BucketLike & { objects: typeof objects } = {\n objects,\n async put(key, value, options) {\n const bytes =\n typeof value === 'string'\n ? new TextEncoder().encode(value)\n : value instanceof ArrayBuffer\n ? new Uint8Array(value)\n : new Uint8Array(await new Response(value).arrayBuffer())\n objects.set(key, {\n bytes,\n contentType: options?.httpMetadata?.contentType,\n })\n return meta(key)\n },\n async get(key) {\n const found = objects.get(key)\n if (!found) return null\n return {\n ...meta(key)!,\n body: new Response(found.bytes as unknown as BodyInit).body!,\n }\n },\n async head(key) {\n return meta(key)\n },\n async delete(key) {\n objects.delete(key)\n },\n async list(options) {\n const keys = [...objects.keys()]\n .filter((key) => key.startsWith(options?.prefix ?? ''))\n .sort()\n const start = options?.cursor ? Number(options.cursor) : 0\n const truncated = start + PAGE < keys.length\n return {\n objects: keys.slice(start, start + PAGE).map((key) => meta(key)!),\n truncated,\n cursor: truncated ? String(start + PAGE) : undefined,\n }\n },\n }\n return bucket\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { configureTestApp, createTestApp } from './testing/fixture.js';
|
|
2
|
+
export type { ConfiguredTestFixture, TestCleanup, TestConfigureOptions, TestFactory, TestFixture, TestMethod, TestOptions, TestSetup, } from './testing/fixture.js';
|
|
3
|
+
export { mockAuthSession, TestAuthError } from './testing/auth.js';
|
|
4
|
+
export type { SignInEmailInput, SignUpEmailInput, TestAuth, TestIdentity, TestSession, TestUser, } from './testing/auth.js';
|
|
5
|
+
export type { CapturedEmail, TestEmail } from './testing/email.js';
|
|
6
|
+
export type { TestMessagingChannel, TestMessagingForApp, } from './testing/messaging.js';
|
|
7
|
+
export type { TestStorage } from './testing/storage.js';
|
|
8
|
+
export type { TestLogEntry, TestLogMode, TestLogs } from './testing/logs.js';
|
|
9
|
+
export { TestJobsConvergenceError, TestJobsError } from './testing/jobs.js';
|
|
10
|
+
export type { JobRunReport, RunNextOptions, RunUntilIdleOptions, TestJob, TestJobFilter, TestJobs, } from './testing/jobs.js';
|
|
11
|
+
export type { TestDatabaseStrategy, TestDatabaseTarget, TestDatabaseTargetOptions, } from './database/adapter.js';
|
|
12
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACnE,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,GACV,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC/D,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC/D,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACxE,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// src/testing.ts — test utilities for Workerstack applications.
|
|
2
|
+
export { configureTestApp, createTestApp } from './testing/fixture.js';
|
|
3
|
+
export { mockAuthSession, TestAuthError } from './testing/auth.js';
|
|
4
|
+
export { TestJobsConvergenceError, TestJobsError } from './testing/jobs.js';
|
|
5
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAWnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAgB/D,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA","sourcesContent":["// src/testing.ts — test utilities for Workerstack applications.\n\nexport { configureTestApp, createTestApp } from './testing/fixture'\nexport type {\n ConfiguredTestFixture,\n TestCleanup,\n TestConfigureOptions,\n TestFactory,\n TestFixture,\n TestMethod,\n TestOptions,\n TestSetup,\n} from './testing/fixture'\nexport { mockAuthSession, TestAuthError } from './testing/auth'\nexport type {\n SignInEmailInput,\n SignUpEmailInput,\n TestAuth,\n TestIdentity,\n TestSession,\n TestUser,\n} from './testing/auth'\nexport type { CapturedEmail, TestEmail } from './testing/email'\nexport type {\n TestMessagingChannel,\n TestMessagingForApp,\n} from './testing/messaging'\nexport type { TestStorage } from './testing/storage'\nexport type { TestLogEntry, TestLogMode, TestLogs } from './testing/logs'\nexport { TestJobsConvergenceError, TestJobsError } from './testing/jobs'\nexport type {\n JobRunReport,\n RunNextOptions,\n RunUntilIdleOptions,\n TestJob,\n TestJobFilter,\n TestJobs,\n} from './testing/jobs'\nexport type {\n TestDatabaseStrategy,\n TestDatabaseTarget,\n TestDatabaseTargetOptions,\n} from './database/adapter'\n"]}
|
package/dist/typeid.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
declare const typeIdBrand: unique symbol;
|
|
2
|
+
/** A branded TypeID string. `TypeId<'post'>` is incompatible with `TypeId<'user'>`. */
|
|
3
|
+
export type TypeId<P extends string> = string & {
|
|
4
|
+
readonly [typeIdBrand]?: P;
|
|
5
|
+
};
|
|
6
|
+
/** Encode a 16-byte UUID into the 26-character base32 suffix. */
|
|
7
|
+
export declare function encode(bytes: Uint8Array): string;
|
|
8
|
+
/** Decode a 26-character base32 suffix back into the original 16 UUID bytes. */
|
|
9
|
+
export declare function decode(suffix: string): Uint8Array;
|
|
10
|
+
/** Whether a string is a valid, non-empty TypeID prefix. */
|
|
11
|
+
export declare function isValidPrefix(prefix: string): boolean;
|
|
12
|
+
export declare function uuidv7Bytes(now?: number): Uint8Array;
|
|
13
|
+
/** Generate a new, branded TypeID for the given prefix. */
|
|
14
|
+
export declare function generate<P extends string>(prefix: P): TypeId<P>;
|
|
15
|
+
/**
|
|
16
|
+
* Parse a TypeID into its parts and the decoded UUID. Throws if the id is
|
|
17
|
+
* malformed or — when `expectedPrefix` is given — if the prefix does not match.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parse<P extends string>(id: string, expectedPrefix?: P): {
|
|
20
|
+
prefix: string;
|
|
21
|
+
suffix: string;
|
|
22
|
+
uuid: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Escape hatch: validate a raw string against a prefix and brand it as a TypeID.
|
|
26
|
+
* Use at trust boundaries (e.g. a raw URL param) where the string isn't yet typed.
|
|
27
|
+
*/
|
|
28
|
+
export declare function asTypeId<P extends string>(prefix: P, raw: string): TypeId<P>;
|
|
29
|
+
/**
|
|
30
|
+
* Drizzle column builder for a branded TypeID text value. Stores a plain `text`
|
|
31
|
+
* column so drizzle-kit migrations and `$inferSelect` work unchanged.
|
|
32
|
+
*
|
|
33
|
+
* Use Drizzle's `$defaultFn` when a column should generate IDs on insert:
|
|
34
|
+
*
|
|
35
|
+
* id: typeid('post').primaryKey().$defaultFn(() => generate('post'))
|
|
36
|
+
*/
|
|
37
|
+
export declare function typeid<P extends string>(prefix: P): import("drizzle-orm/sqlite-core").SQLiteCustomColumnBuilder<{
|
|
38
|
+
name: "";
|
|
39
|
+
dataType: "custom";
|
|
40
|
+
columnType: "SQLiteCustomColumn";
|
|
41
|
+
data: TypeId<P>;
|
|
42
|
+
driverParam: string;
|
|
43
|
+
enumValues: undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=typeid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid.d.ts","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"AAkBA,OAAO,CAAC,MAAM,WAAW,EAAE,OAAO,MAAM,CAAA;AAExC,uFAAuF;AACvF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAE9E,iEAAiE;AACjE,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAWhD;AAED,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAUjD;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAYD,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAmB,GAAG,UAAU,CAwBhE;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAK/D;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,EAAE,EAAE,MAAM,EACV,cAAc,CAAC,EAAE,CAAC,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAelD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAG5E;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC;;;;;;;GAMjD"}
|
package/dist/typeid.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// src/typeid.ts
|
|
2
|
+
//
|
|
3
|
+
// Zero-dependency TypeID implementation (https://github.com/jetify-com/typeid).
|
|
4
|
+
// Stripe-style prefixed, k-sortable identifiers: `prefix_<26-char base32 UUIDv7>`.
|
|
5
|
+
// The only runtime primitive we need is UUIDv7 bytes. `uuidv7Bytes` builds them
|
|
6
|
+
// from WebCrypto, so the same code runs in Bun, workerd, and celld without the
|
|
7
|
+
// `uuid` dependency that the reference `typeid-js` package relies on.
|
|
8
|
+
import { customType } from 'drizzle-orm/sqlite-core';
|
|
9
|
+
// Crockford base32 alphabet (lowercase, excludes i/l/o/u), as used by the TypeID spec.
|
|
10
|
+
const ALPHABET = '0123456789abcdefghjkmnpqrstvwxyz';
|
|
11
|
+
// Spec prefix rules: lowercase ascii, underscores allowed only internally, 1–63 chars.
|
|
12
|
+
const PREFIX_RE = /^[a-z]([a-z_]{0,61}[a-z])?$/;
|
|
13
|
+
// 26 base32 chars from the alphabet above.
|
|
14
|
+
const SUFFIX_RE = /^[0-9a-hjkmnp-tv-z]{26}$/;
|
|
15
|
+
/** Encode a 16-byte UUID into the 26-character base32 suffix. */
|
|
16
|
+
export function encode(bytes) {
|
|
17
|
+
// First two chars cover byte 0: top 3 bits, then low 5 bits.
|
|
18
|
+
let out = ALPHABET[bytes[0] >> 5] + ALPHABET[bytes[0] & 31];
|
|
19
|
+
// Remaining 15 bytes (120 bits) → 24 groups of 5 bits.
|
|
20
|
+
let buf = 0n;
|
|
21
|
+
for (let i = 1; i < 16; i++)
|
|
22
|
+
buf = (buf << 8n) | BigInt(bytes[i]);
|
|
23
|
+
const chars = [];
|
|
24
|
+
for (let i = 0; i < 24; i++) {
|
|
25
|
+
chars.push(ALPHABET[Number((buf >> (BigInt(23 - i) * 5n)) & 31n)]);
|
|
26
|
+
}
|
|
27
|
+
return out + chars.join('');
|
|
28
|
+
}
|
|
29
|
+
/** Decode a 26-character base32 suffix back into the original 16 UUID bytes. */
|
|
30
|
+
export function decode(suffix) {
|
|
31
|
+
const map = {};
|
|
32
|
+
for (let i = 0; i < ALPHABET.length; i++)
|
|
33
|
+
map[ALPHABET[i]] = i;
|
|
34
|
+
const bytes = new Uint8Array(16);
|
|
35
|
+
bytes[0] = (map[suffix[0]] << 5) | map[suffix[1]];
|
|
36
|
+
let buf = 0n;
|
|
37
|
+
for (let i = 2; i < 26; i++)
|
|
38
|
+
buf = (buf << 5n) | BigInt(map[suffix[i]]);
|
|
39
|
+
for (let i = 0; i < 15; i++)
|
|
40
|
+
bytes[15 - i] = Number((buf >> BigInt(i * 8)) & 0xffn);
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
/** Whether a string is a valid, non-empty TypeID prefix. */
|
|
44
|
+
export function isValidPrefix(prefix) {
|
|
45
|
+
return PREFIX_RE.test(prefix);
|
|
46
|
+
}
|
|
47
|
+
function bytesToUuid(bytes) {
|
|
48
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
49
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
50
|
+
}
|
|
51
|
+
// Monotonic state: RFC 9562 method 1, a 12-bit counter in rand_a. Seeded with
|
|
52
|
+
// random bits below its top bit on each new millisecond, so it can grow.
|
|
53
|
+
let lastMs = -1;
|
|
54
|
+
let counter = 0;
|
|
55
|
+
export function uuidv7Bytes(now = Date.now()) {
|
|
56
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
57
|
+
if (now > lastMs) {
|
|
58
|
+
lastMs = now;
|
|
59
|
+
counter = ((bytes[6] & 0x07) << 8) | bytes[7];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
counter += 1;
|
|
63
|
+
if (counter > 0xfff) {
|
|
64
|
+
// Counter overflow: borrow the next millisecond, keep the order.
|
|
65
|
+
lastMs += 1;
|
|
66
|
+
counter = 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const ms = lastMs;
|
|
70
|
+
bytes[0] = Math.floor(ms / 2 ** 40) & 0xff;
|
|
71
|
+
bytes[1] = Math.floor(ms / 2 ** 32) & 0xff;
|
|
72
|
+
bytes[2] = Math.floor(ms / 2 ** 24) & 0xff;
|
|
73
|
+
bytes[3] = Math.floor(ms / 2 ** 16) & 0xff;
|
|
74
|
+
bytes[4] = Math.floor(ms / 2 ** 8) & 0xff;
|
|
75
|
+
bytes[5] = ms & 0xff;
|
|
76
|
+
bytes[6] = 0x70 | ((counter >> 8) & 0x0f);
|
|
77
|
+
bytes[7] = counter & 0xff;
|
|
78
|
+
bytes[8] = 0x80 | (bytes[8] & 0x3f);
|
|
79
|
+
return bytes;
|
|
80
|
+
}
|
|
81
|
+
/** Generate a new, branded TypeID for the given prefix. */
|
|
82
|
+
export function generate(prefix) {
|
|
83
|
+
if (!isValidPrefix(prefix))
|
|
84
|
+
throw new Error(`Invalid typeid prefix: "${prefix}"`);
|
|
85
|
+
const bytes = uuidv7Bytes();
|
|
86
|
+
return `${prefix}_${encode(bytes)}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse a TypeID into its parts and the decoded UUID. Throws if the id is
|
|
90
|
+
* malformed or — when `expectedPrefix` is given — if the prefix does not match.
|
|
91
|
+
*/
|
|
92
|
+
export function parse(id, expectedPrefix) {
|
|
93
|
+
const sep = id.lastIndexOf('_');
|
|
94
|
+
if (sep <= 0)
|
|
95
|
+
throw new Error(`Malformed typeid: "${id}"`);
|
|
96
|
+
const prefix = id.slice(0, sep);
|
|
97
|
+
const suffix = id.slice(sep + 1);
|
|
98
|
+
if (!isValidPrefix(prefix))
|
|
99
|
+
throw new Error(`Malformed typeid prefix: "${id}"`);
|
|
100
|
+
if (!SUFFIX_RE.test(suffix))
|
|
101
|
+
throw new Error(`Malformed typeid suffix: "${id}"`);
|
|
102
|
+
if (expectedPrefix !== undefined && prefix !== expectedPrefix) {
|
|
103
|
+
throw new Error(`Expected typeid prefix "${expectedPrefix}" but got "${prefix}"`);
|
|
104
|
+
}
|
|
105
|
+
return { prefix, suffix, uuid: bytesToUuid(decode(suffix)) };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Escape hatch: validate a raw string against a prefix and brand it as a TypeID.
|
|
109
|
+
* Use at trust boundaries (e.g. a raw URL param) where the string isn't yet typed.
|
|
110
|
+
*/
|
|
111
|
+
export function asTypeId(prefix, raw) {
|
|
112
|
+
parse(raw, prefix);
|
|
113
|
+
return raw;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Drizzle column builder for a branded TypeID text value. Stores a plain `text`
|
|
117
|
+
* column so drizzle-kit migrations and `$inferSelect` work unchanged.
|
|
118
|
+
*
|
|
119
|
+
* Use Drizzle's `$defaultFn` when a column should generate IDs on insert:
|
|
120
|
+
*
|
|
121
|
+
* id: typeid('post').primaryKey().$defaultFn(() => generate('post'))
|
|
122
|
+
*/
|
|
123
|
+
export function typeid(prefix) {
|
|
124
|
+
if (!isValidPrefix(prefix))
|
|
125
|
+
throw new Error(`Invalid typeid prefix: "${prefix}"`);
|
|
126
|
+
return customType({
|
|
127
|
+
dataType: () => 'text',
|
|
128
|
+
})();
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=typeid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid.js","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"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","sourcesContent":["// src/typeid.ts\n//\n// Zero-dependency TypeID implementation (https://github.com/jetify-com/typeid).\n// Stripe-style prefixed, k-sortable identifiers: `prefix_<26-char base32 UUIDv7>`.\n// The only runtime primitive we need is UUIDv7 bytes. `uuidv7Bytes` builds them\n// from WebCrypto, so the same code runs in Bun, workerd, and celld without the\n// `uuid` dependency that the reference `typeid-js` package relies on.\n\nimport { customType } from 'drizzle-orm/sqlite-core'\n\n// Crockford base32 alphabet (lowercase, excludes i/l/o/u), as used by the TypeID spec.\nconst ALPHABET = '0123456789abcdefghjkmnpqrstvwxyz'\n\n// Spec prefix rules: lowercase ascii, underscores allowed only internally, 1–63 chars.\nconst PREFIX_RE = /^[a-z]([a-z_]{0,61}[a-z])?$/\n// 26 base32 chars from the alphabet above.\nconst SUFFIX_RE = /^[0-9a-hjkmnp-tv-z]{26}$/\n\ndeclare const typeIdBrand: unique symbol\n\n/** A branded TypeID string. `TypeId<'post'>` is incompatible with `TypeId<'user'>`. */\nexport type TypeId<P extends string> = string & { readonly [typeIdBrand]?: P }\n\n/** Encode a 16-byte UUID into the 26-character base32 suffix. */\nexport function encode(bytes: Uint8Array): string {\n // First two chars cover byte 0: top 3 bits, then low 5 bits.\n let out = ALPHABET[bytes[0]! >> 5]! + ALPHABET[bytes[0]! & 31]!\n // Remaining 15 bytes (120 bits) → 24 groups of 5 bits.\n let buf = 0n\n for (let i = 1; i < 16; i++) buf = (buf << 8n) | BigInt(bytes[i]!)\n const chars: string[] = []\n for (let i = 0; i < 24; i++) {\n chars.push(ALPHABET[Number((buf >> (BigInt(23 - i) * 5n)) & 31n)]!)\n }\n return out + chars.join('')\n}\n\n/** Decode a 26-character base32 suffix back into the original 16 UUID bytes. */\nexport function decode(suffix: string): Uint8Array {\n const map: Record<string, number> = {}\n for (let i = 0; i < ALPHABET.length; i++) map[ALPHABET[i]!] = i\n const bytes = new Uint8Array(16)\n bytes[0] = (map[suffix[0]!]! << 5) | map[suffix[1]!]!\n let buf = 0n\n for (let i = 2; i < 26; i++) buf = (buf << 5n) | BigInt(map[suffix[i]!]!)\n for (let i = 0; i < 15; i++)\n bytes[15 - i] = Number((buf >> BigInt(i * 8)) & 0xffn)\n return bytes\n}\n\n/** Whether a string is a valid, non-empty TypeID prefix. */\nexport function isValidPrefix(prefix: string): boolean {\n return PREFIX_RE.test(prefix)\n}\n\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n}\n\n// Monotonic state: RFC 9562 method 1, a 12-bit counter in rand_a. Seeded with\n// random bits below its top bit on each new millisecond, so it can grow.\nlet lastMs = -1\nlet counter = 0\n\nexport function uuidv7Bytes(now: number = Date.now()): Uint8Array {\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n if (now > lastMs) {\n lastMs = now\n counter = ((bytes[6]! & 0x07) << 8) | bytes[7]!\n } else {\n counter += 1\n if (counter > 0xfff) {\n // Counter overflow: borrow the next millisecond, keep the order.\n lastMs += 1\n counter = 0\n }\n }\n const ms = lastMs\n bytes[0] = Math.floor(ms / 2 ** 40) & 0xff\n bytes[1] = Math.floor(ms / 2 ** 32) & 0xff\n bytes[2] = Math.floor(ms / 2 ** 24) & 0xff\n bytes[3] = Math.floor(ms / 2 ** 16) & 0xff\n bytes[4] = Math.floor(ms / 2 ** 8) & 0xff\n bytes[5] = ms & 0xff\n bytes[6] = 0x70 | ((counter >> 8) & 0x0f)\n bytes[7] = counter & 0xff\n bytes[8] = 0x80 | (bytes[8]! & 0x3f)\n return bytes\n}\n\n/** Generate a new, branded TypeID for the given prefix. */\nexport function generate<P extends string>(prefix: P): TypeId<P> {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n const bytes = uuidv7Bytes()\n return `${prefix}_${encode(bytes)}` as TypeId<P>\n}\n\n/**\n * Parse a TypeID into its parts and the decoded UUID. Throws if the id is\n * malformed or — when `expectedPrefix` is given — if the prefix does not match.\n */\nexport function parse<P extends string>(\n id: string,\n expectedPrefix?: P,\n): { prefix: string; suffix: string; uuid: string } {\n const sep = id.lastIndexOf('_')\n if (sep <= 0) throw new Error(`Malformed typeid: \"${id}\"`)\n const prefix = id.slice(0, sep)\n const suffix = id.slice(sep + 1)\n if (!isValidPrefix(prefix))\n throw new Error(`Malformed typeid prefix: \"${id}\"`)\n if (!SUFFIX_RE.test(suffix))\n throw new Error(`Malformed typeid suffix: \"${id}\"`)\n if (expectedPrefix !== undefined && prefix !== expectedPrefix) {\n throw new Error(\n `Expected typeid prefix \"${expectedPrefix}\" but got \"${prefix}\"`,\n )\n }\n return { prefix, suffix, uuid: bytesToUuid(decode(suffix)) }\n}\n\n/**\n * Escape hatch: validate a raw string against a prefix and brand it as a TypeID.\n * Use at trust boundaries (e.g. a raw URL param) where the string isn't yet typed.\n */\nexport function asTypeId<P extends string>(prefix: P, raw: string): TypeId<P> {\n parse(raw, prefix)\n return raw as TypeId<P>\n}\n\n/**\n * Drizzle column builder for a branded TypeID text value. Stores a plain `text`\n * column so drizzle-kit migrations and `$inferSelect` work unchanged.\n *\n * Use Drizzle's `$defaultFn` when a column should generate IDs on insert:\n *\n * id: typeid('post').primaryKey().$defaultFn(() => generate('post'))\n */\nexport function typeid<P extends string>(prefix: P) {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n return customType<{ data: TypeId<P>; driverData: string }>({\n dataType: () => 'text',\n })()\n}\n"]}
|
package/dist/vite.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** A Vite plugin, typed without importing vite. */
|
|
2
|
+
export type VitePluginLike = {
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
type Factories = {
|
|
6
|
+
cloudflare: (options: {
|
|
7
|
+
viteEnvironment: {
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
}) => unknown;
|
|
11
|
+
tanstackStart: (options: {
|
|
12
|
+
srcDirectory: string;
|
|
13
|
+
}) => unknown;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Resolves a package specifier from the app, not from workerstack, so the
|
|
17
|
+
* plugins are the app's own versions. The Vite plugins are ESM-only, which
|
|
18
|
+
* `createRequire().resolve` cannot resolve under Node.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveFromApp(root: string, specifier: string): Promise<string>;
|
|
21
|
+
export declare function workerstack(options?: {
|
|
22
|
+
root?: string;
|
|
23
|
+
factories?: Factories;
|
|
24
|
+
}): Promise<VitePluginLike[]>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=vite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAUA,mDAAmD;AACnD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7C,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,CAAC,OAAO,EAAE;QAAE,eAAe,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,OAAO,CAAA;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;CAC9D,CAAA;AAYD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAgBD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GACrD,OAAO,CAAC,cAAc,EAAE,CAAC,CA0C3B"}
|
package/dist/vite.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/vite.ts — `workerstack()` for vite.config.ts. It runs the app as a
|
|
2
|
+
// Worker through the Cloudflare Vite plugin (with TanStack Start for SSR) and
|
|
3
|
+
// points the package Worker entries at the app's backend. No import of `vite`
|
|
4
|
+
// or of the plugins at module load: they are resolved from the app.
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { dirname, join, resolve } from 'node:path';
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { parseWorkerBlueprintYaml } from './blueprint.js';
|
|
9
|
+
/** An ESM condition target: a string or a nested `import`/`default` map. */
|
|
10
|
+
function exportTarget(value) {
|
|
11
|
+
if (typeof value === 'string')
|
|
12
|
+
return value;
|
|
13
|
+
if (value && typeof value === 'object') {
|
|
14
|
+
const map = value;
|
|
15
|
+
return exportTarget(map.import) ?? exportTarget(map.default);
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolves a package specifier from the app, not from workerstack, so the
|
|
21
|
+
* plugins are the app's own versions. The Vite plugins are ESM-only, which
|
|
22
|
+
* `createRequire().resolve` cannot resolve under Node.
|
|
23
|
+
*/
|
|
24
|
+
export async function resolveFromApp(root, specifier) {
|
|
25
|
+
const bun = globalThis.Bun;
|
|
26
|
+
if (bun)
|
|
27
|
+
return bun.resolveSync(specifier, root);
|
|
28
|
+
const parts = specifier.split('/');
|
|
29
|
+
const name = specifier.startsWith('@')
|
|
30
|
+
? parts.slice(0, 2).join('/')
|
|
31
|
+
: parts[0];
|
|
32
|
+
const subpath = `.${specifier.slice(name.length)}`;
|
|
33
|
+
for (let dir = root;; dir = dirname(dir)) {
|
|
34
|
+
const pkgDir = join(dir, 'node_modules', name);
|
|
35
|
+
const pkgText = await readFile(join(pkgDir, 'package.json'), 'utf8').catch(() => undefined);
|
|
36
|
+
if (pkgText) {
|
|
37
|
+
const pkg = JSON.parse(pkgText);
|
|
38
|
+
const exportsMap = typeof pkg.exports === 'object' && pkg.exports && subpath in pkg.exports
|
|
39
|
+
? pkg.exports[subpath]
|
|
40
|
+
: subpath === '.'
|
|
41
|
+
? pkg.exports
|
|
42
|
+
: undefined;
|
|
43
|
+
const target = exportTarget(exportsMap) ?? (subpath === '.' ? pkg.main : undefined);
|
|
44
|
+
if (!target)
|
|
45
|
+
break;
|
|
46
|
+
return join(pkgDir, target);
|
|
47
|
+
}
|
|
48
|
+
if (dirname(dir) === dir)
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`[workerstack] cannot resolve ${specifier} from ${root}; install it`);
|
|
52
|
+
}
|
|
53
|
+
async function appFactories(root, ssr) {
|
|
54
|
+
const load = async (specifier) => import(pathToFileURL(await resolveFromApp(root, specifier)).href);
|
|
55
|
+
const { cloudflare } = await load('@cloudflare/vite-plugin');
|
|
56
|
+
const tanstackStart = ssr
|
|
57
|
+
? (await load('@tanstack/react-start/plugin/vite')).tanstackStart
|
|
58
|
+
: () => {
|
|
59
|
+
throw new Error('[workerstack] TanStack Start is only used for render: ssr');
|
|
60
|
+
};
|
|
61
|
+
return { cloudflare, tanstackStart };
|
|
62
|
+
}
|
|
63
|
+
export async function workerstack(options = {}) {
|
|
64
|
+
const root = resolve(options.root ?? process.cwd());
|
|
65
|
+
let source;
|
|
66
|
+
try {
|
|
67
|
+
source = await readFile(join(root, 'workerstack.blueprint.yaml'), 'utf8');
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new Error('[workerstack] workerstack.blueprint.yaml is missing; run `workerstack dev` or `workerstack blueprint` first');
|
|
71
|
+
}
|
|
72
|
+
const blueprint = parseWorkerBlueprintYaml(source);
|
|
73
|
+
const ssr = blueprint.application.worker.render === 'ssr';
|
|
74
|
+
const pkg = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
|
|
75
|
+
const backendEntry = join(root, pkg.workerstack?.entry ?? 'src/workerstack.ts');
|
|
76
|
+
const { cloudflare, tanstackStart } = options.factories ?? (await appFactories(root, ssr));
|
|
77
|
+
const backendPlugin = {
|
|
78
|
+
name: 'workerstack:backend',
|
|
79
|
+
resolveId(id) {
|
|
80
|
+
if (id === 'virtual:workerstack/backend')
|
|
81
|
+
return backendEntry;
|
|
82
|
+
return undefined;
|
|
83
|
+
},
|
|
84
|
+
config() {
|
|
85
|
+
// The artifact shape hosts deploy, in both render modes.
|
|
86
|
+
return {
|
|
87
|
+
environments: {
|
|
88
|
+
client: { build: { outDir: 'dist/client' } },
|
|
89
|
+
ssr: { build: { outDir: 'dist/server' } },
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
return [
|
|
95
|
+
backendPlugin,
|
|
96
|
+
cloudflare({ viteEnvironment: { name: 'ssr' } }),
|
|
97
|
+
...(ssr ? [tanstackStart({ srcDirectory: 'src' })] : []),
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=vite.js.map
|
package/dist/vite.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,oEAAoE;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAUtD,4EAA4E;AAC5E,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAA;QAC5C,OAAO,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,SAAiB;IAEjB,MAAM,GAAG,GACP,UACD,CAAC,GAAG,CAAA;IACL,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACpC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;IACb,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;IAClD,KAAK,IAAI,GAAG,GAAG,IAAI,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CACxE,GAAG,EAAE,CAAC,SAAS,CAChB,CAAA;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyC,CAAA;YACvE,MAAM,UAAU,GACd,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,IAAI,GAAG,CAAC,OAAO;gBACtE,CAAC,CAAE,GAAG,CAAC,OAAmC,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,OAAO,KAAK,GAAG;oBACf,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,SAAS,CAAA;YACjB,MAAM,MAAM,GACV,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACtE,IAAI,CAAC,MAAM;gBAAE,MAAK;YAClB,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC7B,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,MAAK;IACjC,CAAC;IACD,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,SAAS,IAAI,cAAc,CACrE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,GAAY;IACpD,MAAM,IAAI,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE,CACvC,MAAM,CAAC,aAAa,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAC5D,MAAM,aAAa,GAAG,GAAG;QACvB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,aAAa;QACjE,CAAC,CAAC,GAAG,EAAE;YACH,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAA;QACH,CAAC,CAAA;IACL,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAoD,EAAE;IAEtD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACnD,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,MAAM,CAAC,CAAA;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAA;IACH,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAA;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACX,CAAA;IACzC,MAAM,YAAY,GAAG,IAAI,CACvB,IAAI,EACJ,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,oBAAoB,CAC/C,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GACjC,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IACtD,MAAM,aAAa,GAAG;QACpB,IAAI,EAAE,qBAAqB;QAC3B,SAAS,CAAC,EAAU;YAClB,IAAI,EAAE,KAAK,6BAA6B;gBAAE,OAAO,YAAY,CAAA;YAC7D,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM;YACJ,yDAAyD;YACzD,OAAO;gBACL,YAAY,EAAE;oBACZ,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE;oBAC5C,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE;iBAC1C;aACF,CAAA;QACH,CAAC;KACF,CAAA;IACD,OAAO;QACL,aAAa;QACb,UAAU,CAAC,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAmB;QAClE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC","sourcesContent":["// src/vite.ts — `workerstack()` for vite.config.ts. It runs the app as a\n// Worker through the Cloudflare Vite plugin (with TanStack Start for SSR) and\n// points the package Worker entries at the app's backend. No import of `vite`\n// or of the plugins at module load: they are resolved from the app.\nimport { readFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport { parseWorkerBlueprintYaml } from './blueprint'\n\n/** A Vite plugin, typed without importing vite. */\nexport type VitePluginLike = { name: string }\n\ntype Factories = {\n cloudflare: (options: { viteEnvironment: { name: string } }) => unknown\n tanstackStart: (options: { srcDirectory: string }) => unknown\n}\n\n/** An ESM condition target: a string or a nested `import`/`default` map. */\nfunction exportTarget(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (value && typeof value === 'object') {\n const map = value as Record<string, unknown>\n return exportTarget(map.import) ?? exportTarget(map.default)\n }\n return undefined\n}\n\n/**\n * Resolves a package specifier from the app, not from workerstack, so the\n * plugins are the app's own versions. The Vite plugins are ESM-only, which\n * `createRequire().resolve` cannot resolve under Node.\n */\nexport async function resolveFromApp(\n root: string,\n specifier: string,\n): Promise<string> {\n const bun = (\n globalThis as { Bun?: { resolveSync(s: string, from: string): string } }\n ).Bun\n if (bun) return bun.resolveSync(specifier, root)\n const parts = specifier.split('/')\n const name = specifier.startsWith('@')\n ? parts.slice(0, 2).join('/')\n : parts[0]!\n const subpath = `.${specifier.slice(name.length)}`\n for (let dir = root; ; dir = dirname(dir)) {\n const pkgDir = join(dir, 'node_modules', name)\n const pkgText = await readFile(join(pkgDir, 'package.json'), 'utf8').catch(\n () => undefined,\n )\n if (pkgText) {\n const pkg = JSON.parse(pkgText) as { exports?: unknown; main?: string }\n const exportsMap =\n typeof pkg.exports === 'object' && pkg.exports && subpath in pkg.exports\n ? (pkg.exports as Record<string, unknown>)[subpath]\n : subpath === '.'\n ? pkg.exports\n : undefined\n const target =\n exportTarget(exportsMap) ?? (subpath === '.' ? pkg.main : undefined)\n if (!target) break\n return join(pkgDir, target)\n }\n if (dirname(dir) === dir) break\n }\n throw new Error(\n `[workerstack] cannot resolve ${specifier} from ${root}; install it`,\n )\n}\n\nasync function appFactories(root: string, ssr: boolean): Promise<Factories> {\n const load = async (specifier: string) =>\n import(pathToFileURL(await resolveFromApp(root, specifier)).href)\n const { cloudflare } = await load('@cloudflare/vite-plugin')\n const tanstackStart = ssr\n ? (await load('@tanstack/react-start/plugin/vite')).tanstackStart\n : () => {\n throw new Error(\n '[workerstack] TanStack Start is only used for render: ssr',\n )\n }\n return { cloudflare, tanstackStart }\n}\n\nexport async function workerstack(\n options: { root?: string; factories?: Factories } = {},\n): Promise<VitePluginLike[]> {\n const root = resolve(options.root ?? process.cwd())\n let source: string\n try {\n source = await readFile(join(root, 'workerstack.blueprint.yaml'), 'utf8')\n } catch {\n throw new Error(\n '[workerstack] workerstack.blueprint.yaml is missing; run `workerstack dev` or `workerstack blueprint` first',\n )\n }\n const blueprint = parseWorkerBlueprintYaml(source)\n const ssr = blueprint.application.worker.render === 'ssr'\n const pkg = JSON.parse(\n await readFile(join(root, 'package.json'), 'utf8'),\n ) as { workerstack?: { entry?: string } }\n const backendEntry = join(\n root,\n pkg.workerstack?.entry ?? 'src/workerstack.ts',\n )\n const { cloudflare, tanstackStart } =\n options.factories ?? (await appFactories(root, ssr))\n const backendPlugin = {\n name: 'workerstack:backend',\n resolveId(id: string) {\n if (id === 'virtual:workerstack/backend') return backendEntry\n return undefined\n },\n config() {\n // The artifact shape hosts deploy, in both render modes.\n return {\n environments: {\n client: { build: { outDir: 'dist/client' } },\n ssr: { build: { outDir: 'dist/server' } },\n },\n }\n },\n }\n return [\n backendPlugin,\n cloudflare({ viteEnvironment: { name: 'ssr' } }) as VitePluginLike,\n ...(ssr ? [tanstackStart({ srcDirectory: 'src' }) as VitePluginLike] : []),\n ]\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { WorkerBlueprint, WorkerRender } from './blueprint.js';
|
|
2
|
+
export type WorkerPlan = {
|
|
3
|
+
render: WorkerRender;
|
|
4
|
+
/** The source entry for the Vite plugin and wrangler. */
|
|
5
|
+
main: string;
|
|
6
|
+
compatibilityDate: string;
|
|
7
|
+
compatibilityFlags: string[];
|
|
8
|
+
durableObjects: {
|
|
9
|
+
bindings: {
|
|
10
|
+
name: string;
|
|
11
|
+
className: string;
|
|
12
|
+
}[];
|
|
13
|
+
migrations: {
|
|
14
|
+
tag: string;
|
|
15
|
+
newSqliteClasses: string[];
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
buckets: {
|
|
19
|
+
name: string;
|
|
20
|
+
binding: string;
|
|
21
|
+
}[];
|
|
22
|
+
crons: string[];
|
|
23
|
+
assets: {
|
|
24
|
+
directory: string;
|
|
25
|
+
notFoundHandling: 'none' | 'single-page-application';
|
|
26
|
+
runWorkerFirst: string[];
|
|
27
|
+
};
|
|
28
|
+
/** What a host deploys after `bun run build`, in both render modes. */
|
|
29
|
+
artifact: {
|
|
30
|
+
main: 'dist/server/index.js';
|
|
31
|
+
assets: string;
|
|
32
|
+
modules: true;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export declare function bucketBindingName(bucketName: string): string;
|
|
36
|
+
export declare function workerPlanFromBlueprint(blueprint: WorkerBlueprint): WorkerPlan;
|
|
37
|
+
//# sourceMappingURL=worker-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-plan.d.ts","sourceRoot":"","sources":["../src/worker-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKhE,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,YAAY,CAAA;IACpB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,cAAc,EAAE;QACd,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;QAC/C,UAAU,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAA;KAC1D,CAAA;IACD,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5C,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAA;QACjB,gBAAgB,EAAE,MAAM,GAAG,yBAAyB,CAAA;QACpD,cAAc,EAAE,MAAM,EAAE,CAAA;KACzB,CAAA;IACD,uEAAuE;IACvE,QAAQ,EAAE;QAAE,IAAI,EAAE,sBAAsB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,CAAA;CAC1E,CAAA;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,eAAe,GACzB,UAAU,CAwDZ"}
|