@async/db 0.2.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 +167 -0
- package/README.md +431 -0
- package/SPEC.md +1429 -0
- package/db.config.example.mjs +128 -0
- package/dist/cli/args.d.ts +8 -0
- package/dist/cli/args.js +16 -0
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.js +13 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +31 -0
- package/dist/cli/commands/generate.d.ts +6 -0
- package/dist/cli/commands/generate.js +24 -0
- package/dist/cli/commands/operations.d.ts +12 -0
- package/dist/cli/commands/operations.js +61 -0
- package/dist/cli/commands/schema.d.ts +11 -0
- package/dist/cli/commands/schema.js +1086 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.js +18 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +11 -0
- package/dist/cli/commands/types.d.ts +7 -0
- package/dist/cli/commands/types.js +37 -0
- package/dist/cli/commands/viewer.d.ts +6 -0
- package/dist/cli/commands/viewer.js +29 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/output.d.ts +25 -0
- package/dist/cli/output.js +149 -0
- package/dist/cli/schema-prompt.d.ts +20 -0
- package/dist/cli/schema-prompt.js +66 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +3 -0
- package/dist/client-cache.d.ts +105 -0
- package/dist/client-cache.js +916 -0
- package/dist/client.d.ts +64 -0
- package/dist/client.js +405 -0
- package/dist/config-public.d.ts +1 -0
- package/dist/config-public.js +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.js +2 -0
- package/dist/csv.d.ts +1 -0
- package/dist/csv.js +1 -0
- package/dist/db.d.ts +3 -0
- package/dist/db.js +3 -0
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/features/config/defaults.d.ts +98 -0
- package/dist/features/config/defaults.js +95 -0
- package/dist/features/config/load.d.ts +11 -0
- package/dist/features/config/load.js +265 -0
- package/dist/features/config/public.d.ts +17 -0
- package/dist/features/config/public.js +75 -0
- package/dist/features/doctor/duplicate-ids.d.ts +18 -0
- package/dist/features/doctor/duplicate-ids.js +79 -0
- package/dist/features/doctor/field-consistency.d.ts +17 -0
- package/dist/features/doctor/field-consistency.js +48 -0
- package/dist/features/doctor/index.d.ts +39 -0
- package/dist/features/doctor/index.js +177 -0
- package/dist/features/doctor/relations.d.ts +22 -0
- package/dist/features/doctor/relations.js +90 -0
- package/dist/features/doctor/schema-guidance.d.ts +35 -0
- package/dist/features/doctor/schema-guidance.js +184 -0
- package/dist/features/generate/registry.d.ts +14 -0
- package/dist/features/generate/registry.js +37 -0
- package/dist/features/http/registry.d.ts +46 -0
- package/dist/features/http/registry.js +86 -0
- package/dist/features/operations/index.d.ts +49 -0
- package/dist/features/operations/index.js +199 -0
- package/dist/features/operations/maps.d.ts +1 -0
- package/dist/features/operations/maps.js +10 -0
- package/dist/features/operations/readiness.d.ts +30 -0
- package/dist/features/operations/readiness.js +228 -0
- package/dist/features/operations/runtime.d.ts +57 -0
- package/dist/features/operations/runtime.js +288 -0
- package/dist/features/runtime/collection.d.ts +51 -0
- package/dist/features/runtime/collection.js +198 -0
- package/dist/features/runtime/db.d.ts +152 -0
- package/dist/features/runtime/db.js +824 -0
- package/dist/features/runtime/document.d.ts +43 -0
- package/dist/features/runtime/document.js +111 -0
- package/dist/features/runtime/fanout.d.ts +24 -0
- package/dist/features/runtime/fanout.js +77 -0
- package/dist/features/runtime/json-pointer.d.ts +5 -0
- package/dist/features/runtime/json-pointer.js +49 -0
- package/dist/features/runtime/scope-state.d.ts +44 -0
- package/dist/features/runtime/scope-state.js +185 -0
- package/dist/features/runtime/state.d.ts +1 -0
- package/dist/features/runtime/state.js +1 -0
- package/dist/features/schema/api.d.ts +107 -0
- package/dist/features/schema/api.js +460 -0
- package/dist/features/schema/builders.d.ts +86 -0
- package/dist/features/schema/builders.js +110 -0
- package/dist/features/schema/fields.d.ts +38 -0
- package/dist/features/schema/fields.js +296 -0
- package/dist/features/schema/generated.d.ts +29 -0
- package/dist/features/schema/generated.js +32 -0
- package/dist/features/schema/locator.d.ts +16 -0
- package/dist/features/schema/locator.js +135 -0
- package/dist/features/schema/manifest.d.ts +91 -0
- package/dist/features/schema/manifest.js +384 -0
- package/dist/features/schema/metadata.d.ts +30 -0
- package/dist/features/schema/metadata.js +75 -0
- package/dist/features/schema/project.d.ts +46 -0
- package/dist/features/schema/project.js +442 -0
- package/dist/features/schema/relations.d.ts +38 -0
- package/dist/features/schema/relations.js +109 -0
- package/dist/features/schema/resolvers.d.ts +36 -0
- package/dist/features/schema/resolvers.js +111 -0
- package/dist/features/schema/resource.d.ts +75 -0
- package/dist/features/schema/resource.js +253 -0
- package/dist/features/schema/source-definitions.d.ts +21 -0
- package/dist/features/schema/source-definitions.js +29 -0
- package/dist/features/schema/sources.d.ts +83 -0
- package/dist/features/schema/sources.js +689 -0
- package/dist/features/schema/standard-schema.d.ts +57 -0
- package/dist/features/schema/standard-schema.js +232 -0
- package/dist/features/schema/validation.d.ts +69 -0
- package/dist/features/schema/validation.js +434 -0
- package/dist/features/storage/events.d.ts +12 -0
- package/dist/features/storage/events.js +30 -0
- package/dist/features/storage/json.d.ts +112 -0
- package/dist/features/storage/json.js +239 -0
- package/dist/features/storage/memory.d.ts +30 -0
- package/dist/features/storage/memory.js +44 -0
- package/dist/features/storage/resource-json.d.ts +31 -0
- package/dist/features/storage/resource-json.js +76 -0
- package/dist/features/storage/runtime.d.ts +37 -0
- package/dist/features/storage/runtime.js +184 -0
- package/dist/features/storage/source-metadata.d.ts +20 -0
- package/dist/features/storage/source-metadata.js +25 -0
- package/dist/features/storage/source.d.ts +37 -0
- package/dist/features/storage/source.js +60 -0
- package/dist/features/storage/static.d.ts +29 -0
- package/dist/features/storage/static.js +42 -0
- package/dist/features/sync/defaults.d.ts +21 -0
- package/dist/features/sync/defaults.js +21 -0
- package/dist/features/sync/index.d.ts +35 -0
- package/dist/features/sync/index.js +85 -0
- package/dist/features/sync/mirror-state.d.ts +14 -0
- package/dist/features/sync/mirror-state.js +4 -0
- package/dist/features/sync/runtime-dirs.d.ts +5 -0
- package/dist/features/sync/runtime-dirs.js +9 -0
- package/dist/features/sync/source-writes.d.ts +15 -0
- package/dist/features/sync/source-writes.js +27 -0
- package/dist/features/sync/synthetic-seed.d.ts +26 -0
- package/dist/features/sync/synthetic-seed.js +83 -0
- package/dist/features/viewer/manifest.d.ts +148 -0
- package/dist/features/viewer/manifest.js +165 -0
- package/dist/fs-utils.d.ts +1 -0
- package/dist/fs-utils.js +1 -0
- package/dist/generate/hono/app.d.ts +6 -0
- package/dist/generate/hono/app.js +51 -0
- package/dist/generate/hono/graphql.d.ts +7 -0
- package/dist/generate/hono/graphql.js +53 -0
- package/dist/generate/hono/index.d.ts +55 -0
- package/dist/generate/hono/index.js +140 -0
- package/dist/generate/hono/package.d.ts +6 -0
- package/dist/generate/hono/package.js +44 -0
- package/dist/generate/hono/readme.d.ts +13 -0
- package/dist/generate/hono/readme.js +28 -0
- package/dist/generate/hono/repository.d.ts +1 -0
- package/dist/generate/hono/repository.js +27 -0
- package/dist/generate/hono/rest.d.ts +1 -0
- package/dist/generate/hono/rest.js +38 -0
- package/dist/generate/hono/schema.d.ts +13 -0
- package/dist/generate/hono/schema.js +18 -0
- package/dist/generate/hono/sqlite.d.ts +20 -0
- package/dist/generate/hono/sqlite.js +266 -0
- package/dist/generate/hono/validators.d.ts +1 -0
- package/dist/generate/hono/validators.js +141 -0
- package/dist/generate/hono.d.ts +1 -0
- package/dist/generate/hono.js +1 -0
- package/dist/graphql/execute.d.ts +14 -0
- package/dist/graphql/execute.js +719 -0
- package/dist/graphql/http.d.ts +15 -0
- package/dist/graphql/http.js +29 -0
- package/dist/graphql/index.d.ts +3 -0
- package/dist/graphql/index.js +3 -0
- package/dist/graphql/parser.d.ts +54 -0
- package/dist/graphql/parser.js +433 -0
- package/dist/hono.d.ts +77 -0
- package/dist/hono.js +1 -0
- package/dist/index.d.ts +1065 -0
- package/dist/index.js +14 -0
- package/dist/integrations/hono.d.ts +136 -0
- package/dist/integrations/hono.js +508 -0
- package/dist/integrations/kv.d.ts +69 -0
- package/dist/integrations/kv.js +69 -0
- package/dist/integrations/postgres.d.ts +52 -0
- package/dist/integrations/postgres.js +113 -0
- package/dist/integrations/sqlite.d.ts +112 -0
- package/dist/integrations/sqlite.js +489 -0
- package/dist/integrations/vite.d.ts +45 -0
- package/dist/integrations/vite.js +111 -0
- package/dist/json.d.ts +48 -0
- package/dist/json.js +1 -0
- package/dist/jsonc.d.ts +1 -0
- package/dist/jsonc.js +1 -0
- package/dist/kv.d.ts +24 -0
- package/dist/kv.js +1 -0
- package/dist/mock.d.ts +1 -0
- package/dist/mock.js +1 -0
- package/dist/names.d.ts +1 -0
- package/dist/names.js +1 -0
- package/dist/operations.d.ts +3 -0
- package/dist/operations.js +3 -0
- package/dist/postgres.d.ts +24 -0
- package/dist/postgres.js +1 -0
- package/dist/redis.d.ts +14 -0
- package/dist/redis.js +1 -0
- package/dist/rest/formats.d.ts +80 -0
- package/dist/rest/formats.js +318 -0
- package/dist/rest/handler.d.ts +111 -0
- package/dist/rest/handler.js +833 -0
- package/dist/rest/shape.d.ts +33 -0
- package/dist/rest/shape.js +218 -0
- package/dist/schema-builders.d.ts +1 -0
- package/dist/schema-builders.js +1 -0
- package/dist/schema-manifest.d.ts +1 -0
- package/dist/schema-manifest.js +1 -0
- package/dist/schema.d.ts +193 -0
- package/dist/schema.js +6 -0
- package/dist/server.d.ts +116 -0
- package/dist/server.js +601 -0
- package/dist/shared/csv.d.ts +8 -0
- package/dist/shared/csv.js +149 -0
- package/dist/shared/errors.d.ts +40 -0
- package/dist/shared/errors.js +55 -0
- package/dist/shared/fs-utils.d.ts +4 -0
- package/dist/shared/fs-utils.js +30 -0
- package/dist/shared/jsonc.d.ts +2 -0
- package/dist/shared/jsonc.js +99 -0
- package/dist/shared/mock.d.ts +40 -0
- package/dist/shared/mock.js +83 -0
- package/dist/shared/names.d.ts +28 -0
- package/dist/shared/names.js +127 -0
- package/dist/shared/operations.d.ts +32 -0
- package/dist/shared/operations.js +302 -0
- package/dist/sqlite.d.ts +24 -0
- package/dist/sqlite.js +1 -0
- package/dist/state.d.ts +1 -0
- package/dist/state.js +1 -0
- package/dist/sync.d.ts +1 -0
- package/dist/sync.js +1 -0
- package/dist/tracing.d.ts +95 -0
- package/dist/tracing.js +260 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.js +285 -0
- package/dist/viewer-manifest.d.ts +1 -0
- package/dist/viewer-manifest.js +1 -0
- package/dist/vite.d.ts +59 -0
- package/dist/vite.js +1 -0
- package/dist/web/json-viewer.d.ts +5 -0
- package/dist/web/json-viewer.js +176 -0
- package/dist/web/viewer.d.ts +12 -0
- package/dist/web/viewer.js +1015 -0
- package/docs/README.md +42 -0
- package/docs/architecture.md +112 -0
- package/docs/ci-and-release.md +177 -0
- package/docs/cms-storage-patterns.md +108 -0
- package/docs/concepts.md +141 -0
- package/docs/configuration.md +552 -0
- package/docs/fixtures-and-schemas.md +527 -0
- package/docs/fork-branch-workflows.md +108 -0
- package/docs/generated-files.md +174 -0
- package/docs/getting-started.md +165 -0
- package/docs/integrations.md +206 -0
- package/docs/json-production.md +120 -0
- package/docs/package-api.md +418 -0
- package/docs/prototype-to-production.md +378 -0
- package/docs/server-and-viewer.md +466 -0
- package/docs/store-graduation.md +120 -0
- package/docs/typescript-schema-sources.md +79 -0
- package/examples/advanced/README.md +55 -0
- package/examples/advanced/db/projects.schema.jsonc +44 -0
- package/examples/advanced/db/settings.jsonc +9 -0
- package/examples/advanced/db/users.json +23 -0
- package/examples/advanced/db/users.schema.mjs +31 -0
- package/examples/advanced/db.config.mjs +18 -0
- package/examples/advanced/example.json +5 -0
- package/examples/advanced/src/generated/db.types.d.ts +64 -0
- package/examples/basic/README.md +95 -0
- package/examples/basic/db/operations/get-user.jsonc +8 -0
- package/examples/basic/db/settings.json +7 -0
- package/examples/basic/db/users.schema.jsonc +36 -0
- package/examples/basic/db.config.mjs +68 -0
- package/examples/basic/example.json +5 -0
- package/examples/basic/src/generated/db.types.d.ts +39 -0
- package/examples/cms-json-publish/README.md +21 -0
- package/examples/cms-json-publish/db/navigation.json +7 -0
- package/examples/cms-json-publish/db/pages.json +18 -0
- package/examples/cms-json-publish/example.json +5 -0
- package/examples/cms-json-publish/src/cms.mjs +104 -0
- package/examples/computed-fields/README.md +93 -0
- package/examples/computed-fields/db/orders.schema.mjs +62 -0
- package/examples/computed-fields/db/posts.schema.mjs +59 -0
- package/examples/computed-fields/db/products.schema.mjs +39 -0
- package/examples/computed-fields/db/users.schema.mjs +43 -0
- package/examples/computed-fields/db.config.mjs +15 -0
- package/examples/computed-fields/example.json +5 -0
- package/examples/computed-fields/src/generated/db.types.d.ts +81 -0
- package/examples/content-collections/README.md +91 -0
- package/examples/content-collections/db/authors.json +12 -0
- package/examples/content-collections/db/authors.schema.mjs +20 -0
- package/examples/content-collections/db/blog/draft-roadmap.mdx +12 -0
- package/examples/content-collections/db/blog/index.schema.mjs +61 -0
- package/examples/content-collections/db/blog/launch-notes.mdx +15 -0
- package/examples/content-collections/db/docs/index.schema.mjs +32 -0
- package/examples/content-collections/db/docs/intro.mdx +11 -0
- package/examples/content-collections/db/docs/schema-workflow.mdx +10 -0
- package/examples/content-collections/db/site.schema.jsonc +21 -0
- package/examples/content-collections/db.config.mjs +26 -0
- package/examples/content-collections/example.json +5 -0
- package/examples/content-collections/src/content-preview.mjs +66 -0
- package/examples/content-collections/src/generated/db.types.d.ts +81 -0
- package/examples/csv/README.md +52 -0
- package/examples/csv/db/customers.csv +4 -0
- package/examples/csv/db.config.mjs +13 -0
- package/examples/csv/example.json +5 -0
- package/examples/data-first/README.md +54 -0
- package/examples/data-first/db/posts.json +16 -0
- package/examples/data-first/db/settings.json +8 -0
- package/examples/data-first/db/users.json +14 -0
- package/examples/data-first/db.config.mjs +13 -0
- package/examples/data-first/example.json +5 -0
- package/examples/diagnostics/README.md +55 -0
- package/examples/diagnostics/db/projects.schema.jsonc +27 -0
- package/examples/diagnostics/db/users.json +9 -0
- package/examples/diagnostics/db/users.schema.jsonc +23 -0
- package/examples/diagnostics/db.config.mjs +16 -0
- package/examples/diagnostics/example.json +5 -0
- package/examples/free-plan-upgrade/README.md +22 -0
- package/examples/free-plan-upgrade/db/appSettings.json +4 -0
- package/examples/free-plan-upgrade/db/projects.json +7 -0
- package/examples/free-plan-upgrade/example.json +5 -0
- package/examples/free-plan-upgrade/src/upgrade-tenant-to-paid.mjs +105 -0
- package/examples/hono-auth/README.md +74 -0
- package/examples/hono-auth/db/pages.schema.jsonc +44 -0
- package/examples/hono-auth/db/users.schema.jsonc +42 -0
- package/examples/hono-auth/db.config.mjs +17 -0
- package/examples/hono-auth/example.json +5 -0
- package/examples/hono-auth/package.json +14 -0
- package/examples/hono-auth/src/app.mjs +79 -0
- package/examples/hono-auth/src/server.mjs +13 -0
- package/examples/production-json/README.md +102 -0
- package/examples/production-json/db/appSettings.schema.jsonc +41 -0
- package/examples/production-json/db/featureFlags.schema.jsonc +84 -0
- package/examples/production-json/db/operations/get-control-plane.jsonc +6 -0
- package/examples/production-json/db/operations/get-feature-flag.jsonc +9 -0
- package/examples/production-json/db/operations/list-feature-flags.jsonc +8 -0
- package/examples/production-json/db/operations/read-public-settings.jsonc +8 -0
- package/examples/production-json/db.config.mjs +33 -0
- package/examples/production-json/example.json +5 -0
- package/examples/production-json/src/client-demo.mjs +28 -0
- package/examples/production-json/src/generated/db.types.d.ts +60 -0
- package/examples/relations/README.md +56 -0
- package/examples/relations/db/posts.schema.jsonc +46 -0
- package/examples/relations/db/users.schema.jsonc +34 -0
- package/examples/relations/db.config.mjs +13 -0
- package/examples/relations/example.json +5 -0
- package/examples/rest-client/README.md +54 -0
- package/examples/rest-client/db/settings.json +5 -0
- package/examples/rest-client/db/users.schema.jsonc +42 -0
- package/examples/rest-client/db.config.mjs +13 -0
- package/examples/rest-client/example.json +5 -0
- package/examples/rest-client/src/client-demo.mjs +24 -0
- package/examples/schema-first/README.md +55 -0
- package/examples/schema-first/db/auditEvents.schema.jsonc +24 -0
- package/examples/schema-first/db/settings.schema.jsonc +29 -0
- package/examples/schema-first/db/users.schema.jsonc +36 -0
- package/examples/schema-first/db.config.mjs +15 -0
- package/examples/schema-first/example.json +5 -0
- package/examples/schema-first/src/generated/db.types.d.ts +47 -0
- package/examples/schema-manifest/README.md +50 -0
- package/examples/schema-manifest/db/projects.schema.jsonc +48 -0
- package/examples/schema-manifest/db/users.schema.jsonc +35 -0
- package/examples/schema-manifest/db.config.mjs +41 -0
- package/examples/schema-manifest/example.json +5 -0
- package/examples/schema-manifest/src/generated/db.schema.json +130 -0
- package/examples/schema-manifest/src/generated/db.types.d.ts +50 -0
- package/examples/schema-ui/README.md +103 -0
- package/examples/schema-ui/db/pages.schema.jsonc +53 -0
- package/examples/schema-ui/db/users.schema.jsonc +30 -0
- package/examples/schema-ui/db.config.mjs +55 -0
- package/examples/schema-ui/example.json +5 -0
- package/examples/schema-ui/src/cms-ssr.mjs +276 -0
- package/examples/schema-ui/src/generated/db.schema.json +133 -0
- package/examples/schema-ui/src/generated/db.types.d.ts +46 -0
- package/examples/schema-ui/src/render-admin.mjs +175 -0
- package/examples/schema-ui/src/schema-ui-ssr-handler.mjs +149 -0
- package/examples/schema-ui/src/start-schema-ui-server.mjs +140 -0
- package/examples/standard-schema/README.md +55 -0
- package/examples/standard-schema/db/settings.schema.mjs +22 -0
- package/examples/standard-schema/db/users.schema.mjs +72 -0
- package/examples/standard-schema/example.json +5 -0
- package/package.json +108 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
# Package API
|
|
2
|
+
|
|
3
|
+
This page covers the CLI, runtime API, HTTP client, and package exports.
|
|
4
|
+
|
|
5
|
+
## CLI
|
|
6
|
+
|
|
7
|
+
With a package script like `"db": "async-db"`:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run db -- sync
|
|
11
|
+
npm run db -- types
|
|
12
|
+
npm run db -- types --watch
|
|
13
|
+
npm run db -- types --out ./src/generated/db.types.d.ts
|
|
14
|
+
npm run db -- schema
|
|
15
|
+
npm run db -- schema users
|
|
16
|
+
npm run db -- schema infer users
|
|
17
|
+
npm run db -- schema infer users --out db/users.schema.jsonc
|
|
18
|
+
npm run db -- schema manifest --out ./src/generated/db.schema.json
|
|
19
|
+
npm run db -- schema validate
|
|
20
|
+
npm run db -- viewer manifest --out ./src/generated/db.viewer.json
|
|
21
|
+
npm run db -- operations build
|
|
22
|
+
npm run db -- operations build --out ./src/generated/db.operations.json --refs-out ./src/generated/db.operation-refs.json
|
|
23
|
+
npm run db -- doctor
|
|
24
|
+
npm run db -- doctor --production
|
|
25
|
+
npm run db -- doctor --json
|
|
26
|
+
npm run db -- check --strict --production
|
|
27
|
+
npm run db -- create users '{"id":"u_2","name":"Grace Hopper","email":"grace@example.com"}'
|
|
28
|
+
npm run db -- serve
|
|
29
|
+
npm run db -- generate hono
|
|
30
|
+
npm run db -- generate hono --api rest,graphql --out ./server
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Inside npm scripts, `db` resolves to the local dependency binary. Equivalent direct commands:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
async-db sync
|
|
37
|
+
async-db types
|
|
38
|
+
async-db schema validate
|
|
39
|
+
async-db viewer manifest --out ./src/generated/db.viewer.json
|
|
40
|
+
async-db operations build
|
|
41
|
+
async-db doctor
|
|
42
|
+
async-db doctor --production
|
|
43
|
+
async-db check --strict --production
|
|
44
|
+
async-db serve
|
|
45
|
+
async-db generate hono
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
With pnpm and a `"db": "async-db"` script, pass arguments directly to the script name:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm db sync
|
|
52
|
+
pnpm db schema validate
|
|
53
|
+
pnpm db serve
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Runtime API
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { openDb } from '@async/db';
|
|
60
|
+
|
|
61
|
+
const db = await openDb({
|
|
62
|
+
dbDir: './db',
|
|
63
|
+
outputs: {
|
|
64
|
+
stateDir: './.db',
|
|
65
|
+
},
|
|
66
|
+
stores: {
|
|
67
|
+
default: 'json',
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const users = db.collection('users');
|
|
72
|
+
|
|
73
|
+
await users.create({
|
|
74
|
+
id: 'u_2',
|
|
75
|
+
name: 'Grace Hopper',
|
|
76
|
+
email: 'grace@example.com',
|
|
77
|
+
role: 'user',
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const ada = await users.get('u_1');
|
|
81
|
+
const hasGrace = await users.exists('u_2');
|
|
82
|
+
|
|
83
|
+
await db.close();
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Call `db.close()` when a long-running process is done with the database so stores with open handles, such as SQLite, can release them.
|
|
87
|
+
|
|
88
|
+
Singleton document usage:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const settings = db.document('settings');
|
|
92
|
+
|
|
93
|
+
await settings.set('/theme', 'dark');
|
|
94
|
+
|
|
95
|
+
const value = await settings.get('/theme');
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Fork and branch usage:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
const tenant = await db.forks.ensure('tenant_acme', {
|
|
102
|
+
from: 'main',
|
|
103
|
+
metadata: {
|
|
104
|
+
purpose: 'tenant',
|
|
105
|
+
plan: 'free',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const snapshot = await tenant.snapshots.create({
|
|
110
|
+
label: 'before-projects-migration',
|
|
111
|
+
resources: ['projects'],
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await tenant.migrations.start('projects-to-postgres', {
|
|
115
|
+
resources: ['projects'],
|
|
116
|
+
mode: 'read-only',
|
|
117
|
+
});
|
|
118
|
+
await tenant.resources.migrate('projects', {
|
|
119
|
+
from: 'json',
|
|
120
|
+
to: 'postgres',
|
|
121
|
+
});
|
|
122
|
+
await tenant.migrations.verify('projects-to-postgres', {
|
|
123
|
+
resources: ['projects'],
|
|
124
|
+
checks: ['count', 'checksum'],
|
|
125
|
+
});
|
|
126
|
+
await tenant.routing.set({
|
|
127
|
+
projects: 'postgres',
|
|
128
|
+
});
|
|
129
|
+
await tenant.migrations.finish('projects-to-postgres');
|
|
130
|
+
|
|
131
|
+
void snapshot;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
These are low-level database lifecycle APIs. App code decides whether a fork is a tenant, preview, debug copy, demo, or test environment.
|
|
135
|
+
|
|
136
|
+
Import generated `DbTypes` from `.db/types/index.d.ts` or from a committed output file when typed collection names and records should be available to TypeScript.
|
|
137
|
+
|
|
138
|
+
## Schema Contract API
|
|
139
|
+
|
|
140
|
+
Use `loadDbSchema({ from })` when app code needs the schema contract without
|
|
141
|
+
opening runtime stores or reading source records. `from` can point at a project
|
|
142
|
+
root, a `db/` folder, the root `db.schema.mjs` / `db.schema.js`, or one resource schema file.
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import { loadDbSchema, openDb } from '@async/db';
|
|
146
|
+
|
|
147
|
+
const schema = await loadDbSchema({ from: './db.schema.mjs' });
|
|
148
|
+
|
|
149
|
+
const validateUserInput = schema.validator('users', {
|
|
150
|
+
mode: 'create',
|
|
151
|
+
unknownFields: 'strip',
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const input = validateUserInput.assert(await request.json());
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Validators reject computed and read-only fields. They default unknown fields to
|
|
158
|
+
`error`; use `strip`, `allow`, or `warn` when an endpoint has a different input
|
|
159
|
+
contract. `mode: 'patch'` allows partial records and `mode: 'replace'` keeps
|
|
160
|
+
required-field checks strict.
|
|
161
|
+
|
|
162
|
+
Call computed field resolvers directly when server code wants the same field
|
|
163
|
+
logic that REST and GraphQL use:
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
const userResolvers = schema.resolver('users', {
|
|
167
|
+
value: input,
|
|
168
|
+
context: {
|
|
169
|
+
locale: 'en-US',
|
|
170
|
+
nameFormatter,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const fullName = await userResolvers.fullName();
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
`schema.resolver('users.fullName')` returns one callable resolver. The resolver
|
|
178
|
+
`this` value is a delegated context with `this.get(name)` and `this.has(name)`.
|
|
179
|
+
User context values win over internal values; `this._internal` exposes the
|
|
180
|
+
unoverridden internal view when a resolver needs it. A resolver call can also
|
|
181
|
+
pass ad hoc arguments, such as `{ record: input }`, when the schema function is
|
|
182
|
+
written to receive them.
|
|
183
|
+
|
|
184
|
+
Pass a loaded schema to `openDb({ schema })` when one process wants to inspect
|
|
185
|
+
or validate the contract first, then open the runtime database from the same
|
|
186
|
+
schema locator:
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
const schema = await loadDbSchema({ from: './db.schema.mjs' });
|
|
190
|
+
const db = await openDb({ schema });
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`loadDbSchema()` is metadata-only by default and does not call content/data
|
|
194
|
+
readers, runtime stores, or computed resolvers. `openDb()` defaults to runtime
|
|
195
|
+
loading and reads the matching fixture/content sources.
|
|
196
|
+
|
|
197
|
+
JavaScript schema files can describe folder content sources with the helper
|
|
198
|
+
exported from `@async/db/schema`:
|
|
199
|
+
|
|
200
|
+
```js
|
|
201
|
+
import { collection, field, files } from '@async/db/schema';
|
|
202
|
+
|
|
203
|
+
export default collection({
|
|
204
|
+
source: files('./**/*.mdx', { read: 'frontmatter' }),
|
|
205
|
+
fields: {
|
|
206
|
+
id: field.string({ required: true }),
|
|
207
|
+
title: field.string({ required: true }),
|
|
208
|
+
body: field.string(),
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Keep runtime store selection in `db.config.mjs`, for example
|
|
214
|
+
`resources.docs.store = 'static'`.
|
|
215
|
+
|
|
216
|
+
## HTTP Client
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
import { createDbClient } from '@async/db/client';
|
|
220
|
+
|
|
221
|
+
const client = createDbClient({
|
|
222
|
+
baseUrl: 'http://127.0.0.1:7331',
|
|
223
|
+
batching: true,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const users = await client.rest.get('/db/users.json');
|
|
227
|
+
|
|
228
|
+
await client.rest.post('/db/users', {
|
|
229
|
+
id: 'u_2',
|
|
230
|
+
name: 'Grace Hopper',
|
|
231
|
+
email: 'grace@example.com',
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
const batch = await client.rest.batch([
|
|
235
|
+
{ method: 'GET', path: '/db/users.json' },
|
|
236
|
+
{ method: 'GET', path: '/db/settings.json' },
|
|
237
|
+
]);
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
When using `createDbClient()` directly against standalone `async-db serve`, use
|
|
241
|
+
the app-facing `/db` routes. Scoped clients, such as the Vite virtual client or
|
|
242
|
+
a fork client, can keep resource paths like `/users` because the client sets a
|
|
243
|
+
`restBasePath` for you.
|
|
244
|
+
|
|
245
|
+
The client can batch requests made within a short timeout. The default batching window is `10ms`. Identical REST `GET` requests are deduped by default. Writes are not deduped unless you explicitly choose `dedupe: 'all'`.
|
|
246
|
+
|
|
247
|
+
Enable the browser cache explicitly when app code should reuse normalized REST
|
|
248
|
+
and GraphQL reads:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
import { createDbClient, createIndexedDbCacheStorage } from '@async/db/client';
|
|
252
|
+
|
|
253
|
+
const client = createDbClient({
|
|
254
|
+
baseUrl: 'http://127.0.0.1:7331',
|
|
255
|
+
cache: {
|
|
256
|
+
enabled: true,
|
|
257
|
+
storage: 'memory',
|
|
258
|
+
readPolicy: 'cache-first',
|
|
259
|
+
writePolicy: 'merge-and-invalidate',
|
|
260
|
+
eventPolicy: 'invalidate',
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
await client.rest.get('/db/users.json?select=id,name', { cache: 'cache-first' });
|
|
265
|
+
await client.graphql('{ users { id name __typename } }', {}, { cache: 'cache-and-network' });
|
|
266
|
+
|
|
267
|
+
const stop = client.cache.watch(
|
|
268
|
+
{ kind: 'rest', method: 'GET', path: '/db/users.json?select=id,name' },
|
|
269
|
+
(snapshot) => {
|
|
270
|
+
render(snapshot.data);
|
|
271
|
+
},
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
const persistedClient = createDbClient({
|
|
275
|
+
baseUrl: 'http://127.0.0.1:7331',
|
|
276
|
+
cache: {
|
|
277
|
+
enabled: true,
|
|
278
|
+
storage: createIndexedDbCacheStorage({ name: 'async-db' }),
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
The cache is off by default. When enabled, the client fetches the viewer
|
|
284
|
+
manifest once, normalizes collection records by resource id, normalizes
|
|
285
|
+
documents by resource name, and keeps query results by canonical request key.
|
|
286
|
+
Cacheable reads use exact in-flight dedupe outside the batching window. Runtime
|
|
287
|
+
write events from `/__db/log` invalidate or refetch affected resources according
|
|
288
|
+
to `eventPolicy`; fixture/source reload events from `/__db/events` refresh the
|
|
289
|
+
manifest and invalidate cached queries. IndexedDB is explicit opt-in because it
|
|
290
|
+
persists record data in the browser.
|
|
291
|
+
|
|
292
|
+
Run registered queries or literal operation templates through the same client.
|
|
293
|
+
`query()` is the app-facing alias for `operation()`:
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
import operationRefs from './generated/db.operation-refs.json' assert { type: 'json' };
|
|
297
|
+
|
|
298
|
+
await client.query('GetUser', { id: 'u_1' });
|
|
299
|
+
|
|
300
|
+
await client.query('/db/users/{id}.json?select=id,name', { id: 'u_1' });
|
|
301
|
+
|
|
302
|
+
await client.query({
|
|
303
|
+
method: 'GET',
|
|
304
|
+
path: '/db/users/{id}.json',
|
|
305
|
+
query: {
|
|
306
|
+
select: 'id,name',
|
|
307
|
+
},
|
|
308
|
+
}, { id: 'u_1' });
|
|
309
|
+
|
|
310
|
+
await client.query({
|
|
311
|
+
query: 'query GetUser($id: ID!) { user(id: $id) { id name } }',
|
|
312
|
+
operationName: 'GetUser',
|
|
313
|
+
variables: {
|
|
314
|
+
id: '{id}',
|
|
315
|
+
},
|
|
316
|
+
}, { id: 'u_1' });
|
|
317
|
+
|
|
318
|
+
await client.query({ name: 'GetUser', ref: 'users.get' }, { id: 'u_1' });
|
|
319
|
+
|
|
320
|
+
await client.query(operationRefs.operations.GetUser.ref, { id: 'u_1' });
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
String values passed to `query()` that start with `/`, or with an HTTP method
|
|
324
|
+
followed by `/`, are literal REST templates. Other strings are registered query
|
|
325
|
+
refs, such as an operation name or explicit ref, and call `POST
|
|
326
|
+
/__db/operations/:ref`. Object REST templates execute as normal REST requests.
|
|
327
|
+
Object GraphQL templates are inferred when an object has `query` and no REST
|
|
328
|
+
`path`, and execute as normal GraphQL requests. The server looks up registered
|
|
329
|
+
refs, substitutes variables, and runs REST templates through normal REST shaping
|
|
330
|
+
or GraphQL templates through the GraphQL executor.
|
|
331
|
+
|
|
332
|
+
Generated operation refs include `.name` and `.ref`. `.ref` is the value app
|
|
333
|
+
code should call. It defaults to `hashOperation(template)` unless the operation
|
|
334
|
+
source provides an explicit `ref`. Server acceptance is controlled separately
|
|
335
|
+
with `operations.acceptRefs`.
|
|
336
|
+
|
|
337
|
+
## Package Exports
|
|
338
|
+
|
|
339
|
+
| Export | Use |
|
|
340
|
+
| --- | --- |
|
|
341
|
+
| `@async/db` | Runtime API such as `openDb`. |
|
|
342
|
+
| `@async/db/schema` | `.schema.mjs` and `.schema.js` authoring helpers. |
|
|
343
|
+
| `@async/db/config` | `defineConfig` and manifest helpers. |
|
|
344
|
+
| `@async/db/client` | HTTP client with REST, GraphQL, and batching helpers. |
|
|
345
|
+
| `@async/db/json` | First-party JSON file database capabilities and safe JSON state helpers. |
|
|
346
|
+
| `@async/db/vite` | Optional Vite dev server plugin. |
|
|
347
|
+
| `@async/db/hono` | Optional Hono route registration helpers. |
|
|
348
|
+
| `@async/db/sqlite` | Optional SQLite adapter helpers. |
|
|
349
|
+
| `@async/db/postgres` | Optional Postgres runtime store helpers using an injected client. |
|
|
350
|
+
| `@async/db/kv` | Optional generic KV runtime store helpers using an injected `get`/`set` client. |
|
|
351
|
+
| `@async/db/redis` | Optional Redis-named helper over the generic KV store. |
|
|
352
|
+
|
|
353
|
+
The core package stays dependency-light. Optional integrations use dynamic
|
|
354
|
+
imports, generated app dependencies, or injected database clients.
|
|
355
|
+
|
|
356
|
+
`@async/db/json` is the first-party JSON file database subpath. It exposes the
|
|
357
|
+
JSON store capability metadata and safe file-state helpers for tooling,
|
|
358
|
+
diagnostics, exports, and migrations. Most app code should still use `openDb()`,
|
|
359
|
+
`createDbClient()`, and registered operations so resources can graduate from
|
|
360
|
+
JSON to SQLite, Postgres, or custom stores without changing client calls.
|
|
361
|
+
|
|
362
|
+
The root export also includes `hashOperation()`, `buildOperationManifest()`,
|
|
363
|
+
and `createDbOperationHandler()` for tools and framework adapters that want to
|
|
364
|
+
build or execute registered operation registries without shelling out to the
|
|
365
|
+
CLI.
|
|
366
|
+
|
|
367
|
+
`createDbOperationHandler(db, options?)` returns a small operation executor:
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
const handler = createDbOperationHandler(db, {
|
|
371
|
+
registry: generatedOperations.operations,
|
|
372
|
+
acceptRefs: 'ref',
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
const result = await handler.execute(operationRefs.operations.GetUser.ref, {
|
|
376
|
+
id: 'u_1',
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Use `execute(ref, variables)` for direct calls or `executeRequest(ref, body)`
|
|
381
|
+
when adapting an HTTP request body shaped as `{ variables }`. Framework adapters
|
|
382
|
+
should pass registry, `acceptRefs`, `resolveRef`, or `validateRef` at handler
|
|
383
|
+
creation time instead of relying on per-execution public options.
|
|
384
|
+
|
|
385
|
+
Inline registries can use full operation objects or string REST templates. The
|
|
386
|
+
registry key is used as the fallback name and ref, so custom build steps can
|
|
387
|
+
keep a small manual registry:
|
|
388
|
+
|
|
389
|
+
```js
|
|
390
|
+
const handler = createDbOperationHandler(db, {
|
|
391
|
+
registry: {
|
|
392
|
+
GetUser: '/users/{id}.json?select=id,name',
|
|
393
|
+
},
|
|
394
|
+
acceptRefs: 'name',
|
|
395
|
+
});
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
## Repo Example Launcher
|
|
399
|
+
|
|
400
|
+
Run every repo example and open an index of their viewers:
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
npm run examples
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
The examples index runs on one loopback port and starts each example runtime lazily when you open its demo or `/__db` viewer.
|
|
407
|
+
|
|
408
|
+
To get an HTTPS URL for the examples index inside your tailnet, opt in to
|
|
409
|
+
Tailscale Serve:
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
npm run examples -- --tailscale-serve
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
This runs `tailscale serve --bg <port>` after the local examples host starts.
|
|
416
|
+
@async/db does not call `tailscale cert`, manage local certificate files, or
|
|
417
|
+
change tailnet settings directly. If MagicDNS or HTTPS certificates still need
|
|
418
|
+
admin setup, the Tailscale CLI output is shown so you can follow its prompt.
|