@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,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "document",
|
|
3
|
+
"description": "Site-level content settings stored as an embedded schema seed before aggregate bundle splits it out.",
|
|
4
|
+
"fields": {
|
|
5
|
+
"title": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"required": true
|
|
8
|
+
},
|
|
9
|
+
"description": {
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"baseUrl": {
|
|
13
|
+
"type": "string"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"seed": {
|
|
17
|
+
"title": "Local Content Lab",
|
|
18
|
+
"description": "A small dependency-free content collection workflow.",
|
|
19
|
+
"baseUrl": "https://example.test"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { defineConfig } from '@async/db/config';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
dbDir: './db',
|
|
6
|
+
outputs: {
|
|
7
|
+
stateDir: './.db',
|
|
8
|
+
types: './.db/types/index.d.ts',
|
|
9
|
+
committedTypes: './src/generated/db.types.d.ts',
|
|
10
|
+
},
|
|
11
|
+
types: {
|
|
12
|
+
enabled: true,
|
|
13
|
+
emitComments: true,
|
|
14
|
+
},
|
|
15
|
+
schema: {
|
|
16
|
+
unknownFields: 'warn',
|
|
17
|
+
},
|
|
18
|
+
resources: {
|
|
19
|
+
blog: {
|
|
20
|
+
store: 'static',
|
|
21
|
+
},
|
|
22
|
+
docs: {
|
|
23
|
+
store: 'static',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { openDb } from '@async/db';
|
|
4
|
+
|
|
5
|
+
const exampleRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
6
|
+
const db = await openDb({ cwd: exampleRoot });
|
|
7
|
+
await db.runtime.hydrate();
|
|
8
|
+
|
|
9
|
+
const [docs, blog] = await Promise.all([
|
|
10
|
+
db.collection('docs').all(),
|
|
11
|
+
db.collection('blog').all(),
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
const output = [
|
|
15
|
+
'<main>',
|
|
16
|
+
...docs
|
|
17
|
+
.sort((left, right) => (left.order ?? 100) - (right.order ?? 100))
|
|
18
|
+
.map((record) => renderArticle('doc', record)),
|
|
19
|
+
...blog.map((record) => renderArticle('blog', {
|
|
20
|
+
...record,
|
|
21
|
+
href: `/blog/${record.id}`,
|
|
22
|
+
})),
|
|
23
|
+
'</main>',
|
|
24
|
+
'',
|
|
25
|
+
].join('\n');
|
|
26
|
+
|
|
27
|
+
console.log(output);
|
|
28
|
+
|
|
29
|
+
export function renderArticle(kind, record) {
|
|
30
|
+
const title = escapeHtml(record.title ?? record.id);
|
|
31
|
+
const body = renderMdxPreview(record.body ?? '');
|
|
32
|
+
const href = record.href ? ` data-href="${escapeHtml(record.href)}"` : '';
|
|
33
|
+
return [
|
|
34
|
+
`<article data-kind="${kind}" data-id="${escapeHtml(record.id)}"${href}>`,
|
|
35
|
+
` <h2>${title}</h2>`,
|
|
36
|
+
` <p>${escapeHtml(record.summary ?? '')}</p>`,
|
|
37
|
+
` <div>${body}</div>`,
|
|
38
|
+
'</article>',
|
|
39
|
+
].join('\n');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function renderMdxPreview(source) {
|
|
43
|
+
return String(source)
|
|
44
|
+
.split(/\n{2,}/u)
|
|
45
|
+
.map((block) => block.trim())
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.map((block) => {
|
|
48
|
+
if (block.startsWith('# ')) {
|
|
49
|
+
return `<h1>${escapeHtml(block.slice(2))}</h1>`;
|
|
50
|
+
}
|
|
51
|
+
if (block.startsWith('## ')) {
|
|
52
|
+
return `<h2>${escapeHtml(block.slice(3))}</h2>`;
|
|
53
|
+
}
|
|
54
|
+
const withoutJsxTags = block.replace(/<\/?[A-Z][^>]*>/gu, '');
|
|
55
|
+
return `<p>${escapeHtml(withoutJsxTags)}</p>`;
|
|
56
|
+
})
|
|
57
|
+
.join('');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function escapeHtml(value) {
|
|
61
|
+
return String(value)
|
|
62
|
+
.replaceAll('&', '&')
|
|
63
|
+
.replaceAll('<', '<')
|
|
64
|
+
.replaceAll('>', '>')
|
|
65
|
+
.replaceAll('"', '"');
|
|
66
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
// This file is generated by db. Do not edit by hand.
|
|
3
|
+
|
|
4
|
+
export type AuthorRole = "Editor" | "Author";
|
|
5
|
+
|
|
6
|
+
export type BlogStatus = "draft" | "published";
|
|
7
|
+
|
|
8
|
+
/** People who write or edit content records. */
|
|
9
|
+
export type Author = {
|
|
10
|
+
/** Stable author id used by content frontmatter. */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Display name shown on bylines. */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Editorial role in the local content workflow. */
|
|
15
|
+
role?: AuthorRole;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Blog posts loaded from frontmatter and raw MDX body files. */
|
|
19
|
+
export type Blog = {
|
|
20
|
+
/** Stable post id. Defaults to the filename when frontmatter omits id. */
|
|
21
|
+
id: string;
|
|
22
|
+
/** Post title from frontmatter. */
|
|
23
|
+
title: string;
|
|
24
|
+
/** Publication state. */
|
|
25
|
+
status?: BlogStatus;
|
|
26
|
+
/** Publication timestamp. */
|
|
27
|
+
publishedAt?: string;
|
|
28
|
+
/** Author id from the authors fixture. */
|
|
29
|
+
authorId: string;
|
|
30
|
+
/** Comma-separated tags kept scalar for the dependency-free frontmatter parser. */
|
|
31
|
+
tags?: string;
|
|
32
|
+
/** Short post summary. */
|
|
33
|
+
summary?: string;
|
|
34
|
+
/** Raw MDX body. Rendering and compilation are app-owned. */
|
|
35
|
+
body: string;
|
|
36
|
+
/** Read-only URL path derived from the post id. */
|
|
37
|
+
permalink?: string;
|
|
38
|
+
/** Read-only one-minute minimum estimate derived from the raw body. */
|
|
39
|
+
readingTimeMinutes?: number;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** Documentation pages loaded from frontmatter and raw MDX body files. */
|
|
43
|
+
export type Doc = {
|
|
44
|
+
/** Stable document id. Defaults to the filename when frontmatter omits id. */
|
|
45
|
+
id: string;
|
|
46
|
+
/** Page title from frontmatter. */
|
|
47
|
+
title: string;
|
|
48
|
+
/** Navigation group for this page. */
|
|
49
|
+
section: string;
|
|
50
|
+
/** Sort order inside the section. */
|
|
51
|
+
order?: number;
|
|
52
|
+
/** Short page summary. */
|
|
53
|
+
summary?: string;
|
|
54
|
+
/** Raw MDX body. Rendering and compilation are app-owned. */
|
|
55
|
+
body: string;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Site-level content settings stored as an embedded schema seed before aggregate bundle splits it out. */
|
|
59
|
+
export type Site = {
|
|
60
|
+
title: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
baseUrl?: string;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export type DbCollections = {
|
|
66
|
+
authors: Author;
|
|
67
|
+
blog: Blog;
|
|
68
|
+
docs: Doc;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export type DbDocuments = {
|
|
72
|
+
site: Site;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export type DbTypes = {
|
|
76
|
+
collections: DbCollections;
|
|
77
|
+
documents: DbDocuments;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export type DbCollectionName = keyof DbCollections;
|
|
81
|
+
export type DbDocumentName = keyof DbDocuments;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# CSV Example
|
|
2
|
+
|
|
3
|
+
## What This Teaches
|
|
4
|
+
|
|
5
|
+
Use this when product, customer, or spreadsheet-like data starts as CSV. db scans the header row, infers field shapes, generates types, and mirrors the rows into JSON runtime state.
|
|
6
|
+
|
|
7
|
+
## Files To Inspect
|
|
8
|
+
|
|
9
|
+
- [db/customers.csv](./db/customers.csv): source CSV fixture.
|
|
10
|
+
- [db.config.mjs](./db.config.mjs): default mirror setup using `defineConfig`.
|
|
11
|
+
|
|
12
|
+
## Run It
|
|
13
|
+
|
|
14
|
+
From the repository root, use the repo-internal CLI path:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm run db -- sync --cwd ./examples/csv
|
|
18
|
+
npm run db -- serve --cwd ./examples/csv
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Open the viewer:
|
|
22
|
+
|
|
23
|
+
```txt
|
|
24
|
+
http://127.0.0.1:7331/__db
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Expected Result
|
|
28
|
+
|
|
29
|
+
`sync` writes `.db/state/customers.json`. When `db/customers.csv` changes, the source hash changes and the JSON store refreshes from CSV.
|
|
30
|
+
|
|
31
|
+
## REST Request To Try
|
|
32
|
+
|
|
33
|
+
Leave `serve` running and run this from another terminal:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
curl 'http://127.0.0.1:7331/db/customers.json?select=id,name,email'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Features To Notice
|
|
40
|
+
|
|
41
|
+
- [CSV fixtures](../../docs/fixtures-and-schemas.md#csv-fixtures)
|
|
42
|
+
- [Runtime state refreshes](../../docs/generated-files.md#runtime-state)
|
|
43
|
+
- [Fixture-like `.json` REST routes](../../docs/server-and-viewer.md#fixture-like-json-routes)
|
|
44
|
+
|
|
45
|
+
## Cleanup
|
|
46
|
+
|
|
47
|
+
Generated `.db/` output is ignored by git and can be removed whenever you want fresh runtime state.
|
|
48
|
+
|
|
49
|
+
## More Docs
|
|
50
|
+
|
|
51
|
+
- [Fixtures And Schemas](../../docs/fixtures-and-schemas.md)
|
|
52
|
+
- [Generated Files](../../docs/generated-files.md)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Data-First Example
|
|
2
|
+
|
|
3
|
+
## What This Teaches
|
|
4
|
+
|
|
5
|
+
Use this when you have fixture data before you have a contract. db infers collections, singleton documents, REST routes, GraphQL fields, and TypeScript types from plain JSON.
|
|
6
|
+
|
|
7
|
+
## Files To Inspect
|
|
8
|
+
|
|
9
|
+
- [db/users.json](./db/users.json): collection inferred from an array.
|
|
10
|
+
- [db/posts.json](./db/posts.json): second inferred collection.
|
|
11
|
+
- [db/settings.json](./db/settings.json): singleton document inferred from an object.
|
|
12
|
+
|
|
13
|
+
## Run It
|
|
14
|
+
|
|
15
|
+
From the repository root, use the repo-internal CLI path:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run db -- sync --cwd ./examples/data-first
|
|
19
|
+
npm run db -- serve --cwd ./examples/data-first
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Open the viewer:
|
|
23
|
+
|
|
24
|
+
```txt
|
|
25
|
+
http://127.0.0.1:7331/__db
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Expected Result
|
|
29
|
+
|
|
30
|
+
`sync` infers schema and writes generated runtime state under `examples/data-first/.db/`.
|
|
31
|
+
|
|
32
|
+
## REST Request To Try
|
|
33
|
+
|
|
34
|
+
Leave `serve` running and run this from another terminal:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
curl 'http://127.0.0.1:7331/db/users.json?select=id,name,email'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Features To Notice
|
|
41
|
+
|
|
42
|
+
- [Data-first JSON fixtures](../../docs/fixtures-and-schemas.md#data-first-json-or-jsonc)
|
|
43
|
+
- [Fixture-like `.json` REST routes](../../docs/server-and-viewer.md#fixture-like-json-routes)
|
|
44
|
+
- [REST query parameters](../../docs/server-and-viewer.md#rest-routes)
|
|
45
|
+
- [Runtime state](../../docs/generated-files.md#runtime-state)
|
|
46
|
+
|
|
47
|
+
## Cleanup
|
|
48
|
+
|
|
49
|
+
Generated `.db/` output is ignored by git and can be removed whenever you want a fresh mirror.
|
|
50
|
+
|
|
51
|
+
## More Docs
|
|
52
|
+
|
|
53
|
+
- [Concepts](../../docs/concepts.md)
|
|
54
|
+
- [Fixtures And Schemas](../../docs/fixtures-and-schemas.md)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "p_1",
|
|
4
|
+
"authorId": "u_1",
|
|
5
|
+
"title": "Notes on analytical engines",
|
|
6
|
+
"published": true,
|
|
7
|
+
"tags": ["history", "computing"]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "p_2",
|
|
11
|
+
"authorId": "u_2",
|
|
12
|
+
"title": "Debugging at sea",
|
|
13
|
+
"published": false,
|
|
14
|
+
"tags": ["debugging"]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Diagnostics Example
|
|
2
|
+
|
|
3
|
+
## What This Teaches
|
|
4
|
+
|
|
5
|
+
Use this when you want to see how db reports local fixture drift. It intentionally includes schema/data mismatches so the viewer can show source diagnostics while valid resources still work.
|
|
6
|
+
|
|
7
|
+
## Files To Inspect
|
|
8
|
+
|
|
9
|
+
- [db/users.schema.jsonc](./db/users.schema.jsonc): schema-backed collection.
|
|
10
|
+
- [db/users.json](./db/users.json): contains an extra `twitterHandle` field.
|
|
11
|
+
- [db/projects.schema.jsonc](./db/projects.schema.jsonc): contains a nested field mismatch.
|
|
12
|
+
|
|
13
|
+
## Run It
|
|
14
|
+
|
|
15
|
+
From the repository root, use the repo-internal CLI path:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run db -- sync --cwd ./examples/diagnostics
|
|
19
|
+
npm run db -- serve --cwd ./examples/diagnostics
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Open the viewer:
|
|
23
|
+
|
|
24
|
+
```txt
|
|
25
|
+
http://127.0.0.1:7331/__db
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Expected Result
|
|
29
|
+
|
|
30
|
+
`sync` reports warnings. The viewer surfaces diagnostics for the broken source files instead of making unrelated resources unusable.
|
|
31
|
+
|
|
32
|
+
## REST Request To Try
|
|
33
|
+
|
|
34
|
+
Leave `serve` running and run this from another terminal:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
curl http://127.0.0.1:7331/db/users.json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Expected diagnostics include an extra `twitterHandle` field in `users.json` and an undefined nested `metadata.priority` field in `projects.schema.jsonc`.
|
|
41
|
+
|
|
42
|
+
## Features To Notice
|
|
43
|
+
|
|
44
|
+
- [Diagnostics workflow](../../docs/concepts.md#diagnostics)
|
|
45
|
+
- [Schema validation](../../docs/fixtures-and-schemas.md#schema-files)
|
|
46
|
+
- [Fixture-like `.json` REST routes](../../docs/server-and-viewer.md#fixture-like-json-routes)
|
|
47
|
+
|
|
48
|
+
## Cleanup
|
|
49
|
+
|
|
50
|
+
Generated `.db/` output is ignored by git and can be removed whenever you want a fresh mirror.
|
|
51
|
+
|
|
52
|
+
## More Docs
|
|
53
|
+
|
|
54
|
+
- [Concepts](../../docs/concepts.md)
|
|
55
|
+
- [Fixtures And Schemas](../../docs/fixtures-and-schemas.md)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "collection",
|
|
3
|
+
"idField": "id",
|
|
4
|
+
"fields": {
|
|
5
|
+
"id": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"required": true
|
|
8
|
+
},
|
|
9
|
+
"name": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"required": true
|
|
12
|
+
},
|
|
13
|
+
"metadata": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"default": {}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"seed": [
|
|
19
|
+
{
|
|
20
|
+
"id": "proj_1",
|
|
21
|
+
"name": "Diagnostics demo",
|
|
22
|
+
"metadata": {
|
|
23
|
+
"priority": "high"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "collection",
|
|
3
|
+
"idField": "id",
|
|
4
|
+
"fields": {
|
|
5
|
+
"id": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"required": true
|
|
8
|
+
},
|
|
9
|
+
"name": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"required": true
|
|
12
|
+
},
|
|
13
|
+
"email": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"required": true
|
|
16
|
+
},
|
|
17
|
+
"role": {
|
|
18
|
+
"type": "enum",
|
|
19
|
+
"values": ["admin", "user"],
|
|
20
|
+
"default": "user"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { defineConfig } from '@async/db/config';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
dbDir: './db',
|
|
6
|
+
outputs: {
|
|
7
|
+
stateDir: './.db',
|
|
8
|
+
types: './.db/types/index.d.ts',
|
|
9
|
+
},
|
|
10
|
+
types: {
|
|
11
|
+
enabled: true,
|
|
12
|
+
},
|
|
13
|
+
schema: {
|
|
14
|
+
unknownFields: 'warn',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Free Plan Upgrade Example
|
|
2
|
+
|
|
3
|
+
This example shows app code for a free-plan tenant upgrade. `@async/db` only provides forks, branches, snapshots, migration locks, resource migration, and routing. The app decides that moving `projects` from JSON to another store means "upgrade to paid."
|
|
4
|
+
|
|
5
|
+
Run it from the repository root:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run db -- sync --cwd ./examples/free-plan-upgrade
|
|
9
|
+
node ./examples/free-plan-upgrade/src/upgrade-tenant-to-paid.mjs
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The script:
|
|
13
|
+
|
|
14
|
+
- creates a tenant fork from the root JSON data
|
|
15
|
+
- snapshots `projects`
|
|
16
|
+
- locks `projects` as read-only
|
|
17
|
+
- migrates `projects` to a fake paid store
|
|
18
|
+
- verifies count/checksum
|
|
19
|
+
- switches routing
|
|
20
|
+
- keeps the original JSON snapshot as backup data
|
|
21
|
+
|
|
22
|
+
The fake paid store stands in for Postgres so the example stays dependency-light.
|