@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,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.