@plures/praxis 0.2.1 → 1.0.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 (486) hide show
  1. package/README.md +188 -61
  2. package/core/codegen/docs-generator.ts +808 -0
  3. package/core/codegen/index.ts +27 -0
  4. package/core/codegen/ts-generator.ts +15 -0
  5. package/core/db-adapter/index.ts +52 -0
  6. package/core/db-adapter/sync-engine.ts +450 -0
  7. package/core/logic-engine/engine.ts +12 -0
  8. package/core/logic-engine/index.ts +16 -0
  9. package/core/logic-engine/protocol.ts +16 -0
  10. package/core/logic-engine/psf-adapter.ts +269 -0
  11. package/core/logic-engine/rules.ts +16 -0
  12. package/core/schema-engine/compiler.ts +431 -0
  13. package/core/schema-engine/generator.ts +635 -0
  14. package/core/schema-engine/index.ts +18 -0
  15. package/core/schema-engine/psf.ts +664 -0
  16. package/core/schema-engine/types.ts +63 -0
  17. package/core/schema-engine/validator.ts +541 -0
  18. package/dist/core/codegen/docs-generator.d.ts +123 -0
  19. package/dist/core/codegen/docs-generator.d.ts.map +1 -0
  20. package/dist/core/codegen/docs-generator.js +674 -0
  21. package/dist/core/codegen/docs-generator.js.map +1 -0
  22. package/dist/core/codegen/index.d.ts +11 -0
  23. package/dist/core/codegen/index.d.ts.map +1 -0
  24. package/dist/core/codegen/index.js +13 -0
  25. package/dist/core/codegen/index.js.map +1 -0
  26. package/dist/core/codegen/ts-generator.d.ts +8 -0
  27. package/dist/core/codegen/ts-generator.d.ts.map +1 -0
  28. package/dist/core/codegen/ts-generator.js +8 -0
  29. package/dist/core/codegen/ts-generator.js.map +1 -0
  30. package/dist/core/db-adapter/index.d.ts +18 -0
  31. package/dist/core/db-adapter/index.d.ts.map +1 -0
  32. package/dist/core/db-adapter/index.js +23 -0
  33. package/dist/core/db-adapter/index.js.map +1 -0
  34. package/dist/core/db-adapter/sync-engine.d.ts +180 -0
  35. package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
  36. package/dist/core/db-adapter/sync-engine.js +342 -0
  37. package/dist/core/db-adapter/sync-engine.js.map +1 -0
  38. package/dist/core/logic-engine/engine.d.ts +8 -0
  39. package/dist/core/logic-engine/engine.d.ts.map +1 -0
  40. package/dist/core/logic-engine/engine.js +8 -0
  41. package/dist/core/logic-engine/engine.js.map +1 -0
  42. package/dist/core/logic-engine/index.d.ts +16 -0
  43. package/dist/core/logic-engine/index.d.ts.map +1 -0
  44. package/dist/core/logic-engine/index.js +16 -0
  45. package/dist/core/logic-engine/index.js.map +1 -0
  46. package/dist/core/logic-engine/protocol.d.ts +7 -0
  47. package/dist/core/logic-engine/protocol.d.ts.map +1 -0
  48. package/dist/core/logic-engine/protocol.js +7 -0
  49. package/dist/core/logic-engine/protocol.js.map +1 -0
  50. package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
  51. package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
  52. package/dist/core/logic-engine/psf-adapter.js +207 -0
  53. package/dist/core/logic-engine/psf-adapter.js.map +1 -0
  54. package/dist/core/logic-engine/rules.d.ts +7 -0
  55. package/dist/core/logic-engine/rules.d.ts.map +1 -0
  56. package/dist/core/logic-engine/rules.js +7 -0
  57. package/dist/core/logic-engine/rules.js.map +1 -0
  58. package/dist/core/schema-engine/compiler.d.ts +198 -0
  59. package/dist/core/schema-engine/compiler.d.ts.map +1 -0
  60. package/dist/core/schema-engine/compiler.js +262 -0
  61. package/dist/core/schema-engine/compiler.js.map +1 -0
  62. package/dist/core/schema-engine/generator.d.ts +115 -0
  63. package/dist/core/schema-engine/generator.d.ts.map +1 -0
  64. package/dist/core/schema-engine/generator.js +506 -0
  65. package/dist/core/schema-engine/generator.js.map +1 -0
  66. package/dist/core/schema-engine/index.d.ts +18 -0
  67. package/dist/core/schema-engine/index.d.ts.map +1 -0
  68. package/dist/core/schema-engine/index.js +18 -0
  69. package/dist/core/schema-engine/index.js.map +1 -0
  70. package/dist/core/schema-engine/psf.d.ts +612 -0
  71. package/dist/core/schema-engine/psf.d.ts.map +1 -0
  72. package/dist/core/schema-engine/psf.js +45 -0
  73. package/dist/core/schema-engine/psf.js.map +1 -0
  74. package/dist/core/schema-engine/types.d.ts +10 -0
  75. package/dist/core/schema-engine/types.d.ts.map +1 -0
  76. package/dist/core/schema-engine/types.js +7 -0
  77. package/dist/core/schema-engine/types.js.map +1 -0
  78. package/dist/core/schema-engine/validator.d.ts +140 -0
  79. package/dist/core/schema-engine/validator.d.ts.map +1 -0
  80. package/dist/core/schema-engine/validator.js +407 -0
  81. package/dist/core/schema-engine/validator.js.map +1 -0
  82. package/dist/src/adapters/cli.d.ts.map +1 -0
  83. package/dist/src/adapters/cli.js.map +1 -0
  84. package/dist/src/cli/commands/auth.d.ts.map +1 -0
  85. package/dist/src/cli/commands/auth.js.map +1 -0
  86. package/dist/src/cli/commands/build.d.ts +23 -0
  87. package/dist/src/cli/commands/build.d.ts.map +1 -0
  88. package/dist/src/cli/commands/build.js +162 -0
  89. package/dist/src/cli/commands/build.js.map +1 -0
  90. package/dist/src/cli/commands/canvas.d.ts +23 -0
  91. package/dist/src/cli/commands/canvas.d.ts.map +1 -0
  92. package/dist/src/cli/commands/canvas.js +215 -0
  93. package/dist/src/cli/commands/canvas.js.map +1 -0
  94. package/dist/src/cli/commands/cloud.d.ts.map +1 -0
  95. package/dist/src/cli/commands/cloud.js.map +1 -0
  96. package/dist/src/cli/commands/create.d.ts +21 -0
  97. package/dist/src/cli/commands/create.d.ts.map +1 -0
  98. package/dist/src/cli/commands/create.js +621 -0
  99. package/dist/src/cli/commands/create.js.map +1 -0
  100. package/dist/src/cli/commands/dev.d.ts +21 -0
  101. package/dist/src/cli/commands/dev.d.ts.map +1 -0
  102. package/dist/src/cli/commands/dev.js +71 -0
  103. package/dist/src/cli/commands/dev.js.map +1 -0
  104. package/dist/src/cli/commands/generate.d.ts.map +1 -0
  105. package/dist/src/cli/commands/generate.js.map +1 -0
  106. package/dist/src/cli/commands/orchestrate.d.ts +44 -0
  107. package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
  108. package/dist/src/cli/commands/orchestrate.js +150 -0
  109. package/dist/src/cli/commands/orchestrate.js.map +1 -0
  110. package/dist/{cli → src/cli}/index.d.ts.map +1 -1
  111. package/dist/{cli → src/cli}/index.js +53 -21
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cloud/auth.d.ts.map +1 -0
  114. package/dist/src/cloud/auth.js.map +1 -0
  115. package/dist/src/cloud/billing.d.ts.map +1 -0
  116. package/dist/src/cloud/billing.js.map +1 -0
  117. package/dist/src/cloud/client.d.ts.map +1 -0
  118. package/dist/src/cloud/client.js.map +1 -0
  119. package/dist/src/cloud/index.d.ts.map +1 -0
  120. package/dist/src/cloud/index.js.map +1 -0
  121. package/dist/src/cloud/marketplace.d.ts.map +1 -0
  122. package/dist/src/cloud/marketplace.js.map +1 -0
  123. package/dist/src/cloud/provisioning.d.ts.map +1 -0
  124. package/dist/src/cloud/provisioning.js.map +1 -0
  125. package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
  126. package/dist/src/cloud/relay/endpoints.js.map +1 -0
  127. package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
  128. package/dist/src/cloud/relay/health/index.js.map +1 -0
  129. package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
  130. package/dist/src/cloud/relay/stats/index.js.map +1 -0
  131. package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
  132. package/dist/src/cloud/relay/sync/index.js.map +1 -0
  133. package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
  134. package/dist/src/cloud/relay/usage/index.js.map +1 -0
  135. package/dist/src/cloud/sponsors.d.ts.map +1 -0
  136. package/dist/src/cloud/sponsors.js.map +1 -0
  137. package/dist/src/cloud/types.d.ts.map +1 -0
  138. package/dist/src/cloud/types.js.map +1 -0
  139. package/dist/src/components/index.d.ts.map +1 -0
  140. package/dist/src/components/index.js.map +1 -0
  141. package/dist/src/core/actors.d.ts.map +1 -0
  142. package/dist/src/core/actors.js.map +1 -0
  143. package/dist/src/core/component/generator.d.ts.map +1 -0
  144. package/dist/{core → src/core}/component/generator.js +45 -3
  145. package/dist/src/core/component/generator.js.map +1 -0
  146. package/dist/src/core/engine.d.ts.map +1 -0
  147. package/dist/src/core/engine.js.map +1 -0
  148. package/dist/src/core/introspection.d.ts.map +1 -0
  149. package/dist/src/core/introspection.js.map +1 -0
  150. package/dist/src/core/logic/generator.d.ts.map +1 -0
  151. package/dist/{core → src/core}/logic/generator.js +35 -4
  152. package/dist/src/core/logic/generator.js.map +1 -0
  153. package/dist/src/core/pluresdb/adapter.d.ts +72 -0
  154. package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
  155. package/dist/src/core/pluresdb/adapter.js +73 -0
  156. package/dist/src/core/pluresdb/adapter.js.map +1 -0
  157. package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
  158. package/dist/{core → src/core}/pluresdb/generator.js +33 -4
  159. package/dist/src/core/pluresdb/generator.js.map +1 -0
  160. package/dist/src/core/pluresdb/index.d.ts +15 -0
  161. package/dist/src/core/pluresdb/index.d.ts.map +1 -0
  162. package/dist/src/core/pluresdb/index.js +11 -0
  163. package/dist/src/core/pluresdb/index.js.map +1 -0
  164. package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
  165. package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
  166. package/dist/src/core/pluresdb/schema-registry.js +130 -0
  167. package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
  168. package/dist/src/core/pluresdb/store.d.ts +199 -0
  169. package/dist/src/core/pluresdb/store.d.ts.map +1 -0
  170. package/dist/src/core/pluresdb/store.js +344 -0
  171. package/dist/src/core/pluresdb/store.js.map +1 -0
  172. package/dist/src/core/protocol.d.ts.map +1 -0
  173. package/dist/src/core/protocol.js.map +1 -0
  174. package/dist/src/core/rules.d.ts.map +1 -0
  175. package/dist/src/core/rules.js.map +1 -0
  176. package/dist/src/core/schema/loader.d.ts.map +1 -0
  177. package/dist/src/core/schema/loader.js.map +1 -0
  178. package/dist/src/core/schema/normalize.d.ts.map +1 -0
  179. package/dist/src/core/schema/normalize.js.map +1 -0
  180. package/dist/src/core/schema/types.d.ts.map +1 -0
  181. package/dist/src/core/schema/types.js.map +1 -0
  182. package/dist/src/dsl/index.d.ts.map +1 -0
  183. package/dist/src/dsl/index.js.map +1 -0
  184. package/dist/src/dsl.d.ts.map +1 -0
  185. package/dist/src/dsl.js.map +1 -0
  186. package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
  187. package/dist/src/examples/advanced-todo/index.js.map +1 -0
  188. package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
  189. package/dist/src/examples/auth-basic/index.js.map +1 -0
  190. package/dist/src/examples/cart/index.d.ts.map +1 -0
  191. package/dist/src/examples/cart/index.js.map +1 -0
  192. package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
  193. package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
  194. package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
  195. package/dist/src/examples/svelte-counter/index.js.map +1 -0
  196. package/dist/src/flows.d.ts.map +1 -0
  197. package/dist/src/flows.js.map +1 -0
  198. package/dist/{index.d.ts → src/index.d.ts} +12 -2
  199. package/dist/src/index.d.ts.map +1 -0
  200. package/dist/{index.js → src/index.js} +6 -1
  201. package/dist/src/index.js.map +1 -0
  202. package/dist/src/integrations/code-canvas.d.ts +265 -0
  203. package/dist/src/integrations/code-canvas.d.ts.map +1 -0
  204. package/dist/src/integrations/code-canvas.js +451 -0
  205. package/dist/src/integrations/code-canvas.js.map +1 -0
  206. package/dist/src/integrations/pluresdb.d.ts +117 -0
  207. package/dist/src/integrations/pluresdb.d.ts.map +1 -0
  208. package/dist/src/integrations/pluresdb.js +117 -0
  209. package/dist/src/integrations/pluresdb.js.map +1 -0
  210. package/dist/src/integrations/state-docs.d.ts +191 -0
  211. package/dist/src/integrations/state-docs.d.ts.map +1 -0
  212. package/dist/src/integrations/state-docs.js +515 -0
  213. package/dist/src/integrations/state-docs.js.map +1 -0
  214. package/dist/src/integrations/svelte.d.ts.map +1 -0
  215. package/dist/src/integrations/svelte.js.map +1 -0
  216. package/dist/src/integrations/tauri.d.ts +360 -0
  217. package/dist/src/integrations/tauri.d.ts.map +1 -0
  218. package/dist/src/integrations/tauri.js +278 -0
  219. package/dist/src/integrations/tauri.js.map +1 -0
  220. package/dist/src/integrations/unum.d.ts +159 -0
  221. package/dist/src/integrations/unum.d.ts.map +1 -0
  222. package/dist/src/integrations/unum.js +240 -0
  223. package/dist/src/integrations/unum.js.map +1 -0
  224. package/dist/src/registry.d.ts.map +1 -0
  225. package/dist/src/registry.js.map +1 -0
  226. package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
  227. package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
  228. package/dist/src/runtime/terminal-adapter.js +237 -0
  229. package/dist/src/runtime/terminal-adapter.js.map +1 -0
  230. package/dist/src/step.d.ts.map +1 -0
  231. package/dist/src/step.js.map +1 -0
  232. package/dist/src/types.d.ts.map +1 -0
  233. package/dist/{cloud → src}/types.js.map +1 -1
  234. package/dist/tools/cli/commands/index.d.ts +7 -0
  235. package/dist/tools/cli/commands/index.d.ts.map +1 -0
  236. package/dist/tools/cli/commands/index.js +7 -0
  237. package/dist/tools/cli/commands/index.js.map +1 -0
  238. package/dist/tools/cli/index.d.ts +8 -0
  239. package/dist/tools/cli/index.d.ts.map +1 -0
  240. package/dist/tools/cli/index.js +9 -0
  241. package/dist/tools/cli/index.js.map +1 -0
  242. package/dist/tools/watcher/index.d.ts +105 -0
  243. package/dist/tools/watcher/index.d.ts.map +1 -0
  244. package/dist/tools/watcher/index.js +213 -0
  245. package/dist/tools/watcher/index.js.map +1 -0
  246. package/dist/ui/canvas/canvas-projection.d.ts +78 -0
  247. package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
  248. package/dist/ui/canvas/canvas-projection.js +416 -0
  249. package/dist/ui/canvas/canvas-projection.js.map +1 -0
  250. package/dist/ui/canvas/canvas-state.d.ts +200 -0
  251. package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
  252. package/dist/ui/canvas/canvas-state.js +464 -0
  253. package/dist/ui/canvas/canvas-state.js.map +1 -0
  254. package/dist/ui/canvas/components/index.d.ts +95 -0
  255. package/dist/ui/canvas/components/index.d.ts.map +1 -0
  256. package/dist/ui/canvas/components/index.js +19 -0
  257. package/dist/ui/canvas/components/index.js.map +1 -0
  258. package/dist/ui/canvas/index.d.ts +32 -0
  259. package/dist/ui/canvas/index.d.ts.map +1 -0
  260. package/dist/ui/canvas/index.js +32 -0
  261. package/dist/ui/canvas/index.js.map +1 -0
  262. package/dist/ui/svelte-generator/index.d.ts +9 -0
  263. package/dist/ui/svelte-generator/index.d.ts.map +1 -0
  264. package/dist/ui/svelte-generator/index.js +11 -0
  265. package/dist/ui/svelte-generator/index.js.map +1 -0
  266. package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
  267. package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
  268. package/dist/ui/svelte-generator/psf-generator.js +506 -0
  269. package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
  270. package/docs/README.md +155 -0
  271. package/docs/core/building-extensions.md +553 -0
  272. package/docs/core/cli-usage.md +498 -0
  273. package/docs/core/code-canvas-sync.md +468 -0
  274. package/docs/core/logic-engine.md +566 -0
  275. package/docs/core/pluresdb-integration.md +646 -0
  276. package/docs/core/schema-model.md +414 -0
  277. package/docs/core/ui-generation.md +580 -0
  278. package/docs/core/what-is-praxis.md +240 -0
  279. package/docs/tutorials/README.md +84 -0
  280. package/docs/tutorials/ecommerce-cart.md +631 -0
  281. package/docs/tutorials/first-app.md +529 -0
  282. package/docs/tutorials/form-builder.md +620 -0
  283. package/docs/tutorials/todo-pluresdb.md +589 -0
  284. package/package.json +1 -1
  285. package/src/__tests__/canvas-components.test.ts +450 -0
  286. package/src/__tests__/cli-create.test.ts +178 -0
  287. package/src/__tests__/code-canvas-integration.test.ts +277 -0
  288. package/src/__tests__/docs-generator.test.ts +181 -0
  289. package/src/__tests__/generators.test.ts +3 -2
  290. package/src/__tests__/pluresdb.test.ts +457 -0
  291. package/src/__tests__/psf-schema-engine.test.ts +450 -0
  292. package/src/__tests__/state-docs-integration.test.ts +297 -0
  293. package/src/__tests__/tauri-integration.test.ts +298 -0
  294. package/src/__tests__/terminal-node.test.ts +1 -1
  295. package/src/__tests__/unum-integration.test.ts +142 -0
  296. package/src/cli/commands/build.ts +203 -0
  297. package/src/cli/commands/canvas.ts +246 -0
  298. package/src/cli/commands/create.ts +666 -0
  299. package/src/cli/commands/dev.ts +95 -0
  300. package/src/cli/commands/orchestrate.ts +212 -0
  301. package/src/cli/index.ts +48 -21
  302. package/src/core/component/generator.ts +45 -3
  303. package/src/core/logic/generator.ts +39 -4
  304. package/src/core/pluresdb/adapter.ts +117 -0
  305. package/src/core/pluresdb/generator.ts +33 -4
  306. package/src/core/pluresdb/index.ts +37 -0
  307. package/src/core/pluresdb/schema-registry.ts +162 -0
  308. package/src/core/pluresdb/store.ts +443 -0
  309. package/src/index.ts +109 -0
  310. package/src/integrations/code-canvas.ts +717 -0
  311. package/src/integrations/pluresdb.ts +140 -29
  312. package/src/integrations/state-docs.ts +710 -0
  313. package/src/integrations/tauri.ts +638 -0
  314. package/src/integrations/unum.ts +395 -0
  315. package/src/runtime/terminal-adapter.ts +178 -23
  316. package/dist/adapters/cli.d.ts.map +0 -1
  317. package/dist/adapters/cli.js.map +0 -1
  318. package/dist/cli/commands/auth.d.ts.map +0 -1
  319. package/dist/cli/commands/auth.js.map +0 -1
  320. package/dist/cli/commands/cloud.d.ts.map +0 -1
  321. package/dist/cli/commands/cloud.js.map +0 -1
  322. package/dist/cli/commands/generate.d.ts.map +0 -1
  323. package/dist/cli/commands/generate.js.map +0 -1
  324. package/dist/cli/index.js.map +0 -1
  325. package/dist/cloud/auth.d.ts.map +0 -1
  326. package/dist/cloud/auth.js.map +0 -1
  327. package/dist/cloud/billing.d.ts.map +0 -1
  328. package/dist/cloud/billing.js.map +0 -1
  329. package/dist/cloud/client.d.ts.map +0 -1
  330. package/dist/cloud/client.js.map +0 -1
  331. package/dist/cloud/index.d.ts.map +0 -1
  332. package/dist/cloud/index.js.map +0 -1
  333. package/dist/cloud/marketplace.d.ts.map +0 -1
  334. package/dist/cloud/marketplace.js.map +0 -1
  335. package/dist/cloud/provisioning.d.ts.map +0 -1
  336. package/dist/cloud/provisioning.js.map +0 -1
  337. package/dist/cloud/relay/endpoints.d.ts.map +0 -1
  338. package/dist/cloud/relay/endpoints.js.map +0 -1
  339. package/dist/cloud/relay/health/index.d.ts.map +0 -1
  340. package/dist/cloud/relay/health/index.js.map +0 -1
  341. package/dist/cloud/relay/stats/index.d.ts.map +0 -1
  342. package/dist/cloud/relay/stats/index.js.map +0 -1
  343. package/dist/cloud/relay/sync/index.d.ts.map +0 -1
  344. package/dist/cloud/relay/sync/index.js.map +0 -1
  345. package/dist/cloud/relay/usage/index.d.ts.map +0 -1
  346. package/dist/cloud/relay/usage/index.js.map +0 -1
  347. package/dist/cloud/sponsors.d.ts.map +0 -1
  348. package/dist/cloud/sponsors.js.map +0 -1
  349. package/dist/cloud/types.d.ts.map +0 -1
  350. package/dist/components/index.d.ts.map +0 -1
  351. package/dist/components/index.js.map +0 -1
  352. package/dist/core/actors.d.ts.map +0 -1
  353. package/dist/core/actors.js.map +0 -1
  354. package/dist/core/component/generator.d.ts.map +0 -1
  355. package/dist/core/component/generator.js.map +0 -1
  356. package/dist/core/engine.d.ts.map +0 -1
  357. package/dist/core/engine.js.map +0 -1
  358. package/dist/core/introspection.d.ts.map +0 -1
  359. package/dist/core/introspection.js.map +0 -1
  360. package/dist/core/logic/generator.d.ts.map +0 -1
  361. package/dist/core/logic/generator.js.map +0 -1
  362. package/dist/core/pluresdb/generator.d.ts.map +0 -1
  363. package/dist/core/pluresdb/generator.js.map +0 -1
  364. package/dist/core/protocol.d.ts.map +0 -1
  365. package/dist/core/protocol.js.map +0 -1
  366. package/dist/core/rules.d.ts.map +0 -1
  367. package/dist/core/rules.js.map +0 -1
  368. package/dist/core/schema/loader.d.ts.map +0 -1
  369. package/dist/core/schema/loader.js.map +0 -1
  370. package/dist/core/schema/normalize.d.ts.map +0 -1
  371. package/dist/core/schema/normalize.js.map +0 -1
  372. package/dist/core/schema/types.d.ts.map +0 -1
  373. package/dist/core/schema/types.js.map +0 -1
  374. package/dist/dsl/index.d.ts.map +0 -1
  375. package/dist/dsl/index.js.map +0 -1
  376. package/dist/dsl.d.ts.map +0 -1
  377. package/dist/dsl.js.map +0 -1
  378. package/dist/examples/advanced-todo/index.d.ts.map +0 -1
  379. package/dist/examples/advanced-todo/index.js.map +0 -1
  380. package/dist/examples/auth-basic/index.d.ts.map +0 -1
  381. package/dist/examples/auth-basic/index.js.map +0 -1
  382. package/dist/examples/cart/index.d.ts.map +0 -1
  383. package/dist/examples/cart/index.js.map +0 -1
  384. package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
  385. package/dist/examples/hero-ecommerce/index.js.map +0 -1
  386. package/dist/examples/svelte-counter/index.d.ts.map +0 -1
  387. package/dist/examples/svelte-counter/index.js.map +0 -1
  388. package/dist/flows.d.ts.map +0 -1
  389. package/dist/flows.js.map +0 -1
  390. package/dist/index.d.ts.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/integrations/pluresdb.d.ts +0 -56
  393. package/dist/integrations/pluresdb.d.ts.map +0 -1
  394. package/dist/integrations/pluresdb.js +0 -46
  395. package/dist/integrations/pluresdb.js.map +0 -1
  396. package/dist/integrations/svelte.d.ts.map +0 -1
  397. package/dist/integrations/svelte.js.map +0 -1
  398. package/dist/registry.d.ts.map +0 -1
  399. package/dist/registry.js.map +0 -1
  400. package/dist/runtime/terminal-adapter.d.ts.map +0 -1
  401. package/dist/runtime/terminal-adapter.js +0 -113
  402. package/dist/runtime/terminal-adapter.js.map +0 -1
  403. package/dist/step.d.ts.map +0 -1
  404. package/dist/step.js.map +0 -1
  405. package/dist/types.d.ts.map +0 -1
  406. package/dist/types.js.map +0 -1
  407. /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
  408. /package/dist/{adapters → src/adapters}/cli.js +0 -0
  409. /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
  410. /package/dist/{cli → src/cli}/commands/auth.js +0 -0
  411. /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
  412. /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
  413. /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
  414. /package/dist/{cli → src/cli}/commands/generate.js +0 -0
  415. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  416. /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
  417. /package/dist/{cloud → src/cloud}/auth.js +0 -0
  418. /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
  419. /package/dist/{cloud → src/cloud}/billing.js +0 -0
  420. /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
  421. /package/dist/{cloud → src/cloud}/client.js +0 -0
  422. /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
  423. /package/dist/{cloud → src/cloud}/index.js +0 -0
  424. /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
  425. /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
  426. /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
  427. /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
  428. /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
  429. /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
  430. /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
  431. /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
  432. /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
  433. /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
  434. /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
  435. /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
  436. /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
  437. /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
  438. /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
  439. /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
  440. /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
  441. /package/dist/{cloud → src/cloud}/types.js +0 -0
  442. /package/dist/{components → src/components}/index.d.ts +0 -0
  443. /package/dist/{components → src/components}/index.js +0 -0
  444. /package/dist/{core → src/core}/actors.d.ts +0 -0
  445. /package/dist/{core → src/core}/actors.js +0 -0
  446. /package/dist/{core → src/core}/component/generator.d.ts +0 -0
  447. /package/dist/{core → src/core}/engine.d.ts +0 -0
  448. /package/dist/{core → src/core}/engine.js +0 -0
  449. /package/dist/{core → src/core}/introspection.d.ts +0 -0
  450. /package/dist/{core → src/core}/introspection.js +0 -0
  451. /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
  452. /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
  453. /package/dist/{core → src/core}/protocol.d.ts +0 -0
  454. /package/dist/{core → src/core}/protocol.js +0 -0
  455. /package/dist/{core → src/core}/rules.d.ts +0 -0
  456. /package/dist/{core → src/core}/rules.js +0 -0
  457. /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
  458. /package/dist/{core → src/core}/schema/loader.js +0 -0
  459. /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
  460. /package/dist/{core → src/core}/schema/normalize.js +0 -0
  461. /package/dist/{core → src/core}/schema/types.d.ts +0 -0
  462. /package/dist/{core → src/core}/schema/types.js +0 -0
  463. /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
  464. /package/dist/{dsl → src/dsl}/index.js +0 -0
  465. /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
  466. /package/dist/{dsl.js → src/dsl.js} +0 -0
  467. /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
  468. /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
  469. /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
  470. /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
  471. /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
  472. /package/dist/{examples → src/examples}/cart/index.js +0 -0
  473. /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
  474. /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
  475. /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
  476. /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
  477. /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
  478. /package/dist/{flows.js → src/flows.js} +0 -0
  479. /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
  480. /package/dist/{integrations → src/integrations}/svelte.js +0 -0
  481. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  482. /package/dist/{registry.js → src/registry.js} +0 -0
  483. /package/dist/{step.d.ts → src/step.d.ts} +0 -0
  484. /package/dist/{step.js → src/step.js} +0 -0
  485. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  486. /package/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,646 @@
1
+ # PluresDB Integration
2
+
3
+ PluresDB is Praxis's local-first reactive datastore. This document explains how to integrate PluresDB with your Praxis application.
4
+
5
+ ## Overview
6
+
7
+ PluresDB provides:
8
+ - **Local-first storage**: Data lives on the device
9
+ - **Reactive queries**: Automatic UI updates on data changes
10
+ - **Sync**: Automatic synchronization when connected
11
+ - **CRDT-based conflict resolution**: Handle concurrent edits
12
+ - **Event sourcing**: Full history of changes
13
+
14
+ ```mermaid
15
+ flowchart TB
16
+ subgraph App["Praxis App"]
17
+ Engine[Logic Engine]
18
+ UI[UI Components]
19
+ end
20
+
21
+ subgraph PluresDB["PluresDB"]
22
+ Local[(Local Store)]
23
+ Sync[Sync Engine]
24
+ CRDT[CRDT Resolver]
25
+ end
26
+
27
+ subgraph Cloud["Praxis Cloud"]
28
+ Relay[Relay Server]
29
+ Remote[(Remote Store)]
30
+ end
31
+
32
+ Engine <--> Local
33
+ UI <--> Local
34
+ Local <--> Sync
35
+ Sync <--> CRDT
36
+ Sync <--> Relay
37
+ Relay <--> Remote
38
+ ```
39
+
40
+ ## Setup
41
+
42
+ ### Installation
43
+
44
+ PluresDB is included with Praxis:
45
+
46
+ ```bash
47
+ npm install @plures/praxis
48
+ ```
49
+
50
+ ### Configuration
51
+
52
+ Configure PluresDB in your application:
53
+
54
+ ```typescript
55
+ import { createPluresDB } from '@plures/praxis';
56
+
57
+ const db = createPluresDB({
58
+ // Database name (stored in IndexedDB)
59
+ name: 'my-app-db',
60
+
61
+ // Schema version (increment to migrate)
62
+ version: 1,
63
+
64
+ // Collections to create
65
+ collections: ['users', 'posts', 'comments'],
66
+
67
+ // Sync configuration (optional)
68
+ sync: {
69
+ enabled: true,
70
+ endpoint: 'https://your-sync-server.com',
71
+ interval: 5000, // ms
72
+ },
73
+ });
74
+ ```
75
+
76
+ ### From Schema
77
+
78
+ Generate PluresDB configuration from your PSF schema:
79
+
80
+ ```bash
81
+ praxis generate --schema ./schema.psf.json --only pluresdb
82
+ ```
83
+
84
+ Generated configuration:
85
+
86
+ ```typescript
87
+ // generated/pluresdb-config.ts
88
+ import { createPluresDB } from '@plures/praxis';
89
+
90
+ export const dbConfig = {
91
+ name: 'my-app',
92
+ version: 1,
93
+ collections: [
94
+ {
95
+ name: 'users',
96
+ schema: {
97
+ id: { type: 'uuid', primary: true },
98
+ username: { type: 'string', indexed: true },
99
+ email: { type: 'string', indexed: true, unique: true },
100
+ createdAt: { type: 'datetime' },
101
+ },
102
+ },
103
+ {
104
+ name: 'posts',
105
+ schema: {
106
+ id: { type: 'uuid', primary: true },
107
+ title: { type: 'string' },
108
+ content: { type: 'string' },
109
+ authorId: { type: 'string', ref: 'users' },
110
+ },
111
+ },
112
+ ],
113
+ };
114
+
115
+ export const db = createPluresDB(dbConfig);
116
+ ```
117
+
118
+ ## CRUD Operations
119
+
120
+ ### Create
121
+
122
+ ```typescript
123
+ // Insert a single document
124
+ const user = await db.users.insert({
125
+ id: crypto.randomUUID(),
126
+ username: 'alice',
127
+ email: 'alice@example.com',
128
+ createdAt: new Date(),
129
+ });
130
+
131
+ // Insert multiple documents
132
+ const users = await db.users.insertMany([
133
+ { id: '1', username: 'bob', email: 'bob@example.com' },
134
+ { id: '2', username: 'carol', email: 'carol@example.com' },
135
+ ]);
136
+ ```
137
+
138
+ ### Read
139
+
140
+ ```typescript
141
+ // Find by ID
142
+ const user = await db.users.findById('user-123');
143
+
144
+ // Find one by query
145
+ const alice = await db.users.findOne({ username: 'alice' });
146
+
147
+ // Find all matching
148
+ const admins = await db.users.find({ role: 'admin' });
149
+
150
+ // Find with options
151
+ const recentUsers = await db.users.find(
152
+ { role: 'user' },
153
+ {
154
+ sort: { createdAt: -1 },
155
+ limit: 10,
156
+ skip: 0,
157
+ }
158
+ );
159
+ ```
160
+
161
+ ### Update
162
+
163
+ ```typescript
164
+ // Update by ID
165
+ await db.users.updateById('user-123', {
166
+ $set: { username: 'alice2' },
167
+ });
168
+
169
+ // Update matching documents
170
+ await db.users.updateMany(
171
+ { role: 'guest' },
172
+ { $set: { active: false } }
173
+ );
174
+
175
+ // Replace document
176
+ await db.users.replaceById('user-123', {
177
+ id: 'user-123',
178
+ username: 'newname',
179
+ email: 'new@example.com',
180
+ });
181
+ ```
182
+
183
+ ### Delete
184
+
185
+ ```typescript
186
+ // Delete by ID
187
+ await db.users.deleteById('user-123');
188
+
189
+ // Delete matching documents
190
+ await db.users.deleteMany({ active: false });
191
+ ```
192
+
193
+ ## Reactive Queries
194
+
195
+ PluresDB queries are reactive - they automatically update when data changes.
196
+
197
+ ### Using Subscriptions
198
+
199
+ ```typescript
200
+ // Subscribe to all users
201
+ const unsubscribe = db.users.subscribe(
202
+ {}, // Query
203
+ (users) => {
204
+ console.log('Users updated:', users);
205
+ }
206
+ );
207
+
208
+ // Later: unsubscribe
209
+ unsubscribe();
210
+ ```
211
+
212
+ ### With Svelte
213
+
214
+ ```svelte
215
+ <script lang="ts">
216
+ import { db } from '../db';
217
+
218
+ // Reactive query as a store
219
+ const users = db.users.query({});
220
+
221
+ // Derived query
222
+ const activeUsers = db.users.query({ active: true });
223
+ </script>
224
+
225
+ <ul>
226
+ {#each $users as user}
227
+ <li>{user.username}</li>
228
+ {/each}
229
+ </ul>
230
+ ```
231
+
232
+ ### With Praxis Engine
233
+
234
+ ```typescript
235
+ import { usePraxisEngine } from '@plures/praxis/svelte';
236
+ import { db } from '../db';
237
+
238
+ // Subscribe to database changes and dispatch engine events
239
+ db.users.subscribe({}, (users) => {
240
+ engine.dispatch([UsersUpdated.create({ users })]);
241
+ });
242
+
243
+ // Or integrate directly
244
+ const engine = createPraxisEngine({
245
+ initialContext: { users: [] },
246
+ registry,
247
+ plugins: [createPluresDBPlugin(db)],
248
+ });
249
+ ```
250
+
251
+ ## Sync
252
+
253
+ ### Enable Sync
254
+
255
+ ```typescript
256
+ const db = createPluresDB({
257
+ name: 'my-app',
258
+ collections: ['users', 'posts'],
259
+ sync: {
260
+ enabled: true,
261
+ endpoint: 'https://your-relay.com',
262
+ authToken: 'user-token',
263
+ autoSync: true,
264
+ syncInterval: 5000,
265
+ },
266
+ });
267
+ ```
268
+
269
+ ### Manual Sync
270
+
271
+ ```typescript
272
+ // Trigger sync manually
273
+ await db.sync();
274
+
275
+ // Sync specific collection
276
+ await db.users.sync();
277
+
278
+ // Check sync status
279
+ const status = db.getSyncStatus();
280
+ console.log(status);
281
+ // { lastSync: Date, pending: 5, syncing: false }
282
+ ```
283
+
284
+ ### Sync Events
285
+
286
+ ```typescript
287
+ db.on('sync:start', () => {
288
+ console.log('Sync started');
289
+ });
290
+
291
+ db.on('sync:complete', (result) => {
292
+ console.log('Sync complete:', result);
293
+ });
294
+
295
+ db.on('sync:error', (error) => {
296
+ console.error('Sync error:', error);
297
+ });
298
+
299
+ db.on('sync:conflict', (conflicts) => {
300
+ console.log('Conflicts detected:', conflicts);
301
+ });
302
+ ```
303
+
304
+ ## Conflict Resolution
305
+
306
+ PluresDB uses CRDTs for conflict-free synchronization.
307
+
308
+ ### Default Strategy: Last-Write-Wins
309
+
310
+ By default, the most recent change wins:
311
+
312
+ ```typescript
313
+ const db = createPluresDB({
314
+ name: 'my-app',
315
+ collections: ['notes'],
316
+ sync: {
317
+ conflictResolution: 'last-write-wins',
318
+ },
319
+ });
320
+ ```
321
+
322
+ ### Custom Resolution
323
+
324
+ ```typescript
325
+ const db = createPluresDB({
326
+ name: 'my-app',
327
+ collections: ['notes'],
328
+ sync: {
329
+ conflictResolution: 'custom',
330
+ resolveConflict: (local, remote, base) => {
331
+ // Merge logic
332
+ return {
333
+ ...base,
334
+ ...remote,
335
+ ...local,
336
+ mergedAt: new Date(),
337
+ };
338
+ },
339
+ },
340
+ });
341
+ ```
342
+
343
+ ### Field-Level CRDTs
344
+
345
+ For fine-grained merging:
346
+
347
+ ```typescript
348
+ const db = createPluresDB({
349
+ collections: [
350
+ {
351
+ name: 'documents',
352
+ schema: {
353
+ id: { type: 'uuid' },
354
+ title: { type: 'string', crdt: 'lww' }, // Last-write-wins
355
+ content: { type: 'string', crdt: 'rga' }, // Sequence CRDT
356
+ tags: { type: 'array', crdt: 'or-set' }, // Add-wins set
357
+ viewCount: { type: 'number', crdt: 'counter' }, // Counter
358
+ },
359
+ },
360
+ ],
361
+ });
362
+ ```
363
+
364
+ ## Offline Support
365
+
366
+ PluresDB works offline by default:
367
+
368
+ ### Checking Connection
369
+
370
+ ```typescript
371
+ // Check if online
372
+ const isOnline = db.isOnline();
373
+
374
+ // Subscribe to connection changes
375
+ db.on('online', () => console.log('Back online!'));
376
+ db.on('offline', () => console.log('Gone offline'));
377
+ ```
378
+
379
+ ### Pending Changes
380
+
381
+ ```typescript
382
+ // Get pending changes (not yet synced)
383
+ const pending = await db.getPendingChanges();
384
+ console.log(`${pending.length} changes waiting to sync`);
385
+
386
+ // Clear pending (discard local changes)
387
+ await db.clearPending();
388
+ ```
389
+
390
+ ### Offline Queue
391
+
392
+ Operations are queued when offline:
393
+
394
+ ```typescript
395
+ // Works even when offline
396
+ await db.users.insert({ id: '1', name: 'Alice' });
397
+
398
+ // Check queue
399
+ const queue = db.getQueue();
400
+ console.log(`${queue.length} operations queued`);
401
+
402
+ // Queue syncs automatically when back online
403
+ ```
404
+
405
+ ## Indexing
406
+
407
+ ### Define Indexes
408
+
409
+ ```typescript
410
+ const db = createPluresDB({
411
+ collections: [
412
+ {
413
+ name: 'posts',
414
+ schema: {
415
+ id: { type: 'uuid', primary: true },
416
+ title: { type: 'string' },
417
+ authorId: { type: 'string' },
418
+ createdAt: { type: 'datetime' },
419
+ tags: { type: 'array' },
420
+ },
421
+ indexes: [
422
+ { fields: ['authorId'] },
423
+ { fields: ['createdAt'], sort: 'desc' },
424
+ { fields: ['authorId', 'createdAt'], unique: false },
425
+ { fields: ['tags'], type: 'multikey' },
426
+ ],
427
+ },
428
+ ],
429
+ });
430
+ ```
431
+
432
+ ### Query with Indexes
433
+
434
+ ```typescript
435
+ // Uses authorId index
436
+ const posts = await db.posts.find({ authorId: 'user-123' });
437
+
438
+ // Uses compound index
439
+ const recentPosts = await db.posts.find(
440
+ { authorId: 'user-123' },
441
+ { sort: { createdAt: -1 } }
442
+ );
443
+
444
+ // Uses multikey index for array
445
+ const taggedPosts = await db.posts.find({ tags: 'javascript' });
446
+ ```
447
+
448
+ ## Relationships
449
+
450
+ ### Define Relationships
451
+
452
+ From your PSF schema:
453
+
454
+ ```json
455
+ {
456
+ "models": [
457
+ {
458
+ "name": "Post",
459
+ "fields": [
460
+ { "name": "authorId", "type": "string" }
461
+ ],
462
+ "relationships": [
463
+ {
464
+ "name": "author",
465
+ "type": "many-to-one",
466
+ "target": "User",
467
+ "foreignKey": "authorId"
468
+ }
469
+ ]
470
+ }
471
+ ]
472
+ }
473
+ ```
474
+
475
+ ### Query with Relationships
476
+
477
+ ```typescript
478
+ // Include related documents
479
+ const posts = await db.posts.find(
480
+ {},
481
+ { include: ['author'] }
482
+ );
483
+
484
+ // Each post has author populated
485
+ posts.forEach(post => {
486
+ console.log(`${post.title} by ${post.author.username}`);
487
+ });
488
+
489
+ // Nested includes
490
+ const posts = await db.posts.find(
491
+ {},
492
+ { include: ['author', 'comments.author'] }
493
+ );
494
+ ```
495
+
496
+ ## Integration with Logic Engine
497
+
498
+ ### Event Sourcing
499
+
500
+ Use PluresDB to persist facts:
501
+
502
+ ```typescript
503
+ import { createPraxisEngine } from '@plures/praxis';
504
+ import { db } from './db';
505
+
506
+ const engine = createPraxisEngine({
507
+ initialContext: { ... },
508
+ registry,
509
+ plugins: [
510
+ // Persist facts to PluresDB
511
+ {
512
+ afterStep: async (result) => {
513
+ for (const fact of result.state.facts) {
514
+ await db.facts.insert({
515
+ id: crypto.randomUUID(),
516
+ tag: fact.tag,
517
+ payload: fact.payload,
518
+ timestamp: Date.now(),
519
+ });
520
+ }
521
+ },
522
+ },
523
+ ],
524
+ });
525
+
526
+ // Replay facts to restore state
527
+ async function restoreState() {
528
+ const facts = await db.facts.find({}, { sort: { timestamp: 1 } });
529
+ for (const fact of facts) {
530
+ engine.dispatch([fact]);
531
+ }
532
+ }
533
+ ```
534
+
535
+ ### Reactive Context
536
+
537
+ Sync engine context with database:
538
+
539
+ ```typescript
540
+ // Update context when database changes
541
+ db.users.subscribe({}, (users) => {
542
+ engine.dispatch([UsersLoaded.create({ users })]);
543
+ });
544
+
545
+ // Persist context changes
546
+ engine.subscribe((state) => {
547
+ // Persist to database
548
+ db.state.replaceById('current', {
549
+ id: 'current',
550
+ context: state.context,
551
+ timestamp: Date.now(),
552
+ });
553
+ });
554
+ ```
555
+
556
+ ## Migrations
557
+
558
+ ### Schema Migrations
559
+
560
+ ```typescript
561
+ const db = createPluresDB({
562
+ name: 'my-app',
563
+ version: 2, // Increment version
564
+ collections: ['users', 'posts'],
565
+ migrations: [
566
+ {
567
+ version: 2,
568
+ up: async (db) => {
569
+ // Add new field to existing documents
570
+ const users = await db.users.find({});
571
+ for (const user of users) {
572
+ if (!user.role) {
573
+ await db.users.updateById(user.id, {
574
+ $set: { role: 'user' },
575
+ });
576
+ }
577
+ }
578
+ },
579
+ down: async (db) => {
580
+ // Rollback migration
581
+ await db.users.updateMany({}, {
582
+ $unset: { role: true },
583
+ });
584
+ },
585
+ },
586
+ ],
587
+ });
588
+ ```
589
+
590
+ ## Best Practices
591
+
592
+ ### 1. Define Clear Schemas
593
+
594
+ ```typescript
595
+ const db = createPluresDB({
596
+ collections: [
597
+ {
598
+ name: 'users',
599
+ schema: {
600
+ id: { type: 'uuid', primary: true },
601
+ username: { type: 'string', required: true },
602
+ email: { type: 'string', required: true, unique: true },
603
+ },
604
+ validate: true, // Enable validation
605
+ },
606
+ ],
607
+ });
608
+ ```
609
+
610
+ ### 2. Use Transactions
611
+
612
+ ```typescript
613
+ await db.transaction(async (tx) => {
614
+ const user = await tx.users.insert({ ... });
615
+ await tx.profiles.insert({ userId: user.id, ... });
616
+ // Both succeed or both fail
617
+ });
618
+ ```
619
+
620
+ ### 3. Handle Errors
621
+
622
+ ```typescript
623
+ try {
624
+ await db.users.insert({ ... });
625
+ } catch (error) {
626
+ if (error.code === 'UNIQUE_CONSTRAINT') {
627
+ console.log('Email already exists');
628
+ } else if (error.code === 'VALIDATION_ERROR') {
629
+ console.log('Invalid data:', error.details);
630
+ }
631
+ }
632
+ ```
633
+
634
+ ### 4. Clean Up
635
+
636
+ ```typescript
637
+ // Close database when done
638
+ await db.close();
639
+
640
+ // Clear all data (development)
641
+ await db.clear();
642
+ ```
643
+
644
+ ---
645
+
646
+ **Next:** [Code ↔ Canvas Sync](./code-canvas-sync.md)