@plures/praxis 0.2.0 → 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 (488) hide show
  1. package/README.md +282 -76
  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/{core → src/core}/schema/loader.js +2 -2
  178. package/dist/src/core/schema/loader.js.map +1 -0
  179. package/dist/src/core/schema/normalize.d.ts.map +1 -0
  180. package/dist/src/core/schema/normalize.js.map +1 -0
  181. package/dist/src/core/schema/types.d.ts.map +1 -0
  182. package/dist/src/core/schema/types.js.map +1 -0
  183. package/dist/src/dsl/index.d.ts.map +1 -0
  184. package/dist/src/dsl/index.js.map +1 -0
  185. package/dist/src/dsl.d.ts.map +1 -0
  186. package/dist/src/dsl.js.map +1 -0
  187. package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
  188. package/dist/src/examples/advanced-todo/index.js.map +1 -0
  189. package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
  190. package/dist/src/examples/auth-basic/index.js.map +1 -0
  191. package/dist/src/examples/cart/index.d.ts.map +1 -0
  192. package/dist/src/examples/cart/index.js.map +1 -0
  193. package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
  194. package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
  195. package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
  196. package/dist/src/examples/svelte-counter/index.js.map +1 -0
  197. package/dist/src/flows.d.ts.map +1 -0
  198. package/dist/src/flows.js.map +1 -0
  199. package/dist/{index.d.ts → src/index.d.ts} +12 -2
  200. package/dist/src/index.d.ts.map +1 -0
  201. package/dist/{index.js → src/index.js} +6 -1
  202. package/dist/src/index.js.map +1 -0
  203. package/dist/src/integrations/code-canvas.d.ts +265 -0
  204. package/dist/src/integrations/code-canvas.d.ts.map +1 -0
  205. package/dist/src/integrations/code-canvas.js +451 -0
  206. package/dist/src/integrations/code-canvas.js.map +1 -0
  207. package/dist/src/integrations/pluresdb.d.ts +117 -0
  208. package/dist/src/integrations/pluresdb.d.ts.map +1 -0
  209. package/dist/src/integrations/pluresdb.js +117 -0
  210. package/dist/src/integrations/pluresdb.js.map +1 -0
  211. package/dist/src/integrations/state-docs.d.ts +191 -0
  212. package/dist/src/integrations/state-docs.d.ts.map +1 -0
  213. package/dist/src/integrations/state-docs.js +515 -0
  214. package/dist/src/integrations/state-docs.js.map +1 -0
  215. package/dist/src/integrations/svelte.d.ts.map +1 -0
  216. package/dist/src/integrations/svelte.js.map +1 -0
  217. package/dist/src/integrations/tauri.d.ts +360 -0
  218. package/dist/src/integrations/tauri.d.ts.map +1 -0
  219. package/dist/src/integrations/tauri.js +278 -0
  220. package/dist/src/integrations/tauri.js.map +1 -0
  221. package/dist/src/integrations/unum.d.ts +159 -0
  222. package/dist/src/integrations/unum.d.ts.map +1 -0
  223. package/dist/src/integrations/unum.js +240 -0
  224. package/dist/src/integrations/unum.js.map +1 -0
  225. package/dist/src/registry.d.ts.map +1 -0
  226. package/dist/src/registry.js.map +1 -0
  227. package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
  228. package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
  229. package/dist/src/runtime/terminal-adapter.js +237 -0
  230. package/dist/src/runtime/terminal-adapter.js.map +1 -0
  231. package/dist/src/step.d.ts.map +1 -0
  232. package/dist/src/step.js.map +1 -0
  233. package/dist/src/types.d.ts.map +1 -0
  234. package/dist/{cloud → src}/types.js.map +1 -1
  235. package/dist/tools/cli/commands/index.d.ts +7 -0
  236. package/dist/tools/cli/commands/index.d.ts.map +1 -0
  237. package/dist/tools/cli/commands/index.js +7 -0
  238. package/dist/tools/cli/commands/index.js.map +1 -0
  239. package/dist/tools/cli/index.d.ts +8 -0
  240. package/dist/tools/cli/index.d.ts.map +1 -0
  241. package/dist/tools/cli/index.js +9 -0
  242. package/dist/tools/cli/index.js.map +1 -0
  243. package/dist/tools/watcher/index.d.ts +105 -0
  244. package/dist/tools/watcher/index.d.ts.map +1 -0
  245. package/dist/tools/watcher/index.js +213 -0
  246. package/dist/tools/watcher/index.js.map +1 -0
  247. package/dist/ui/canvas/canvas-projection.d.ts +78 -0
  248. package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
  249. package/dist/ui/canvas/canvas-projection.js +416 -0
  250. package/dist/ui/canvas/canvas-projection.js.map +1 -0
  251. package/dist/ui/canvas/canvas-state.d.ts +200 -0
  252. package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
  253. package/dist/ui/canvas/canvas-state.js +464 -0
  254. package/dist/ui/canvas/canvas-state.js.map +1 -0
  255. package/dist/ui/canvas/components/index.d.ts +95 -0
  256. package/dist/ui/canvas/components/index.d.ts.map +1 -0
  257. package/dist/ui/canvas/components/index.js +19 -0
  258. package/dist/ui/canvas/components/index.js.map +1 -0
  259. package/dist/ui/canvas/index.d.ts +32 -0
  260. package/dist/ui/canvas/index.d.ts.map +1 -0
  261. package/dist/ui/canvas/index.js +32 -0
  262. package/dist/ui/canvas/index.js.map +1 -0
  263. package/dist/ui/svelte-generator/index.d.ts +9 -0
  264. package/dist/ui/svelte-generator/index.d.ts.map +1 -0
  265. package/dist/ui/svelte-generator/index.js +11 -0
  266. package/dist/ui/svelte-generator/index.js.map +1 -0
  267. package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
  268. package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
  269. package/dist/ui/svelte-generator/psf-generator.js +506 -0
  270. package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
  271. package/docs/README.md +155 -0
  272. package/docs/core/building-extensions.md +553 -0
  273. package/docs/core/cli-usage.md +498 -0
  274. package/docs/core/code-canvas-sync.md +468 -0
  275. package/docs/core/logic-engine.md +566 -0
  276. package/docs/core/pluresdb-integration.md +646 -0
  277. package/docs/core/schema-model.md +414 -0
  278. package/docs/core/ui-generation.md +580 -0
  279. package/docs/core/what-is-praxis.md +240 -0
  280. package/docs/tutorials/README.md +84 -0
  281. package/docs/tutorials/ecommerce-cart.md +631 -0
  282. package/docs/tutorials/first-app.md +529 -0
  283. package/docs/tutorials/form-builder.md +620 -0
  284. package/docs/tutorials/todo-pluresdb.md +589 -0
  285. package/package.json +1 -1
  286. package/src/__tests__/canvas-components.test.ts +450 -0
  287. package/src/__tests__/cli-create.test.ts +178 -0
  288. package/src/__tests__/code-canvas-integration.test.ts +277 -0
  289. package/src/__tests__/docs-generator.test.ts +181 -0
  290. package/src/__tests__/generators.test.ts +3 -2
  291. package/src/__tests__/pluresdb.test.ts +457 -0
  292. package/src/__tests__/psf-schema-engine.test.ts +450 -0
  293. package/src/__tests__/state-docs-integration.test.ts +297 -0
  294. package/src/__tests__/tauri-integration.test.ts +298 -0
  295. package/src/__tests__/terminal-node.test.ts +1 -1
  296. package/src/__tests__/unum-integration.test.ts +142 -0
  297. package/src/cli/commands/build.ts +203 -0
  298. package/src/cli/commands/canvas.ts +246 -0
  299. package/src/cli/commands/create.ts +666 -0
  300. package/src/cli/commands/dev.ts +95 -0
  301. package/src/cli/commands/orchestrate.ts +212 -0
  302. package/src/cli/index.ts +48 -21
  303. package/src/core/actors.ts +1 -1
  304. package/src/core/component/generator.ts +45 -3
  305. package/src/core/logic/generator.ts +39 -4
  306. package/src/core/pluresdb/adapter.ts +117 -0
  307. package/src/core/pluresdb/generator.ts +33 -4
  308. package/src/core/pluresdb/index.ts +37 -0
  309. package/src/core/pluresdb/schema-registry.ts +162 -0
  310. package/src/core/pluresdb/store.ts +443 -0
  311. package/src/core/schema/loader.ts +2 -2
  312. package/src/index.ts +109 -0
  313. package/src/integrations/code-canvas.ts +717 -0
  314. package/src/integrations/pluresdb.ts +140 -29
  315. package/src/integrations/state-docs.ts +710 -0
  316. package/src/integrations/tauri.ts +638 -0
  317. package/src/integrations/unum.ts +395 -0
  318. package/src/runtime/terminal-adapter.ts +178 -23
  319. package/dist/adapters/cli.d.ts.map +0 -1
  320. package/dist/adapters/cli.js.map +0 -1
  321. package/dist/cli/commands/auth.d.ts.map +0 -1
  322. package/dist/cli/commands/auth.js.map +0 -1
  323. package/dist/cli/commands/cloud.d.ts.map +0 -1
  324. package/dist/cli/commands/cloud.js.map +0 -1
  325. package/dist/cli/commands/generate.d.ts.map +0 -1
  326. package/dist/cli/commands/generate.js.map +0 -1
  327. package/dist/cli/index.js.map +0 -1
  328. package/dist/cloud/auth.d.ts.map +0 -1
  329. package/dist/cloud/auth.js.map +0 -1
  330. package/dist/cloud/billing.d.ts.map +0 -1
  331. package/dist/cloud/billing.js.map +0 -1
  332. package/dist/cloud/client.d.ts.map +0 -1
  333. package/dist/cloud/client.js.map +0 -1
  334. package/dist/cloud/index.d.ts.map +0 -1
  335. package/dist/cloud/index.js.map +0 -1
  336. package/dist/cloud/marketplace.d.ts.map +0 -1
  337. package/dist/cloud/marketplace.js.map +0 -1
  338. package/dist/cloud/provisioning.d.ts.map +0 -1
  339. package/dist/cloud/provisioning.js.map +0 -1
  340. package/dist/cloud/relay/endpoints.d.ts.map +0 -1
  341. package/dist/cloud/relay/endpoints.js.map +0 -1
  342. package/dist/cloud/relay/health/index.d.ts.map +0 -1
  343. package/dist/cloud/relay/health/index.js.map +0 -1
  344. package/dist/cloud/relay/stats/index.d.ts.map +0 -1
  345. package/dist/cloud/relay/stats/index.js.map +0 -1
  346. package/dist/cloud/relay/sync/index.d.ts.map +0 -1
  347. package/dist/cloud/relay/sync/index.js.map +0 -1
  348. package/dist/cloud/relay/usage/index.d.ts.map +0 -1
  349. package/dist/cloud/relay/usage/index.js.map +0 -1
  350. package/dist/cloud/sponsors.d.ts.map +0 -1
  351. package/dist/cloud/sponsors.js.map +0 -1
  352. package/dist/cloud/types.d.ts.map +0 -1
  353. package/dist/components/index.d.ts.map +0 -1
  354. package/dist/components/index.js.map +0 -1
  355. package/dist/core/actors.d.ts.map +0 -1
  356. package/dist/core/actors.js.map +0 -1
  357. package/dist/core/component/generator.d.ts.map +0 -1
  358. package/dist/core/component/generator.js.map +0 -1
  359. package/dist/core/engine.d.ts.map +0 -1
  360. package/dist/core/engine.js.map +0 -1
  361. package/dist/core/introspection.d.ts.map +0 -1
  362. package/dist/core/introspection.js.map +0 -1
  363. package/dist/core/logic/generator.d.ts.map +0 -1
  364. package/dist/core/logic/generator.js.map +0 -1
  365. package/dist/core/pluresdb/generator.d.ts.map +0 -1
  366. package/dist/core/pluresdb/generator.js.map +0 -1
  367. package/dist/core/protocol.d.ts.map +0 -1
  368. package/dist/core/protocol.js.map +0 -1
  369. package/dist/core/rules.d.ts.map +0 -1
  370. package/dist/core/rules.js.map +0 -1
  371. package/dist/core/schema/loader.d.ts.map +0 -1
  372. package/dist/core/schema/loader.js.map +0 -1
  373. package/dist/core/schema/normalize.d.ts.map +0 -1
  374. package/dist/core/schema/normalize.js.map +0 -1
  375. package/dist/core/schema/types.d.ts.map +0 -1
  376. package/dist/core/schema/types.js.map +0 -1
  377. package/dist/dsl/index.d.ts.map +0 -1
  378. package/dist/dsl/index.js.map +0 -1
  379. package/dist/dsl.d.ts.map +0 -1
  380. package/dist/dsl.js.map +0 -1
  381. package/dist/examples/advanced-todo/index.d.ts.map +0 -1
  382. package/dist/examples/advanced-todo/index.js.map +0 -1
  383. package/dist/examples/auth-basic/index.d.ts.map +0 -1
  384. package/dist/examples/auth-basic/index.js.map +0 -1
  385. package/dist/examples/cart/index.d.ts.map +0 -1
  386. package/dist/examples/cart/index.js.map +0 -1
  387. package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
  388. package/dist/examples/hero-ecommerce/index.js.map +0 -1
  389. package/dist/examples/svelte-counter/index.d.ts.map +0 -1
  390. package/dist/examples/svelte-counter/index.js.map +0 -1
  391. package/dist/flows.d.ts.map +0 -1
  392. package/dist/flows.js.map +0 -1
  393. package/dist/index.d.ts.map +0 -1
  394. package/dist/index.js.map +0 -1
  395. package/dist/integrations/pluresdb.d.ts +0 -56
  396. package/dist/integrations/pluresdb.d.ts.map +0 -1
  397. package/dist/integrations/pluresdb.js +0 -46
  398. package/dist/integrations/pluresdb.js.map +0 -1
  399. package/dist/integrations/svelte.d.ts.map +0 -1
  400. package/dist/integrations/svelte.js.map +0 -1
  401. package/dist/registry.d.ts.map +0 -1
  402. package/dist/registry.js.map +0 -1
  403. package/dist/runtime/terminal-adapter.d.ts.map +0 -1
  404. package/dist/runtime/terminal-adapter.js +0 -113
  405. package/dist/runtime/terminal-adapter.js.map +0 -1
  406. package/dist/step.d.ts.map +0 -1
  407. package/dist/step.js.map +0 -1
  408. package/dist/types.d.ts.map +0 -1
  409. package/dist/types.js.map +0 -1
  410. /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
  411. /package/dist/{adapters → src/adapters}/cli.js +0 -0
  412. /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
  413. /package/dist/{cli → src/cli}/commands/auth.js +0 -0
  414. /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
  415. /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
  416. /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
  417. /package/dist/{cli → src/cli}/commands/generate.js +0 -0
  418. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  419. /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
  420. /package/dist/{cloud → src/cloud}/auth.js +0 -0
  421. /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
  422. /package/dist/{cloud → src/cloud}/billing.js +0 -0
  423. /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
  424. /package/dist/{cloud → src/cloud}/client.js +0 -0
  425. /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
  426. /package/dist/{cloud → src/cloud}/index.js +0 -0
  427. /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
  428. /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
  429. /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
  430. /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
  431. /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
  432. /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
  433. /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
  434. /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
  435. /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
  436. /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
  437. /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
  438. /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
  439. /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
  440. /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
  441. /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
  442. /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
  443. /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
  444. /package/dist/{cloud → src/cloud}/types.js +0 -0
  445. /package/dist/{components → src/components}/index.d.ts +0 -0
  446. /package/dist/{components → src/components}/index.js +0 -0
  447. /package/dist/{core → src/core}/actors.d.ts +0 -0
  448. /package/dist/{core → src/core}/actors.js +0 -0
  449. /package/dist/{core → src/core}/component/generator.d.ts +0 -0
  450. /package/dist/{core → src/core}/engine.d.ts +0 -0
  451. /package/dist/{core → src/core}/engine.js +0 -0
  452. /package/dist/{core → src/core}/introspection.d.ts +0 -0
  453. /package/dist/{core → src/core}/introspection.js +0 -0
  454. /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
  455. /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
  456. /package/dist/{core → src/core}/protocol.d.ts +0 -0
  457. /package/dist/{core → src/core}/protocol.js +0 -0
  458. /package/dist/{core → src/core}/rules.d.ts +0 -0
  459. /package/dist/{core → src/core}/rules.js +0 -0
  460. /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
  461. /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
  462. /package/dist/{core → src/core}/schema/normalize.js +0 -0
  463. /package/dist/{core → src/core}/schema/types.d.ts +0 -0
  464. /package/dist/{core → src/core}/schema/types.js +0 -0
  465. /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
  466. /package/dist/{dsl → src/dsl}/index.js +0 -0
  467. /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
  468. /package/dist/{dsl.js → src/dsl.js} +0 -0
  469. /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
  470. /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
  471. /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
  472. /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
  473. /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
  474. /package/dist/{examples → src/examples}/cart/index.js +0 -0
  475. /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
  476. /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
  477. /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
  478. /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
  479. /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
  480. /package/dist/{flows.js → src/flows.js} +0 -0
  481. /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
  482. /package/dist/{integrations → src/integrations}/svelte.js +0 -0
  483. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  484. /package/dist/{registry.js → src/registry.js} +0 -0
  485. /package/dist/{step.d.ts → src/step.d.ts} +0 -0
  486. /package/dist/{step.js → src/step.js} +0 -0
  487. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  488. /package/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,541 @@
1
+ /**
2
+ * PSF Validator
3
+ *
4
+ * Validates PSF schemas for correctness, completeness, and consistency.
5
+ */
6
+
7
+ import type {
8
+ PSFSchema,
9
+ PSFFact,
10
+ PSFEvent,
11
+ PSFRule,
12
+ PSFConstraint,
13
+ PSFModel,
14
+ PSFComponent,
15
+ PSFFlow,
16
+ PSFFieldType,
17
+ } from './psf.js';
18
+ import { PSF_VERSION } from './psf.js';
19
+
20
+ /**
21
+ * Validation error
22
+ */
23
+ export interface ValidationError {
24
+ /** Error path in schema */
25
+ path: string;
26
+ /** Error message */
27
+ message: string;
28
+ /** Error code */
29
+ code: string;
30
+ /** Severity */
31
+ severity: 'error' | 'warning' | 'info';
32
+ }
33
+
34
+ /**
35
+ * Validation result
36
+ */
37
+ export interface ValidationResult {
38
+ /** Is schema valid */
39
+ valid: boolean;
40
+ /** Validation errors */
41
+ errors: ValidationError[];
42
+ /** Validation warnings */
43
+ warnings: ValidationError[];
44
+ /** Info messages */
45
+ info: ValidationError[];
46
+ }
47
+
48
+ /**
49
+ * Validation options
50
+ */
51
+ export interface ValidationOptions {
52
+ /** Check for duplicate IDs */
53
+ checkDuplicates?: boolean;
54
+ /** Check references are valid */
55
+ checkReferences?: boolean;
56
+ /** Check identifier naming conventions */
57
+ checkNaming?: boolean;
58
+ /** Strict mode (treat warnings as errors) */
59
+ strict?: boolean;
60
+ }
61
+
62
+ /**
63
+ * Reserved JavaScript keywords
64
+ */
65
+ const RESERVED_KEYWORDS = new Set([
66
+ 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
67
+ 'default', 'delete', 'do', 'else', 'export', 'extends', 'finally',
68
+ 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new',
69
+ 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof',
70
+ 'var', 'void', 'while', 'with', 'yield', 'let', 'static',
71
+ 'enum', 'await', 'implements', 'interface', 'package', 'private',
72
+ 'protected', 'public',
73
+ ]);
74
+
75
+ /**
76
+ * PSF Validator class
77
+ */
78
+ export class PSFValidator {
79
+ private options: Required<ValidationOptions>;
80
+ private errors: ValidationError[] = [];
81
+ private warnings: ValidationError[] = [];
82
+ private info: ValidationError[] = [];
83
+
84
+ constructor(options: ValidationOptions = {}) {
85
+ this.options = {
86
+ checkDuplicates: options.checkDuplicates ?? true,
87
+ checkReferences: options.checkReferences ?? true,
88
+ checkNaming: options.checkNaming ?? true,
89
+ strict: options.strict ?? false,
90
+ };
91
+ }
92
+
93
+ /**
94
+ * Validate a PSF schema
95
+ */
96
+ validate(schema: PSFSchema): ValidationResult {
97
+ this.errors = [];
98
+ this.warnings = [];
99
+ this.info = [];
100
+
101
+ // Check version
102
+ this.validateVersion(schema);
103
+
104
+ // Check required fields
105
+ this.validateRequiredFields(schema);
106
+
107
+ // Validate individual sections (handle undefined arrays)
108
+ this.validateFacts(schema.facts || []);
109
+ this.validateEvents(schema.events || []);
110
+ this.validateRules(schema.rules || [], schema);
111
+ this.validateConstraints(schema.constraints || []);
112
+ this.validateModels(schema.models || []);
113
+ this.validateComponents(schema.components || [], schema);
114
+ this.validateFlows(schema.flows || []);
115
+
116
+ // Check for duplicate IDs
117
+ if (this.options.checkDuplicates) {
118
+ this.validateDuplicateIds(schema);
119
+ }
120
+
121
+ // Check references
122
+ if (this.options.checkReferences) {
123
+ this.validateReferences(schema);
124
+ }
125
+
126
+ const isValid = this.options.strict
127
+ ? this.errors.length === 0 && this.warnings.length === 0
128
+ : this.errors.length === 0;
129
+
130
+ return {
131
+ valid: isValid,
132
+ errors: this.errors,
133
+ warnings: this.warnings,
134
+ info: this.info,
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Validate schema version
140
+ */
141
+ private validateVersion(schema: PSFSchema): void {
142
+ if (!schema.$version) {
143
+ this.addError('$version', 'Schema version is required', 'missing-version');
144
+ } else if (schema.$version !== PSF_VERSION) {
145
+ this.addWarning(
146
+ '$version',
147
+ `Schema version ${schema.$version} does not match current PSF version ${PSF_VERSION}`,
148
+ 'version-mismatch'
149
+ );
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Validate required fields
155
+ */
156
+ private validateRequiredFields(schema: PSFSchema): void {
157
+ if (!schema.id) {
158
+ this.addError('id', 'Schema ID is required', 'missing-id');
159
+ }
160
+ if (!schema.name) {
161
+ this.addError('name', 'Schema name is required', 'missing-name');
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Validate facts
167
+ */
168
+ private validateFacts(facts: PSFFact[]): void {
169
+ facts.forEach((fact, index) => {
170
+ const path = `facts[${index}]`;
171
+
172
+ if (!fact.id) {
173
+ this.addError(`${path}.id`, 'Fact ID is required', 'missing-id');
174
+ }
175
+
176
+ if (!fact.tag) {
177
+ this.addError(`${path}.tag`, 'Fact tag is required', 'missing-tag');
178
+ } else if (this.options.checkNaming && !this.isValidIdentifier(fact.tag)) {
179
+ this.addError(`${path}.tag`, `"${fact.tag}" is not a valid identifier`, 'invalid-identifier');
180
+ }
181
+
182
+ if (!fact.payload) {
183
+ this.addError(`${path}.payload`, 'Fact payload is required', 'missing-payload');
184
+ }
185
+ });
186
+ }
187
+
188
+ /**
189
+ * Validate events
190
+ */
191
+ private validateEvents(events: PSFEvent[]): void {
192
+ events.forEach((event, index) => {
193
+ const path = `events[${index}]`;
194
+
195
+ if (!event.id) {
196
+ this.addError(`${path}.id`, 'Event ID is required', 'missing-id');
197
+ }
198
+
199
+ if (!event.tag) {
200
+ this.addError(`${path}.tag`, 'Event tag is required', 'missing-tag');
201
+ } else if (this.options.checkNaming && !this.isValidIdentifier(event.tag)) {
202
+ this.addError(`${path}.tag`, `"${event.tag}" is not a valid identifier`, 'invalid-identifier');
203
+ }
204
+
205
+ if (!event.payload) {
206
+ this.addError(`${path}.payload`, 'Event payload is required', 'missing-payload');
207
+ }
208
+ });
209
+ }
210
+
211
+ /**
212
+ * Validate rules
213
+ */
214
+ private validateRules(rules: PSFRule[], schema: PSFSchema): void {
215
+ const eventTags = new Set((schema.events || []).map((e) => e.tag));
216
+
217
+ rules.forEach((rule, index) => {
218
+ const path = `rules[${index}]`;
219
+
220
+ if (!rule.id) {
221
+ this.addError(`${path}.id`, 'Rule ID is required', 'missing-id');
222
+ }
223
+
224
+ if (!rule.description) {
225
+ this.addWarning(`${path}.description`, 'Rule description is recommended', 'missing-description');
226
+ }
227
+
228
+ if (!rule.then) {
229
+ this.addError(`${path}.then`, 'Rule action (then) is required', 'missing-action');
230
+ }
231
+
232
+ // Check that triggers reference valid events
233
+ if (rule.triggers) {
234
+ rule.triggers.forEach((trigger, triggerIndex) => {
235
+ if (!eventTags.has(trigger)) {
236
+ this.addWarning(
237
+ `${path}.triggers[${triggerIndex}]`,
238
+ `Trigger "${trigger}" does not match any defined event`,
239
+ 'unknown-trigger'
240
+ );
241
+ }
242
+ });
243
+ }
244
+ });
245
+ }
246
+
247
+ /**
248
+ * Validate constraints
249
+ */
250
+ private validateConstraints(constraints: PSFConstraint[]): void {
251
+ constraints.forEach((constraint, index) => {
252
+ const path = `constraints[${index}]`;
253
+
254
+ if (!constraint.id) {
255
+ this.addError(`${path}.id`, 'Constraint ID is required', 'missing-id');
256
+ }
257
+
258
+ if (!constraint.description) {
259
+ this.addWarning(`${path}.description`, 'Constraint description is recommended', 'missing-description');
260
+ }
261
+
262
+ if (!constraint.check) {
263
+ this.addError(`${path}.check`, 'Constraint check is required', 'missing-check');
264
+ }
265
+
266
+ if (!constraint.errorMessage) {
267
+ this.addWarning(`${path}.errorMessage`, 'Constraint error message is recommended', 'missing-error-message');
268
+ }
269
+ });
270
+ }
271
+
272
+ /**
273
+ * Validate models
274
+ */
275
+ private validateModels(models: PSFModel[]): void {
276
+ models.forEach((model, index) => {
277
+ const path = `models[${index}]`;
278
+
279
+ if (!model.id) {
280
+ this.addError(`${path}.id`, 'Model ID is required', 'missing-id');
281
+ }
282
+
283
+ if (!model.name) {
284
+ this.addError(`${path}.name`, 'Model name is required', 'missing-name');
285
+ } else if (this.options.checkNaming && !this.isValidTypeName(model.name)) {
286
+ this.addError(`${path}.name`, `"${model.name}" is not a valid type name (should be PascalCase)`, 'invalid-type-name');
287
+ }
288
+
289
+ if (!model.fields || model.fields.length === 0) {
290
+ this.addError(`${path}.fields`, 'Model must have at least one field', 'empty-fields');
291
+ } else {
292
+ this.validateModelFields(model.fields, `${path}.fields`);
293
+ }
294
+ });
295
+ }
296
+
297
+ /**
298
+ * Validate model fields
299
+ */
300
+ private validateModelFields(fields: { name: string; type: PSFFieldType; optional?: boolean }[], basePath: string): void {
301
+ const fieldNames = new Set<string>();
302
+
303
+ fields.forEach((field, index) => {
304
+ const path = `${basePath}[${index}]`;
305
+
306
+ if (!field.name) {
307
+ this.addError(`${path}.name`, 'Field name is required', 'missing-name');
308
+ } else {
309
+ if (fieldNames.has(field.name)) {
310
+ this.addError(`${path}.name`, `Duplicate field name "${field.name}"`, 'duplicate-field');
311
+ }
312
+ fieldNames.add(field.name);
313
+
314
+ if (this.options.checkNaming && !this.isValidPropertyName(field.name)) {
315
+ this.addWarning(`${path}.name`, `"${field.name}" should be camelCase`, 'naming-convention');
316
+ }
317
+ }
318
+
319
+ if (!field.type) {
320
+ this.addError(`${path}.type`, 'Field type is required', 'missing-type');
321
+ }
322
+ });
323
+ }
324
+
325
+ /**
326
+ * Validate components
327
+ */
328
+ private validateComponents(components: PSFComponent[], schema: PSFSchema): void {
329
+ const modelNames = new Set((schema.models || []).map((m) => m.name));
330
+
331
+ components.forEach((component, index) => {
332
+ const path = `components[${index}]`;
333
+
334
+ if (!component.id) {
335
+ this.addError(`${path}.id`, 'Component ID is required', 'missing-id');
336
+ }
337
+
338
+ if (!component.name) {
339
+ this.addError(`${path}.name`, 'Component name is required', 'missing-name');
340
+ }
341
+
342
+ if (!component.type) {
343
+ this.addError(`${path}.type`, 'Component type is required', 'missing-type');
344
+ }
345
+
346
+ // Check model reference
347
+ if (component.model && !modelNames.has(component.model)) {
348
+ this.addWarning(
349
+ `${path}.model`,
350
+ `Model "${component.model}" does not exist`,
351
+ 'unknown-model'
352
+ );
353
+ }
354
+ });
355
+ }
356
+
357
+ /**
358
+ * Validate flows
359
+ */
360
+ private validateFlows(flows: PSFFlow[]): void {
361
+ flows.forEach((flow, index) => {
362
+ const path = `flows[${index}]`;
363
+
364
+ if (!flow.id) {
365
+ this.addError(`${path}.id`, 'Flow ID is required', 'missing-id');
366
+ }
367
+
368
+ if (!flow.name) {
369
+ this.addError(`${path}.name`, 'Flow name is required', 'missing-name');
370
+ }
371
+
372
+ if (!flow.type) {
373
+ this.addError(`${path}.type`, 'Flow type is required', 'missing-type');
374
+ }
375
+
376
+ if (!flow.steps || flow.steps.length === 0) {
377
+ this.addWarning(`${path}.steps`, 'Flow has no steps', 'empty-steps');
378
+ } else {
379
+ const stepIds = new Set(flow.steps.map((s) => s.id));
380
+
381
+ // Check step references
382
+ flow.steps.forEach((step, stepIndex) => {
383
+ const stepPath = `${path}.steps[${stepIndex}]`;
384
+
385
+ if (!step.id) {
386
+ this.addError(`${stepPath}.id`, 'Step ID is required', 'missing-id');
387
+ }
388
+
389
+ // Check next step references
390
+ if (step.next) {
391
+ if (typeof step.next === 'string') {
392
+ if (!stepIds.has(step.next)) {
393
+ this.addError(`${stepPath}.next`, `Step "${step.next}" does not exist`, 'invalid-step-reference');
394
+ }
395
+ } else {
396
+ Object.values(step.next).forEach((nextId) => {
397
+ if (!stepIds.has(nextId)) {
398
+ this.addError(`${stepPath}.next`, `Step "${nextId}" does not exist`, 'invalid-step-reference');
399
+ }
400
+ });
401
+ }
402
+ }
403
+ });
404
+
405
+ // Check initial step
406
+ if (flow.initial && !stepIds.has(flow.initial)) {
407
+ this.addError(`${path}.initial`, `Initial step "${flow.initial}" does not exist`, 'invalid-step-reference');
408
+ }
409
+ }
410
+ });
411
+ }
412
+
413
+ /**
414
+ * Validate for duplicate IDs across all sections
415
+ */
416
+ private validateDuplicateIds(schema: PSFSchema): void {
417
+ const allIds = new Map<string, string[]>();
418
+
419
+ const addId = (id: string, type: string) => {
420
+ if (!allIds.has(id)) {
421
+ allIds.set(id, []);
422
+ }
423
+ allIds.get(id)!.push(type);
424
+ };
425
+
426
+ (schema.facts || []).forEach((f) => addId(f.id, 'fact'));
427
+ (schema.events || []).forEach((e) => addId(e.id, 'event'));
428
+ (schema.rules || []).forEach((r) => addId(r.id, 'rule'));
429
+ (schema.constraints || []).forEach((c) => addId(c.id, 'constraint'));
430
+ (schema.models || []).forEach((m) => addId(m.id, 'model'));
431
+ (schema.components || []).forEach((c) => addId(c.id, 'component'));
432
+ (schema.flows || []).forEach((f) => addId(f.id, 'flow'));
433
+
434
+ allIds.forEach((types, id) => {
435
+ if (types.length > 1) {
436
+ this.addError('', `Duplicate ID "${id}" found in: ${types.join(', ')}`, 'duplicate-id');
437
+ }
438
+ });
439
+ }
440
+
441
+ /**
442
+ * Validate references between sections
443
+ */
444
+ private validateReferences(schema: PSFSchema): void {
445
+ const modelNames = new Set((schema.models || []).map((m) => m.name));
446
+
447
+ // Check model references in field types
448
+ (schema.models || []).forEach((model, modelIndex) => {
449
+ (model.fields || []).forEach((field, fieldIndex) => {
450
+ this.checkFieldTypeReferences(
451
+ field.type,
452
+ modelNames,
453
+ `models[${modelIndex}].fields[${fieldIndex}].type`
454
+ );
455
+ });
456
+
457
+ // Check relationship references
458
+ model.relationships?.forEach((rel, relIndex) => {
459
+ if (!modelNames.has(rel.target)) {
460
+ this.addError(
461
+ `models[${modelIndex}].relationships[${relIndex}].target`,
462
+ `Target model "${rel.target}" does not exist`,
463
+ 'invalid-reference'
464
+ );
465
+ }
466
+ });
467
+ });
468
+ }
469
+
470
+ /**
471
+ * Check field type for references
472
+ */
473
+ private checkFieldTypeReferences(type: PSFFieldType, modelNames: Set<string>, path: string): void {
474
+ if (typeof type === 'object') {
475
+ if ('reference' in type) {
476
+ if (!modelNames.has(type.reference)) {
477
+ this.addWarning(path, `Reference to unknown model "${type.reference}"`, 'unknown-reference');
478
+ }
479
+ } else if ('array' in type) {
480
+ this.checkFieldTypeReferences(type.array, modelNames, path);
481
+ } else if ('object' in type) {
482
+ Object.entries(type.object).forEach(([key, field]) => {
483
+ this.checkFieldTypeReferences(field.type, modelNames, `${path}.${key}`);
484
+ });
485
+ }
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Check if string is valid JavaScript identifier
491
+ */
492
+ private isValidIdentifier(str: string): boolean {
493
+ const identifierRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
494
+ return identifierRegex.test(str) && !RESERVED_KEYWORDS.has(str);
495
+ }
496
+
497
+ /**
498
+ * Check if string is valid type name (PascalCase)
499
+ */
500
+ private isValidTypeName(str: string): boolean {
501
+ const pascalCaseRegex = /^[A-Z][a-zA-Z0-9]*$/;
502
+ return pascalCaseRegex.test(str);
503
+ }
504
+
505
+ /**
506
+ * Check if string is valid property name (camelCase)
507
+ */
508
+ private isValidPropertyName(str: string): boolean {
509
+ const camelCaseRegex = /^[a-z][a-zA-Z0-9]*$/;
510
+ return camelCaseRegex.test(str) || str.startsWith('_');
511
+ }
512
+
513
+ /**
514
+ * Add error
515
+ */
516
+ private addError(path: string, message: string, code: string): void {
517
+ this.errors.push({ path, message, code, severity: 'error' });
518
+ }
519
+
520
+ /**
521
+ * Add warning
522
+ */
523
+ private addWarning(path: string, message: string, code: string): void {
524
+ this.warnings.push({ path, message, code, severity: 'warning' });
525
+ }
526
+ }
527
+
528
+ /**
529
+ * Create a PSF validator
530
+ */
531
+ export function createPSFValidator(options?: ValidationOptions): PSFValidator {
532
+ return new PSFValidator(options);
533
+ }
534
+
535
+ /**
536
+ * Validate a PSF schema (convenience function)
537
+ */
538
+ export function validatePSFSchema(schema: PSFSchema, options?: ValidationOptions): ValidationResult {
539
+ const validator = new PSFValidator(options);
540
+ return validator.validate(schema);
541
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Documentation Generator
3
+ *
4
+ * Generates Markdown documentation from PSF schemas.
5
+ * Produces API docs, architecture diagrams, and user guides.
6
+ */
7
+ import type { PSFSchema } from '../schema-engine/psf.js';
8
+ /**
9
+ * Documentation generator options
10
+ */
11
+ export interface DocsGeneratorOptions {
12
+ /** Output directory */
13
+ outputDir?: string;
14
+ /** Include Mermaid diagrams */
15
+ includeDiagrams?: boolean;
16
+ /** Include code examples */
17
+ includeExamples?: boolean;
18
+ /** Include API reference */
19
+ includeApiReference?: boolean;
20
+ /** Include table of contents */
21
+ includeToc?: boolean;
22
+ /** Document format */
23
+ format?: 'markdown' | 'html';
24
+ }
25
+ /**
26
+ * Generated documentation file
27
+ */
28
+ export interface GeneratedDoc {
29
+ /** File path */
30
+ path: string;
31
+ /** File content */
32
+ content: string;
33
+ /** Document type */
34
+ type: 'overview' | 'api' | 'model' | 'component' | 'flow' | 'diagram' | 'index';
35
+ }
36
+ /**
37
+ * Documentation generation result
38
+ */
39
+ export interface DocsGenerationResult {
40
+ success: boolean;
41
+ files: GeneratedDoc[];
42
+ errors: string[];
43
+ }
44
+ /**
45
+ * Documentation Generator class
46
+ */
47
+ export declare class DocsGenerator {
48
+ private options;
49
+ constructor(options?: DocsGeneratorOptions);
50
+ /**
51
+ * Generate all documentation from schema
52
+ */
53
+ generate(schema: PSFSchema): DocsGenerationResult;
54
+ /**
55
+ * Generate overview document
56
+ */
57
+ private generateOverview;
58
+ /**
59
+ * Generate API reference
60
+ */
61
+ private generateApiReference;
62
+ /**
63
+ * Generate fact documentation
64
+ */
65
+ private generateFactDoc;
66
+ /**
67
+ * Generate event documentation
68
+ */
69
+ private generateEventDoc;
70
+ /**
71
+ * Generate rule documentation
72
+ */
73
+ private generateRuleDoc;
74
+ /**
75
+ * Generate constraint documentation
76
+ */
77
+ private generateConstraintDoc;
78
+ /**
79
+ * Generate models documentation
80
+ */
81
+ private generateModelsDoc;
82
+ /**
83
+ * Generate components documentation
84
+ */
85
+ private generateComponentsDoc;
86
+ /**
87
+ * Generate flows documentation
88
+ */
89
+ private generateFlowsDoc;
90
+ /**
91
+ * Generate Mermaid diagrams
92
+ */
93
+ private generateDiagrams;
94
+ /**
95
+ * Generate index document
96
+ */
97
+ private generateIndex;
98
+ /**
99
+ * Format field type for display
100
+ */
101
+ private formatFieldType;
102
+ /**
103
+ * Format field type simple (for Mermaid)
104
+ */
105
+ private formatFieldTypeSimple;
106
+ /**
107
+ * Get example value for type
108
+ */
109
+ private getExampleValue;
110
+ /**
111
+ * Sanitize ID for Mermaid
112
+ */
113
+ private sanitizeId;
114
+ }
115
+ /**
116
+ * Create a docs generator
117
+ */
118
+ export declare function createDocsGenerator(options?: DocsGeneratorOptions): DocsGenerator;
119
+ /**
120
+ * Generate documentation from PSF schema (convenience function)
121
+ */
122
+ export declare function generateDocs(schema: PSFSchema, options?: DocsGeneratorOptions): DocsGenerationResult;
123
+ //# sourceMappingURL=docs-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-generator.d.ts","sourceRoot":"","sources":["../../../core/codegen/docs-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EASV,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,OAAO,GAAE,oBAAyB;IAW9C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB;IA8CjD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8DxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsE5B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+CvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyDzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0FxB;;OAEG;IACH,OAAO,CAAC,aAAa;IA4CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAEjF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAGpG"}