@happyvertical/smrt-core 0.30.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 (631) hide show
  1. package/AGENTS.md +124 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +265 -0
  5. package/bin/smrt-prebuild.js +26 -0
  6. package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
  7. package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
  9. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
  11. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
  13. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
  15. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
  17. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
  18. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
  19. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
  21. package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
  22. package/dist/adapters/ai-usage.d.ts +23 -0
  23. package/dist/adapters/ai-usage.d.ts.map +1 -0
  24. package/dist/adapters/ai-usage.js +105 -0
  25. package/dist/adapters/ai-usage.js.map +1 -0
  26. package/dist/adapters/cost-rates.d.ts +20 -0
  27. package/dist/adapters/cost-rates.d.ts.map +1 -0
  28. package/dist/adapters/cost-rates.js +40 -0
  29. package/dist/adapters/cost-rates.js.map +1 -0
  30. package/dist/adapters/index.d.ts +19 -0
  31. package/dist/adapters/index.d.ts.map +1 -0
  32. package/dist/adapters/metrics.d.ts +111 -0
  33. package/dist/adapters/metrics.d.ts.map +1 -0
  34. package/dist/adapters/metrics.js +169 -0
  35. package/dist/adapters/metrics.js.map +1 -0
  36. package/dist/adapters/pubsub.d.ts +124 -0
  37. package/dist/adapters/pubsub.d.ts.map +1 -0
  38. package/dist/adapters/pubsub.js +121 -0
  39. package/dist/adapters/pubsub.js.map +1 -0
  40. package/dist/browser.d.ts +32 -0
  41. package/dist/browser.d.ts.map +1 -0
  42. package/dist/browser.js +68 -0
  43. package/dist/browser.js.map +1 -0
  44. package/dist/child-accessors.d.ts +27 -0
  45. package/dist/child-accessors.d.ts.map +1 -0
  46. package/dist/child-accessors.js +35 -0
  47. package/dist/child-accessors.js.map +1 -0
  48. package/dist/class.d.ts +313 -0
  49. package/dist/class.d.ts.map +1 -0
  50. package/dist/class.js +896 -0
  51. package/dist/class.js.map +1 -0
  52. package/dist/collection-cache.d.ts +110 -0
  53. package/dist/collection-cache.d.ts.map +1 -0
  54. package/dist/collection-cache.js +187 -0
  55. package/dist/collection-cache.js.map +1 -0
  56. package/dist/collection.d.ts +894 -0
  57. package/dist/collection.d.ts.map +1 -0
  58. package/dist/collection.js +1987 -0
  59. package/dist/collection.js.map +1 -0
  60. package/dist/config/global-config.d.ts +3 -0
  61. package/dist/config/global-config.d.ts.map +1 -0
  62. package/dist/config/global-config.js +19 -0
  63. package/dist/config/global-config.js.map +1 -0
  64. package/dist/config.d.ts +145 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +57 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/consumer-plugin/index.d.ts +22 -0
  69. package/dist/consumer-plugin/index.d.ts.map +1 -0
  70. package/dist/consumer-plugin/index.js +452 -0
  71. package/dist/consumer-plugin/index.js.map +1 -0
  72. package/dist/consumer-plugin.d.ts +8 -0
  73. package/dist/consumer-plugin.d.ts.map +1 -0
  74. package/dist/consumer-plugin.js +5 -0
  75. package/dist/consumer-plugin.js.map +1 -0
  76. package/dist/database.d.ts +95 -0
  77. package/dist/database.d.ts.map +1 -0
  78. package/dist/database.js +32 -0
  79. package/dist/database.js.map +1 -0
  80. package/dist/decorators/compatibility.d.ts +14 -0
  81. package/dist/decorators/compatibility.d.ts.map +1 -0
  82. package/dist/decorators/compatibility.js +111 -0
  83. package/dist/decorators/compatibility.js.map +1 -0
  84. package/dist/decorators/index.d.ts +381 -0
  85. package/dist/decorators/index.d.ts.map +1 -0
  86. package/dist/decorators/index.js +104 -0
  87. package/dist/decorators/index.js.map +1 -0
  88. package/dist/dispatch/bus.d.ts +306 -0
  89. package/dist/dispatch/bus.d.ts.map +1 -0
  90. package/dist/dispatch/bus.js +583 -0
  91. package/dist/dispatch/bus.js.map +1 -0
  92. package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
  93. package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
  94. package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
  95. package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
  96. package/dist/dispatch/collections/Dispatches.d.ts +98 -0
  97. package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
  98. package/dist/dispatch/collections/Dispatches.js +358 -0
  99. package/dist/dispatch/collections/Dispatches.js.map +1 -0
  100. package/dist/dispatch/index.d.ts +47 -0
  101. package/dist/dispatch/index.d.ts.map +1 -0
  102. package/dist/dispatch/models/Dispatch.d.ts +101 -0
  103. package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
  104. package/dist/dispatch/models/Dispatch.js +162 -0
  105. package/dist/dispatch/models/Dispatch.js.map +1 -0
  106. package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
  107. package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
  108. package/dist/dispatch/models/DispatchSubscription.js +112 -0
  109. package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
  110. package/dist/dispatch/tenant-resolver.d.ts +98 -0
  111. package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
  112. package/dist/dispatch/tenant-resolver.js +32 -0
  113. package/dist/dispatch/tenant-resolver.js.map +1 -0
  114. package/dist/dispatch/types.d.ts +149 -0
  115. package/dist/dispatch/types.d.ts.map +1 -0
  116. package/dist/embeddings/hash.d.ts +33 -0
  117. package/dist/embeddings/hash.d.ts.map +1 -0
  118. package/dist/embeddings/hash.js +37 -0
  119. package/dist/embeddings/hash.js.map +1 -0
  120. package/dist/embeddings/index.d.ts +36 -0
  121. package/dist/embeddings/index.d.ts.map +1 -0
  122. package/dist/embeddings/provider.d.ts +75 -0
  123. package/dist/embeddings/provider.d.ts.map +1 -0
  124. package/dist/embeddings/provider.js +170 -0
  125. package/dist/embeddings/provider.js.map +1 -0
  126. package/dist/embeddings/similarity.d.ts +47 -0
  127. package/dist/embeddings/similarity.d.ts.map +1 -0
  128. package/dist/embeddings/similarity.js +64 -0
  129. package/dist/embeddings/similarity.js.map +1 -0
  130. package/dist/embeddings/storage.d.ts +125 -0
  131. package/dist/embeddings/storage.d.ts.map +1 -0
  132. package/dist/embeddings/storage.js +283 -0
  133. package/dist/embeddings/storage.js.map +1 -0
  134. package/dist/embeddings/types.d.ts +250 -0
  135. package/dist/embeddings/types.d.ts.map +1 -0
  136. package/dist/errors.d.ts +363 -0
  137. package/dist/errors.d.ts.map +1 -0
  138. package/dist/errors.js +669 -0
  139. package/dist/errors.js.map +1 -0
  140. package/dist/generators/cli.d.ts +162 -0
  141. package/dist/generators/cli.d.ts.map +1 -0
  142. package/dist/generators/cli.js +462 -0
  143. package/dist/generators/cli.js.map +1 -0
  144. package/dist/generators/index.d.ts +13 -0
  145. package/dist/generators/index.d.ts.map +1 -0
  146. package/dist/generators/mcp-runtime-template.d.ts +60 -0
  147. package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
  148. package/dist/generators/mcp-runtime-template.js +509 -0
  149. package/dist/generators/mcp-runtime-template.js.map +1 -0
  150. package/dist/generators/mcp.d.ts +231 -0
  151. package/dist/generators/mcp.d.ts.map +1 -0
  152. package/dist/generators/mcp.js +1220 -0
  153. package/dist/generators/mcp.js.map +1 -0
  154. package/dist/generators/rest.d.ts +171 -0
  155. package/dist/generators/rest.d.ts.map +1 -0
  156. package/dist/generators/rest.js +591 -0
  157. package/dist/generators/rest.js.map +1 -0
  158. package/dist/generators/swagger.d.ts +21 -0
  159. package/dist/generators/swagger.d.ts.map +1 -0
  160. package/dist/generators/swagger.js +307 -0
  161. package/dist/generators/swagger.js.map +1 -0
  162. package/dist/generators/tenant-gate.d.ts +74 -0
  163. package/dist/generators/tenant-gate.d.ts.map +1 -0
  164. package/dist/generators/tenant-gate.js +15 -0
  165. package/dist/generators/tenant-gate.js.map +1 -0
  166. package/dist/generators.d.ts +8 -0
  167. package/dist/generators.d.ts.map +1 -0
  168. package/dist/generators.js +19 -0
  169. package/dist/generators.js.map +1 -0
  170. package/dist/hierarchical.d.ts +103 -0
  171. package/dist/hierarchical.d.ts.map +1 -0
  172. package/dist/hierarchical.js +184 -0
  173. package/dist/hierarchical.js.map +1 -0
  174. package/dist/index.d.ts +57 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +202 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/interceptors.d.ts +251 -0
  179. package/dist/interceptors.d.ts.map +1 -0
  180. package/dist/interceptors.js +259 -0
  181. package/dist/interceptors.js.map +1 -0
  182. package/dist/junction.d.ts +99 -0
  183. package/dist/junction.d.ts.map +1 -0
  184. package/dist/junction.js +136 -0
  185. package/dist/junction.js.map +1 -0
  186. package/dist/knowledge.d.ts +11 -0
  187. package/dist/knowledge.d.ts.map +1 -0
  188. package/dist/knowledge.js +310 -0
  189. package/dist/knowledge.js.map +1 -0
  190. package/dist/lazy-config.d.ts +160 -0
  191. package/dist/lazy-config.d.ts.map +1 -0
  192. package/dist/lazy-config.js +146 -0
  193. package/dist/lazy-config.js.map +1 -0
  194. package/dist/manifest/discover-base-classes.d.ts +78 -0
  195. package/dist/manifest/discover-base-classes.d.ts.map +1 -0
  196. package/dist/manifest/discover-base-classes.js +85 -0
  197. package/dist/manifest/discover-base-classes.js.map +1 -0
  198. package/dist/manifest/discover-smrt-packages.d.ts +48 -0
  199. package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
  200. package/dist/manifest/discover-smrt-packages.js +361 -0
  201. package/dist/manifest/discover-smrt-packages.js.map +1 -0
  202. package/dist/manifest/generator.d.ts +93 -0
  203. package/dist/manifest/generator.d.ts.map +1 -0
  204. package/dist/manifest/generator.js +380 -0
  205. package/dist/manifest/generator.js.map +1 -0
  206. package/dist/manifest/index.d.ts +16 -0
  207. package/dist/manifest/index.d.ts.map +1 -0
  208. package/dist/manifest/index.js +51 -0
  209. package/dist/manifest/index.js.map +1 -0
  210. package/dist/manifest/manager.d.ts +51 -0
  211. package/dist/manifest/manager.d.ts.map +1 -0
  212. package/dist/manifest/manager.js +89 -0
  213. package/dist/manifest/manager.js.map +1 -0
  214. package/dist/manifest/manifest-loader.d.ts +187 -0
  215. package/dist/manifest/manifest-loader.d.ts.map +1 -0
  216. package/dist/manifest/manifest-loader.js +847 -0
  217. package/dist/manifest/manifest-loader.js.map +1 -0
  218. package/dist/manifest/sources/composite.d.ts +22 -0
  219. package/dist/manifest/sources/composite.d.ts.map +1 -0
  220. package/dist/manifest/sources/composite.js +60 -0
  221. package/dist/manifest/sources/composite.js.map +1 -0
  222. package/dist/manifest/sources/embedded.d.ts +7 -0
  223. package/dist/manifest/sources/embedded.d.ts.map +1 -0
  224. package/dist/manifest/sources/embedded.js +30 -0
  225. package/dist/manifest/sources/embedded.js.map +1 -0
  226. package/dist/manifest/sources/explicit-paths.d.ts +17 -0
  227. package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
  228. package/dist/manifest/sources/explicit-paths.js +35 -0
  229. package/dist/manifest/sources/explicit-paths.js.map +1 -0
  230. package/dist/manifest/sources/fallback.d.ts +25 -0
  231. package/dist/manifest/sources/fallback.d.ts.map +1 -0
  232. package/dist/manifest/sources/fallback.js +63 -0
  233. package/dist/manifest/sources/fallback.js.map +1 -0
  234. package/dist/manifest/sources/index.d.ts +17 -0
  235. package/dist/manifest/sources/index.d.ts.map +1 -0
  236. package/dist/manifest/sources/local-test.d.ts +7 -0
  237. package/dist/manifest/sources/local-test.d.ts.map +1 -0
  238. package/dist/manifest/sources/local-test.js +21 -0
  239. package/dist/manifest/sources/local-test.js.map +1 -0
  240. package/dist/manifest/sources/static.d.ts +7 -0
  241. package/dist/manifest/sources/static.d.ts.map +1 -0
  242. package/dist/manifest/sources/static.js +19 -0
  243. package/dist/manifest/sources/static.js.map +1 -0
  244. package/dist/manifest/sources/test.d.ts +7 -0
  245. package/dist/manifest/sources/test.d.ts.map +1 -0
  246. package/dist/manifest/sources/test.js +21 -0
  247. package/dist/manifest/sources/test.js.map +1 -0
  248. package/dist/manifest/sources/types.d.ts +79 -0
  249. package/dist/manifest/sources/types.d.ts.map +1 -0
  250. package/dist/manifest/sources/types.js +61 -0
  251. package/dist/manifest/sources/types.js.map +1 -0
  252. package/dist/manifest/static-manifest.d.ts +4 -0
  253. package/dist/manifest/static-manifest.d.ts.map +1 -0
  254. package/dist/manifest/static-manifest.js +1535 -0
  255. package/dist/manifest/static-manifest.js.map +1 -0
  256. package/dist/manifest/store.d.ts +111 -0
  257. package/dist/manifest/store.d.ts.map +1 -0
  258. package/dist/manifest/store.js +431 -0
  259. package/dist/manifest/store.js.map +1 -0
  260. package/dist/manifest/test-manifest-loader.d.ts +3 -0
  261. package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
  262. package/dist/manifest/test-manifest-stub.d.ts +4 -0
  263. package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
  264. package/dist/manifest/test-manifest-stub.js +80013 -0
  265. package/dist/manifest/test-manifest-stub.js.map +1 -0
  266. package/dist/manifest.d.ts +8 -0
  267. package/dist/manifest.d.ts.map +1 -0
  268. package/dist/manifest.js +20 -0
  269. package/dist/manifest.js.map +1 -0
  270. package/dist/manifest.json +1489 -0
  271. package/dist/mcp-advisor/index.d.ts +499 -0
  272. package/dist/mcp-advisor/index.d.ts.map +1 -0
  273. package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
  274. package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
  275. package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
  276. package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
  277. package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
  278. package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
  279. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
  280. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
  281. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
  282. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
  283. package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
  284. package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
  285. package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
  286. package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
  287. package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
  288. package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
  289. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
  290. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
  291. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
  292. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
  293. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
  294. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
  295. package/dist/mcp-advisor/types.d.ts +209 -0
  296. package/dist/mcp-advisor/types.d.ts.map +1 -0
  297. package/dist/migrations/backfill-tracker.d.ts +84 -0
  298. package/dist/migrations/backfill-tracker.d.ts.map +1 -0
  299. package/dist/migrations/backfill-tracker.js +118 -0
  300. package/dist/migrations/backfill-tracker.js.map +1 -0
  301. package/dist/migrations/checksum.d.ts +43 -0
  302. package/dist/migrations/checksum.d.ts.map +1 -0
  303. package/dist/migrations/checksum.js +32 -0
  304. package/dist/migrations/checksum.js.map +1 -0
  305. package/dist/migrations/differ.d.ts +186 -0
  306. package/dist/migrations/differ.d.ts.map +1 -0
  307. package/dist/migrations/differ.js +601 -0
  308. package/dist/migrations/differ.js.map +1 -0
  309. package/dist/migrations/generator.d.ts +133 -0
  310. package/dist/migrations/generator.d.ts.map +1 -0
  311. package/dist/migrations/generator.js +328 -0
  312. package/dist/migrations/generator.js.map +1 -0
  313. package/dist/migrations/index.d.ts +20 -0
  314. package/dist/migrations/index.d.ts.map +1 -0
  315. package/dist/migrations/orchestrate.d.ts +148 -0
  316. package/dist/migrations/orchestrate.d.ts.map +1 -0
  317. package/dist/migrations/orchestrate.js +118 -0
  318. package/dist/migrations/orchestrate.js.map +1 -0
  319. package/dist/migrations/tracker.d.ts +134 -0
  320. package/dist/migrations/tracker.d.ts.map +1 -0
  321. package/dist/migrations/tracker.js +624 -0
  322. package/dist/migrations/tracker.js.map +1 -0
  323. package/dist/migrations/types.d.ts +221 -0
  324. package/dist/migrations/types.d.ts.map +1 -0
  325. package/dist/migrations.d.ts +7 -0
  326. package/dist/migrations.d.ts.map +1 -0
  327. package/dist/migrations.js +26 -0
  328. package/dist/migrations.js.map +1 -0
  329. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
  330. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
  331. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
  332. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
  333. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
  334. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  335. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
  336. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  337. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
  338. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  339. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
  340. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  341. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
  342. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
  343. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
  344. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  345. package/dist/object.d.ts +1202 -0
  346. package/dist/object.d.ts.map +1 -0
  347. package/dist/object.js +2731 -0
  348. package/dist/object.js.map +1 -0
  349. package/dist/polymorphic-association.d.ts +69 -0
  350. package/dist/polymorphic-association.d.ts.map +1 -0
  351. package/dist/polymorphic-association.js +96 -0
  352. package/dist/polymorphic-association.js.map +1 -0
  353. package/dist/prebuild/cli.d.ts +7 -0
  354. package/dist/prebuild/cli.d.ts.map +1 -0
  355. package/dist/prebuild/cli.js +29 -0
  356. package/dist/prebuild/cli.js.map +1 -0
  357. package/dist/prebuild/index.d.ts +22 -0
  358. package/dist/prebuild/index.d.ts.map +1 -0
  359. package/dist/prebuild/index.js +239 -0
  360. package/dist/prebuild/index.js.map +1 -0
  361. package/dist/prebuild.d.ts +8 -0
  362. package/dist/prebuild.d.ts.map +1 -0
  363. package/dist/prebuild.js +6 -0
  364. package/dist/prebuild.js.map +1 -0
  365. package/dist/registry/cache-config.d.ts +13 -0
  366. package/dist/registry/cache-config.d.ts.map +1 -0
  367. package/dist/registry/cache-config.js +17 -0
  368. package/dist/registry/cache-config.js.map +1 -0
  369. package/dist/registry/class-registration.d.ts +31 -0
  370. package/dist/registry/class-registration.d.ts.map +1 -0
  371. package/dist/registry/class-registration.js +1074 -0
  372. package/dist/registry/class-registration.js.map +1 -0
  373. package/dist/registry/collection-resolution.d.ts +45 -0
  374. package/dist/registry/collection-resolution.d.ts.map +1 -0
  375. package/dist/registry/collection-resolution.js +121 -0
  376. package/dist/registry/collection-resolution.js.map +1 -0
  377. package/dist/registry/collision-policy.d.ts +179 -0
  378. package/dist/registry/collision-policy.d.ts.map +1 -0
  379. package/dist/registry/collision-policy.js +153 -0
  380. package/dist/registry/collision-policy.js.map +1 -0
  381. package/dist/registry/diagnostics.d.ts +58 -0
  382. package/dist/registry/diagnostics.d.ts.map +1 -0
  383. package/dist/registry/diagnostics.js +54 -0
  384. package/dist/registry/diagnostics.js.map +1 -0
  385. package/dist/registry/embedding-manager.d.ts +23 -0
  386. package/dist/registry/embedding-manager.d.ts.map +1 -0
  387. package/dist/registry/embedding-manager.js +62 -0
  388. package/dist/registry/embedding-manager.js.map +1 -0
  389. package/dist/registry/index.d.ts +13 -0
  390. package/dist/registry/index.d.ts.map +1 -0
  391. package/dist/registry/inheritance-resolver.d.ts +13 -0
  392. package/dist/registry/inheritance-resolver.d.ts.map +1 -0
  393. package/dist/registry/inheritance-resolver.js +244 -0
  394. package/dist/registry/inheritance-resolver.js.map +1 -0
  395. package/dist/registry/manifest-field-merge.d.ts +4 -0
  396. package/dist/registry/manifest-field-merge.d.ts.map +1 -0
  397. package/dist/registry/manifest-field-merge.js +82 -0
  398. package/dist/registry/manifest-field-merge.js.map +1 -0
  399. package/dist/registry/name-resolver.d.ts +102 -0
  400. package/dist/registry/name-resolver.d.ts.map +1 -0
  401. package/dist/registry/name-resolver.js +241 -0
  402. package/dist/registry/name-resolver.js.map +1 -0
  403. package/dist/registry/relationship-graph.d.ts +16 -0
  404. package/dist/registry/relationship-graph.d.ts.map +1 -0
  405. package/dist/registry/relationship-graph.js +79 -0
  406. package/dist/registry/relationship-graph.js.map +1 -0
  407. package/dist/registry/schema-builder.d.ts +113 -0
  408. package/dist/registry/schema-builder.d.ts.map +1 -0
  409. package/dist/registry/schema-builder.js +474 -0
  410. package/dist/registry/schema-builder.js.map +1 -0
  411. package/dist/registry/shared-state.d.ts +62 -0
  412. package/dist/registry/shared-state.d.ts.map +1 -0
  413. package/dist/registry/shared-state.js +135 -0
  414. package/dist/registry/shared-state.js.map +1 -0
  415. package/dist/registry/types.d.ts +667 -0
  416. package/dist/registry/types.d.ts.map +1 -0
  417. package/dist/registry/validator.d.ts +13 -0
  418. package/dist/registry/validator.d.ts.map +1 -0
  419. package/dist/registry/validator.js +138 -0
  420. package/dist/registry/validator.js.map +1 -0
  421. package/dist/registry.d.ts +1358 -0
  422. package/dist/registry.d.ts.map +1 -0
  423. package/dist/registry.js +2301 -0
  424. package/dist/registry.js.map +1 -0
  425. package/dist/runtime/client.d.ts +34 -0
  426. package/dist/runtime/client.d.ts.map +1 -0
  427. package/dist/runtime/client.js +104 -0
  428. package/dist/runtime/client.js.map +1 -0
  429. package/dist/runtime/index.d.ts +10 -0
  430. package/dist/runtime/index.d.ts.map +1 -0
  431. package/dist/runtime/mcp.d.ts +47 -0
  432. package/dist/runtime/mcp.d.ts.map +1 -0
  433. package/dist/runtime/mcp.js +72 -0
  434. package/dist/runtime/mcp.js.map +1 -0
  435. package/dist/runtime/server.d.ts +92 -0
  436. package/dist/runtime/server.d.ts.map +1 -0
  437. package/dist/runtime/server.js +390 -0
  438. package/dist/runtime/server.js.map +1 -0
  439. package/dist/runtime/types.d.ts +58 -0
  440. package/dist/runtime/types.d.ts.map +1 -0
  441. package/dist/runtime.d.ts +8 -0
  442. package/dist/runtime.d.ts.map +1 -0
  443. package/dist/runtime.js +10 -0
  444. package/dist/runtime.js.map +1 -0
  445. package/dist/scanner/import-scanner.d.ts +7 -0
  446. package/dist/scanner/import-scanner.d.ts.map +1 -0
  447. package/dist/scanner/index.d.ts +12 -0
  448. package/dist/scanner/index.d.ts.map +1 -0
  449. package/dist/scanner/manifest-generator.d.ts +304 -0
  450. package/dist/scanner/manifest-generator.d.ts.map +1 -0
  451. package/dist/scanner/manifest-generator.js +1707 -0
  452. package/dist/scanner/manifest-generator.js.map +1 -0
  453. package/dist/scanner/test-file-patterns.d.ts +18 -0
  454. package/dist/scanner/test-file-patterns.d.ts.map +1 -0
  455. package/dist/scanner/test-file-patterns.js +16 -0
  456. package/dist/scanner/test-file-patterns.js.map +1 -0
  457. package/dist/scanner/types.d.ts +313 -0
  458. package/dist/scanner/types.d.ts.map +1 -0
  459. package/dist/scanner/types.js +2 -0
  460. package/dist/scanner/types.js.map +1 -0
  461. package/dist/scanner.d.ts +6 -0
  462. package/dist/scanner.d.ts.map +1 -0
  463. package/dist/scanner.js +6 -0
  464. package/dist/scanner.js.map +1 -0
  465. package/dist/schema/code-generator.d.ts +53 -0
  466. package/dist/schema/code-generator.d.ts.map +1 -0
  467. package/dist/schema/ddl/base-strategy.d.ts +80 -0
  468. package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
  469. package/dist/schema/ddl/base-strategy.js +240 -0
  470. package/dist/schema/ddl/base-strategy.js.map +1 -0
  471. package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
  472. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
  473. package/dist/schema/ddl/duckdb-strategy.js +74 -0
  474. package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
  475. package/dist/schema/ddl/index.d.ts +53 -0
  476. package/dist/schema/ddl/index.d.ts.map +1 -0
  477. package/dist/schema/ddl/index.js +80 -0
  478. package/dist/schema/ddl/index.js.map +1 -0
  479. package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
  480. package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
  481. package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
  482. package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
  483. package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
  484. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
  485. package/dist/schema/ddl/postgres-strategy.js +102 -0
  486. package/dist/schema/ddl/postgres-strategy.js.map +1 -0
  487. package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
  488. package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
  489. package/dist/schema/ddl/sqlite-strategy.js +74 -0
  490. package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
  491. package/dist/schema/ddl/types.d.ts +114 -0
  492. package/dist/schema/ddl/types.d.ts.map +1 -0
  493. package/dist/schema/generator.d.ts +176 -0
  494. package/dist/schema/generator.d.ts.map +1 -0
  495. package/dist/schema/generator.js +1076 -0
  496. package/dist/schema/generator.js.map +1 -0
  497. package/dist/schema/index-utils.d.ts +19 -0
  498. package/dist/schema/index-utils.d.ts.map +1 -0
  499. package/dist/schema/index-utils.js +32 -0
  500. package/dist/schema/index-utils.js.map +1 -0
  501. package/dist/schema/index.d.ts +13 -0
  502. package/dist/schema/index.d.ts.map +1 -0
  503. package/dist/schema/override-system.d.ts +43 -0
  504. package/dist/schema/override-system.d.ts.map +1 -0
  505. package/dist/schema/schema-aggregator.d.ts +112 -0
  506. package/dist/schema/schema-aggregator.d.ts.map +1 -0
  507. package/dist/schema/schema-manager.d.ts +95 -0
  508. package/dist/schema/schema-manager.d.ts.map +1 -0
  509. package/dist/schema/schema-manager.js +283 -0
  510. package/dist/schema/schema-manager.js.map +1 -0
  511. package/dist/schema/sql-identifiers.d.ts +107 -0
  512. package/dist/schema/sql-identifiers.d.ts.map +1 -0
  513. package/dist/schema/sql-identifiers.js +190 -0
  514. package/dist/schema/sql-identifiers.js.map +1 -0
  515. package/dist/schema/table-verifier.d.ts +10 -0
  516. package/dist/schema/table-verifier.d.ts.map +1 -0
  517. package/dist/schema/table-verifier.js +37 -0
  518. package/dist/schema/table-verifier.js.map +1 -0
  519. package/dist/schema/types.d.ts +241 -0
  520. package/dist/schema/types.d.ts.map +1 -0
  521. package/dist/schema/utils.d.ts +32 -0
  522. package/dist/schema/utils.d.ts.map +1 -0
  523. package/dist/schema/utils.js +134 -0
  524. package/dist/schema/utils.js.map +1 -0
  525. package/dist/scripts/create-wrappers.js +89 -0
  526. package/dist/scripts/generate-manifest.js +155 -0
  527. package/dist/scripts/generate-test-manifest.js +77 -0
  528. package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
  529. package/dist/scripts/prepack.js +49 -0
  530. package/dist/signals/bus.d.ts +64 -0
  531. package/dist/signals/bus.d.ts.map +1 -0
  532. package/dist/signals/bus.js +102 -0
  533. package/dist/signals/bus.js.map +1 -0
  534. package/dist/signals/index.d.ts +11 -0
  535. package/dist/signals/index.d.ts.map +1 -0
  536. package/dist/signals/sanitizer.d.ts +54 -0
  537. package/dist/signals/sanitizer.d.ts.map +1 -0
  538. package/dist/signals/sanitizer.js +111 -0
  539. package/dist/signals/sanitizer.js.map +1 -0
  540. package/dist/smrt-knowledge.json +335 -0
  541. package/dist/system/compatibility.d.ts +8 -0
  542. package/dist/system/compatibility.d.ts.map +1 -0
  543. package/dist/system/compatibility.js +409 -0
  544. package/dist/system/compatibility.js.map +1 -0
  545. package/dist/system/index.d.ts +9 -0
  546. package/dist/system/index.d.ts.map +1 -0
  547. package/dist/system/schema.d.ts +69 -0
  548. package/dist/system/schema.d.ts.map +1 -0
  549. package/dist/system/schema.js +271 -0
  550. package/dist/system/schema.js.map +1 -0
  551. package/dist/system/types.d.ts +135 -0
  552. package/dist/system/types.d.ts.map +1 -0
  553. package/dist/system-fields.d.ts +44 -0
  554. package/dist/system-fields.d.ts.map +1 -0
  555. package/dist/system-fields.js +55 -0
  556. package/dist/system-fields.js.map +1 -0
  557. package/dist/table-cache.d.ts +28 -0
  558. package/dist/table-cache.d.ts.map +1 -0
  559. package/dist/table-cache.js +21 -0
  560. package/dist/table-cache.js.map +1 -0
  561. package/dist/test-utils.d.ts +140 -0
  562. package/dist/test-utils.d.ts.map +1 -0
  563. package/dist/testing/database.d.ts +73 -0
  564. package/dist/testing/database.d.ts.map +1 -0
  565. package/dist/testing/database.js +204 -0
  566. package/dist/testing/database.js.map +1 -0
  567. package/dist/testing/index.d.ts +21 -0
  568. package/dist/testing/index.d.ts.map +1 -0
  569. package/dist/testing.d.ts +6 -0
  570. package/dist/testing.d.ts.map +1 -0
  571. package/dist/testing.js +5 -0
  572. package/dist/testing.js.map +1 -0
  573. package/dist/tools/index.d.ts +8 -0
  574. package/dist/tools/index.d.ts.map +1 -0
  575. package/dist/tools/tool-executor.d.ts +101 -0
  576. package/dist/tools/tool-executor.d.ts.map +1 -0
  577. package/dist/tools/tool-executor.js +142 -0
  578. package/dist/tools/tool-executor.js.map +1 -0
  579. package/dist/tools/tool-generator.d.ts +54 -0
  580. package/dist/tools/tool-generator.d.ts.map +1 -0
  581. package/dist/tools/tool-generator.js +121 -0
  582. package/dist/tools/tool-generator.js.map +1 -0
  583. package/dist/utils/chunk.d.ts +32 -0
  584. package/dist/utils/chunk.d.ts.map +1 -0
  585. package/dist/utils/chunk.js +14 -0
  586. package/dist/utils/chunk.js.map +1 -0
  587. package/dist/utils/import-workspace-module.d.ts +8 -0
  588. package/dist/utils/import-workspace-module.d.ts.map +1 -0
  589. package/dist/utils/import-workspace-module.js +81 -0
  590. package/dist/utils/import-workspace-module.js.map +1 -0
  591. package/dist/utils/json.d.ts +102 -0
  592. package/dist/utils/json.d.ts.map +1 -0
  593. package/dist/utils/json.js +43 -0
  594. package/dist/utils/json.js.map +1 -0
  595. package/dist/utils/lru-cache.d.ts +69 -0
  596. package/dist/utils/lru-cache.d.ts.map +1 -0
  597. package/dist/utils/lru-cache.js +100 -0
  598. package/dist/utils/lru-cache.js.map +1 -0
  599. package/dist/utils/naming.d.ts +16 -0
  600. package/dist/utils/naming.d.ts.map +1 -0
  601. package/dist/utils/naming.js +23 -0
  602. package/dist/utils/naming.js.map +1 -0
  603. package/dist/utils/qualified-names.d.ts +122 -0
  604. package/dist/utils/qualified-names.d.ts.map +1 -0
  605. package/dist/utils/qualified-names.js +82 -0
  606. package/dist/utils/qualified-names.js.map +1 -0
  607. package/dist/utils/scanner-module.d.ts +37 -0
  608. package/dist/utils/scanner-module.d.ts.map +1 -0
  609. package/dist/utils.d.ts +177 -0
  610. package/dist/utils.d.ts.map +1 -0
  611. package/dist/utils.js +185 -0
  612. package/dist/utils.js.map +1 -0
  613. package/dist/vite-plugin/import-build-aware.d.ts +68 -0
  614. package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
  615. package/dist/vite-plugin/import-build-aware.js +72 -0
  616. package/dist/vite-plugin/import-build-aware.js.map +1 -0
  617. package/dist/vite-plugin/index.d.ts +59 -0
  618. package/dist/vite-plugin/index.d.ts.map +1 -0
  619. package/dist/vite-plugin/index.js +1400 -0
  620. package/dist/vite-plugin/index.js.map +1 -0
  621. package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
  622. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
  623. package/dist/vite-plugin/sveltekit-generator.js +1375 -0
  624. package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
  625. package/dist/vite-plugin/templates/default-ui.ts +432 -0
  626. package/dist/vite-plugin/templates/default.html +206 -0
  627. package/dist/vite-plugin.d.ts +8 -0
  628. package/dist/vite-plugin.d.ts.map +1 -0
  629. package/dist/vite-plugin.js +11 -0
  630. package/dist/vite-plugin.js.map +1 -0
  631. package/package.json +208 -0
@@ -0,0 +1,1076 @@
1
+ import { createHash } from "node:crypto";
2
+ import { classnameToTablename } from "../utils/naming.js";
3
+ import { getDDLStrategy } from "./ddl/index.js";
4
+ import { quoteIdentifier, quoteStringLiteral, formatDefaultValue } from "./sql-identifiers.js";
5
+ class SchemaGenerator {
6
+ /**
7
+ * Generate schema definition from SMRT object definition
8
+ */
9
+ generateSchema(objectDef) {
10
+ const tableName = this.getTableName(objectDef);
11
+ const columns = this.generateColumns(
12
+ objectDef.fields,
13
+ objectDef.decoratorConfig
14
+ );
15
+ const indexes = this.generateIndexes(objectDef, columns);
16
+ const triggers = this.generateTriggers(objectDef, tableName);
17
+ const foreignKeys = this.extractForeignKeys(columns);
18
+ const dependencies = this.extractDependencies(objectDef, foreignKeys);
19
+ const version = this.generateVersion(objectDef);
20
+ return {
21
+ tableName,
22
+ columns,
23
+ indexes,
24
+ triggers,
25
+ foreignKeys,
26
+ dependencies,
27
+ version,
28
+ packageName: this.extractPackageName(objectDef.filePath),
29
+ baseClass: objectDef.extends
30
+ };
31
+ }
32
+ /**
33
+ * Convert field type to SQL data type
34
+ */
35
+ mapFieldTypeToSQL(fieldType) {
36
+ switch (fieldType) {
37
+ case "text":
38
+ return "TEXT";
39
+ case "integer":
40
+ return "INTEGER";
41
+ case "decimal":
42
+ return "REAL";
43
+ case "boolean":
44
+ return "BOOLEAN";
45
+ case "datetime":
46
+ return "TIMESTAMP";
47
+ case "json":
48
+ return "JSON";
49
+ case "foreignKey":
50
+ return "UUID";
51
+ // Foreign keys default to UUID, then same-package refs can be reconciled to target idType
52
+ case "crossPackageRef":
53
+ return "UUID";
54
+ // Cross-package refs are UUID ids with no DDL FK constraint
55
+ default:
56
+ return "TEXT";
57
+ }
58
+ }
59
+ getIdColumnType(config) {
60
+ return config?.idType === "text" ? "TEXT" : "UUID";
61
+ }
62
+ getRelationshipColumnType(field) {
63
+ if (field?._meta?.sqlType) {
64
+ return String(field._meta.sqlType).toUpperCase();
65
+ }
66
+ if (field?.type === "crossPackageRef" && (field._meta?.idType === "text" || field.idType === "text")) {
67
+ return "TEXT";
68
+ }
69
+ return this.mapFieldTypeToSQL(field?.type || "text");
70
+ }
71
+ getReferenceKind(field) {
72
+ if (field?.__tenancy?.isTenantIdField || field?._meta?.__tenancy?.isTenantIdField) {
73
+ return "tenantId";
74
+ }
75
+ if (field?.type === "foreignKey") {
76
+ return "foreignKey";
77
+ }
78
+ if (field?.type === "crossPackageRef") {
79
+ return "crossPackageRef";
80
+ }
81
+ return void 0;
82
+ }
83
+ shouldEmitDefault(field, defaultValue) {
84
+ return !(this.getReferenceKind(field) === "tenantId" && this.getRelationshipColumnType(field) === "UUID" && defaultValue === "");
85
+ }
86
+ getRegistryTargetIdColumnType(relatedName, registry) {
87
+ if (!relatedName || !registry?.getConfig) {
88
+ return void 0;
89
+ }
90
+ const targetName = relatedName.split(".")[0];
91
+ const targetNames = [targetName];
92
+ const stiBase = registry.getSTIBase?.(targetName);
93
+ if (stiBase && !targetNames.includes(stiBase)) {
94
+ targetNames.push(stiBase);
95
+ }
96
+ for (const name of targetNames) {
97
+ const idType = registry.getConfig(name)?.idType;
98
+ if (idType === "text") {
99
+ return "TEXT";
100
+ }
101
+ if (idType === "uuid") {
102
+ return "UUID";
103
+ }
104
+ }
105
+ return void 0;
106
+ }
107
+ reconcileRegistryForeignKeyColumnTypes(columns, fields, registry) {
108
+ if (!registry?.getConfig) {
109
+ return;
110
+ }
111
+ for (const [fieldName, field] of fields.entries()) {
112
+ if (field.type !== "foreignKey" || field._meta?.sqlType) {
113
+ continue;
114
+ }
115
+ const targetIdType = this.getRegistryTargetIdColumnType(
116
+ field.related,
117
+ registry
118
+ );
119
+ if (!targetIdType) {
120
+ continue;
121
+ }
122
+ const columnName = this.toSnakeCase(fieldName);
123
+ if (columns[columnName]) {
124
+ columns[columnName] = {
125
+ ...columns[columnName],
126
+ type: targetIdType
127
+ };
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Generate column definitions
133
+ */
134
+ generateColumns(fields, config) {
135
+ const columns = {};
136
+ columns.id = {
137
+ type: this.getIdColumnType(config),
138
+ primaryKey: true,
139
+ referenceKind: "id",
140
+ notNull: true,
141
+ description: "Primary identifier"
142
+ };
143
+ columns.created_at = {
144
+ type: "TIMESTAMP",
145
+ notNull: true,
146
+ defaultValue: "current_timestamp",
147
+ description: "Creation timestamp"
148
+ };
149
+ columns.updated_at = {
150
+ type: "TIMESTAMP",
151
+ notNull: true,
152
+ defaultValue: "current_timestamp",
153
+ description: "Last update timestamp"
154
+ };
155
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
156
+ if (fieldName === "id" || fieldName === "created_at" || fieldName === "updated_at") {
157
+ continue;
158
+ }
159
+ if (fieldDef.transient || fieldDef._meta?.transient) {
160
+ continue;
161
+ }
162
+ if (fieldDef.type === "oneToMany" || fieldDef.type === "manyToMany") {
163
+ continue;
164
+ }
165
+ if (fieldDef.type === "meta") {
166
+ continue;
167
+ }
168
+ const column = {
169
+ type: this.getRelationshipColumnType(fieldDef),
170
+ referenceKind: this.getReferenceKind(fieldDef),
171
+ // If _meta.nullable is true, the field can be null regardless of required
172
+ // This handles field helpers like text({ required: true, nullable: true })
173
+ notNull: fieldDef._meta?.nullable ? false : fieldDef.required || false,
174
+ unique: fieldDef._meta?.unique || false,
175
+ description: fieldDef.description
176
+ };
177
+ if (fieldDef.default !== void 0 && this.shouldEmitDefault(fieldDef, fieldDef.default)) {
178
+ column.defaultValue = fieldDef.default;
179
+ }
180
+ if (fieldDef.type === "foreignKey" && fieldDef.related) {
181
+ const [table, columnName = "id"] = fieldDef.related.split(".");
182
+ column.foreignKey = {
183
+ table,
184
+ column: columnName,
185
+ onDelete: "CASCADE",
186
+ // Default behavior
187
+ onUpdate: "CASCADE"
188
+ };
189
+ }
190
+ if (fieldName === "slug" || fieldName === "email") {
191
+ column.unique = true;
192
+ }
193
+ columns[fieldName] = column;
194
+ }
195
+ return columns;
196
+ }
197
+ /**
198
+ * Generate index definitions
199
+ */
200
+ generateIndexes(objectDef, columns) {
201
+ const indexes = [];
202
+ const tableName = this.getTableName(objectDef);
203
+ for (const [columnName, columnDef] of Object.entries(columns)) {
204
+ if (columnDef.foreignKey) {
205
+ indexes.push({
206
+ name: `idx_${tableName}_${columnName}`,
207
+ columns: [columnName],
208
+ description: `Index for foreign key ${columnName}`
209
+ });
210
+ }
211
+ }
212
+ indexes.push({
213
+ name: `idx_${tableName}_updated_at`,
214
+ columns: ["updated_at"],
215
+ description: "Index for timestamp queries"
216
+ });
217
+ for (const [columnName, columnDef] of Object.entries(columns)) {
218
+ if (columnDef.unique && !columnDef.primaryKey) {
219
+ indexes.push({
220
+ name: `idx_${tableName}_${columnName}_unique`,
221
+ columns: [columnName],
222
+ unique: true,
223
+ description: `Unique index for ${columnName}`
224
+ });
225
+ }
226
+ }
227
+ return indexes;
228
+ }
229
+ /**
230
+ * Generate trigger definitions for automatic timestamp updates
231
+ */
232
+ generateTriggers(_objectDef, tableName) {
233
+ return [
234
+ {
235
+ name: `trg_${tableName}_updated_at`,
236
+ when: "BEFORE",
237
+ event: "UPDATE",
238
+ body: `UPDATE ${quoteIdentifier(tableName)} SET "updated_at" = current_timestamp WHERE "id" = NEW."id";`,
239
+ description: "Automatically update updated_at timestamp"
240
+ }
241
+ ];
242
+ }
243
+ /**
244
+ * Extract foreign key definitions
245
+ */
246
+ extractForeignKeys(columns) {
247
+ const foreignKeys = [];
248
+ for (const [columnName, columnDef] of Object.entries(columns)) {
249
+ if (columnDef.foreignKey) {
250
+ foreignKeys.push({
251
+ column: columnName,
252
+ referencesTable: columnDef.foreignKey.table,
253
+ referencesColumn: columnDef.foreignKey.column,
254
+ onDelete: columnDef.foreignKey.onDelete,
255
+ onUpdate: columnDef.foreignKey.onUpdate
256
+ });
257
+ }
258
+ }
259
+ return foreignKeys;
260
+ }
261
+ /**
262
+ * Extract schema dependencies from foreign keys and inheritance
263
+ */
264
+ extractDependencies(objectDef, foreignKeys) {
265
+ const dependencies = /* @__PURE__ */ new Set();
266
+ for (const fk of foreignKeys) {
267
+ dependencies.add(fk.referencesTable);
268
+ }
269
+ if (objectDef.extends && objectDef.extends !== "SmrtObject" && objectDef.extends !== "SmrtCollection") {
270
+ dependencies.add(this.classNameToTableName(objectDef.extends));
271
+ }
272
+ return Array.from(dependencies);
273
+ }
274
+ /**
275
+ * Generate version hash for schema
276
+ */
277
+ generateVersion(objectDef) {
278
+ const content = JSON.stringify({
279
+ className: objectDef.className,
280
+ fields: objectDef.fields,
281
+ extends: objectDef.extends
282
+ });
283
+ return createHash("sha256").update(content).digest("hex").substring(0, 8);
284
+ }
285
+ /**
286
+ * Get table name from object definition
287
+ */
288
+ getTableName(objectDef) {
289
+ return this.classNameToTableName(objectDef.className);
290
+ }
291
+ /**
292
+ * Convert class name to table name (camelCase to snake_case, pluralized)
293
+ */
294
+ classNameToTableName(className) {
295
+ return classnameToTablename(className);
296
+ }
297
+ /**
298
+ * Extract package name from file path
299
+ */
300
+ extractPackageName(filePath) {
301
+ const match = filePath.match(/packages\/([^/]+)/);
302
+ return match ? match[1] : "unknown";
303
+ }
304
+ /**
305
+ * Generate schema definition from ObjectRegistry fields (runtime)
306
+ *
307
+ * This method builds a SchemaDefinition from ObjectRegistry cached fields,
308
+ * enabling schema generation from decorated classes at runtime.
309
+ *
310
+ * @param className - Class name to look up in ObjectRegistry
311
+ * @param tableName - Table name (from SMRT_TABLE_NAME or derived)
312
+ * @param fields - Map of Field definitions from ObjectRegistry
313
+ * @returns Schema definition object
314
+ */
315
+ generateSchemaFromRegistry(className, tableName, fields, config) {
316
+ const columns = {};
317
+ let hasCustomPK = false;
318
+ for (const [_fieldName, field] of fields.entries()) {
319
+ if (field._meta?.primaryKey) {
320
+ hasCustomPK = true;
321
+ break;
322
+ }
323
+ }
324
+ if (!hasCustomPK) {
325
+ columns.id = {
326
+ type: this.getIdColumnType(config),
327
+ primaryKey: true,
328
+ referenceKind: "id",
329
+ notNull: true,
330
+ description: "Primary identifier"
331
+ };
332
+ columns.slug = {
333
+ type: "TEXT",
334
+ notNull: true,
335
+ description: "URL-friendly identifier"
336
+ };
337
+ columns.context = {
338
+ type: "TEXT",
339
+ notNull: true,
340
+ defaultValue: "",
341
+ description: "Context for slug scoping"
342
+ };
343
+ }
344
+ let hasCreatedAt = false;
345
+ let hasUpdatedAt = false;
346
+ const indexedColumns = /* @__PURE__ */ new Set();
347
+ for (const [fieldName, field] of fields.entries()) {
348
+ if (field.transient || field._meta?.transient) {
349
+ continue;
350
+ }
351
+ const isDefaultSmrtColumn = fieldName === "id" || fieldName === "slug" || fieldName === "context";
352
+ if (isDefaultSmrtColumn && (!hasCustomPK || field._meta?.__smrtSystemField === true)) {
353
+ continue;
354
+ }
355
+ if (fieldName === "created_at" || fieldName === "createdAt") {
356
+ if (hasCreatedAt) continue;
357
+ hasCreatedAt = true;
358
+ columns.created_at = {
359
+ type: "TIMESTAMP",
360
+ notNull: true,
361
+ defaultValue: "current_timestamp",
362
+ description: "Creation timestamp"
363
+ };
364
+ continue;
365
+ }
366
+ if (fieldName === "updated_at" || fieldName === "updatedAt") {
367
+ if (hasUpdatedAt) continue;
368
+ hasUpdatedAt = true;
369
+ columns.updated_at = {
370
+ type: "TIMESTAMP",
371
+ notNull: true,
372
+ defaultValue: "current_timestamp",
373
+ description: "Last update timestamp"
374
+ };
375
+ continue;
376
+ }
377
+ if (field.type === "oneToMany" || field.type === "manyToMany") {
378
+ continue;
379
+ }
380
+ if (field.type === "meta") {
381
+ continue;
382
+ }
383
+ const sqlType = this.getRelationshipColumnType(field);
384
+ const columnDef = {
385
+ type: sqlType,
386
+ referenceKind: this.getReferenceKind(field),
387
+ // If _meta.nullable is true, the field can be null regardless of required
388
+ notNull: field._meta?.nullable ? false : field._meta?.required || false,
389
+ primaryKey: field._meta?.primaryKey || false,
390
+ unique: field._meta?.unique || false,
391
+ description: field._meta?.description
392
+ };
393
+ if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) {
394
+ columnDef.defaultValue = field._meta.default;
395
+ }
396
+ if (field.type === "foreignKey") {
397
+ const relatedName = field.related;
398
+ const onDeleteAction = field._meta?.onDelete;
399
+ if (relatedName) {
400
+ columnDef.foreignKey = {
401
+ table: this.classNameToTableName(relatedName),
402
+ column: "id",
403
+ onDelete: onDeleteAction || "CASCADE",
404
+ onUpdate: "CASCADE"
405
+ };
406
+ }
407
+ }
408
+ const isIndexed = field._meta?.indexed === true || field.indexed === true;
409
+ if (isIndexed && !columnDef.foreignKey && !columnDef.unique && !columnDef.primaryKey) {
410
+ indexedColumns.add(this.toSnakeCase(fieldName));
411
+ }
412
+ columns[this.toSnakeCase(fieldName)] = columnDef;
413
+ }
414
+ if (!hasCreatedAt) {
415
+ columns.created_at = {
416
+ type: "TIMESTAMP",
417
+ notNull: true,
418
+ defaultValue: "current_timestamp",
419
+ description: "Creation timestamp"
420
+ };
421
+ }
422
+ if (!hasUpdatedAt) {
423
+ columns.updated_at = {
424
+ type: "TIMESTAMP",
425
+ notNull: true,
426
+ defaultValue: "current_timestamp",
427
+ description: "Last update timestamp"
428
+ };
429
+ }
430
+ this.reconcileRegistryForeignKeyColumnTypes(
431
+ columns,
432
+ fields,
433
+ config?.registry
434
+ );
435
+ const indexes = [];
436
+ if (!hasCustomPK) {
437
+ indexes.push({
438
+ name: `${tableName}_id_idx`,
439
+ columns: ["id"],
440
+ description: "Primary key index"
441
+ });
442
+ const conflictColumns = config?.conflictColumns || ["slug", "context"];
443
+ const conflictIndexName = conflictColumns.length > 2 ? `${tableName}_${conflictColumns.slice(0, 2).join("_")}_idx` : `${tableName}_${conflictColumns.join("_")}_idx`;
444
+ indexes.push({
445
+ name: conflictIndexName,
446
+ columns: conflictColumns,
447
+ unique: true,
448
+ description: `Unique conflict index for ${className}`
449
+ });
450
+ } else {
451
+ for (const [colName, colDef] of Object.entries(columns)) {
452
+ if (colDef.primaryKey) {
453
+ indexes.push({
454
+ name: `${tableName}_${colName}_idx`,
455
+ columns: [colName],
456
+ description: `Primary key index`
457
+ });
458
+ break;
459
+ }
460
+ }
461
+ }
462
+ for (const [colName, colDef] of Object.entries(columns)) {
463
+ if (colDef.foreignKey) {
464
+ indexes.push({
465
+ name: `idx_${tableName}_${colName}`,
466
+ columns: [colName],
467
+ description: `Foreign key index for ${colName}`
468
+ });
469
+ }
470
+ }
471
+ for (const colName of indexedColumns) {
472
+ indexes.push({
473
+ name: `${tableName}_${colName}_idx`,
474
+ columns: [colName],
475
+ description: `Index for ${colName}`
476
+ });
477
+ }
478
+ return {
479
+ tableName,
480
+ columns,
481
+ indexes,
482
+ triggers: [],
483
+ foreignKeys: this.extractForeignKeys(columns),
484
+ dependencies: [],
485
+ version: createHash("sha256").update(JSON.stringify(columns)).digest("hex").substring(0, 8),
486
+ packageName: "runtime",
487
+ baseClass: "SmrtObject"
488
+ };
489
+ }
490
+ /**
491
+ * Generate STI (Single Table Inheritance) schema from ObjectRegistry fields
492
+ *
493
+ * Creates a shared table for an inheritance hierarchy with:
494
+ * - _meta_type: Discriminator column to identify class type
495
+ * - _meta_data: JSON column for flexible field storage
496
+ * - Union of all FK columns from descendants (all nullable)
497
+ * - Partial indexes for FK columns (filtered by _meta_type)
498
+ *
499
+ * @param baseClassName - Base class name for the STI hierarchy
500
+ * @param tableName - Shared table name (from base class)
501
+ * @param fields - Map of Field definitions from base class
502
+ * @returns Schema definition object for STI table
503
+ * @example
504
+ * ```typescript
505
+ * @smrt({ tableStrategy: 'sti' })
506
+ * class Event extends SmrtObject {
507
+ * title: string = '';
508
+ * }
509
+ *
510
+ * @smrt()
511
+ * class Meeting extends Event {
512
+ * roomId = foreignKey(Room);
513
+ * }
514
+ *
515
+ * // Generates single table 'events' with:
516
+ * // - title (from Event)
517
+ * // - room_id (from Meeting, nullable)
518
+ * // - _meta_type TEXT NOT NULL (discriminator)
519
+ * // - _meta_data JSON (flexible storage)
520
+ * ```
521
+ */
522
+ async generateSTISchemaFromRegistry(baseClassName, tableName, _fields, config) {
523
+ const ObjectRegistry = config?.registry ?? (await import("../registry.js")).ObjectRegistry;
524
+ const columns = {};
525
+ columns.id = {
526
+ type: this.getIdColumnType(config),
527
+ primaryKey: true,
528
+ referenceKind: "id",
529
+ notNull: true,
530
+ description: "Primary identifier"
531
+ };
532
+ columns.slug = {
533
+ type: "TEXT",
534
+ notNull: true,
535
+ description: "URL-friendly identifier"
536
+ };
537
+ columns.context = {
538
+ type: "TEXT",
539
+ notNull: true,
540
+ defaultValue: "",
541
+ description: "Context for slug scoping"
542
+ };
543
+ columns._meta_type = {
544
+ type: "TEXT",
545
+ notNull: true,
546
+ description: "Class type discriminator for STI"
547
+ };
548
+ columns._meta_data = {
549
+ type: "JSON",
550
+ notNull: false,
551
+ description: "Flexible JSON storage for meta() fields"
552
+ };
553
+ let hasCreatedAt = false;
554
+ let hasUpdatedAt = false;
555
+ const descendants = ObjectRegistry.getDescendants(baseClassName);
556
+ const allClassNames = [baseClassName, ...descendants];
557
+ const fkColumnsByClass = /* @__PURE__ */ new Map();
558
+ const indexedMetaFields = /* @__PURE__ */ new Set();
559
+ const indexedStiColumns = /* @__PURE__ */ new Set();
560
+ for (const className of allClassNames) {
561
+ const classFields = await ObjectRegistry.getAllFields(className);
562
+ fkColumnsByClass.set(className, /* @__PURE__ */ new Set());
563
+ for (const [fieldName, field] of classFields.entries()) {
564
+ if (field.transient || field._meta?.transient) {
565
+ continue;
566
+ }
567
+ if (field.type === "meta" && (field.indexed === true || field._meta?.indexed === true)) {
568
+ indexedMetaFields.add(fieldName);
569
+ }
570
+ if (fieldName === "id" || fieldName === "slug" || fieldName === "context") {
571
+ continue;
572
+ }
573
+ if (fieldName === "created_at" || fieldName === "createdAt") {
574
+ if (hasCreatedAt) continue;
575
+ hasCreatedAt = true;
576
+ columns.created_at = {
577
+ type: "TIMESTAMP",
578
+ notNull: true,
579
+ defaultValue: "current_timestamp",
580
+ description: "Creation timestamp"
581
+ };
582
+ continue;
583
+ }
584
+ if (fieldName === "updated_at" || fieldName === "updatedAt") {
585
+ if (hasUpdatedAt) continue;
586
+ hasUpdatedAt = true;
587
+ columns.updated_at = {
588
+ type: "TIMESTAMP",
589
+ notNull: true,
590
+ defaultValue: "current_timestamp",
591
+ description: "Last update timestamp"
592
+ };
593
+ continue;
594
+ }
595
+ if (field.type === "oneToMany" || field.type === "manyToMany") {
596
+ continue;
597
+ }
598
+ if (field.type === "meta") {
599
+ continue;
600
+ }
601
+ const columnName = this.toSnakeCase(fieldName);
602
+ if (columns[columnName]) {
603
+ continue;
604
+ }
605
+ const sqlType = this.getRelationshipColumnType(field);
606
+ const columnDef = {
607
+ type: sqlType,
608
+ referenceKind: this.getReferenceKind(field),
609
+ // STI: All columns nullable (union of child fields)
610
+ notNull: false,
611
+ primaryKey: false,
612
+ unique: false,
613
+ description: field._meta?.description
614
+ };
615
+ if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) {
616
+ columnDef.defaultValue = field._meta.default;
617
+ }
618
+ if (field.type === "foreignKey") {
619
+ const relatedName = field.related;
620
+ const onDeleteAction = field._meta?.onDelete;
621
+ if (relatedName) {
622
+ columnDef.foreignKey = {
623
+ table: this.classNameToTableName(relatedName),
624
+ column: "id",
625
+ onDelete: onDeleteAction || "CASCADE",
626
+ onUpdate: "CASCADE"
627
+ };
628
+ fkColumnsByClass.get(className)?.add(columnName);
629
+ }
630
+ }
631
+ const isIndexed = field._meta?.indexed === true || field.indexed === true;
632
+ if (isIndexed && !columnDef.foreignKey) {
633
+ indexedStiColumns.add(columnName);
634
+ }
635
+ columns[columnName] = columnDef;
636
+ }
637
+ }
638
+ if (!hasCreatedAt) {
639
+ columns.created_at = {
640
+ type: "TIMESTAMP",
641
+ notNull: true,
642
+ defaultValue: "current_timestamp",
643
+ description: "Creation timestamp"
644
+ };
645
+ }
646
+ if (!hasUpdatedAt) {
647
+ columns.updated_at = {
648
+ type: "TIMESTAMP",
649
+ notNull: true,
650
+ defaultValue: "current_timestamp",
651
+ description: "Last update timestamp"
652
+ };
653
+ }
654
+ for (const className of allClassNames) {
655
+ const classFields = await ObjectRegistry.getAllFields(className);
656
+ this.reconcileRegistryForeignKeyColumnTypes(
657
+ columns,
658
+ classFields,
659
+ ObjectRegistry
660
+ );
661
+ }
662
+ const indexes = [];
663
+ indexes.push({
664
+ name: `${tableName}_id_idx`,
665
+ columns: ["id"],
666
+ description: "Primary key index"
667
+ });
668
+ indexes.push({
669
+ name: `${tableName}_slug_context_meta_type_idx`,
670
+ columns: ["slug", "context", "_meta_type"],
671
+ unique: true,
672
+ description: "Unique index for slug, context, and type"
673
+ });
674
+ indexes.push({
675
+ name: `${tableName}_meta_type_idx`,
676
+ columns: ["_meta_type"],
677
+ description: "Index for type discriminator queries"
678
+ });
679
+ for (const [className, fkColumns] of fkColumnsByClass.entries()) {
680
+ for (const fkColumn of fkColumns) {
681
+ indexes.push({
682
+ name: `idx_${tableName}_${fkColumn}_${className.toLowerCase()}`,
683
+ columns: [fkColumn],
684
+ where: `_meta_type = ${quoteStringLiteral(className)}`,
685
+ description: `Partial index for ${fkColumn} in ${className} rows`
686
+ });
687
+ }
688
+ }
689
+ for (const fieldName of indexedMetaFields) {
690
+ indexes.push({
691
+ name: `${tableName}_meta_${this.toSnakeCase(fieldName)}_idx`,
692
+ columns: [],
693
+ jsonPath: { column: "_meta_data", path: fieldName },
694
+ description: `JSON-path index for @meta({ indexed: true }) field ${fieldName}`
695
+ });
696
+ }
697
+ for (const colName of indexedStiColumns) {
698
+ indexes.push({
699
+ name: `${tableName}_${colName}_idx`,
700
+ columns: [colName],
701
+ description: `Index for ${colName}`
702
+ });
703
+ }
704
+ return {
705
+ tableName,
706
+ columns,
707
+ indexes,
708
+ triggers: [],
709
+ foreignKeys: this.extractForeignKeys(columns),
710
+ dependencies: [],
711
+ version: createHash("sha256").update(JSON.stringify({ columns, baseClassName, descendants })).digest("hex").substring(0, 8),
712
+ packageName: "runtime",
713
+ baseClass: "SmrtObject"
714
+ };
715
+ }
716
+ /**
717
+ * Generate STI schema from manifest data (build-time, no runtime registry)
718
+ *
719
+ * This method generates STI schema purely from manifest data, without depending
720
+ * on ObjectRegistry. This enables pre-generating schemas at build time for
721
+ * efficient external package consumption.
722
+ *
723
+ * @param baseClassName - Base class name for the STI hierarchy
724
+ * @param tableName - Shared table name (from base class)
725
+ * @param baseFields - Fields from the base class
726
+ * @param manifest - Full manifest containing all objects
727
+ * @returns ManifestSchema for storage in manifest.json
728
+ */
729
+ generateSTISchemaFromManifest(baseClassName, tableName, _baseFields, manifest, config) {
730
+ const columns = {};
731
+ columns.id = {
732
+ type: this.getIdColumnType(config),
733
+ primaryKey: true,
734
+ referenceKind: "id",
735
+ notNull: true
736
+ };
737
+ columns.slug = {
738
+ type: "TEXT",
739
+ notNull: true
740
+ };
741
+ columns.context = {
742
+ type: "TEXT",
743
+ notNull: true,
744
+ default: ""
745
+ };
746
+ columns._meta_type = {
747
+ type: "TEXT",
748
+ notNull: true
749
+ };
750
+ columns._meta_data = {
751
+ type: "JSON",
752
+ notNull: false
753
+ };
754
+ columns.created_at = {
755
+ type: "TIMESTAMP",
756
+ notNull: true,
757
+ default: "current_timestamp"
758
+ };
759
+ columns.updated_at = {
760
+ type: "TIMESTAMP",
761
+ notNull: true,
762
+ default: "current_timestamp"
763
+ };
764
+ const descendants = this.findDescendantsInManifest(baseClassName, manifest);
765
+ const allClassNames = [baseClassName, ...descendants];
766
+ const fkColumnsByClass = /* @__PURE__ */ new Map();
767
+ const indexedMetaFields = /* @__PURE__ */ new Set();
768
+ const indexedStiColumns = /* @__PURE__ */ new Set();
769
+ for (const className of allClassNames) {
770
+ const objDef = manifest.objects[className];
771
+ if (!objDef) continue;
772
+ fkColumnsByClass.set(className, /* @__PURE__ */ new Set());
773
+ for (const [fieldName, field] of Object.entries(objDef.fields)) {
774
+ if (field.transient || field._meta?.transient) {
775
+ continue;
776
+ }
777
+ if (field.type === "meta" && (field.indexed === true || field._meta?.indexed === true)) {
778
+ indexedMetaFields.add(fieldName);
779
+ }
780
+ if (fieldName === "id" || fieldName === "slug" || fieldName === "context" || fieldName === "created_at" || fieldName === "createdAt" || fieldName === "updated_at" || fieldName === "updatedAt") {
781
+ continue;
782
+ }
783
+ if (field.type === "oneToMany" || field.type === "manyToMany") {
784
+ continue;
785
+ }
786
+ if (field.type === "meta") {
787
+ continue;
788
+ }
789
+ const columnName = this.toSnakeCase(fieldName);
790
+ if (columns[columnName]) {
791
+ continue;
792
+ }
793
+ const sqlType = this.getRelationshipColumnType(field);
794
+ const columnDef = {
795
+ type: sqlType,
796
+ referenceKind: this.getReferenceKind(field),
797
+ // STI: All columns nullable (union of child fields)
798
+ notNull: false
799
+ };
800
+ if (field.default !== void 0 && this.shouldEmitDefault(field, field.default)) {
801
+ columnDef.default = field.default;
802
+ }
803
+ if (field.type === "foreignKey") {
804
+ fkColumnsByClass.get(className)?.add(columnName);
805
+ }
806
+ const isIndexed = field.indexed === true || field._meta?.indexed === true;
807
+ if (isIndexed && field.type !== "foreignKey") {
808
+ indexedStiColumns.add(columnName);
809
+ }
810
+ columns[columnName] = columnDef;
811
+ }
812
+ }
813
+ const indexes = [];
814
+ indexes.push({
815
+ name: `${tableName}_id_idx`,
816
+ columns: ["id"]
817
+ });
818
+ indexes.push({
819
+ name: `${tableName}_slug_context_meta_type_idx`,
820
+ columns: ["slug", "context", "_meta_type"],
821
+ unique: true
822
+ });
823
+ indexes.push({
824
+ name: `${tableName}_meta_type_idx`,
825
+ columns: ["_meta_type"]
826
+ });
827
+ for (const fieldName of indexedMetaFields) {
828
+ indexes.push({
829
+ name: `${tableName}_meta_${this.toSnakeCase(fieldName)}_idx`,
830
+ columns: [],
831
+ jsonPath: { column: "_meta_data", path: fieldName }
832
+ });
833
+ }
834
+ for (const colName of indexedStiColumns) {
835
+ indexes.push({
836
+ name: `${tableName}_${colName}_idx`,
837
+ columns: [colName]
838
+ });
839
+ }
840
+ const schemaDefinition = {
841
+ tableName,
842
+ columns: this.convertManifestColumnsToSchemaColumns(columns),
843
+ indexes: indexes.map((idx) => ({
844
+ name: idx.name,
845
+ columns: idx.columns,
846
+ unique: idx.unique,
847
+ where: idx.where,
848
+ jsonPath: idx.jsonPath
849
+ })),
850
+ triggers: [],
851
+ foreignKeys: [],
852
+ dependencies: [],
853
+ version: "",
854
+ packageName: ""
855
+ };
856
+ const ddl = this.generateSQL(schemaDefinition);
857
+ const version = createHash("sha256").update(JSON.stringify({ columns, baseClassName, descendants })).digest("hex").substring(0, 8);
858
+ return {
859
+ tableName,
860
+ ddl,
861
+ columns,
862
+ indexes,
863
+ version
864
+ };
865
+ }
866
+ /**
867
+ * Generate CTI (Class Table Inheritance) schema from manifest data
868
+ *
869
+ * @param className - Class name
870
+ * @param tableName - Table name
871
+ * @param fields - Fields from the class
872
+ * @returns ManifestSchema for storage in manifest.json
873
+ */
874
+ generateCTISchemaFromManifest(className, tableName, fields, config) {
875
+ const columns = {};
876
+ columns.id = {
877
+ type: this.getIdColumnType(config),
878
+ primaryKey: true,
879
+ referenceKind: "id",
880
+ notNull: true
881
+ };
882
+ columns.slug = {
883
+ type: "TEXT",
884
+ notNull: true
885
+ };
886
+ columns.context = {
887
+ type: "TEXT",
888
+ notNull: true,
889
+ default: ""
890
+ };
891
+ columns.created_at = {
892
+ type: "TIMESTAMP",
893
+ notNull: true,
894
+ default: "current_timestamp"
895
+ };
896
+ columns.updated_at = {
897
+ type: "TIMESTAMP",
898
+ notNull: true,
899
+ default: "current_timestamp"
900
+ };
901
+ for (const [fieldName, field] of Object.entries(fields)) {
902
+ if (field.transient || field._meta?.transient) {
903
+ continue;
904
+ }
905
+ if (fieldName === "id" || fieldName === "slug" || fieldName === "context" || fieldName === "created_at" || fieldName === "createdAt" || fieldName === "updated_at" || fieldName === "updatedAt") {
906
+ continue;
907
+ }
908
+ if (field.type === "oneToMany" || field.type === "manyToMany") {
909
+ continue;
910
+ }
911
+ if (field.type === "meta") {
912
+ continue;
913
+ }
914
+ const columnName = this.toSnakeCase(fieldName);
915
+ const sqlType = this.getRelationshipColumnType(field);
916
+ const columnDef = {
917
+ type: sqlType,
918
+ referenceKind: this.getReferenceKind(field),
919
+ notNull: field._meta?.nullable ? false : field.required || false,
920
+ unique: field._meta?.unique || false
921
+ };
922
+ if (field.default !== void 0 && this.shouldEmitDefault(field, field.default)) {
923
+ columnDef.default = field.default;
924
+ }
925
+ columns[columnName] = columnDef;
926
+ }
927
+ const indexes = [];
928
+ indexes.push({
929
+ name: `${tableName}_id_idx`,
930
+ columns: ["id"]
931
+ });
932
+ const conflictColumns = config?.conflictColumns || ["slug", "context"];
933
+ const indexName = conflictColumns.length > 2 ? `${tableName}_${conflictColumns.slice(0, 2).join("_")}_idx` : `${tableName}_${conflictColumns.join("_")}_idx`;
934
+ indexes.push({
935
+ name: indexName,
936
+ columns: conflictColumns,
937
+ unique: true
938
+ });
939
+ const schemaDefinition = {
940
+ tableName,
941
+ columns: this.convertManifestColumnsToSchemaColumns(columns),
942
+ indexes: indexes.map((idx) => ({
943
+ name: idx.name,
944
+ columns: idx.columns,
945
+ unique: idx.unique,
946
+ where: idx.where,
947
+ jsonPath: idx.jsonPath
948
+ })),
949
+ triggers: [],
950
+ foreignKeys: [],
951
+ dependencies: [],
952
+ version: "",
953
+ packageName: ""
954
+ };
955
+ const ddl = this.generateSQL(schemaDefinition);
956
+ const version = createHash("sha256").update(JSON.stringify({ columns, className })).digest("hex").substring(0, 8);
957
+ return {
958
+ tableName,
959
+ ddl,
960
+ columns,
961
+ indexes,
962
+ version
963
+ };
964
+ }
965
+ /**
966
+ * Find all descendants of a class in the manifest
967
+ *
968
+ * Note: Manifest keys are now qualified names (@pkg:ClassName) but `extends` field
969
+ * stores simple PascalCase class names. We need to handle both qualified and simple
970
+ * name lookups.
971
+ *
972
+ * Issue #713: Updated to handle qualified names in manifest keys
973
+ */
974
+ findDescendantsInManifest(baseClassName, manifest, visited = /* @__PURE__ */ new Set()) {
975
+ const descendants = [];
976
+ if (visited.has(baseClassName)) return descendants;
977
+ visited.add(baseClassName);
978
+ const simpleBaseClassName = baseClassName.includes(":") ? baseClassName.split(":").pop() || baseClassName : baseClassName;
979
+ const baseClassLower = simpleBaseClassName.toLowerCase();
980
+ for (const [name, obj] of Object.entries(manifest.objects)) {
981
+ if (obj.className.toLowerCase() === baseClassLower && obj.extends?.toLowerCase() === baseClassLower) {
982
+ continue;
983
+ }
984
+ if (obj.extends?.toLowerCase() === baseClassLower) {
985
+ descendants.push(name);
986
+ descendants.push(
987
+ ...this.findDescendantsInManifest(name, manifest, visited)
988
+ );
989
+ }
990
+ }
991
+ return descendants;
992
+ }
993
+ /**
994
+ * Convert ManifestColumnDefinition to ColumnDefinition
995
+ */
996
+ convertManifestColumnsToSchemaColumns(manifestColumns) {
997
+ const columns = {};
998
+ for (const [name, col] of Object.entries(manifestColumns)) {
999
+ columns[name] = {
1000
+ type: col.type,
1001
+ primaryKey: col.primaryKey,
1002
+ referenceKind: col.referenceKind,
1003
+ notNull: col.notNull,
1004
+ unique: col.unique,
1005
+ defaultValue: col.default
1006
+ };
1007
+ }
1008
+ return columns;
1009
+ }
1010
+ /**
1011
+ * Convert camelCase to snake_case
1012
+ */
1013
+ toSnakeCase(str) {
1014
+ return str.replace(/([A-Z])/g, "_$1").toLowerCase().replace(/^_/, "");
1015
+ }
1016
+ /**
1017
+ * Generate SQL CREATE TABLE statement from schema definition
1018
+ *
1019
+ * This is the single source of truth for SQL generation, consolidating
1020
+ * logic that was previously duplicated across multiple code paths.
1021
+ *
1022
+ * @param schema - Schema definition object
1023
+ * @returns SQL CREATE TABLE statement with indexes
1024
+ */
1025
+ generateSQL(schema, engine) {
1026
+ if (engine) {
1027
+ return getDDLStrategy(engine).generateCreateTable(schema);
1028
+ }
1029
+ const { tableName, columns } = schema;
1030
+ let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (
1031
+ `;
1032
+ for (const [columnName, columnDef] of Object.entries(columns)) {
1033
+ const parts = [` ${quoteIdentifier(columnName)} ${columnDef.type}`];
1034
+ if (columnDef.primaryKey) {
1035
+ parts.push("PRIMARY KEY");
1036
+ }
1037
+ if (columnDef.notNull) {
1038
+ parts.push("NOT NULL");
1039
+ }
1040
+ if (columnDef.unique && !columnDef.primaryKey) {
1041
+ parts.push("UNIQUE");
1042
+ }
1043
+ if (columnDef.defaultValue !== void 0) {
1044
+ parts.push(
1045
+ `DEFAULT ${this.formatDefaultValue(
1046
+ columnDef.defaultValue,
1047
+ columnDef.type
1048
+ )}`
1049
+ );
1050
+ }
1051
+ sql += `${parts.join(" ")},
1052
+ `;
1053
+ }
1054
+ return `${sql.slice(0, -2)}
1055
+ );`;
1056
+ }
1057
+ /**
1058
+ * Format default value for SQL
1059
+ *
1060
+ * SQLite doesn't support CAST expressions in DEFAULT values (only literal values are allowed).
1061
+ * This method generates DEFAULT values that work with both SQLite and DuckDB.
1062
+ *
1063
+ * @param value - Default value
1064
+ * @param type - Column SQL type
1065
+ * @returns Formatted SQL default value expression
1066
+ */
1067
+ formatDefaultValue(value, type) {
1068
+ return formatDefaultValue(value, type, {
1069
+ nonStringTimestampDefault: "current_timestamp"
1070
+ });
1071
+ }
1072
+ }
1073
+ export {
1074
+ SchemaGenerator
1075
+ };
1076
+ //# sourceMappingURL=generator.js.map