@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,601 @@
1
+ import { createLogger } from "@happyvertical/logger";
2
+ import { detectEngine, getDDLStrategy } from "../schema/ddl/index.js";
3
+ import "../registry.js";
4
+ import "../utils.js";
5
+ import { isJsonPathIndex, renderIndexTarget } from "../schema/index-utils.js";
6
+ const logger = createLogger({ level: "info" });
7
+ const VALID_SQL_DATA_TYPES = /* @__PURE__ */ new Set([
8
+ "TEXT",
9
+ "INTEGER",
10
+ "REAL",
11
+ "BLOB",
12
+ "BOOLEAN",
13
+ "JSON",
14
+ "TIMESTAMP",
15
+ "UUID"
16
+ ]);
17
+ function isValidSQLDataType(type) {
18
+ return VALID_SQL_DATA_TYPES.has(type);
19
+ }
20
+ const PROTECTED_INDEX_SUFFIXES = ["_pkey", "_key"];
21
+ function isProtectedDbIndexName(name) {
22
+ return PROTECTED_INDEX_SUFFIXES.some((suffix) => name.endsWith(suffix));
23
+ }
24
+ function resolveDatabaseUrl(db) {
25
+ const dbWithConfig = db;
26
+ return db.url || dbWithConfig.config?.url || "";
27
+ }
28
+ class SchemaComparer {
29
+ db;
30
+ options;
31
+ engine;
32
+ ddlStrategy;
33
+ constructor(db, options = {}) {
34
+ this.db = db;
35
+ this.options = {
36
+ includeDroppedTables: false,
37
+ includeDroppedColumns: false,
38
+ includeDroppedIndexes: false,
39
+ ignoreTypeMismatches: false,
40
+ ...options
41
+ };
42
+ this.engine = typeof this.db.exportTable === "function" ? "json" : detectEngine(resolveDatabaseUrl(this.db), this.options.engineHint);
43
+ this.ddlStrategy = getDDLStrategy(this.engine);
44
+ }
45
+ /**
46
+ * Compare manifest schemas to database and return differences
47
+ */
48
+ async compare(manifestSchemas) {
49
+ const diff = {
50
+ added_tables: [],
51
+ dropped_tables: [],
52
+ changes: [],
53
+ has_changes: false
54
+ };
55
+ const existingTables = await this.getExistingTables();
56
+ for (const [tableName, schema] of Object.entries(manifestSchemas)) {
57
+ if (!existingTables.has(tableName)) {
58
+ diff.added_tables.push(schema);
59
+ diff.has_changes = true;
60
+ } else {
61
+ const tableChanges = await this.compareTable(tableName, schema);
62
+ if (tableChanges.length > 0) {
63
+ diff.changes.push(...tableChanges);
64
+ diff.has_changes = true;
65
+ }
66
+ }
67
+ }
68
+ if (this.options.includeDroppedTables) {
69
+ for (const tableName of existingTables) {
70
+ if (tableName.startsWith("_smrt_") || tableName.startsWith("sqlite_")) {
71
+ continue;
72
+ }
73
+ if (!manifestSchemas[tableName]) {
74
+ diff.dropped_tables.push(tableName);
75
+ diff.has_changes = true;
76
+ }
77
+ }
78
+ }
79
+ return diff;
80
+ }
81
+ /**
82
+ * Compare a single table's schema to manifest
83
+ */
84
+ async compareTable(tableName, manifest) {
85
+ const changes = [];
86
+ const dbSchema = await this.db.getTableSchema?.(tableName);
87
+ if (!dbSchema) {
88
+ return changes;
89
+ }
90
+ const columnChanges = this.compareColumns(tableName, manifest, dbSchema);
91
+ changes.push(...columnChanges);
92
+ const indexChanges = this.compareIndexes(tableName, manifest, dbSchema);
93
+ changes.push(...indexChanges);
94
+ return changes;
95
+ }
96
+ /**
97
+ * Compare columns between manifest and database
98
+ */
99
+ compareColumns(tableName, manifest, dbSchema) {
100
+ const changes = [];
101
+ const dbColumnNames = new Set(Object.keys(dbSchema.columns));
102
+ for (const [colName, colDef] of Object.entries(manifest.columns)) {
103
+ if (!dbColumnNames.has(colName)) {
104
+ changes.push({
105
+ type: "add_column",
106
+ table: tableName,
107
+ name: colName,
108
+ column: colDef,
109
+ sql: this.generateAddColumnSQL(tableName, colName, colDef)
110
+ });
111
+ } else {
112
+ const dbCol = dbSchema.columns[colName];
113
+ const manifestType = colDef.type;
114
+ if (!isValidSQLDataType(manifestType)) {
115
+ logger.warn(
116
+ `[SchemaComparer] Invalid manifest type "${manifestType}" for ${tableName}.${colName}, treating as TEXT`
117
+ );
118
+ }
119
+ const validatedType = isValidSQLDataType(manifestType) ? manifestType : "TEXT";
120
+ const expectedEngineType = this.ddlStrategy.mapType(validatedType);
121
+ const normalizedExpected = this.normalizeType(expectedEngineType);
122
+ const normalizedActual = this.normalizeType(dbCol.type);
123
+ const isUuidTextEquivalent = this.isUuidTextEquivalentColumn(
124
+ colName,
125
+ colDef,
126
+ normalizedExpected,
127
+ normalizedActual
128
+ );
129
+ const isJsonTextEquivalent = normalizedExpected === "JSON" && normalizedActual === "TEXT" || normalizedExpected === "TEXT" && normalizedActual === "JSON";
130
+ if (normalizedExpected !== normalizedActual && !isUuidTextEquivalent && !isJsonTextEquivalent) {
131
+ if (this.isCompatibleTypeUpgrade(colDef.type, dbCol.type)) {
132
+ const generatedSQL = this.generateTypeUpgradeSQL(
133
+ tableName,
134
+ colName,
135
+ colDef,
136
+ dbCol.type
137
+ );
138
+ changes.push({
139
+ type: "type_upgrade",
140
+ table: tableName,
141
+ name: colName,
142
+ column: colDef,
143
+ mismatch: {
144
+ expected: colDef.type,
145
+ actual: dbCol.type
146
+ },
147
+ sql: generatedSQL.sql,
148
+ ...generatedSQL.statements ? { sqlStatements: generatedSQL.statements } : {}
149
+ });
150
+ } else if (!this.options.ignoreTypeMismatches) {
151
+ changes.push({
152
+ type: "type_mismatch",
153
+ table: tableName,
154
+ name: colName,
155
+ mismatch: {
156
+ expected: colDef.type,
157
+ actual: dbCol.type
158
+ }
159
+ });
160
+ }
161
+ }
162
+ }
163
+ }
164
+ if (this.options.includeDroppedColumns) {
165
+ const manifestColumnNames = new Set(Object.keys(manifest.columns));
166
+ for (const colName of dbColumnNames) {
167
+ if (!manifestColumnNames.has(colName)) {
168
+ changes.push({
169
+ type: "drop_column",
170
+ table: tableName,
171
+ name: colName,
172
+ sql: this.generateDropColumnSQL(tableName, colName)
173
+ });
174
+ }
175
+ }
176
+ }
177
+ return changes;
178
+ }
179
+ isUuidTextEquivalentColumn(columnName, colDef, normalizedExpected, normalizedActual) {
180
+ const expectedUuidActualText = normalizedExpected === "UUID" && normalizedActual === "TEXT";
181
+ const expectedTextActualUuid = normalizedExpected === "TEXT" && normalizedActual === "UUID";
182
+ if (!expectedUuidActualText && !expectedTextActualUuid) {
183
+ return false;
184
+ }
185
+ return this.isStructuralUuidCompatibleColumn(columnName, colDef);
186
+ }
187
+ isStructuralUuidCompatibleColumn(columnName, colDef) {
188
+ return colDef.primaryKey === true || Boolean(colDef.foreignKey) || colDef.referenceKind === "id" || colDef.referenceKind === "foreignKey" || colDef.referenceKind === "crossPackageRef" || colDef.referenceKind === "tenantId" || columnName === "id" && colDef.type === "TEXT";
189
+ }
190
+ /**
191
+ * Compare indexes between manifest and database
192
+ *
193
+ * Three classes of drift the differ now detects:
194
+ *
195
+ * 1. **Missing index** — manifest has an index neither the DB has by name
196
+ * nor any equivalent-by-signature. Emit `add_index`. (Issue #741: the
197
+ * signature check protects against creating duplicates when STI child
198
+ * classes register indexes with different name prefixes.)
199
+ *
200
+ * 2. **Same-name shape drift** — DB has an index with the manifest's name,
201
+ * but its columns or uniqueness flag differ. This is the failure mode
202
+ * in issue #1165: `tenants_slug_context_meta_type_idx` exists but is
203
+ * non-unique, while the manifest declares it unique. Emit
204
+ * `drop_index` + `add_index` so the next migrate cycle recreates it
205
+ * with the correct shape.
206
+ *
207
+ * 3. **Orphan in DB** — DB has an index with no manifest counterpart by
208
+ * name and no signature equivalent. Emit `drop_index` *only* when the
209
+ * caller opts in via `includeDroppedIndexes`, and even then never for
210
+ * PostgreSQL implicit indexes (`*_pkey`, `*_key`) — those are owned by
211
+ * table-level constraints and need a separate `DROP CONSTRAINT` path
212
+ * that the differ does not emit yet.
213
+ */
214
+ compareIndexes(tableName, manifest, dbSchema) {
215
+ const changes = [];
216
+ const dbIndexesByName = /* @__PURE__ */ new Map();
217
+ const dbIndexSignatures = /* @__PURE__ */ new Map();
218
+ for (const idx of dbSchema.indexes) {
219
+ const unique = idx.unique ?? false;
220
+ dbIndexesByName.set(idx.name, { columns: idx.columns, unique });
221
+ const signature = this.getIndexSignature(idx.columns, unique);
222
+ let bucket = dbIndexSignatures.get(signature);
223
+ if (!bucket) {
224
+ bucket = /* @__PURE__ */ new Set();
225
+ dbIndexSignatures.set(signature, bucket);
226
+ }
227
+ bucket.add(idx.name);
228
+ }
229
+ const manifestSignatureSet = /* @__PURE__ */ new Set();
230
+ for (const idx of manifest.indexes) {
231
+ manifestSignatureSet.add(this.getIndexSignature(idx));
232
+ }
233
+ const claimedDbIndexes = /* @__PURE__ */ new Set();
234
+ for (const idx of manifest.indexes) {
235
+ const manifestSignature = this.getIndexSignature(idx);
236
+ const dbByName = dbIndexesByName.get(idx.name);
237
+ if (dbByName) {
238
+ claimedDbIndexes.add(idx.name);
239
+ if (isJsonPathIndex(idx)) {
240
+ continue;
241
+ }
242
+ const dbSignature = this.getIndexSignature(
243
+ dbByName.columns,
244
+ dbByName.unique
245
+ );
246
+ if (dbSignature === manifestSignature) {
247
+ continue;
248
+ }
249
+ changes.push({
250
+ type: "drop_index",
251
+ table: tableName,
252
+ name: idx.name,
253
+ sql: this.generateDropIndexSQL(idx.name)
254
+ });
255
+ changes.push({
256
+ type: "add_index",
257
+ table: tableName,
258
+ name: idx.name,
259
+ index: idx,
260
+ sql: this.generateAddIndexSQL(tableName, idx)
261
+ });
262
+ continue;
263
+ }
264
+ const equivalentIndexNames = dbIndexSignatures.get(manifestSignature);
265
+ if (equivalentIndexNames && equivalentIndexNames.size > 0) {
266
+ for (const name of equivalentIndexNames) {
267
+ claimedDbIndexes.add(name);
268
+ }
269
+ continue;
270
+ }
271
+ changes.push({
272
+ type: "add_index",
273
+ table: tableName,
274
+ name: idx.name,
275
+ index: idx,
276
+ sql: this.generateAddIndexSQL(tableName, idx)
277
+ });
278
+ }
279
+ if (this.options.includeDroppedIndexes) {
280
+ for (const idx of dbSchema.indexes) {
281
+ if (claimedDbIndexes.has(idx.name)) continue;
282
+ if (isProtectedDbIndexName(idx.name)) continue;
283
+ const idxSignature = this.getIndexSignature(
284
+ idx.columns,
285
+ idx.unique ?? false
286
+ );
287
+ if (manifestSignatureSet.has(idxSignature)) continue;
288
+ changes.push({
289
+ type: "drop_index",
290
+ table: tableName,
291
+ name: idx.name,
292
+ sql: this.generateDropIndexSQL(idx.name)
293
+ });
294
+ }
295
+ }
296
+ return changes;
297
+ }
298
+ /**
299
+ * Generate a signature for an index based on its columns and uniqueness.
300
+ * Used for functional equivalence checking (Issue #741).
301
+ *
302
+ * Note: Column order is preserved because it is semantically significant for
303
+ * composite indexes. An index on (a, b) is NOT equivalent to (b, a) - they
304
+ * have different query performance characteristics.
305
+ *
306
+ * Limitation: Partial indexes (with WHERE clauses) are not fully supported.
307
+ * The database introspection layer doesn't provide WHERE clause information,
308
+ * so two partial indexes with the same columns but different WHERE clauses
309
+ * cannot be distinguished and may be incorrectly treated as equivalent.
310
+ *
311
+ * For JSON-path indexes (`@meta({ indexed: true })`) the signature is
312
+ * derived from the JSON path instead of an empty column list, so the
313
+ * differ can distinguish two jsonPath indexes against different paths.
314
+ *
315
+ * @param idxOrColumns - Either an IndexDefinition or a column array (legacy)
316
+ * @param uniqueArg - Unique flag (used when first arg is a column array)
317
+ * @returns Signature string
318
+ */
319
+ getIndexSignature(idxOrColumns, uniqueArg) {
320
+ if (Array.isArray(idxOrColumns)) {
321
+ return `${idxOrColumns.join(",")}:${Boolean(uniqueArg)}`;
322
+ }
323
+ const idx = idxOrColumns;
324
+ if (isJsonPathIndex(idx) && idx.jsonPath) {
325
+ return `json:${idx.jsonPath.column}.${idx.jsonPath.path}:${Boolean(idx.unique)}`;
326
+ }
327
+ return `${(idx.columns ?? []).join(",")}:${Boolean(idx.unique)}`;
328
+ }
329
+ /**
330
+ * Get list of existing tables from database
331
+ */
332
+ async getExistingTables() {
333
+ let query;
334
+ if (this.engine === "postgres") {
335
+ query = `SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'`;
336
+ } else {
337
+ query = `SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`;
338
+ }
339
+ const result = await this.db.query(query);
340
+ const rows = result.rows;
341
+ return new Set(
342
+ rows.map((r) => r.name || r.table_name || "").filter(Boolean)
343
+ );
344
+ }
345
+ /**
346
+ * Normalize SQL types for comparison
347
+ */
348
+ normalizeType(type) {
349
+ const upper = type.toUpperCase().trim();
350
+ if (/^(INTEGER|INT|BIGINT|SMALLINT|TINYINT)$/i.test(upper)) {
351
+ return "INTEGER";
352
+ }
353
+ if (/^(TEXT|CLOB|STRING|VARCHAR|CHAR)/i.test(upper)) {
354
+ return "TEXT";
355
+ }
356
+ if (/^UUID$/i.test(upper)) {
357
+ return "UUID";
358
+ }
359
+ if (/^(REAL|FLOAT|DOUBLE|DECIMAL|NUMERIC|NUMBER)/i.test(upper)) {
360
+ return "REAL";
361
+ }
362
+ if (/^(BOOLEAN|BOOL)/i.test(upper)) {
363
+ return "BOOLEAN";
364
+ }
365
+ if (/^(DATETIME|TIMESTAMP|DATE|TIME)/i.test(upper)) {
366
+ return "TIMESTAMP";
367
+ }
368
+ if (/^(BLOB|BINARY|BYTEA)/i.test(upper)) {
369
+ return "BLOB";
370
+ }
371
+ if (/^(JSON|JSONB)/i.test(upper)) {
372
+ return "JSON";
373
+ }
374
+ return upper;
375
+ }
376
+ /**
377
+ * Check if a type change is a safe upgrade that can be auto-migrated.
378
+ *
379
+ * SMRT controls the data lifecycle for these columns, so we know:
380
+ * - TEXT→JSON: The column stores JSON data serialized as text (arrays, objects)
381
+ * - TEXT/JSON→TIMESTAMP: Legacy system columns stored timestamp strings
382
+ * before newer manifests normalized the column type.
383
+ * - INTEGER→REAL: Safe widening of integer to floating point
384
+ * - TEXT/REAL→INTEGER on PostgreSQL: explicit data-checked repairs for
385
+ * legacy integer columns that were previously stored as text/real.
386
+ *
387
+ * @param manifestType - The abstract type from the manifest (e.g., 'JSON')
388
+ * @param dbType - The actual type in the database (e.g., 'TEXT')
389
+ * @returns true if the change from dbType to manifestType is a safe upgrade
390
+ */
391
+ isCompatibleTypeUpgrade(manifestType, dbType) {
392
+ const manifest = this.normalizeType(manifestType);
393
+ const db = this.normalizeType(dbType);
394
+ if (manifest === "JSON" && db === "TEXT") {
395
+ return true;
396
+ }
397
+ if (manifest === "TEXT" && db === "JSON") {
398
+ return true;
399
+ }
400
+ if (manifest === "TEXT" && db === "UUID") {
401
+ return true;
402
+ }
403
+ if (manifest === "REAL" && db === "INTEGER") {
404
+ return true;
405
+ }
406
+ if (this.engine === "postgres" && manifest === "INTEGER" && (db === "TEXT" || db === "REAL")) {
407
+ return true;
408
+ }
409
+ if (manifest === "TIMESTAMP" && (db === "TEXT" || db === "JSON")) {
410
+ return true;
411
+ }
412
+ return false;
413
+ }
414
+ /**
415
+ * Generate SQL for a type upgrade migration.
416
+ *
417
+ * Engine-specific SQL:
418
+ * - SQLite: TEXT and JSON are equivalent, no-op or comment
419
+ * - DuckDB: ALTER COLUMN TYPE (native type conversion)
420
+ * - PostgreSQL: ALTER COLUMN TYPE with USING clause
421
+ */
422
+ generateTypeUpgradeSQL(tableName, colName, colDef, dbType) {
423
+ const quotedTable = this.quoteIdentifier(tableName);
424
+ const quotedCol = this.quoteIdentifier(colName);
425
+ const manifestType = colDef.type;
426
+ const validatedType = isValidSQLDataType(manifestType) ? manifestType : "TEXT";
427
+ const targetType = this.ddlStrategy.mapType(validatedType);
428
+ switch (this.engine) {
429
+ case "sqlite":
430
+ if (this.normalizeType(manifestType) === "JSON" && this.normalizeType(dbType) === "TEXT") {
431
+ return {
432
+ sql: `-- SQLite: ${quotedCol} already stores JSON as TEXT (no change needed)`
433
+ };
434
+ }
435
+ return {
436
+ sql: `-- SQLite: Type upgrade for ${quotedCol} requires table recreation`
437
+ };
438
+ case "postgres": {
439
+ const manifestNormalized = this.normalizeType(manifestType);
440
+ const dbNormalized = this.normalizeType(dbType);
441
+ const preflightSQL = manifestNormalized === "INTEGER" && (dbNormalized === "TEXT" || dbNormalized === "REAL") ? this.generatePostgresIntegerPreflightSQL(
442
+ quotedTable,
443
+ quotedCol,
444
+ tableName,
445
+ colName,
446
+ dbNormalized
447
+ ) : null;
448
+ const clauses = [];
449
+ if (colDef.defaultValue !== void 0) {
450
+ clauses.push(`ALTER COLUMN ${quotedCol} DROP DEFAULT`);
451
+ }
452
+ let typeClause = `ALTER COLUMN ${quotedCol} TYPE ${targetType}`;
453
+ if (manifestNormalized === "JSON" && dbNormalized === "TEXT") {
454
+ typeClause += ` USING to_jsonb(${quotedCol})`;
455
+ } else if (manifestNormalized === "TEXT" && dbNormalized === "JSON") {
456
+ typeClause += ` USING ${quotedCol}::text`;
457
+ } else if (manifestNormalized === "TEXT" && dbNormalized === "UUID") {
458
+ typeClause += ` USING ${quotedCol}::text`;
459
+ } else if (manifestNormalized === "INTEGER" && dbNormalized === "TEXT") {
460
+ typeClause += ` USING trim(${quotedCol}::text)::integer`;
461
+ } else if (manifestNormalized === "INTEGER" && dbNormalized === "REAL") {
462
+ typeClause += ` USING ${quotedCol}::integer`;
463
+ } else if (manifestNormalized === "TIMESTAMP" && (dbNormalized === "TEXT" || dbNormalized === "JSON")) {
464
+ typeClause += ` USING NULLIF(NULLIF(trim(both '"' from ${quotedCol}::text), ''), 'null')::timestamp`;
465
+ }
466
+ clauses.push(typeClause);
467
+ if (colDef.defaultValue !== void 0) {
468
+ const formattedDefault = this.ddlStrategy.formatDefaultValue(
469
+ colDef.defaultValue,
470
+ validatedType
471
+ );
472
+ const defaultSql = manifestNormalized === "JSON" ? `${formattedDefault}::${targetType.toLowerCase()}` : formattedDefault;
473
+ clauses.push(`ALTER COLUMN ${quotedCol} SET DEFAULT ${defaultSql}`);
474
+ }
475
+ const alterSql = `ALTER TABLE ${quotedTable} ${clauses.join(", ")}`;
476
+ return preflightSQL ? { sql: alterSql, statements: [preflightSQL, alterSql] } : { sql: alterSql };
477
+ }
478
+ case "duckdb":
479
+ return {
480
+ sql: `ALTER TABLE ${quotedTable} ALTER COLUMN ${quotedCol} TYPE ${targetType}`
481
+ };
482
+ default: {
483
+ const safeDbType = dbType.replace(/[^\w]/g, "_");
484
+ const safeManifestType = manifestType.replace(/[^\w]/g, "_");
485
+ return {
486
+ sql: `-- Type upgrade for ${quotedCol}: ${safeDbType} → ${safeManifestType}`
487
+ };
488
+ }
489
+ }
490
+ }
491
+ /**
492
+ * Quote a SQL identifier
493
+ */
494
+ quoteIdentifier(name) {
495
+ return `"${name.replace(/"/g, '""')}"`;
496
+ }
497
+ /**
498
+ * Generate a PostgreSQL preflight guard for narrowing legacy columns to
499
+ * INTEGER. PostgreSQL's REAL→INTEGER cast rounds fractional values, so the
500
+ * generated migration must fail before the ALTER can silently change data.
501
+ */
502
+ generatePostgresIntegerPreflightSQL(quotedTable, quotedCol, tableName, colName, dbNormalized) {
503
+ const invalidCondition = dbNormalized === "REAL" ? `${quotedCol} IS NOT NULL AND ${quotedCol} <> trunc(${quotedCol})` : `${quotedCol} IS NOT NULL AND trim(${quotedCol}::text) !~ '^[+-]?[0-9]+$'`;
504
+ const message = `Cannot convert ${tableName}.${colName} to INTEGER: found non-integer values`;
505
+ return `DO $$ BEGIN IF EXISTS (SELECT 1 FROM ${quotedTable} WHERE ${invalidCondition}) THEN RAISE EXCEPTION ${this.quoteLiteral(message)}; END IF; END $$`;
506
+ }
507
+ quoteLiteral(value) {
508
+ return `'${value.replace(/'/g, "''")}'`;
509
+ }
510
+ /**
511
+ * Generate SQL for adding a column
512
+ */
513
+ generateAddColumnSQL(tableName, colName, colDef) {
514
+ const validatedType = isValidSQLDataType(colDef.type) ? colDef.type : "TEXT";
515
+ if (!isValidSQLDataType(colDef.type)) {
516
+ logger.warn(
517
+ `[SchemaComparer] Invalid manifest type "${colDef.type}" for ${tableName}.${colName}, treating as TEXT`
518
+ );
519
+ }
520
+ const parts = [
521
+ this.quoteIdentifier(colName),
522
+ this.ddlStrategy.mapType(validatedType)
523
+ ];
524
+ if (colDef.notNull) {
525
+ parts.push("NOT NULL");
526
+ }
527
+ if (colDef.unique) {
528
+ parts.push("UNIQUE");
529
+ }
530
+ if (colDef.defaultValue !== void 0) {
531
+ const defaultVal = this.ddlStrategy.formatDefaultValue(
532
+ colDef.defaultValue,
533
+ validatedType
534
+ );
535
+ parts.push(`DEFAULT ${defaultVal}`);
536
+ }
537
+ if (colDef.check) {
538
+ parts.push(`CHECK (${colDef.check})`);
539
+ }
540
+ const columnDefinition = parts.join(" ");
541
+ return `ALTER TABLE ${this.quoteIdentifier(tableName)} ADD COLUMN ${columnDefinition}`;
542
+ }
543
+ /**
544
+ * Generate SQL for dropping a column
545
+ */
546
+ generateDropColumnSQL(tableName, colName) {
547
+ return `ALTER TABLE ${this.quoteIdentifier(tableName)} DROP COLUMN ${this.quoteIdentifier(colName)}`;
548
+ }
549
+ /**
550
+ * Generate SQL for adding an index
551
+ */
552
+ generateAddIndexSQL(tableName, idx) {
553
+ const uniqueStr = idx.unique ? "UNIQUE " : "";
554
+ const target = renderIndexTarget(idx, this.engine);
555
+ return `CREATE ${uniqueStr}INDEX ${this.quoteIdentifier(idx.name)} ON ${this.quoteIdentifier(tableName)} (${target})`;
556
+ }
557
+ /**
558
+ * Generate SQL for dropping an index.
559
+ *
560
+ * This SQL is consumed by the manifest-driven execution path:
561
+ *
562
+ * - `db:migrate` runs the SQL we put in `change.sql` directly, with the
563
+ * tracker's `executePostgresStatements` adding CONCURRENTLY when
564
+ * `--postgres-safe` is on.
565
+ *
566
+ * PostgreSQL ends up with `CONCURRENTLY` when it should.
567
+ * Keeping this method engine-agnostic also means the diff preview text
568
+ * stays readable (no engine-specific noise) for engines like SQLite
569
+ * where CONCURRENTLY isn't a thing.
570
+ */
571
+ generateDropIndexSQL(indexName) {
572
+ return `DROP INDEX IF EXISTS ${this.quoteIdentifier(indexName)}`;
573
+ }
574
+ }
575
+ async function generateSchemaDiff(db, manifestSchemas, options = {}) {
576
+ const comparer = new SchemaComparer(db, options);
577
+ return comparer.compare(manifestSchemas);
578
+ }
579
+ function hasActionableChanges(diff) {
580
+ if (diff.added_tables.length > 0) return true;
581
+ if (diff.dropped_tables.length > 0) return true;
582
+ return diff.changes.some((c) => c.type !== "type_mismatch");
583
+ }
584
+ function getSQLFromDiff(diff) {
585
+ const statements = [];
586
+ for (const change of diff.changes) {
587
+ if (change.type !== "type_mismatch") {
588
+ statements.push(
589
+ ...change.sqlStatements ?? (change.sql ? [change.sql] : [])
590
+ );
591
+ }
592
+ }
593
+ return statements;
594
+ }
595
+ export {
596
+ SchemaComparer,
597
+ generateSchemaDiff,
598
+ getSQLFromDiff,
599
+ hasActionableChanges
600
+ };
601
+ //# sourceMappingURL=differ.js.map