@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.
Files changed (398) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +431 -0
  3. package/SPEC.md +1429 -0
  4. package/db.config.example.mjs +128 -0
  5. package/dist/cli/args.d.ts +8 -0
  6. package/dist/cli/args.js +16 -0
  7. package/dist/cli/commands/create.d.ts +3 -0
  8. package/dist/cli/commands/create.js +13 -0
  9. package/dist/cli/commands/doctor.d.ts +3 -0
  10. package/dist/cli/commands/doctor.js +31 -0
  11. package/dist/cli/commands/generate.d.ts +6 -0
  12. package/dist/cli/commands/generate.js +24 -0
  13. package/dist/cli/commands/operations.d.ts +12 -0
  14. package/dist/cli/commands/operations.js +61 -0
  15. package/dist/cli/commands/schema.d.ts +11 -0
  16. package/dist/cli/commands/schema.js +1086 -0
  17. package/dist/cli/commands/serve.d.ts +9 -0
  18. package/dist/cli/commands/serve.js +18 -0
  19. package/dist/cli/commands/sync.d.ts +3 -0
  20. package/dist/cli/commands/sync.js +11 -0
  21. package/dist/cli/commands/types.d.ts +7 -0
  22. package/dist/cli/commands/types.js +37 -0
  23. package/dist/cli/commands/viewer.d.ts +6 -0
  24. package/dist/cli/commands/viewer.js +29 -0
  25. package/dist/cli/index.d.ts +2 -0
  26. package/dist/cli/index.js +108 -0
  27. package/dist/cli/output.d.ts +25 -0
  28. package/dist/cli/output.js +149 -0
  29. package/dist/cli/schema-prompt.d.ts +20 -0
  30. package/dist/cli/schema-prompt.js +66 -0
  31. package/dist/cli.d.ts +2 -0
  32. package/dist/cli.js +3 -0
  33. package/dist/client-cache.d.ts +105 -0
  34. package/dist/client-cache.js +916 -0
  35. package/dist/client.d.ts +64 -0
  36. package/dist/client.js +405 -0
  37. package/dist/config-public.d.ts +1 -0
  38. package/dist/config-public.js +1 -0
  39. package/dist/config.d.ts +54 -0
  40. package/dist/config.js +2 -0
  41. package/dist/csv.d.ts +1 -0
  42. package/dist/csv.js +1 -0
  43. package/dist/db.d.ts +3 -0
  44. package/dist/db.js +3 -0
  45. package/dist/doctor.d.ts +1 -0
  46. package/dist/doctor.js +1 -0
  47. package/dist/errors.d.ts +1 -0
  48. package/dist/errors.js +1 -0
  49. package/dist/features/config/defaults.d.ts +98 -0
  50. package/dist/features/config/defaults.js +95 -0
  51. package/dist/features/config/load.d.ts +11 -0
  52. package/dist/features/config/load.js +265 -0
  53. package/dist/features/config/public.d.ts +17 -0
  54. package/dist/features/config/public.js +75 -0
  55. package/dist/features/doctor/duplicate-ids.d.ts +18 -0
  56. package/dist/features/doctor/duplicate-ids.js +79 -0
  57. package/dist/features/doctor/field-consistency.d.ts +17 -0
  58. package/dist/features/doctor/field-consistency.js +48 -0
  59. package/dist/features/doctor/index.d.ts +39 -0
  60. package/dist/features/doctor/index.js +177 -0
  61. package/dist/features/doctor/relations.d.ts +22 -0
  62. package/dist/features/doctor/relations.js +90 -0
  63. package/dist/features/doctor/schema-guidance.d.ts +35 -0
  64. package/dist/features/doctor/schema-guidance.js +184 -0
  65. package/dist/features/generate/registry.d.ts +14 -0
  66. package/dist/features/generate/registry.js +37 -0
  67. package/dist/features/http/registry.d.ts +46 -0
  68. package/dist/features/http/registry.js +86 -0
  69. package/dist/features/operations/index.d.ts +49 -0
  70. package/dist/features/operations/index.js +199 -0
  71. package/dist/features/operations/maps.d.ts +1 -0
  72. package/dist/features/operations/maps.js +10 -0
  73. package/dist/features/operations/readiness.d.ts +30 -0
  74. package/dist/features/operations/readiness.js +228 -0
  75. package/dist/features/operations/runtime.d.ts +57 -0
  76. package/dist/features/operations/runtime.js +288 -0
  77. package/dist/features/runtime/collection.d.ts +51 -0
  78. package/dist/features/runtime/collection.js +198 -0
  79. package/dist/features/runtime/db.d.ts +152 -0
  80. package/dist/features/runtime/db.js +824 -0
  81. package/dist/features/runtime/document.d.ts +43 -0
  82. package/dist/features/runtime/document.js +111 -0
  83. package/dist/features/runtime/fanout.d.ts +24 -0
  84. package/dist/features/runtime/fanout.js +77 -0
  85. package/dist/features/runtime/json-pointer.d.ts +5 -0
  86. package/dist/features/runtime/json-pointer.js +49 -0
  87. package/dist/features/runtime/scope-state.d.ts +44 -0
  88. package/dist/features/runtime/scope-state.js +185 -0
  89. package/dist/features/runtime/state.d.ts +1 -0
  90. package/dist/features/runtime/state.js +1 -0
  91. package/dist/features/schema/api.d.ts +107 -0
  92. package/dist/features/schema/api.js +460 -0
  93. package/dist/features/schema/builders.d.ts +86 -0
  94. package/dist/features/schema/builders.js +110 -0
  95. package/dist/features/schema/fields.d.ts +38 -0
  96. package/dist/features/schema/fields.js +296 -0
  97. package/dist/features/schema/generated.d.ts +29 -0
  98. package/dist/features/schema/generated.js +32 -0
  99. package/dist/features/schema/locator.d.ts +16 -0
  100. package/dist/features/schema/locator.js +135 -0
  101. package/dist/features/schema/manifest.d.ts +91 -0
  102. package/dist/features/schema/manifest.js +384 -0
  103. package/dist/features/schema/metadata.d.ts +30 -0
  104. package/dist/features/schema/metadata.js +75 -0
  105. package/dist/features/schema/project.d.ts +46 -0
  106. package/dist/features/schema/project.js +442 -0
  107. package/dist/features/schema/relations.d.ts +38 -0
  108. package/dist/features/schema/relations.js +109 -0
  109. package/dist/features/schema/resolvers.d.ts +36 -0
  110. package/dist/features/schema/resolvers.js +111 -0
  111. package/dist/features/schema/resource.d.ts +75 -0
  112. package/dist/features/schema/resource.js +253 -0
  113. package/dist/features/schema/source-definitions.d.ts +21 -0
  114. package/dist/features/schema/source-definitions.js +29 -0
  115. package/dist/features/schema/sources.d.ts +83 -0
  116. package/dist/features/schema/sources.js +689 -0
  117. package/dist/features/schema/standard-schema.d.ts +57 -0
  118. package/dist/features/schema/standard-schema.js +232 -0
  119. package/dist/features/schema/validation.d.ts +69 -0
  120. package/dist/features/schema/validation.js +434 -0
  121. package/dist/features/storage/events.d.ts +12 -0
  122. package/dist/features/storage/events.js +30 -0
  123. package/dist/features/storage/json.d.ts +112 -0
  124. package/dist/features/storage/json.js +239 -0
  125. package/dist/features/storage/memory.d.ts +30 -0
  126. package/dist/features/storage/memory.js +44 -0
  127. package/dist/features/storage/resource-json.d.ts +31 -0
  128. package/dist/features/storage/resource-json.js +76 -0
  129. package/dist/features/storage/runtime.d.ts +37 -0
  130. package/dist/features/storage/runtime.js +184 -0
  131. package/dist/features/storage/source-metadata.d.ts +20 -0
  132. package/dist/features/storage/source-metadata.js +25 -0
  133. package/dist/features/storage/source.d.ts +37 -0
  134. package/dist/features/storage/source.js +60 -0
  135. package/dist/features/storage/static.d.ts +29 -0
  136. package/dist/features/storage/static.js +42 -0
  137. package/dist/features/sync/defaults.d.ts +21 -0
  138. package/dist/features/sync/defaults.js +21 -0
  139. package/dist/features/sync/index.d.ts +35 -0
  140. package/dist/features/sync/index.js +85 -0
  141. package/dist/features/sync/mirror-state.d.ts +14 -0
  142. package/dist/features/sync/mirror-state.js +4 -0
  143. package/dist/features/sync/runtime-dirs.d.ts +5 -0
  144. package/dist/features/sync/runtime-dirs.js +9 -0
  145. package/dist/features/sync/source-writes.d.ts +15 -0
  146. package/dist/features/sync/source-writes.js +27 -0
  147. package/dist/features/sync/synthetic-seed.d.ts +26 -0
  148. package/dist/features/sync/synthetic-seed.js +83 -0
  149. package/dist/features/viewer/manifest.d.ts +148 -0
  150. package/dist/features/viewer/manifest.js +165 -0
  151. package/dist/fs-utils.d.ts +1 -0
  152. package/dist/fs-utils.js +1 -0
  153. package/dist/generate/hono/app.d.ts +6 -0
  154. package/dist/generate/hono/app.js +51 -0
  155. package/dist/generate/hono/graphql.d.ts +7 -0
  156. package/dist/generate/hono/graphql.js +53 -0
  157. package/dist/generate/hono/index.d.ts +55 -0
  158. package/dist/generate/hono/index.js +140 -0
  159. package/dist/generate/hono/package.d.ts +6 -0
  160. package/dist/generate/hono/package.js +44 -0
  161. package/dist/generate/hono/readme.d.ts +13 -0
  162. package/dist/generate/hono/readme.js +28 -0
  163. package/dist/generate/hono/repository.d.ts +1 -0
  164. package/dist/generate/hono/repository.js +27 -0
  165. package/dist/generate/hono/rest.d.ts +1 -0
  166. package/dist/generate/hono/rest.js +38 -0
  167. package/dist/generate/hono/schema.d.ts +13 -0
  168. package/dist/generate/hono/schema.js +18 -0
  169. package/dist/generate/hono/sqlite.d.ts +20 -0
  170. package/dist/generate/hono/sqlite.js +266 -0
  171. package/dist/generate/hono/validators.d.ts +1 -0
  172. package/dist/generate/hono/validators.js +141 -0
  173. package/dist/generate/hono.d.ts +1 -0
  174. package/dist/generate/hono.js +1 -0
  175. package/dist/graphql/execute.d.ts +14 -0
  176. package/dist/graphql/execute.js +719 -0
  177. package/dist/graphql/http.d.ts +15 -0
  178. package/dist/graphql/http.js +29 -0
  179. package/dist/graphql/index.d.ts +3 -0
  180. package/dist/graphql/index.js +3 -0
  181. package/dist/graphql/parser.d.ts +54 -0
  182. package/dist/graphql/parser.js +433 -0
  183. package/dist/hono.d.ts +77 -0
  184. package/dist/hono.js +1 -0
  185. package/dist/index.d.ts +1065 -0
  186. package/dist/index.js +14 -0
  187. package/dist/integrations/hono.d.ts +136 -0
  188. package/dist/integrations/hono.js +508 -0
  189. package/dist/integrations/kv.d.ts +69 -0
  190. package/dist/integrations/kv.js +69 -0
  191. package/dist/integrations/postgres.d.ts +52 -0
  192. package/dist/integrations/postgres.js +113 -0
  193. package/dist/integrations/sqlite.d.ts +112 -0
  194. package/dist/integrations/sqlite.js +489 -0
  195. package/dist/integrations/vite.d.ts +45 -0
  196. package/dist/integrations/vite.js +111 -0
  197. package/dist/json.d.ts +48 -0
  198. package/dist/json.js +1 -0
  199. package/dist/jsonc.d.ts +1 -0
  200. package/dist/jsonc.js +1 -0
  201. package/dist/kv.d.ts +24 -0
  202. package/dist/kv.js +1 -0
  203. package/dist/mock.d.ts +1 -0
  204. package/dist/mock.js +1 -0
  205. package/dist/names.d.ts +1 -0
  206. package/dist/names.js +1 -0
  207. package/dist/operations.d.ts +3 -0
  208. package/dist/operations.js +3 -0
  209. package/dist/postgres.d.ts +24 -0
  210. package/dist/postgres.js +1 -0
  211. package/dist/redis.d.ts +14 -0
  212. package/dist/redis.js +1 -0
  213. package/dist/rest/formats.d.ts +80 -0
  214. package/dist/rest/formats.js +318 -0
  215. package/dist/rest/handler.d.ts +111 -0
  216. package/dist/rest/handler.js +833 -0
  217. package/dist/rest/shape.d.ts +33 -0
  218. package/dist/rest/shape.js +218 -0
  219. package/dist/schema-builders.d.ts +1 -0
  220. package/dist/schema-builders.js +1 -0
  221. package/dist/schema-manifest.d.ts +1 -0
  222. package/dist/schema-manifest.js +1 -0
  223. package/dist/schema.d.ts +193 -0
  224. package/dist/schema.js +6 -0
  225. package/dist/server.d.ts +116 -0
  226. package/dist/server.js +601 -0
  227. package/dist/shared/csv.d.ts +8 -0
  228. package/dist/shared/csv.js +149 -0
  229. package/dist/shared/errors.d.ts +40 -0
  230. package/dist/shared/errors.js +55 -0
  231. package/dist/shared/fs-utils.d.ts +4 -0
  232. package/dist/shared/fs-utils.js +30 -0
  233. package/dist/shared/jsonc.d.ts +2 -0
  234. package/dist/shared/jsonc.js +99 -0
  235. package/dist/shared/mock.d.ts +40 -0
  236. package/dist/shared/mock.js +83 -0
  237. package/dist/shared/names.d.ts +28 -0
  238. package/dist/shared/names.js +127 -0
  239. package/dist/shared/operations.d.ts +32 -0
  240. package/dist/shared/operations.js +302 -0
  241. package/dist/sqlite.d.ts +24 -0
  242. package/dist/sqlite.js +1 -0
  243. package/dist/state.d.ts +1 -0
  244. package/dist/state.js +1 -0
  245. package/dist/sync.d.ts +1 -0
  246. package/dist/sync.js +1 -0
  247. package/dist/tracing.d.ts +95 -0
  248. package/dist/tracing.js +260 -0
  249. package/dist/types.d.ts +51 -0
  250. package/dist/types.js +285 -0
  251. package/dist/viewer-manifest.d.ts +1 -0
  252. package/dist/viewer-manifest.js +1 -0
  253. package/dist/vite.d.ts +59 -0
  254. package/dist/vite.js +1 -0
  255. package/dist/web/json-viewer.d.ts +5 -0
  256. package/dist/web/json-viewer.js +176 -0
  257. package/dist/web/viewer.d.ts +12 -0
  258. package/dist/web/viewer.js +1015 -0
  259. package/docs/README.md +42 -0
  260. package/docs/architecture.md +112 -0
  261. package/docs/ci-and-release.md +177 -0
  262. package/docs/cms-storage-patterns.md +108 -0
  263. package/docs/concepts.md +141 -0
  264. package/docs/configuration.md +552 -0
  265. package/docs/fixtures-and-schemas.md +527 -0
  266. package/docs/fork-branch-workflows.md +108 -0
  267. package/docs/generated-files.md +174 -0
  268. package/docs/getting-started.md +165 -0
  269. package/docs/integrations.md +206 -0
  270. package/docs/json-production.md +120 -0
  271. package/docs/package-api.md +418 -0
  272. package/docs/prototype-to-production.md +378 -0
  273. package/docs/server-and-viewer.md +466 -0
  274. package/docs/store-graduation.md +120 -0
  275. package/docs/typescript-schema-sources.md +79 -0
  276. package/examples/advanced/README.md +55 -0
  277. package/examples/advanced/db/projects.schema.jsonc +44 -0
  278. package/examples/advanced/db/settings.jsonc +9 -0
  279. package/examples/advanced/db/users.json +23 -0
  280. package/examples/advanced/db/users.schema.mjs +31 -0
  281. package/examples/advanced/db.config.mjs +18 -0
  282. package/examples/advanced/example.json +5 -0
  283. package/examples/advanced/src/generated/db.types.d.ts +64 -0
  284. package/examples/basic/README.md +95 -0
  285. package/examples/basic/db/operations/get-user.jsonc +8 -0
  286. package/examples/basic/db/settings.json +7 -0
  287. package/examples/basic/db/users.schema.jsonc +36 -0
  288. package/examples/basic/db.config.mjs +68 -0
  289. package/examples/basic/example.json +5 -0
  290. package/examples/basic/src/generated/db.types.d.ts +39 -0
  291. package/examples/cms-json-publish/README.md +21 -0
  292. package/examples/cms-json-publish/db/navigation.json +7 -0
  293. package/examples/cms-json-publish/db/pages.json +18 -0
  294. package/examples/cms-json-publish/example.json +5 -0
  295. package/examples/cms-json-publish/src/cms.mjs +104 -0
  296. package/examples/computed-fields/README.md +93 -0
  297. package/examples/computed-fields/db/orders.schema.mjs +62 -0
  298. package/examples/computed-fields/db/posts.schema.mjs +59 -0
  299. package/examples/computed-fields/db/products.schema.mjs +39 -0
  300. package/examples/computed-fields/db/users.schema.mjs +43 -0
  301. package/examples/computed-fields/db.config.mjs +15 -0
  302. package/examples/computed-fields/example.json +5 -0
  303. package/examples/computed-fields/src/generated/db.types.d.ts +81 -0
  304. package/examples/content-collections/README.md +91 -0
  305. package/examples/content-collections/db/authors.json +12 -0
  306. package/examples/content-collections/db/authors.schema.mjs +20 -0
  307. package/examples/content-collections/db/blog/draft-roadmap.mdx +12 -0
  308. package/examples/content-collections/db/blog/index.schema.mjs +61 -0
  309. package/examples/content-collections/db/blog/launch-notes.mdx +15 -0
  310. package/examples/content-collections/db/docs/index.schema.mjs +32 -0
  311. package/examples/content-collections/db/docs/intro.mdx +11 -0
  312. package/examples/content-collections/db/docs/schema-workflow.mdx +10 -0
  313. package/examples/content-collections/db/site.schema.jsonc +21 -0
  314. package/examples/content-collections/db.config.mjs +26 -0
  315. package/examples/content-collections/example.json +5 -0
  316. package/examples/content-collections/src/content-preview.mjs +66 -0
  317. package/examples/content-collections/src/generated/db.types.d.ts +81 -0
  318. package/examples/csv/README.md +52 -0
  319. package/examples/csv/db/customers.csv +4 -0
  320. package/examples/csv/db.config.mjs +13 -0
  321. package/examples/csv/example.json +5 -0
  322. package/examples/data-first/README.md +54 -0
  323. package/examples/data-first/db/posts.json +16 -0
  324. package/examples/data-first/db/settings.json +8 -0
  325. package/examples/data-first/db/users.json +14 -0
  326. package/examples/data-first/db.config.mjs +13 -0
  327. package/examples/data-first/example.json +5 -0
  328. package/examples/diagnostics/README.md +55 -0
  329. package/examples/diagnostics/db/projects.schema.jsonc +27 -0
  330. package/examples/diagnostics/db/users.json +9 -0
  331. package/examples/diagnostics/db/users.schema.jsonc +23 -0
  332. package/examples/diagnostics/db.config.mjs +16 -0
  333. package/examples/diagnostics/example.json +5 -0
  334. package/examples/free-plan-upgrade/README.md +22 -0
  335. package/examples/free-plan-upgrade/db/appSettings.json +4 -0
  336. package/examples/free-plan-upgrade/db/projects.json +7 -0
  337. package/examples/free-plan-upgrade/example.json +5 -0
  338. package/examples/free-plan-upgrade/src/upgrade-tenant-to-paid.mjs +105 -0
  339. package/examples/hono-auth/README.md +74 -0
  340. package/examples/hono-auth/db/pages.schema.jsonc +44 -0
  341. package/examples/hono-auth/db/users.schema.jsonc +42 -0
  342. package/examples/hono-auth/db.config.mjs +17 -0
  343. package/examples/hono-auth/example.json +5 -0
  344. package/examples/hono-auth/package.json +14 -0
  345. package/examples/hono-auth/src/app.mjs +79 -0
  346. package/examples/hono-auth/src/server.mjs +13 -0
  347. package/examples/production-json/README.md +102 -0
  348. package/examples/production-json/db/appSettings.schema.jsonc +41 -0
  349. package/examples/production-json/db/featureFlags.schema.jsonc +84 -0
  350. package/examples/production-json/db/operations/get-control-plane.jsonc +6 -0
  351. package/examples/production-json/db/operations/get-feature-flag.jsonc +9 -0
  352. package/examples/production-json/db/operations/list-feature-flags.jsonc +8 -0
  353. package/examples/production-json/db/operations/read-public-settings.jsonc +8 -0
  354. package/examples/production-json/db.config.mjs +33 -0
  355. package/examples/production-json/example.json +5 -0
  356. package/examples/production-json/src/client-demo.mjs +28 -0
  357. package/examples/production-json/src/generated/db.types.d.ts +60 -0
  358. package/examples/relations/README.md +56 -0
  359. package/examples/relations/db/posts.schema.jsonc +46 -0
  360. package/examples/relations/db/users.schema.jsonc +34 -0
  361. package/examples/relations/db.config.mjs +13 -0
  362. package/examples/relations/example.json +5 -0
  363. package/examples/rest-client/README.md +54 -0
  364. package/examples/rest-client/db/settings.json +5 -0
  365. package/examples/rest-client/db/users.schema.jsonc +42 -0
  366. package/examples/rest-client/db.config.mjs +13 -0
  367. package/examples/rest-client/example.json +5 -0
  368. package/examples/rest-client/src/client-demo.mjs +24 -0
  369. package/examples/schema-first/README.md +55 -0
  370. package/examples/schema-first/db/auditEvents.schema.jsonc +24 -0
  371. package/examples/schema-first/db/settings.schema.jsonc +29 -0
  372. package/examples/schema-first/db/users.schema.jsonc +36 -0
  373. package/examples/schema-first/db.config.mjs +15 -0
  374. package/examples/schema-first/example.json +5 -0
  375. package/examples/schema-first/src/generated/db.types.d.ts +47 -0
  376. package/examples/schema-manifest/README.md +50 -0
  377. package/examples/schema-manifest/db/projects.schema.jsonc +48 -0
  378. package/examples/schema-manifest/db/users.schema.jsonc +35 -0
  379. package/examples/schema-manifest/db.config.mjs +41 -0
  380. package/examples/schema-manifest/example.json +5 -0
  381. package/examples/schema-manifest/src/generated/db.schema.json +130 -0
  382. package/examples/schema-manifest/src/generated/db.types.d.ts +50 -0
  383. package/examples/schema-ui/README.md +103 -0
  384. package/examples/schema-ui/db/pages.schema.jsonc +53 -0
  385. package/examples/schema-ui/db/users.schema.jsonc +30 -0
  386. package/examples/schema-ui/db.config.mjs +55 -0
  387. package/examples/schema-ui/example.json +5 -0
  388. package/examples/schema-ui/src/cms-ssr.mjs +276 -0
  389. package/examples/schema-ui/src/generated/db.schema.json +133 -0
  390. package/examples/schema-ui/src/generated/db.types.d.ts +46 -0
  391. package/examples/schema-ui/src/render-admin.mjs +175 -0
  392. package/examples/schema-ui/src/schema-ui-ssr-handler.mjs +149 -0
  393. package/examples/schema-ui/src/start-schema-ui-server.mjs +140 -0
  394. package/examples/standard-schema/README.md +55 -0
  395. package/examples/standard-schema/db/settings.schema.mjs +22 -0
  396. package/examples/standard-schema/db/users.schema.mjs +72 -0
  397. package/examples/standard-schema/example.json +5 -0
  398. 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,5 @@
1
+ {
2
+ "title": "Content Collections",
3
+ "description": "Dependency-free docs and blog folders with frontmatter, raw MDX bodies, static stores, computed fields, and aggregate schema bundling.",
4
+ "tags": ["content", "mdx", "schema-mjs"]
5
+ }
@@ -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('&', '&amp;')
63
+ .replaceAll('<', '&lt;')
64
+ .replaceAll('>', '&gt;')
65
+ .replaceAll('"', '&quot;');
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,4 @@
1
+ Customer ID,Name,Email,Plan,Active,Signup Score,Postal Code
2
+ c_1,Ada Lovelace,ada@example.com,team,true,98,02139
3
+ c_2,Grace Hopper,grace@example.com,enterprise,true,95,10001
4
+ c_3,Katherine Johnson,katherine@example.com,starter,false,88,23666
@@ -0,0 +1,13 @@
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
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "title": "CSV Fixtures",
3
+ "description": "CSV source loading with inferred fields, source hashes, and runtime JSON store refreshes.",
4
+ "tags": ["csv", "inference", "sync"]
5
+ }
@@ -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,8 @@
1
+ {
2
+ "theme": "light",
3
+ "locale": "en-US",
4
+ "features": {
5
+ "billing": false,
6
+ "graphql": true
7
+ }
8
+ }
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "id": "u_1",
4
+ "name": "Ada Lovelace",
5
+ "email": "ada@example.com",
6
+ "role": "admin"
7
+ },
8
+ {
9
+ "id": "u_2",
10
+ "name": "Grace Hopper",
11
+ "email": "grace@example.com",
12
+ "role": "user"
13
+ }
14
+ ]
@@ -0,0 +1,13 @@
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
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "title": "Data First",
3
+ "description": "Plain JSON fixtures with inferred schema, generated types, REST routes, and a writable mirror.",
4
+ "tags": ["data-first", "inference", "rest"]
5
+ }
@@ -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,9 @@
1
+ [
2
+ {
3
+ "id": "u_1",
4
+ "name": "Ada Lovelace",
5
+ "email": "ada@example.com",
6
+ "role": "admin",
7
+ "twitterHandle": "@ada"
8
+ }
9
+ ]
@@ -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,5 @@
1
+ {
2
+ "title": "Diagnostics",
3
+ "description": "Intentional schema and source warnings so the viewer can show file-specific diagnostics while valid resources keep working.",
4
+ "tags": ["diagnostics", "viewer", "warnings"]
5
+ }
@@ -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.
@@ -0,0 +1,4 @@
1
+ {
2
+ "appName": "Upgrade Demo",
3
+ "plan": "free"
4
+ }
@@ -0,0 +1,7 @@
1
+ [
2
+ {
3
+ "id": "p_1",
4
+ "name": "Launch checklist",
5
+ "status": "active"
6
+ }
7
+ ]
@@ -0,0 +1,5 @@
1
+ {
2
+ "title": "Free Plan Upgrade",
3
+ "description": "App-owned upgrade flow that moves one tenant resource from JSON to another store.",
4
+ "tags": ["forks", "migration", "json", "postgres"]
5
+ }