@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,177 @@
1
+ import { classnameToTablename, pluralize, toSnakeCase } from './utils/naming.js';
2
+ export { classnameToTablename, pluralize, toSnakeCase };
3
+ /**
4
+ * Converts a snake_case string to camelCase
5
+ *
6
+ * @param str - String in snake_case format
7
+ * @returns String in camelCase format
8
+ * @example
9
+ * ```typescript
10
+ * toCamelCase('meetings_url'); // 'meetingsUrl'
11
+ * toCamelCase('created_at'); // 'createdAt'
12
+ * toCamelCase('id'); // 'id'
13
+ * ```
14
+ */
15
+ export declare function toCamelCase(str: string): string;
16
+ /**
17
+ * Converts all keys in an object from camelCase to snake_case
18
+ *
19
+ * @param obj - Object with camelCase keys
20
+ * @returns Object with snake_case keys
21
+ */
22
+ export declare function keysToSnakeCase(obj: Record<string, any>): Record<string, any>;
23
+ /**
24
+ * Converts all keys in an object from snake_case to camelCase
25
+ *
26
+ * @param obj - Object with snake_case keys
27
+ * @returns Object with camelCase keys
28
+ */
29
+ export declare function keysToCamelCase(obj: Record<string, any>): Record<string, any>;
30
+ /**
31
+ * Checks if a field name indicates a date field based on naming conventions
32
+ *
33
+ * Recognizes common date field patterns like '_at', '_date', and 'date'.
34
+ * Used for automatic type inference during schema generation.
35
+ *
36
+ * @param key - Field name to check
37
+ * @returns Boolean indicating if the field is likely a date field
38
+ * @example
39
+ * ```typescript
40
+ * isDateField('created_at'); // true
41
+ * isDateField('updated_date'); // true
42
+ * isDateField('name'); // false
43
+ * ```
44
+ */
45
+ export declare function isDateField(key: string): boolean;
46
+ /**
47
+ * Converts a date string to a Date object
48
+ *
49
+ * @param date - Date as string or Date object
50
+ * @returns Date object
51
+ */
52
+ export declare function dateAsString(date: Date | string): Date;
53
+ /**
54
+ * Converts a Date object to an ISO string
55
+ *
56
+ * @param date - Date as Date object or string
57
+ * @returns ISO date string or the original string
58
+ */
59
+ export declare function dateAsObject(date: Date | string): string;
60
+ /**
61
+ * Extracts field definitions from a class constructor
62
+ *
63
+ * Uses ObjectRegistry cached fields from AST manifest exclusively.
64
+ * No runtime introspection fallback - classes must be decorated with @smrt()
65
+ * for schema generation to work.
66
+ *
67
+ * @param ClassType - Class constructor to extract fields from
68
+ * @param values - Optional values to set for the fields
69
+ * @returns Object containing field definitions with names, types, and values
70
+ * @throws {Error} If the class is not registered in ObjectRegistry
71
+ * @example
72
+ * ```typescript
73
+ * @smrt()
74
+ * class Product extends SmrtObject {
75
+ * name: string = '';
76
+ * price: number = 0.0;
77
+ * }
78
+ *
79
+ * const fields = await fieldsFromClass(Product);
80
+ * console.log(fields.name.type); // 'TEXT'
81
+ * console.log(fields.price.type); // 'REAL'
82
+ * ```
83
+ */
84
+ export declare function fieldsFromClass(ClassType: new (...args: any[]) => any, values?: Record<string, any>): Promise<Record<string, any>>;
85
+ /**
86
+ * Returns the old (incorrect) pluralized table name for migration purposes.
87
+ *
88
+ * This function replicates the previous buggy behavior where 'y' → 'ies'
89
+ * transformation was applied AFTER adding 's', resulting in incorrect
90
+ * pluralization (e.g., 'currency' → 'currencys' instead of 'currencies').
91
+ *
92
+ * Use this to generate migration SQL that renames old tables to new names.
93
+ *
94
+ * @param className - Name of the class
95
+ * @returns The incorrectly pluralized table name (old behavior)
96
+ * @example
97
+ * ```typescript
98
+ * // Generate migration for a class
99
+ * const oldName = legacyClassnameToTablename('Currency'); // 'currencys'
100
+ * const newName = classnameToTablename('Currency'); // 'currencies'
101
+ * console.log(`ALTER TABLE ${oldName} RENAME TO ${newName};`);
102
+ * ```
103
+ */
104
+ export declare function legacyClassnameToTablename(className: string): string;
105
+ /**
106
+ * Generates migration SQL for renaming tables from old to new naming convention.
107
+ *
108
+ * Returns an array of SQL statements to rename tables that were affected
109
+ * by the pluralization bug (Issue #839).
110
+ *
111
+ * @param classNames - Array of class names to check for migration
112
+ * @returns Array of SQL RENAME statements (empty if no changes needed)
113
+ * @example
114
+ * ```typescript
115
+ * const migrations = generateTableRenameMigrations([
116
+ * 'Currency',
117
+ * 'JournalEntry',
118
+ * 'Product' // Not affected
119
+ * ]);
120
+ * // Returns:
121
+ * // [
122
+ * // 'ALTER TABLE currencys RENAME TO currencies;',
123
+ * // 'ALTER TABLE journal_entrys RENAME TO journal_entries;'
124
+ * // ]
125
+ * ```
126
+ */
127
+ export declare function generateTableRenameMigrations(classNames: string[]): string[];
128
+ /**
129
+ * Generates a table name from a class constructor
130
+ *
131
+ * Checks for SMRT_TABLE_NAME static property first (set by @smrt() decorator),
132
+ * which survives code minification. Falls back to deriving from ClassType.name
133
+ * for backward compatibility.
134
+ *
135
+ * @param ClassType - Class constructor or function
136
+ * @returns Pluralized snake_case table name
137
+ * @example
138
+ * ```typescript
139
+ * // With @smrt() decorator (recommended)
140
+ * @smrt()
141
+ * class Product extends SmrtObject { }
142
+ * tableNameFromClass(Product); // "products" (captured before minification)
143
+ *
144
+ * // Without decorator (fallback)
145
+ * class Category extends SmrtObject { }
146
+ * tableNameFromClass(Category); // "categories" (derived from runtime name)
147
+ * ```
148
+ */
149
+ export declare function tableNameFromClass(ClassType: Function | (new (...args: any[]) => any)): any;
150
+ /**
151
+ * Formats data for JavaScript by converting date strings to Date objects
152
+ * and snake_case column names to camelCase properties
153
+ *
154
+ * @param data - Object with data to format (snake_case column names from DB)
155
+ * @param fields - Optional field definitions to determine types (from fieldsFromClass)
156
+ * @returns Object with properly typed values and camelCase property names for JavaScript
157
+ */
158
+ export declare function formatDataJs(data: Record<string, any>, fields?: Record<string, {
159
+ type?: string;
160
+ }>): Record<string, any>;
161
+ /**
162
+ * Type guard to check if a value is a Field instance
163
+ *
164
+ * @deprecated Field helpers have been removed. This function always returns false.
165
+ * @param value - Value to check
166
+ * @returns Always false (Field class no longer exists)
167
+ */
168
+ export declare function isFieldInstance(value: any): value is never;
169
+ /**
170
+ * Formats data for SQL by converting Date objects to ISO strings
171
+ * and camelCase property names to snake_case column names
172
+ *
173
+ * @param data - Object with data to format (camelCase property names from JavaScript)
174
+ * @returns Object with properly formatted values and snake_case column names for SQL
175
+ */
176
+ export declare function formatDataSql(data: Record<string, any>): Record<string, any>;
177
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,WAItC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,QAK/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,UAK/C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAgC7B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa5E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAEhC,SAAS,EAAE,QAAQ,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,OAepD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,uBAkH3C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBActD"}
package/dist/utils.js ADDED
@@ -0,0 +1,185 @@
1
+ import { createLogger } from "@happyvertical/logger";
2
+ import { ObjectRegistry } from "./registry.js";
3
+ import { toSnakeCase, classnameToTablename, pluralize } from "./utils/naming.js";
4
+ const logger = createLogger({
5
+ level: process.env.DEBUG_STI ? "debug" : "info"
6
+ });
7
+ function toCamelCase(str) {
8
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
9
+ }
10
+ function keysToSnakeCase(obj) {
11
+ const result = {};
12
+ for (const [key, value] of Object.entries(obj)) {
13
+ result[toSnakeCase(key)] = value;
14
+ }
15
+ return result;
16
+ }
17
+ function keysToCamelCase(obj) {
18
+ const result = {};
19
+ for (const [key, value] of Object.entries(obj)) {
20
+ result[toCamelCase(key)] = value;
21
+ }
22
+ return result;
23
+ }
24
+ function isDateField(key) {
25
+ return key.endsWith("_date") || key.endsWith("_at") || key === "date";
26
+ }
27
+ function dateAsString(date) {
28
+ if (typeof date === "string") {
29
+ return new Date(date);
30
+ }
31
+ return date;
32
+ }
33
+ function dateAsObject(date) {
34
+ if (date instanceof Date) {
35
+ return date.toISOString();
36
+ }
37
+ return date;
38
+ }
39
+ async function fieldsFromClass(ClassType, values) {
40
+ const className = ObjectRegistry.getClassByConstructor(ClassType)?.name || ClassType.name;
41
+ const cachedFields = await ObjectRegistry.getAllFields(className);
42
+ if (cachedFields.size === 0) {
43
+ return {};
44
+ }
45
+ const fields = {};
46
+ for (const [key, field] of cachedFields.entries()) {
47
+ const meta = { ...field._meta || {} };
48
+ delete meta.__smrtSystemField;
49
+ fields[key] = {
50
+ name: key,
51
+ type: field.type || "TEXT",
52
+ _meta: meta,
53
+ ...values && key in values ? { value: values[key] } : {}
54
+ };
55
+ }
56
+ return fields;
57
+ }
58
+ function legacyClassnameToTablename(className) {
59
+ return className.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/([^s])$/, "$1s").replace(/y$/, "ies");
60
+ }
61
+ function generateTableRenameMigrations(classNames) {
62
+ const migrations = [];
63
+ for (const className of classNames) {
64
+ const oldName = legacyClassnameToTablename(className);
65
+ const newName = classnameToTablename(className);
66
+ if (oldName !== newName) {
67
+ migrations.push(`ALTER TABLE ${oldName} RENAME TO ${newName};`);
68
+ }
69
+ }
70
+ return migrations;
71
+ }
72
+ function tableNameFromClass(ClassType) {
73
+ if ("SMRT_TABLE_NAME" in ClassType) {
74
+ return ClassType.SMRT_TABLE_NAME;
75
+ }
76
+ const snakeCase = ClassType.name.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
77
+ return pluralize(snakeCase);
78
+ }
79
+ function formatDataJs(data, fields) {
80
+ const normalizedData = {};
81
+ if (process.env.DEBUG_STI) {
82
+ logger.debug("[formatDataJs] Input data", {
83
+ hasMetaData: !!data._meta_data,
84
+ metaType: data._meta_type,
85
+ keys: Object.keys(data)
86
+ });
87
+ }
88
+ let mergedData = data;
89
+ if (data._meta_data) {
90
+ const metaData = typeof data._meta_data === "string" ? JSON.parse(data._meta_data) : data._meta_data;
91
+ if (process.env.DEBUG_STI) {
92
+ logger.debug("[formatDataJs] Merging _meta_data", {
93
+ metaDataKeys: Object.keys(metaData),
94
+ metaData
95
+ });
96
+ }
97
+ mergedData = { ...data, ...metaData };
98
+ if (process.env.DEBUG_STI) {
99
+ logger.debug("[formatDataJs] After merge, data keys", {
100
+ keys: Object.keys(mergedData)
101
+ });
102
+ }
103
+ }
104
+ for (const [key, value] of Object.entries(mergedData)) {
105
+ const camelKey = key.startsWith("_") ? key : toCamelCase(key);
106
+ let outputKey = camelKey;
107
+ if (fields && key in fields && !(camelKey in fields)) {
108
+ outputKey = key;
109
+ }
110
+ const fieldDef = fields?.[outputKey] ?? fields?.[camelKey] ?? fields?.[key];
111
+ const fieldType = fieldDef?.type?.toLowerCase();
112
+ if (value instanceof Date) {
113
+ normalizedData[outputKey] = value;
114
+ } else if (typeof value === "string") {
115
+ const isDate = fieldType === "datetime" || isDateField(key);
116
+ if (isDate) {
117
+ const parsedDate = value.trim() ? new Date(value) : null;
118
+ normalizedData[outputKey] = parsedDate && !Number.isNaN(parsedDate.getTime()) ? parsedDate : value;
119
+ } else if (fieldType === "json") {
120
+ try {
121
+ normalizedData[outputKey] = JSON.parse(value);
122
+ } catch {
123
+ normalizedData[outputKey] = value;
124
+ }
125
+ } else if (fieldType === "integer") {
126
+ const parsed = Number.parseInt(value, 10);
127
+ normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;
128
+ } else if (fieldType === "real" || fieldType === "decimal") {
129
+ const parsed = Number.parseFloat(value);
130
+ normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;
131
+ } else {
132
+ normalizedData[outputKey] = value;
133
+ }
134
+ } else if (typeof value === "number") {
135
+ if (fieldType === "boolean") {
136
+ normalizedData[outputKey] = value === 1;
137
+ } else {
138
+ normalizedData[outputKey] = value;
139
+ }
140
+ } else {
141
+ normalizedData[outputKey] = value;
142
+ }
143
+ }
144
+ if (process.env.DEBUG_STI) {
145
+ logger.debug("[formatDataJs] Output normalizedData", {
146
+ keys: Object.keys(normalizedData),
147
+ metaType: normalizedData._meta_type
148
+ });
149
+ }
150
+ return normalizedData;
151
+ }
152
+ function isFieldInstance(value) {
153
+ return false;
154
+ }
155
+ function formatDataSql(data) {
156
+ const normalizedData = {};
157
+ for (const [key, value] of Object.entries(data)) {
158
+ const snakeKey = toSnakeCase(key);
159
+ if (value instanceof Date) {
160
+ normalizedData[snakeKey] = value.toISOString();
161
+ } else {
162
+ normalizedData[snakeKey] = value;
163
+ }
164
+ }
165
+ return normalizedData;
166
+ }
167
+ export {
168
+ classnameToTablename,
169
+ dateAsObject,
170
+ dateAsString,
171
+ fieldsFromClass,
172
+ formatDataJs,
173
+ formatDataSql,
174
+ generateTableRenameMigrations,
175
+ isDateField,
176
+ isFieldInstance,
177
+ keysToCamelCase,
178
+ keysToSnakeCase,
179
+ legacyClassnameToTablename,
180
+ pluralize,
181
+ tableNameFromClass,
182
+ toCamelCase,
183
+ toSnakeCase
184
+ };
185
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import { createLogger } from '@happyvertical/logger';\nimport { ObjectRegistry } from './registry';\nimport {\n classnameToTablename,\n pluralize,\n toSnakeCase,\n} from './utils/naming.js';\n\n// formatDataJs' debug traces are gated by DEBUG_STI, so the level must allow\n// debug when it's set (a fixed 'info' would filter them out and break the flag).\nconst logger = createLogger({\n level: process.env.DEBUG_STI ? 'debug' : 'info',\n});\n\nexport { classnameToTablename, pluralize, toSnakeCase };\n\n/**\n * Converts a snake_case string to camelCase\n *\n * @param str - String in snake_case format\n * @returns String in camelCase format\n * @example\n * ```typescript\n * toCamelCase('meetings_url'); // 'meetingsUrl'\n * toCamelCase('created_at'); // 'createdAt'\n * toCamelCase('id'); // 'id'\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Converts all keys in an object from camelCase to snake_case\n *\n * @param obj - Object with camelCase keys\n * @returns Object with snake_case keys\n */\nexport function keysToSnakeCase(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[toSnakeCase(key)] = value;\n }\n return result;\n}\n\n/**\n * Converts all keys in an object from snake_case to camelCase\n *\n * @param obj - Object with snake_case keys\n * @returns Object with camelCase keys\n */\nexport function keysToCamelCase(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[toCamelCase(key)] = value;\n }\n return result;\n}\n\n/**\n * Checks if a field name indicates a date field based on naming conventions\n *\n * Recognizes common date field patterns like '_at', '_date', and 'date'.\n * Used for automatic type inference during schema generation.\n *\n * @param key - Field name to check\n * @returns Boolean indicating if the field is likely a date field\n * @example\n * ```typescript\n * isDateField('created_at'); // true\n * isDateField('updated_date'); // true\n * isDateField('name'); // false\n * ```\n */\nexport function isDateField(key: string) {\n // Fallback pattern matching when schema is not available\n // Primary date detection should use schema field types\n return key.endsWith('_date') || key.endsWith('_at') || key === 'date';\n}\n\n/**\n * Converts a date string to a Date object\n *\n * @param date - Date as string or Date object\n * @returns Date object\n */\nexport function dateAsString(date: Date | string) {\n if (typeof date === 'string') {\n return new Date(date);\n }\n return date;\n}\n\n/**\n * Converts a Date object to an ISO string\n *\n * @param date - Date as Date object or string\n * @returns ISO date string or the original string\n */\nexport function dateAsObject(date: Date | string) {\n if (date instanceof Date) {\n return date.toISOString();\n }\n return date;\n}\n\n/**\n * Extracts field definitions from a class constructor\n *\n * Uses ObjectRegistry cached fields from AST manifest exclusively.\n * No runtime introspection fallback - classes must be decorated with @smrt()\n * for schema generation to work.\n *\n * @param ClassType - Class constructor to extract fields from\n * @param values - Optional values to set for the fields\n * @returns Object containing field definitions with names, types, and values\n * @throws {Error} If the class is not registered in ObjectRegistry\n * @example\n * ```typescript\n * @smrt()\n * class Product extends SmrtObject {\n * name: string = '';\n * price: number = 0.0;\n * }\n *\n * const fields = await fieldsFromClass(Product);\n * console.log(fields.name.type); // 'TEXT'\n * console.log(fields.price.type); // 'REAL'\n * ```\n */\nexport async function fieldsFromClass(\n ClassType: new (...args: any[]) => any,\n values?: Record<string, any>,\n) {\n const className =\n ObjectRegistry.getClassByConstructor(ClassType as any)?.name ||\n ClassType.name;\n // NEW: Use getAllFields() to include inherited fields from parent classes\n const cachedFields = await ObjectRegistry.getAllFields(className);\n\n // Phase 2: AST manifest only - no runtime introspection fallback\n if (cachedFields.size === 0) {\n // Return empty fields for unregistered classes (for backward compatibility)\n // generateSchema() will throw if it needs field definitions\n return {};\n }\n\n // Use cached field definitions from AST manifest\n const fields: Record<string, any> = {};\n\n // Add/override with fields from cached registry\n for (const [key, field] of cachedFields.entries()) {\n const meta = { ...(field._meta || {}) };\n delete meta.__smrtSystemField;\n\n fields[key] = {\n name: key,\n type: field.type || 'TEXT',\n _meta: meta,\n ...(values && key in values ? { value: values[key] } : {}),\n };\n }\n\n return fields;\n}\n\n// NOTE: generateSchema moved to schema/utils.ts\n// to prevent bundling Node.js-only code (SchemaGenerator with node:crypto) in browser builds.\n// Import from './schema/utils' in Node.js code that needs schema generation.\n\n/**\n * Returns the old (incorrect) pluralized table name for migration purposes.\n *\n * This function replicates the previous buggy behavior where 'y' → 'ies'\n * transformation was applied AFTER adding 's', resulting in incorrect\n * pluralization (e.g., 'currency' → 'currencys' instead of 'currencies').\n *\n * Use this to generate migration SQL that renames old tables to new names.\n *\n * @param className - Name of the class\n * @returns The incorrectly pluralized table name (old behavior)\n * @example\n * ```typescript\n * // Generate migration for a class\n * const oldName = legacyClassnameToTablename('Currency'); // 'currencys'\n * const newName = classnameToTablename('Currency'); // 'currencies'\n * console.log(`ALTER TABLE ${oldName} RENAME TO ${newName};`);\n * ```\n */\nexport function legacyClassnameToTablename(className: string): string {\n return className\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/([^s])$/, '$1s')\n .replace(/y$/, 'ies'); // This runs AFTER 's' is added, so it's a no-op for 'y' words\n}\n\n/**\n * Generates migration SQL for renaming tables from old to new naming convention.\n *\n * Returns an array of SQL statements to rename tables that were affected\n * by the pluralization bug (Issue #839).\n *\n * @param classNames - Array of class names to check for migration\n * @returns Array of SQL RENAME statements (empty if no changes needed)\n * @example\n * ```typescript\n * const migrations = generateTableRenameMigrations([\n * 'Currency',\n * 'JournalEntry',\n * 'Product' // Not affected\n * ]);\n * // Returns:\n * // [\n * // 'ALTER TABLE currencys RENAME TO currencies;',\n * // 'ALTER TABLE journal_entrys RENAME TO journal_entries;'\n * // ]\n * ```\n */\nexport function generateTableRenameMigrations(classNames: string[]): string[] {\n const migrations: string[] = [];\n\n for (const className of classNames) {\n const oldName = legacyClassnameToTablename(className);\n const newName = classnameToTablename(className);\n\n if (oldName !== newName) {\n migrations.push(`ALTER TABLE ${oldName} RENAME TO ${newName};`);\n }\n }\n\n return migrations;\n}\n\n/**\n * Generates a table name from a class constructor\n *\n * Checks for SMRT_TABLE_NAME static property first (set by @smrt() decorator),\n * which survives code minification. Falls back to deriving from ClassType.name\n * for backward compatibility.\n *\n * @param ClassType - Class constructor or function\n * @returns Pluralized snake_case table name\n * @example\n * ```typescript\n * // With @smrt() decorator (recommended)\n * @smrt()\n * class Product extends SmrtObject { }\n * tableNameFromClass(Product); // \"products\" (captured before minification)\n *\n * // Without decorator (fallback)\n * class Category extends SmrtObject { }\n * tableNameFromClass(Category); // \"categories\" (derived from runtime name)\n * ```\n */\nexport function tableNameFromClass(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n ClassType: Function | (new (...args: any[]) => any),\n) {\n // Check for SMRT_TABLE_NAME property set by @smrt() decorator (survives minification)\n if ('SMRT_TABLE_NAME' in ClassType) {\n return (ClassType as any).SMRT_TABLE_NAME;\n }\n\n // Fallback: derive from class name (breaks with minification)\n const snakeCase = ClassType.name\n // Insert underscore between lower & upper case letters\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n // Convert to lowercase\n .toLowerCase();\n\n return pluralize(snakeCase);\n}\n\n/**\n * Formats data for JavaScript by converting date strings to Date objects\n * and snake_case column names to camelCase properties\n *\n * @param data - Object with data to format (snake_case column names from DB)\n * @param fields - Optional field definitions to determine types (from fieldsFromClass)\n * @returns Object with properly typed values and camelCase property names for JavaScript\n */\nexport function formatDataJs(\n data: Record<string, any>,\n fields?: Record<string, { type?: string }>,\n) {\n const normalizedData: Record<string, any> = {};\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Input data', {\n hasMetaData: !!data._meta_data,\n metaType: data._meta_type,\n keys: Object.keys(data),\n });\n }\n\n // STI: If _meta_data exists, merge it into a FRESH object first so meta\n // fields are available during formatting. This must never mutate the caller's\n // `data` argument — `formatDataJs` is a public export and external callers may\n // pass shared objects that would otherwise get silent field injection (#1378).\n let mergedData: Record<string, any> = data;\n if (data._meta_data) {\n const metaData =\n typeof data._meta_data === 'string'\n ? JSON.parse(data._meta_data)\n : data._meta_data;\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Merging _meta_data', {\n metaDataKeys: Object.keys(metaData),\n metaData,\n });\n }\n\n // Merge meta fields into a copy (will be formatted below). Spreading\n // `metaData` last preserves the original precedence of Object.assign.\n mergedData = { ...data, ...metaData };\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] After merge, data keys', {\n keys: Object.keys(mergedData),\n });\n }\n }\n\n for (const [key, value] of Object.entries(mergedData)) {\n // Preserve keys with leading underscore (e.g., _meta_type, _meta_data)\n // These are special STI/framework fields that should not be camelCased\n const camelKey = key.startsWith('_') ? key : toCamelCase(key);\n\n // Determine the actual output key based on what's in fields\n // If the original key (snake_case) is in fields, use it; otherwise use camelCase\n // This supports both conventions (e.g., publish_date vs publishDate)\n let outputKey = camelKey;\n if (fields && key in fields && !(camelKey in fields)) {\n // Original key exists in fields but camelCase doesn't - use original (snake_case)\n outputKey = key;\n }\n\n // Get field type from fields, trying both key variants\n const fieldDef = fields?.[outputKey] ?? fields?.[camelKey] ?? fields?.[key];\n const fieldType = fieldDef?.type?.toLowerCase();\n\n if (value instanceof Date) {\n normalizedData[outputKey] = value;\n } else if (typeof value === 'string') {\n // Use field definitions if available, otherwise fall back to name patterns\n const isDate = fieldType === 'datetime' || isDateField(key);\n\n if (isDate) {\n const parsedDate = value.trim() ? new Date(value) : null;\n normalizedData[outputKey] =\n parsedDate && !Number.isNaN(parsedDate.getTime())\n ? parsedDate\n : value;\n } else if (fieldType === 'json') {\n // Parse JSON strings back to objects\n try {\n normalizedData[outputKey] = JSON.parse(value);\n } catch {\n // Keep as string if parsing fails\n normalizedData[outputKey] = value;\n }\n } else if (fieldType === 'integer') {\n // Convert string numbers to integers for INTEGER fields\n // SQLite may return \"2.0\" as a string in some cases\n const parsed = Number.parseInt(value, 10);\n normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;\n } else if (fieldType === 'real' || fieldType === 'decimal') {\n // Convert string numbers to floats for REAL/DECIMAL fields\n const parsed = Number.parseFloat(value);\n normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;\n } else {\n normalizedData[outputKey] = value;\n }\n } else if (typeof value === 'number') {\n if (fieldType === 'boolean') {\n // Convert SQLite integers (0/1) to booleans for boolean fields\n normalizedData[outputKey] = value === 1;\n } else {\n // Pass through numeric values as-is\n // Note: In JavaScript, 2.0 === 2 so no conversion needed\n // Non-integers in INTEGER fields (e.g., 2.9) are kept to surface data issues\n normalizedData[outputKey] = value;\n }\n } else {\n normalizedData[outputKey] = value;\n }\n }\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Output normalizedData', {\n keys: Object.keys(normalizedData),\n metaType: normalizedData._meta_type,\n });\n }\n\n return normalizedData;\n}\n\n/**\n * Type guard to check if a value is a Field instance\n *\n * @deprecated Field helpers have been removed. This function always returns false.\n * @param value - Value to check\n * @returns Always false (Field class no longer exists)\n */\nexport function isFieldInstance(value: any): value is never {\n return false;\n}\n\n/**\n * Formats data for SQL by converting Date objects to ISO strings\n * and camelCase property names to snake_case column names\n *\n * @param data - Object with data to format (camelCase property names from JavaScript)\n * @returns Object with properly formatted values and snake_case column names for SQL\n */\nexport function formatDataSql(data: Record<string, any>) {\n const normalizedData: Record<string, any> = {};\n for (const [key, value] of Object.entries(data)) {\n // Convert camelCase to snake_case for SQL\n const snakeKey = toSnakeCase(key);\n\n // Field helpers removed - no need to extract values (deprecated code removed)\n if (value instanceof Date) {\n normalizedData[snakeKey] = value.toISOString(); // Postgres accepts ISO format with timezone\n } else {\n normalizedData[snakeKey] = value;\n }\n }\n return normalizedData;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Import a module that exists in both source (`.ts`) and compiled (`.js`)
3
+ * form, deterministically.
4
+ *
5
+ * # Why this exists
6
+ *
7
+ * The Vite plugin needs to load sibling modules (scanner, schema generator)
8
+ * at runtime. Those siblings ship in two shapes:
9
+ *
10
+ * src/scanner/index.ts (workspace dev, tsx-driven)
11
+ * dist/vite-plugin/../scanner.js (published tarball, plain Node ESM)
12
+ *
13
+ * The previous implementation picked a branch by sniffing
14
+ * `import.meta.url.endsWith('.ts')` and then issued a relative dynamic
15
+ * `import()`. That decision rode on top of tsx's ESM loader, whose
16
+ * interception of `@happyvertical/smrt-core/vite-plugin` varies with tsx
17
+ * version, Node version, pnpm symlink state, and Node's internal resolver
18
+ * cache (first-import wins). As a result, the branch was non-deterministic
19
+ * at publish time and could pick the `.ts` source even though `dist/`
20
+ * existed — then fail inside that source on an inner `.js→.ts` hop. Seen
21
+ * on PR 1131, Release A, Release B, and PR 1141, each time losing the
22
+ * publish for 12–13 downstream domain packages.
23
+ *
24
+ * # How this is deterministic
25
+ *
26
+ * We don't ask tsx anything. We check `<packageRoot>/dist/vite-plugin/<dist>`
27
+ * directly with `fs.existsSync`. If dist is on disk we load it via an
28
+ * absolute `file://` URL — Node's loader doesn't consult tsx for that.
29
+ * If dist is absent (fresh clone, pre-first-build) we fall back to the
30
+ * source path via a plain relative `import()`; at that point tsx is the
31
+ * only way to load `.ts` anyway, so there's no choice to make.
32
+ *
33
+ * # Dev-mode caveat
34
+ *
35
+ * When `dist/` exists, this helper always loads dist — even if a core
36
+ * developer just edited source. That's a deliberate trade: in any
37
+ * meaningful dev loop you have `pnpm build:watch` keeping dist fresh, and
38
+ * the determinism at publish time is worth far more than a hot-reload
39
+ * convenience for the handful of times anyone edits
40
+ * `packages/core/src/scanner/*.ts` directly.
41
+ *
42
+ * @see https://github.com/happyvertical/smrt/issues/1139
43
+ */
44
+ export interface ImportBuildAwareOptions {
45
+ /**
46
+ * Relative path to the `.ts` source entry, expressed from the
47
+ * `vite-plugin/` directory (e.g. `'../scanner/index.ts'`). Used only
48
+ * when the corresponding dist file is absent.
49
+ */
50
+ source: string;
51
+ /**
52
+ * Relative path to the compiled `.js` entry, expressed from the
53
+ * `vite-plugin/` directory (e.g. `'../scanner.js'`). Resolved to an
54
+ * absolute path against `<packageRoot>/dist/vite-plugin/` — independent
55
+ * of where the caller physically lives on disk.
56
+ */
57
+ dist: string;
58
+ /**
59
+ * Override for the caller's `import.meta.url`. Tests use this to
60
+ * simulate being loaded from different locations without physically
61
+ * relocating the source file. Defaults to this module's URL, which is
62
+ * equivalent to the caller in the normal production path (both sit in
63
+ * `vite-plugin/`).
64
+ */
65
+ callerUrl?: string;
66
+ }
67
+ export declare function importBuildAwareModule<T>({ source, dist, callerUrl, }: ImportBuildAwareOptions): Promise<T>;
68
+ //# sourceMappingURL=import-build-aware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-build-aware.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/import-build-aware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAsDH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,MAAM,EACN,IAAI,EACJ,SAA2B,GAC5B,EAAE,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BtC"}
@@ -0,0 +1,72 @@
1
+ import { existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, resolve, extname } from "node:path";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+ const require$1 = createRequire(import.meta.url);
6
+ const TS_SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".mts", ".tsx"]);
7
+ async function importSourceFallback(sourceAbs, packageRoot) {
8
+ const ext = extname(sourceAbs);
9
+ if (!TS_SOURCE_EXTENSIONS.has(ext)) {
10
+ return await import(
11
+ /* @vite-ignore */
12
+ pathToFileURL(sourceAbs).href
13
+ );
14
+ }
15
+ let unregister;
16
+ try {
17
+ const tsxApiPath = require$1.resolve("tsx/esm/api");
18
+ const { register } = await import(
19
+ /* @vite-ignore */
20
+ pathToFileURL(tsxApiPath).href
21
+ );
22
+ const workspaceTsconfigPath = resolve(
23
+ packageRoot,
24
+ "..",
25
+ "..",
26
+ "tsconfig.package-build.json"
27
+ );
28
+ unregister = register(
29
+ existsSync(workspaceTsconfigPath) ? { tsconfig: workspaceTsconfigPath } : void 0
30
+ );
31
+ } catch (error) {
32
+ throw new Error(
33
+ `[smrt] Failed to register tsx source fallback for ${sourceAbs}. Ensure "tsx" is installed or keep dist artifacts available before invoking the SMRT Vite plugin.`,
34
+ { cause: error }
35
+ );
36
+ }
37
+ try {
38
+ return await import(
39
+ /* @vite-ignore */
40
+ pathToFileURL(sourceAbs).href
41
+ );
42
+ } finally {
43
+ await unregister?.();
44
+ }
45
+ }
46
+ async function importBuildAwareModule({
47
+ source,
48
+ dist,
49
+ callerUrl = import.meta.url
50
+ }) {
51
+ const thisFile = fileURLToPath(callerUrl);
52
+ const thisDir = dirname(thisFile);
53
+ const packageRoot = resolve(thisDir, "..", "..");
54
+ const distAbs = resolve(packageRoot, "dist", "vite-plugin", dist);
55
+ if (existsSync(distAbs)) {
56
+ return await import(
57
+ /* @vite-ignore */
58
+ pathToFileURL(distAbs).href
59
+ );
60
+ }
61
+ const sourceAbs = resolve(packageRoot, "src", "vite-plugin", source);
62
+ if (!existsSync(sourceAbs)) {
63
+ throw new Error(
64
+ `[smrt] Build-aware import fallback could not find source module ${sourceAbs} after dist module ${distAbs} was unavailable.`
65
+ );
66
+ }
67
+ return importSourceFallback(sourceAbs, packageRoot);
68
+ }
69
+ export {
70
+ importBuildAwareModule
71
+ };
72
+ //# sourceMappingURL=import-build-aware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-build-aware.js","sources":["../../src/vite-plugin/import-build-aware.ts"],"sourcesContent":["/**\n * Import a module that exists in both source (`.ts`) and compiled (`.js`)\n * form, deterministically.\n *\n * # Why this exists\n *\n * The Vite plugin needs to load sibling modules (scanner, schema generator)\n * at runtime. Those siblings ship in two shapes:\n *\n * src/scanner/index.ts (workspace dev, tsx-driven)\n * dist/vite-plugin/../scanner.js (published tarball, plain Node ESM)\n *\n * The previous implementation picked a branch by sniffing\n * `import.meta.url.endsWith('.ts')` and then issued a relative dynamic\n * `import()`. That decision rode on top of tsx's ESM loader, whose\n * interception of `@happyvertical/smrt-core/vite-plugin` varies with tsx\n * version, Node version, pnpm symlink state, and Node's internal resolver\n * cache (first-import wins). As a result, the branch was non-deterministic\n * at publish time and could pick the `.ts` source even though `dist/`\n * existed — then fail inside that source on an inner `.js→.ts` hop. Seen\n * on PR 1131, Release A, Release B, and PR 1141, each time losing the\n * publish for 12–13 downstream domain packages.\n *\n * # How this is deterministic\n *\n * We don't ask tsx anything. We check `<packageRoot>/dist/vite-plugin/<dist>`\n * directly with `fs.existsSync`. If dist is on disk we load it via an\n * absolute `file://` URL — Node's loader doesn't consult tsx for that.\n * If dist is absent (fresh clone, pre-first-build) we fall back to the\n * source path via a plain relative `import()`; at that point tsx is the\n * only way to load `.ts` anyway, so there's no choice to make.\n *\n * # Dev-mode caveat\n *\n * When `dist/` exists, this helper always loads dist — even if a core\n * developer just edited source. That's a deliberate trade: in any\n * meaningful dev loop you have `pnpm build:watch` keeping dist fresh, and\n * the determinism at publish time is worth far more than a hot-reload\n * convenience for the handful of times anyone edits\n * `packages/core/src/scanner/*.ts` directly.\n *\n * @see https://github.com/happyvertical/smrt/issues/1139\n */\n\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, resolve as resolvePath } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nconst require = createRequire(import.meta.url);\nconst TS_SOURCE_EXTENSIONS = new Set(['.ts', '.mts', '.tsx']);\n\nasync function importSourceFallback<T>(\n sourceAbs: string,\n packageRoot: string,\n): Promise<T> {\n const ext = extname(sourceAbs);\n if (!TS_SOURCE_EXTENSIONS.has(ext)) {\n return (await import(\n /* @vite-ignore */ pathToFileURL(sourceAbs).href\n )) as T;\n }\n\n let unregister: (() => Promise<void>) | undefined;\n try {\n const tsxApiPath = require.resolve('tsx/esm/api');\n const { register } = await import(\n /* @vite-ignore */ pathToFileURL(tsxApiPath).href\n );\n const workspaceTsconfigPath = resolvePath(\n packageRoot,\n '..',\n '..',\n 'tsconfig.package-build.json',\n );\n unregister = register(\n existsSync(workspaceTsconfigPath)\n ? { tsconfig: workspaceTsconfigPath }\n : undefined,\n );\n } catch (error) {\n throw new Error(\n `[smrt] Failed to register tsx source fallback for ${sourceAbs}. Ensure \"tsx\" is installed or keep dist artifacts available before invoking the SMRT Vite plugin.`,\n { cause: error },\n );\n }\n\n try {\n return (await import(\n /* @vite-ignore */ pathToFileURL(sourceAbs).href\n )) as T;\n } finally {\n await unregister?.();\n }\n}\n\nexport interface ImportBuildAwareOptions {\n /**\n * Relative path to the `.ts` source entry, expressed from the\n * `vite-plugin/` directory (e.g. `'../scanner/index.ts'`). Used only\n * when the corresponding dist file is absent.\n */\n source: string;\n /**\n * Relative path to the compiled `.js` entry, expressed from the\n * `vite-plugin/` directory (e.g. `'../scanner.js'`). Resolved to an\n * absolute path against `<packageRoot>/dist/vite-plugin/` — independent\n * of where the caller physically lives on disk.\n */\n dist: string;\n /**\n * Override for the caller's `import.meta.url`. Tests use this to\n * simulate being loaded from different locations without physically\n * relocating the source file. Defaults to this module's URL, which is\n * equivalent to the caller in the normal production path (both sit in\n * `vite-plugin/`).\n */\n callerUrl?: string;\n}\n\nexport async function importBuildAwareModule<T>({\n source,\n dist,\n callerUrl = import.meta.url,\n}: ImportBuildAwareOptions): Promise<T> {\n const thisFile = fileURLToPath(callerUrl);\n const thisDir = dirname(thisFile);\n\n // Walk up two levels: `src/vite-plugin/` and `dist/vite-plugin/` both\n // sit at package-root + 2 segments, so the same math works regardless\n // of which copy of the plugin the consumer loaded.\n const packageRoot = resolvePath(thisDir, '..', '..');\n const distAbs = resolvePath(packageRoot, 'dist', 'vite-plugin', dist);\n\n if (existsSync(distAbs)) {\n // Absolute `file://` URL bypasses tsx's specifier resolver entirely\n // — Node's native loader handles it. Deterministic regardless of\n // whether tsx, pnpm, or Node's resolver cache are in play.\n return (await import(/* @vite-ignore */ pathToFileURL(distAbs).href)) as T;\n }\n\n // Dist missing → fresh clone before first build or a publish-time rebuild\n // window. Source paths are defined relative to `src/vite-plugin/`, not to\n // whichever copy of this helper happens to be loaded, so always anchor the\n // fallback under the source tree explicitly.\n const sourceAbs = resolvePath(packageRoot, 'src', 'vite-plugin', source);\n if (!existsSync(sourceAbs)) {\n throw new Error(\n `[smrt] Build-aware import fallback could not find source module ${sourceAbs} after dist module ${distAbs} was unavailable.`,\n );\n }\n\n return importSourceFallback<T>(sourceAbs, packageRoot);\n}\n"],"names":["require","resolvePath"],"mappings":";;;;AAiDA,MAAMA,YAAU,cAAc,YAAY,GAAG;AAC7C,MAAM,uBAAuB,oBAAI,IAAI,CAAC,OAAO,QAAQ,MAAM,CAAC;AAE5D,eAAe,qBACb,WACA,aACY;AACZ,QAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,CAAC,qBAAqB,IAAI,GAAG,GAAG;AAClC,WAAQ,MAAM;AAAA;AAAA,MACO,cAAc,SAAS,EAAE;AAAA;AAAA,EAEhD;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,aAAaA,UAAQ,QAAQ,aAAa;AAChD,UAAM,EAAE,SAAA,IAAa,MAAM;AAAA;AAAA,MACN,cAAc,UAAU,EAAE;AAAA;AAE/C,UAAM,wBAAwBC;AAAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,iBAAa;AAAA,MACX,WAAW,qBAAqB,IAC5B,EAAE,UAAU,0BACZ;AAAA,IAAA;AAAA,EAER,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,qDAAqD,SAAS;AAAA,MAC9D,EAAE,OAAO,MAAA;AAAA,IAAM;AAAA,EAEnB;AAEA,MAAI;AACF,WAAQ,MAAM;AAAA;AAAA,MACO,cAAc,SAAS,EAAE;AAAA;AAAA,EAEhD,UAAA;AACE,UAAM,aAAA;AAAA,EACR;AACF;AA0BA,eAAsB,uBAA0B;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY,YAAY;AAC1B,GAAwC;AACtC,QAAM,WAAW,cAAc,SAAS;AACxC,QAAM,UAAU,QAAQ,QAAQ;AAKhC,QAAM,cAAcA,QAAY,SAAS,MAAM,IAAI;AACnD,QAAM,UAAUA,QAAY,aAAa,QAAQ,eAAe,IAAI;AAEpE,MAAI,WAAW,OAAO,GAAG;AAIvB,WAAQ,MAAM;AAAA;AAAA,MAA0B,cAAc,OAAO,EAAE;AAAA;AAAA,EACjE;AAMA,QAAM,YAAYA,QAAY,aAAa,OAAO,eAAe,MAAM;AACvE,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,mEAAmE,SAAS,sBAAsB,OAAO;AAAA,IAAA;AAAA,EAE7G;AAEA,SAAO,qBAAwB,WAAW,WAAW;AACvD;"}
@@ -0,0 +1,59 @@
1
+ import { DomainKnowledgeConfig } from '@happyvertical/smrt-types';
2
+ import { Plugin } from 'vite';
3
+ export type { CliApiCoherenceViolation, SvelteKitOptions, } from './sveltekit-generator.js';
4
+ export { findCliApiCoherenceViolations, generateSvelteKitRoutes, methodNameToKebab, resolveApiActionSet, validateCliIncludeAgainstApi, } from './sveltekit-generator.js';
5
+ export interface SmrtPluginOptions {
6
+ /** Glob patterns for SMRT source files */
7
+ include?: string[];
8
+ /** Patterns to exclude */
9
+ exclude?: string[];
10
+ /** Output directory for generated files */
11
+ outDir?: string;
12
+ /** Enable hot module replacement */
13
+ hmr?: boolean;
14
+ /** Watch for file changes */
15
+ watch?: boolean;
16
+ /** Generate types */
17
+ generateTypes?: boolean;
18
+ /** Custom base classes to scan for */
19
+ baseClasses?: string[];
20
+ /** Follow import chains to detect inheritance (e.g., Event extends SmrtObject) */
21
+ followImports?: boolean;
22
+ /** Directory to write TypeScript declarations (relative to project root) */
23
+ typeDeclarationsPath?: string;
24
+ /** Plugin execution mode - controls Node.js vs browser compatibility */
25
+ mode?: 'server' | 'client' | 'auto';
26
+ /**
27
+ * @deprecated OXC scanner is now the only scanner. This option is ignored.
28
+ */
29
+ experimentalFastScanner?: boolean;
30
+ /** SvelteKit route auto-generation options */
31
+ svelteKit?: {
32
+ /** Enable SvelteKit route generation (default: false) */
33
+ enabled: boolean;
34
+ /** Output directory for generated routes (default: 'src/routes/api') */
35
+ routesDir?: string;
36
+ /** Directory containing SMRT objects (default: 'src/lib/objects') */
37
+ objectsDir?: string;
38
+ /** Directory for configuration file (default: 'src/lib/server') */
39
+ configPath?: string;
40
+ /** Configuration file name (default: 'smrt.ts') */
41
+ configFileName?: string;
42
+ /**
43
+ * Apply kebab-case to custom-method URL segments (e.g. `discoverFromUrl`
44
+ * becomes `/discover-from-url`). Opt-in for one minor; default flips in
45
+ * the next major. An explicit `api.routes[name].path` always wins.
46
+ */
47
+ kebabRoutes?: boolean;
48
+ };
49
+ /** Domain-scoped agent/developer knowledge artifact generation. */
50
+ knowledge?: DomainKnowledgeConfig | false;
51
+ /**
52
+ * Validate that every method in `cli.include` is exposed via the API
53
+ * (so HTTP-based CLI consumers can actually reach them). Default: true.
54
+ * Per-class opt-out via `cli: { skipApiCheck: true }`.
55
+ */
56
+ validateCliApiCoherence?: boolean;
57
+ }
58
+ export declare function smrtPlugin(options?: SmrtPluginOptions): Plugin;
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAelD,YAAY,EACV,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE;QACV,yDAAyD;QACzD,OAAO,EAAE,OAAO,CAAC;QACjB,wEAAwE;QACxE,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,qEAAqE;QACrE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mEAAmE;QACnE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mDAAmD;QACnD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;WAIG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,mEAAmE;IACnE,SAAS,CAAC,EAAE,qBAAqB,GAAG,KAAK,CAAC;IAC1C;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAsBD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA+1BlE"}