@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.
- package/AGENTS.md +124 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +265 -0
- package/bin/smrt-prebuild.js +26 -0
- package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
- package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
- package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
- package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
- package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
- package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
- package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
- package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
- package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
- package/dist/adapters/ai-usage.d.ts +23 -0
- package/dist/adapters/ai-usage.d.ts.map +1 -0
- package/dist/adapters/ai-usage.js +105 -0
- package/dist/adapters/ai-usage.js.map +1 -0
- package/dist/adapters/cost-rates.d.ts +20 -0
- package/dist/adapters/cost-rates.d.ts.map +1 -0
- package/dist/adapters/cost-rates.js +40 -0
- package/dist/adapters/cost-rates.js.map +1 -0
- package/dist/adapters/index.d.ts +19 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/metrics.d.ts +111 -0
- package/dist/adapters/metrics.d.ts.map +1 -0
- package/dist/adapters/metrics.js +169 -0
- package/dist/adapters/metrics.js.map +1 -0
- package/dist/adapters/pubsub.d.ts +124 -0
- package/dist/adapters/pubsub.d.ts.map +1 -0
- package/dist/adapters/pubsub.js +121 -0
- package/dist/adapters/pubsub.js.map +1 -0
- package/dist/browser.d.ts +32 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +68 -0
- package/dist/browser.js.map +1 -0
- package/dist/child-accessors.d.ts +27 -0
- package/dist/child-accessors.d.ts.map +1 -0
- package/dist/child-accessors.js +35 -0
- package/dist/child-accessors.js.map +1 -0
- package/dist/class.d.ts +313 -0
- package/dist/class.d.ts.map +1 -0
- package/dist/class.js +896 -0
- package/dist/class.js.map +1 -0
- package/dist/collection-cache.d.ts +110 -0
- package/dist/collection-cache.d.ts.map +1 -0
- package/dist/collection-cache.js +187 -0
- package/dist/collection-cache.js.map +1 -0
- package/dist/collection.d.ts +894 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +1987 -0
- package/dist/collection.js.map +1 -0
- package/dist/config/global-config.d.ts +3 -0
- package/dist/config/global-config.d.ts.map +1 -0
- package/dist/config/global-config.js +19 -0
- package/dist/config/global-config.js.map +1 -0
- package/dist/config.d.ts +145 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/consumer-plugin/index.d.ts +22 -0
- package/dist/consumer-plugin/index.d.ts.map +1 -0
- package/dist/consumer-plugin/index.js +452 -0
- package/dist/consumer-plugin/index.js.map +1 -0
- package/dist/consumer-plugin.d.ts +8 -0
- package/dist/consumer-plugin.d.ts.map +1 -0
- package/dist/consumer-plugin.js +5 -0
- package/dist/consumer-plugin.js.map +1 -0
- package/dist/database.d.ts +95 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +32 -0
- package/dist/database.js.map +1 -0
- package/dist/decorators/compatibility.d.ts +14 -0
- package/dist/decorators/compatibility.d.ts.map +1 -0
- package/dist/decorators/compatibility.js +111 -0
- package/dist/decorators/compatibility.js.map +1 -0
- package/dist/decorators/index.d.ts +381 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +104 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/dispatch/bus.d.ts +306 -0
- package/dist/dispatch/bus.d.ts.map +1 -0
- package/dist/dispatch/bus.js +583 -0
- package/dist/dispatch/bus.js.map +1 -0
- package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
- package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
- package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
- package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
- package/dist/dispatch/collections/Dispatches.d.ts +98 -0
- package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
- package/dist/dispatch/collections/Dispatches.js +358 -0
- package/dist/dispatch/collections/Dispatches.js.map +1 -0
- package/dist/dispatch/index.d.ts +47 -0
- package/dist/dispatch/index.d.ts.map +1 -0
- package/dist/dispatch/models/Dispatch.d.ts +101 -0
- package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
- package/dist/dispatch/models/Dispatch.js +162 -0
- package/dist/dispatch/models/Dispatch.js.map +1 -0
- package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
- package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
- package/dist/dispatch/models/DispatchSubscription.js +112 -0
- package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
- package/dist/dispatch/tenant-resolver.d.ts +98 -0
- package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
- package/dist/dispatch/tenant-resolver.js +32 -0
- package/dist/dispatch/tenant-resolver.js.map +1 -0
- package/dist/dispatch/types.d.ts +149 -0
- package/dist/dispatch/types.d.ts.map +1 -0
- package/dist/embeddings/hash.d.ts +33 -0
- package/dist/embeddings/hash.d.ts.map +1 -0
- package/dist/embeddings/hash.js +37 -0
- package/dist/embeddings/hash.js.map +1 -0
- package/dist/embeddings/index.d.ts +36 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/provider.d.ts +75 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +170 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/similarity.d.ts +47 -0
- package/dist/embeddings/similarity.d.ts.map +1 -0
- package/dist/embeddings/similarity.js +64 -0
- package/dist/embeddings/similarity.js.map +1 -0
- package/dist/embeddings/storage.d.ts +125 -0
- package/dist/embeddings/storage.d.ts.map +1 -0
- package/dist/embeddings/storage.js +283 -0
- package/dist/embeddings/storage.js.map +1 -0
- package/dist/embeddings/types.d.ts +250 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/errors.d.ts +363 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +669 -0
- package/dist/errors.js.map +1 -0
- package/dist/generators/cli.d.ts +162 -0
- package/dist/generators/cli.d.ts.map +1 -0
- package/dist/generators/cli.js +462 -0
- package/dist/generators/cli.js.map +1 -0
- package/dist/generators/index.d.ts +13 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/mcp-runtime-template.d.ts +60 -0
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
- package/dist/generators/mcp-runtime-template.js +509 -0
- package/dist/generators/mcp-runtime-template.js.map +1 -0
- package/dist/generators/mcp.d.ts +231 -0
- package/dist/generators/mcp.d.ts.map +1 -0
- package/dist/generators/mcp.js +1220 -0
- package/dist/generators/mcp.js.map +1 -0
- package/dist/generators/rest.d.ts +171 -0
- package/dist/generators/rest.d.ts.map +1 -0
- package/dist/generators/rest.js +591 -0
- package/dist/generators/rest.js.map +1 -0
- package/dist/generators/swagger.d.ts +21 -0
- package/dist/generators/swagger.d.ts.map +1 -0
- package/dist/generators/swagger.js +307 -0
- package/dist/generators/swagger.js.map +1 -0
- package/dist/generators/tenant-gate.d.ts +74 -0
- package/dist/generators/tenant-gate.d.ts.map +1 -0
- package/dist/generators/tenant-gate.js +15 -0
- package/dist/generators/tenant-gate.js.map +1 -0
- package/dist/generators.d.ts +8 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +19 -0
- package/dist/generators.js.map +1 -0
- package/dist/hierarchical.d.ts +103 -0
- package/dist/hierarchical.d.ts.map +1 -0
- package/dist/hierarchical.js +184 -0
- package/dist/hierarchical.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +202 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors.d.ts +251 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +259 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/junction.d.ts +99 -0
- package/dist/junction.d.ts.map +1 -0
- package/dist/junction.js +136 -0
- package/dist/junction.js.map +1 -0
- package/dist/knowledge.d.ts +11 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +310 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/lazy-config.d.ts +160 -0
- package/dist/lazy-config.d.ts.map +1 -0
- package/dist/lazy-config.js +146 -0
- package/dist/lazy-config.js.map +1 -0
- package/dist/manifest/discover-base-classes.d.ts +78 -0
- package/dist/manifest/discover-base-classes.d.ts.map +1 -0
- package/dist/manifest/discover-base-classes.js +85 -0
- package/dist/manifest/discover-base-classes.js.map +1 -0
- package/dist/manifest/discover-smrt-packages.d.ts +48 -0
- package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
- package/dist/manifest/discover-smrt-packages.js +361 -0
- package/dist/manifest/discover-smrt-packages.js.map +1 -0
- package/dist/manifest/generator.d.ts +93 -0
- package/dist/manifest/generator.d.ts.map +1 -0
- package/dist/manifest/generator.js +380 -0
- package/dist/manifest/generator.js.map +1 -0
- package/dist/manifest/index.d.ts +16 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +51 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/manager.d.ts +51 -0
- package/dist/manifest/manager.d.ts.map +1 -0
- package/dist/manifest/manager.js +89 -0
- package/dist/manifest/manager.js.map +1 -0
- package/dist/manifest/manifest-loader.d.ts +187 -0
- package/dist/manifest/manifest-loader.d.ts.map +1 -0
- package/dist/manifest/manifest-loader.js +847 -0
- package/dist/manifest/manifest-loader.js.map +1 -0
- package/dist/manifest/sources/composite.d.ts +22 -0
- package/dist/manifest/sources/composite.d.ts.map +1 -0
- package/dist/manifest/sources/composite.js +60 -0
- package/dist/manifest/sources/composite.js.map +1 -0
- package/dist/manifest/sources/embedded.d.ts +7 -0
- package/dist/manifest/sources/embedded.d.ts.map +1 -0
- package/dist/manifest/sources/embedded.js +30 -0
- package/dist/manifest/sources/embedded.js.map +1 -0
- package/dist/manifest/sources/explicit-paths.d.ts +17 -0
- package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
- package/dist/manifest/sources/explicit-paths.js +35 -0
- package/dist/manifest/sources/explicit-paths.js.map +1 -0
- package/dist/manifest/sources/fallback.d.ts +25 -0
- package/dist/manifest/sources/fallback.d.ts.map +1 -0
- package/dist/manifest/sources/fallback.js +63 -0
- package/dist/manifest/sources/fallback.js.map +1 -0
- package/dist/manifest/sources/index.d.ts +17 -0
- package/dist/manifest/sources/index.d.ts.map +1 -0
- package/dist/manifest/sources/local-test.d.ts +7 -0
- package/dist/manifest/sources/local-test.d.ts.map +1 -0
- package/dist/manifest/sources/local-test.js +21 -0
- package/dist/manifest/sources/local-test.js.map +1 -0
- package/dist/manifest/sources/static.d.ts +7 -0
- package/dist/manifest/sources/static.d.ts.map +1 -0
- package/dist/manifest/sources/static.js +19 -0
- package/dist/manifest/sources/static.js.map +1 -0
- package/dist/manifest/sources/test.d.ts +7 -0
- package/dist/manifest/sources/test.d.ts.map +1 -0
- package/dist/manifest/sources/test.js +21 -0
- package/dist/manifest/sources/test.js.map +1 -0
- package/dist/manifest/sources/types.d.ts +79 -0
- package/dist/manifest/sources/types.d.ts.map +1 -0
- package/dist/manifest/sources/types.js +61 -0
- package/dist/manifest/sources/types.js.map +1 -0
- package/dist/manifest/static-manifest.d.ts +4 -0
- package/dist/manifest/static-manifest.d.ts.map +1 -0
- package/dist/manifest/static-manifest.js +1535 -0
- package/dist/manifest/static-manifest.js.map +1 -0
- package/dist/manifest/store.d.ts +111 -0
- package/dist/manifest/store.d.ts.map +1 -0
- package/dist/manifest/store.js +431 -0
- package/dist/manifest/store.js.map +1 -0
- package/dist/manifest/test-manifest-loader.d.ts +3 -0
- package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
- package/dist/manifest/test-manifest-stub.d.ts +4 -0
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
- package/dist/manifest/test-manifest-stub.js +80013 -0
- package/dist/manifest/test-manifest-stub.js.map +1 -0
- package/dist/manifest.d.ts +8 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +20 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifest.json +1489 -0
- package/dist/mcp-advisor/index.d.ts +499 -0
- package/dist/mcp-advisor/index.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
- package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
- package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
- package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
- package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
- package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
- package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
- package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
- package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
- package/dist/mcp-advisor/types.d.ts +209 -0
- package/dist/mcp-advisor/types.d.ts.map +1 -0
- package/dist/migrations/backfill-tracker.d.ts +84 -0
- package/dist/migrations/backfill-tracker.d.ts.map +1 -0
- package/dist/migrations/backfill-tracker.js +118 -0
- package/dist/migrations/backfill-tracker.js.map +1 -0
- package/dist/migrations/checksum.d.ts +43 -0
- package/dist/migrations/checksum.d.ts.map +1 -0
- package/dist/migrations/checksum.js +32 -0
- package/dist/migrations/checksum.js.map +1 -0
- package/dist/migrations/differ.d.ts +186 -0
- package/dist/migrations/differ.d.ts.map +1 -0
- package/dist/migrations/differ.js +601 -0
- package/dist/migrations/differ.js.map +1 -0
- package/dist/migrations/generator.d.ts +133 -0
- package/dist/migrations/generator.d.ts.map +1 -0
- package/dist/migrations/generator.js +328 -0
- package/dist/migrations/generator.js.map +1 -0
- package/dist/migrations/index.d.ts +20 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/orchestrate.d.ts +148 -0
- package/dist/migrations/orchestrate.d.ts.map +1 -0
- package/dist/migrations/orchestrate.js +118 -0
- package/dist/migrations/orchestrate.js.map +1 -0
- package/dist/migrations/tracker.d.ts +134 -0
- package/dist/migrations/tracker.d.ts.map +1 -0
- package/dist/migrations/tracker.js +624 -0
- package/dist/migrations/tracker.js.map +1 -0
- package/dist/migrations/types.d.ts +221 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations.d.ts +7 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +26 -0
- package/dist/migrations.js.map +1 -0
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
- package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/dist/object.d.ts +1202 -0
- package/dist/object.d.ts.map +1 -0
- package/dist/object.js +2731 -0
- package/dist/object.js.map +1 -0
- package/dist/polymorphic-association.d.ts +69 -0
- package/dist/polymorphic-association.d.ts.map +1 -0
- package/dist/polymorphic-association.js +96 -0
- package/dist/polymorphic-association.js.map +1 -0
- package/dist/prebuild/cli.d.ts +7 -0
- package/dist/prebuild/cli.d.ts.map +1 -0
- package/dist/prebuild/cli.js +29 -0
- package/dist/prebuild/cli.js.map +1 -0
- package/dist/prebuild/index.d.ts +22 -0
- package/dist/prebuild/index.d.ts.map +1 -0
- package/dist/prebuild/index.js +239 -0
- package/dist/prebuild/index.js.map +1 -0
- package/dist/prebuild.d.ts +8 -0
- package/dist/prebuild.d.ts.map +1 -0
- package/dist/prebuild.js +6 -0
- package/dist/prebuild.js.map +1 -0
- package/dist/registry/cache-config.d.ts +13 -0
- package/dist/registry/cache-config.d.ts.map +1 -0
- package/dist/registry/cache-config.js +17 -0
- package/dist/registry/cache-config.js.map +1 -0
- package/dist/registry/class-registration.d.ts +31 -0
- package/dist/registry/class-registration.d.ts.map +1 -0
- package/dist/registry/class-registration.js +1074 -0
- package/dist/registry/class-registration.js.map +1 -0
- package/dist/registry/collection-resolution.d.ts +45 -0
- package/dist/registry/collection-resolution.d.ts.map +1 -0
- package/dist/registry/collection-resolution.js +121 -0
- package/dist/registry/collection-resolution.js.map +1 -0
- package/dist/registry/collision-policy.d.ts +179 -0
- package/dist/registry/collision-policy.d.ts.map +1 -0
- package/dist/registry/collision-policy.js +153 -0
- package/dist/registry/collision-policy.js.map +1 -0
- package/dist/registry/diagnostics.d.ts +58 -0
- package/dist/registry/diagnostics.d.ts.map +1 -0
- package/dist/registry/diagnostics.js +54 -0
- package/dist/registry/diagnostics.js.map +1 -0
- package/dist/registry/embedding-manager.d.ts +23 -0
- package/dist/registry/embedding-manager.d.ts.map +1 -0
- package/dist/registry/embedding-manager.js +62 -0
- package/dist/registry/embedding-manager.js.map +1 -0
- package/dist/registry/index.d.ts +13 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/inheritance-resolver.d.ts +13 -0
- package/dist/registry/inheritance-resolver.d.ts.map +1 -0
- package/dist/registry/inheritance-resolver.js +244 -0
- package/dist/registry/inheritance-resolver.js.map +1 -0
- package/dist/registry/manifest-field-merge.d.ts +4 -0
- package/dist/registry/manifest-field-merge.d.ts.map +1 -0
- package/dist/registry/manifest-field-merge.js +82 -0
- package/dist/registry/manifest-field-merge.js.map +1 -0
- package/dist/registry/name-resolver.d.ts +102 -0
- package/dist/registry/name-resolver.d.ts.map +1 -0
- package/dist/registry/name-resolver.js +241 -0
- package/dist/registry/name-resolver.js.map +1 -0
- package/dist/registry/relationship-graph.d.ts +16 -0
- package/dist/registry/relationship-graph.d.ts.map +1 -0
- package/dist/registry/relationship-graph.js +79 -0
- package/dist/registry/relationship-graph.js.map +1 -0
- package/dist/registry/schema-builder.d.ts +113 -0
- package/dist/registry/schema-builder.d.ts.map +1 -0
- package/dist/registry/schema-builder.js +474 -0
- package/dist/registry/schema-builder.js.map +1 -0
- package/dist/registry/shared-state.d.ts +62 -0
- package/dist/registry/shared-state.d.ts.map +1 -0
- package/dist/registry/shared-state.js +135 -0
- package/dist/registry/shared-state.js.map +1 -0
- package/dist/registry/types.d.ts +667 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/validator.d.ts +13 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +138 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/registry.d.ts +1358 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2301 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime/client.d.ts +34 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +104 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/mcp.d.ts +47 -0
- package/dist/runtime/mcp.d.ts.map +1 -0
- package/dist/runtime/mcp.js +72 -0
- package/dist/runtime/mcp.js.map +1 -0
- package/dist/runtime/server.d.ts +92 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +390 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/types.d.ts +58 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +10 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scanner/import-scanner.d.ts +7 -0
- package/dist/scanner/import-scanner.d.ts.map +1 -0
- package/dist/scanner/index.d.ts +12 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/manifest-generator.d.ts +304 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -0
- package/dist/scanner/manifest-generator.js +1707 -0
- package/dist/scanner/manifest-generator.js.map +1 -0
- package/dist/scanner/test-file-patterns.d.ts +18 -0
- package/dist/scanner/test-file-patterns.d.ts.map +1 -0
- package/dist/scanner/test-file-patterns.js +16 -0
- package/dist/scanner/test-file-patterns.js.map +1 -0
- package/dist/scanner/types.d.ts +313 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +2 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner.d.ts +6 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +6 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/code-generator.d.ts +53 -0
- package/dist/schema/code-generator.d.ts.map +1 -0
- package/dist/schema/ddl/base-strategy.d.ts +80 -0
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/base-strategy.js +240 -0
- package/dist/schema/ddl/base-strategy.js.map +1 -0
- package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
- package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/duckdb-strategy.js +74 -0
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
- package/dist/schema/ddl/index.d.ts +53 -0
- package/dist/schema/ddl/index.d.ts.map +1 -0
- package/dist/schema/ddl/index.js +80 -0
- package/dist/schema/ddl/index.js.map +1 -0
- package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
- package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
- package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
- package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
- package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/postgres-strategy.js +102 -0
- package/dist/schema/ddl/postgres-strategy.js.map +1 -0
- package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
- package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/sqlite-strategy.js +74 -0
- package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
- package/dist/schema/ddl/types.d.ts +114 -0
- package/dist/schema/ddl/types.d.ts.map +1 -0
- package/dist/schema/generator.d.ts +176 -0
- package/dist/schema/generator.d.ts.map +1 -0
- package/dist/schema/generator.js +1076 -0
- package/dist/schema/generator.js.map +1 -0
- package/dist/schema/index-utils.d.ts +19 -0
- package/dist/schema/index-utils.d.ts.map +1 -0
- package/dist/schema/index-utils.js +32 -0
- package/dist/schema/index-utils.js.map +1 -0
- package/dist/schema/index.d.ts +13 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/override-system.d.ts +43 -0
- package/dist/schema/override-system.d.ts.map +1 -0
- package/dist/schema/schema-aggregator.d.ts +112 -0
- package/dist/schema/schema-aggregator.d.ts.map +1 -0
- package/dist/schema/schema-manager.d.ts +95 -0
- package/dist/schema/schema-manager.d.ts.map +1 -0
- package/dist/schema/schema-manager.js +283 -0
- package/dist/schema/schema-manager.js.map +1 -0
- package/dist/schema/sql-identifiers.d.ts +107 -0
- package/dist/schema/sql-identifiers.d.ts.map +1 -0
- package/dist/schema/sql-identifiers.js +190 -0
- package/dist/schema/sql-identifiers.js.map +1 -0
- package/dist/schema/table-verifier.d.ts +10 -0
- package/dist/schema/table-verifier.d.ts.map +1 -0
- package/dist/schema/table-verifier.js +37 -0
- package/dist/schema/table-verifier.js.map +1 -0
- package/dist/schema/types.d.ts +241 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/utils.d.ts +32 -0
- package/dist/schema/utils.d.ts.map +1 -0
- package/dist/schema/utils.js +134 -0
- package/dist/schema/utils.js.map +1 -0
- package/dist/scripts/create-wrappers.js +89 -0
- package/dist/scripts/generate-manifest.js +155 -0
- package/dist/scripts/generate-test-manifest.js +77 -0
- package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
- package/dist/scripts/prepack.js +49 -0
- package/dist/signals/bus.d.ts +64 -0
- package/dist/signals/bus.d.ts.map +1 -0
- package/dist/signals/bus.js +102 -0
- package/dist/signals/bus.js.map +1 -0
- package/dist/signals/index.d.ts +11 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/sanitizer.d.ts +54 -0
- package/dist/signals/sanitizer.d.ts.map +1 -0
- package/dist/signals/sanitizer.js +111 -0
- package/dist/signals/sanitizer.js.map +1 -0
- package/dist/smrt-knowledge.json +335 -0
- package/dist/system/compatibility.d.ts +8 -0
- package/dist/system/compatibility.d.ts.map +1 -0
- package/dist/system/compatibility.js +409 -0
- package/dist/system/compatibility.js.map +1 -0
- package/dist/system/index.d.ts +9 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/system/schema.d.ts +69 -0
- package/dist/system/schema.d.ts.map +1 -0
- package/dist/system/schema.js +271 -0
- package/dist/system/schema.js.map +1 -0
- package/dist/system/types.d.ts +135 -0
- package/dist/system/types.d.ts.map +1 -0
- package/dist/system-fields.d.ts +44 -0
- package/dist/system-fields.d.ts.map +1 -0
- package/dist/system-fields.js +55 -0
- package/dist/system-fields.js.map +1 -0
- package/dist/table-cache.d.ts +28 -0
- package/dist/table-cache.d.ts.map +1 -0
- package/dist/table-cache.js +21 -0
- package/dist/table-cache.js.map +1 -0
- package/dist/test-utils.d.ts +140 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/testing/database.d.ts +73 -0
- package/dist/testing/database.d.ts.map +1 -0
- package/dist/testing/database.js +204 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/tool-executor.d.ts +101 -0
- package/dist/tools/tool-executor.d.ts.map +1 -0
- package/dist/tools/tool-executor.js +142 -0
- package/dist/tools/tool-executor.js.map +1 -0
- package/dist/tools/tool-generator.d.ts +54 -0
- package/dist/tools/tool-generator.d.ts.map +1 -0
- package/dist/tools/tool-generator.js +121 -0
- package/dist/tools/tool-generator.js.map +1 -0
- package/dist/utils/chunk.d.ts +32 -0
- package/dist/utils/chunk.d.ts.map +1 -0
- package/dist/utils/chunk.js +14 -0
- package/dist/utils/chunk.js.map +1 -0
- package/dist/utils/import-workspace-module.d.ts +8 -0
- package/dist/utils/import-workspace-module.d.ts.map +1 -0
- package/dist/utils/import-workspace-module.js +81 -0
- package/dist/utils/import-workspace-module.js.map +1 -0
- package/dist/utils/json.d.ts +102 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/lru-cache.d.ts +69 -0
- package/dist/utils/lru-cache.d.ts.map +1 -0
- package/dist/utils/lru-cache.js +100 -0
- package/dist/utils/lru-cache.js.map +1 -0
- package/dist/utils/naming.d.ts +16 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +23 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/qualified-names.d.ts +122 -0
- package/dist/utils/qualified-names.d.ts.map +1 -0
- package/dist/utils/qualified-names.js +82 -0
- package/dist/utils/qualified-names.js.map +1 -0
- package/dist/utils/scanner-module.d.ts +37 -0
- package/dist/utils/scanner-module.d.ts.map +1 -0
- package/dist/utils.d.ts +177 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +185 -0
- package/dist/utils.js.map +1 -0
- package/dist/vite-plugin/import-build-aware.d.ts +68 -0
- package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
- package/dist/vite-plugin/import-build-aware.js +72 -0
- package/dist/vite-plugin/import-build-aware.js.map +1 -0
- package/dist/vite-plugin/index.d.ts +59 -0
- package/dist/vite-plugin/index.d.ts.map +1 -0
- package/dist/vite-plugin/index.js +1400 -0
- package/dist/vite-plugin/index.js.map +1 -0
- package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
- package/dist/vite-plugin/sveltekit-generator.js +1375 -0
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
- package/dist/vite-plugin/templates/default-ui.ts +432 -0
- package/dist/vite-plugin/templates/default.html +206 -0
- package/dist/vite-plugin.d.ts +8 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +11 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +208 -0
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import { createLogger } from "@happyvertical/logger";
|
|
4
|
+
import { detectEngine } from "../schema/ddl/index.js";
|
|
5
|
+
import { CREATE_SMRT_SCHEMA_MIGRATIONS_TABLE } from "../system/schema.js";
|
|
6
|
+
import { computeChecksum, verifyChecksum } from "./checksum.js";
|
|
7
|
+
const logger = createLogger({ level: "info" });
|
|
8
|
+
const DEFAULT_OPTIONS = {
|
|
9
|
+
lockTimeout: 3e4,
|
|
10
|
+
statementTimeout: 6e4,
|
|
11
|
+
useConcurrentIndexes: true
|
|
12
|
+
};
|
|
13
|
+
class AtomicMigrationRollback extends Error {
|
|
14
|
+
constructor(results, failed) {
|
|
15
|
+
super(`Atomic migration batch failed at ${failed.name}`);
|
|
16
|
+
this.results = results;
|
|
17
|
+
this.failed = failed;
|
|
18
|
+
}
|
|
19
|
+
results;
|
|
20
|
+
failed;
|
|
21
|
+
}
|
|
22
|
+
const CONCURRENT_INDEX_STATEMENT_RE = /(?:(?:CREATE\s+(?:UNIQUE\s+)?INDEX|DROP\s+INDEX)\s+CONCURRENTLY|REINDEX(?:\s*\([^)]*\))?\s+(?:INDEX|TABLE|SCHEMA|DATABASE|SYSTEM)\s+CONCURRENTLY)/i;
|
|
23
|
+
function findConcurrentIndexStatement(definitions) {
|
|
24
|
+
for (const definition of definitions) {
|
|
25
|
+
const statement = definition.up.find(
|
|
26
|
+
(sql) => CONCURRENT_INDEX_STATEMENT_RE.test(sql)
|
|
27
|
+
);
|
|
28
|
+
if (statement) {
|
|
29
|
+
return {
|
|
30
|
+
migrationName: definition.id,
|
|
31
|
+
statement
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
class MigrationTracker {
|
|
38
|
+
db;
|
|
39
|
+
options;
|
|
40
|
+
engineHint;
|
|
41
|
+
dbEngine;
|
|
42
|
+
/**
|
|
43
|
+
* Memoized initialization promise. Storing the in-flight promise (rather
|
|
44
|
+
* than a `boolean` flag set after the DDL completes) makes `initialize()`
|
|
45
|
+
* safe under concurrency: multiple parallel callers all `await` the same
|
|
46
|
+
* promise instead of independently re-running the DDL. On error the slot
|
|
47
|
+
* is cleared so the next caller retries — a transient failure doesn't
|
|
48
|
+
* permanently poison the instance.
|
|
49
|
+
*/
|
|
50
|
+
initializePromise = null;
|
|
51
|
+
currentBatch = null;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
this.db = options.db;
|
|
54
|
+
this.options = {
|
|
55
|
+
lockTimeout: options.lockTimeout ?? DEFAULT_OPTIONS.lockTimeout,
|
|
56
|
+
statementTimeout: options.statementTimeout ?? DEFAULT_OPTIONS.statementTimeout,
|
|
57
|
+
useConcurrentIndexes: options.useConcurrentIndexes ?? DEFAULT_OPTIONS.useConcurrentIndexes
|
|
58
|
+
};
|
|
59
|
+
this.engineHint = options.engineHint;
|
|
60
|
+
this.dbEngine = this.detectDbEngine();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect the database engine. Honors an explicit `engineHint` (passed via
|
|
64
|
+
* `MigrationTrackerOptions`) before falling back to URL parsing — this is
|
|
65
|
+
* the same `detectEngine` contract used by `SchemaComparer` and the rest
|
|
66
|
+
* of the migration stack, so the tracker stays consistent with the DDL
|
|
67
|
+
* the orchestrator generated.
|
|
68
|
+
*/
|
|
69
|
+
detectDbEngine() {
|
|
70
|
+
const dbWithConfig = this.db;
|
|
71
|
+
const url = this.db.url || dbWithConfig.config?.url || "";
|
|
72
|
+
return detectEngine(url, this.engineHint);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the current database engine
|
|
76
|
+
*/
|
|
77
|
+
getEngine() {
|
|
78
|
+
return this.dbEngine;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Initialize the migrations tracking table
|
|
82
|
+
*/
|
|
83
|
+
async initialize() {
|
|
84
|
+
if (!this.initializePromise) {
|
|
85
|
+
this.initializePromise = this.runInitializeDdl().catch((error) => {
|
|
86
|
+
this.initializePromise = null;
|
|
87
|
+
throw error;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return this.initializePromise;
|
|
91
|
+
}
|
|
92
|
+
async runInitializeDdl() {
|
|
93
|
+
const statements = CREATE_SMRT_SCHEMA_MIGRATIONS_TABLE.split(";").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
94
|
+
for (const statement of statements) {
|
|
95
|
+
await this.db.query(statement);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get all applied migrations ordered by applied_at
|
|
100
|
+
*/
|
|
101
|
+
async getAppliedMigrations() {
|
|
102
|
+
await this.initialize();
|
|
103
|
+
const result = await this.db.query(
|
|
104
|
+
`SELECT * FROM _smrt_schema_migrations WHERE status = 'completed' ORDER BY applied_at ASC`
|
|
105
|
+
);
|
|
106
|
+
return result.rows.map((row) => ({
|
|
107
|
+
...row,
|
|
108
|
+
applied_at: new Date(row.applied_at),
|
|
109
|
+
rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
|
|
110
|
+
is_reversible: Boolean(row.is_reversible)
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get pending migrations (defined but not applied)
|
|
115
|
+
*/
|
|
116
|
+
async getPendingMigrations(definitions) {
|
|
117
|
+
const applied = await this.getAppliedMigrations();
|
|
118
|
+
const appliedNames = new Set(applied.map((m) => m.name));
|
|
119
|
+
return definitions.filter((d) => !appliedNames.has(d.id));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a migration has been applied
|
|
123
|
+
*/
|
|
124
|
+
async isApplied(migrationId) {
|
|
125
|
+
await this.initialize();
|
|
126
|
+
const result = await this.db.query(
|
|
127
|
+
`SELECT 1 FROM _smrt_schema_migrations WHERE name = ? AND status = 'completed' LIMIT 1`,
|
|
128
|
+
migrationId
|
|
129
|
+
);
|
|
130
|
+
return result.rows.length > 0;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get a single migration record by name
|
|
134
|
+
*/
|
|
135
|
+
async getMigration(name) {
|
|
136
|
+
await this.initialize();
|
|
137
|
+
const result = await this.db.query(
|
|
138
|
+
`SELECT * FROM _smrt_schema_migrations WHERE name = ? LIMIT 1`,
|
|
139
|
+
name
|
|
140
|
+
);
|
|
141
|
+
if (result.rows.length === 0) return null;
|
|
142
|
+
const row = result.rows[0];
|
|
143
|
+
return {
|
|
144
|
+
...row,
|
|
145
|
+
applied_at: new Date(row.applied_at),
|
|
146
|
+
rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
|
|
147
|
+
is_reversible: Boolean(row.is_reversible)
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the next batch number
|
|
152
|
+
*/
|
|
153
|
+
async getNextBatch() {
|
|
154
|
+
await this.initialize();
|
|
155
|
+
const result = await this.db.query(
|
|
156
|
+
`SELECT MAX(batch) as max_batch FROM _smrt_schema_migrations`
|
|
157
|
+
);
|
|
158
|
+
const row = result.rows[0];
|
|
159
|
+
return (row?.max_batch ?? 0) + 1;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Detect drift between migration definitions and applied migrations
|
|
163
|
+
*/
|
|
164
|
+
async detectDrift(definitions) {
|
|
165
|
+
const applied = await this.getAppliedMigrations();
|
|
166
|
+
const reports = [];
|
|
167
|
+
new Map(applied.map((m) => [m.name, m]));
|
|
168
|
+
const definitionMap = new Map(definitions.map((d) => [d.id, d]));
|
|
169
|
+
for (const record of applied) {
|
|
170
|
+
const definition = definitionMap.get(record.name);
|
|
171
|
+
if (!definition) {
|
|
172
|
+
reports.push({
|
|
173
|
+
migration_name: record.name,
|
|
174
|
+
expected_checksum: "N/A",
|
|
175
|
+
actual_checksum: record.checksum,
|
|
176
|
+
drift_type: "unknown_in_db",
|
|
177
|
+
recommendation: "Migration exists in database but definition is missing. Manual cleanup may be required."
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const currentChecksum = computeChecksum(definition.up);
|
|
182
|
+
const verification = verifyChecksum(
|
|
183
|
+
currentChecksum,
|
|
184
|
+
record.checksum,
|
|
185
|
+
record.applied_checksum
|
|
186
|
+
);
|
|
187
|
+
if (!verification.valid) {
|
|
188
|
+
const driftType = verification.drift ?? "db_modified";
|
|
189
|
+
reports.push({
|
|
190
|
+
migration_name: record.name,
|
|
191
|
+
expected_checksum: record.checksum,
|
|
192
|
+
actual_checksum: currentChecksum,
|
|
193
|
+
drift_type: driftType,
|
|
194
|
+
recommendation: driftType === "file_modified" ? "Migration file was modified after application. Create a new migration instead." : "Database schema was modified outside of migrations. Review and reconcile manually."
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return reports;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Apply a single migration
|
|
202
|
+
*/
|
|
203
|
+
async apply(definition, options = {}) {
|
|
204
|
+
await this.initialize();
|
|
205
|
+
const startTime = Date.now();
|
|
206
|
+
const checksum = computeChecksum(definition.up);
|
|
207
|
+
const existing = await this.getMigration(definition.id);
|
|
208
|
+
if (existing) {
|
|
209
|
+
switch (existing.status) {
|
|
210
|
+
case "completed":
|
|
211
|
+
if (!options.force && existing.checksum !== checksum) {
|
|
212
|
+
return {
|
|
213
|
+
success: false,
|
|
214
|
+
applied: false,
|
|
215
|
+
skipped: false,
|
|
216
|
+
name: definition.id,
|
|
217
|
+
checksum,
|
|
218
|
+
execution_time_ms: 0,
|
|
219
|
+
error: `Migration ${definition.id} checksum mismatch. Was already applied with different checksum. Use --force to override.`
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (!options.force && !options.reconcile) {
|
|
223
|
+
return {
|
|
224
|
+
success: true,
|
|
225
|
+
applied: false,
|
|
226
|
+
skipped: true,
|
|
227
|
+
name: definition.id,
|
|
228
|
+
checksum,
|
|
229
|
+
execution_time_ms: 0
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
case "failed":
|
|
234
|
+
if (!options.force && !options.reconcile) {
|
|
235
|
+
return {
|
|
236
|
+
success: false,
|
|
237
|
+
applied: false,
|
|
238
|
+
skipped: false,
|
|
239
|
+
name: definition.id,
|
|
240
|
+
checksum,
|
|
241
|
+
execution_time_ms: 0,
|
|
242
|
+
error: `Migration ${definition.id} previously failed: ${existing.error_message || "Unknown error"}. Use --force to retry.`
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
case "running":
|
|
247
|
+
if (!options.force) {
|
|
248
|
+
return {
|
|
249
|
+
success: false,
|
|
250
|
+
applied: false,
|
|
251
|
+
skipped: false,
|
|
252
|
+
name: definition.id,
|
|
253
|
+
checksum,
|
|
254
|
+
execution_time_ms: 0,
|
|
255
|
+
error: `Migration ${definition.id} is currently running or was interrupted. Use --force to retry if the previous run crashed.`
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (options.dryRun) {
|
|
262
|
+
return {
|
|
263
|
+
success: true,
|
|
264
|
+
applied: false,
|
|
265
|
+
skipped: false,
|
|
266
|
+
name: definition.id,
|
|
267
|
+
checksum,
|
|
268
|
+
execution_time_ms: Date.now() - startTime
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (this.currentBatch === null) {
|
|
272
|
+
this.currentBatch = await this.getNextBatch();
|
|
273
|
+
}
|
|
274
|
+
const id = existing?.id || randomUUID();
|
|
275
|
+
const attempts = (existing?.attempts || 0) + 1;
|
|
276
|
+
if (existing) {
|
|
277
|
+
await this.db.query(
|
|
278
|
+
`UPDATE _smrt_schema_migrations
|
|
279
|
+
SET status = 'running', checksum = ?, attempts = ?, error_message = NULL, batch = ?, applied_by = ?, applied_at = CURRENT_TIMESTAMP
|
|
280
|
+
WHERE id = ?`,
|
|
281
|
+
checksum,
|
|
282
|
+
attempts,
|
|
283
|
+
this.currentBatch,
|
|
284
|
+
hostname(),
|
|
285
|
+
id
|
|
286
|
+
);
|
|
287
|
+
} else {
|
|
288
|
+
await this.db.query(
|
|
289
|
+
`INSERT INTO _smrt_schema_migrations
|
|
290
|
+
(id, name, version, checksum, status, attempts, is_reversible, package_name, source_file, applied_by, batch)
|
|
291
|
+
VALUES (?, ?, ?, ?, 'running', 1, ?, ?, ?, ?, ?)`,
|
|
292
|
+
id,
|
|
293
|
+
definition.id,
|
|
294
|
+
definition.version,
|
|
295
|
+
checksum,
|
|
296
|
+
definition.is_reversible ?? definition.down.length > 0 ? 1 : 0,
|
|
297
|
+
definition.package_name ?? null,
|
|
298
|
+
definition.source_file ?? null,
|
|
299
|
+
hostname(),
|
|
300
|
+
this.currentBatch
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
await this.executeStatements(definition.up, options);
|
|
305
|
+
const executionTime = Date.now() - startTime;
|
|
306
|
+
await this.db.query(
|
|
307
|
+
`UPDATE _smrt_schema_migrations
|
|
308
|
+
SET status = 'completed', execution_time_ms = ?, applied_checksum = ?, applied_at = CURRENT_TIMESTAMP
|
|
309
|
+
WHERE id = ?`,
|
|
310
|
+
executionTime,
|
|
311
|
+
checksum,
|
|
312
|
+
id
|
|
313
|
+
);
|
|
314
|
+
return {
|
|
315
|
+
success: true,
|
|
316
|
+
applied: true,
|
|
317
|
+
skipped: false,
|
|
318
|
+
name: definition.id,
|
|
319
|
+
checksum,
|
|
320
|
+
execution_time_ms: executionTime
|
|
321
|
+
};
|
|
322
|
+
} catch (error) {
|
|
323
|
+
const migrationError = error instanceof Error ? error : new Error(String(error));
|
|
324
|
+
try {
|
|
325
|
+
await this.db.query(
|
|
326
|
+
`UPDATE _smrt_schema_migrations
|
|
327
|
+
SET status = 'failed', error_message = ?
|
|
328
|
+
WHERE id = ?`,
|
|
329
|
+
migrationError.message,
|
|
330
|
+
id
|
|
331
|
+
);
|
|
332
|
+
} catch (persistError) {
|
|
333
|
+
const persistMessage = persistError instanceof Error ? persistError.message : String(persistError);
|
|
334
|
+
logger.error(
|
|
335
|
+
`Failed to persist failed status for migration ${definition.id}: ${persistMessage}`
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
success: false,
|
|
340
|
+
applied: false,
|
|
341
|
+
skipped: false,
|
|
342
|
+
name: definition.id,
|
|
343
|
+
checksum,
|
|
344
|
+
execution_time_ms: Date.now() - startTime,
|
|
345
|
+
error: migrationError
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Apply multiple migrations in order
|
|
351
|
+
*/
|
|
352
|
+
async applyAll(definitions, options = {}) {
|
|
353
|
+
if (options.atomic && !options.dryRun) {
|
|
354
|
+
if (!this.db.transaction) {
|
|
355
|
+
throw new Error(
|
|
356
|
+
"Atomic migration batches require a database adapter with transaction support."
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
if (this.dbEngine === "postgres") {
|
|
360
|
+
const concurrentStatement = findConcurrentIndexStatement(definitions);
|
|
361
|
+
if (concurrentStatement) {
|
|
362
|
+
throw new Error(
|
|
363
|
+
`Atomic migration batch cannot include CONCURRENTLY index DDL in ${concurrentStatement.migrationName}; PostgreSQL forbids CONCURRENTLY inside a transaction.`
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
return await this.db.transaction(async (tx) => {
|
|
369
|
+
const txDb = {
|
|
370
|
+
...tx,
|
|
371
|
+
transaction: async (callback) => callback(tx)
|
|
372
|
+
};
|
|
373
|
+
const txTracker = new MigrationTracker({
|
|
374
|
+
db: txDb,
|
|
375
|
+
lockTimeout: this.options.lockTimeout,
|
|
376
|
+
statementTimeout: this.options.statementTimeout,
|
|
377
|
+
useConcurrentIndexes: false
|
|
378
|
+
});
|
|
379
|
+
const results2 = await txTracker.applyAll(definitions, {
|
|
380
|
+
...options,
|
|
381
|
+
atomic: false,
|
|
382
|
+
continueOnError: false,
|
|
383
|
+
postgresSafe: false
|
|
384
|
+
});
|
|
385
|
+
const failed = results2.find((result) => !result.success);
|
|
386
|
+
if (failed) {
|
|
387
|
+
throw new AtomicMigrationRollback(results2, failed);
|
|
388
|
+
}
|
|
389
|
+
return results2;
|
|
390
|
+
});
|
|
391
|
+
} catch (error) {
|
|
392
|
+
if (error instanceof AtomicMigrationRollback) {
|
|
393
|
+
return error.results.map((result) => {
|
|
394
|
+
if (!result.success || !result.applied) {
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
...result,
|
|
399
|
+
success: false,
|
|
400
|
+
applied: false,
|
|
401
|
+
skipped: false,
|
|
402
|
+
rolled_back: true,
|
|
403
|
+
error: new Error(
|
|
404
|
+
`Rolled back because migration ${error.failed.name} failed`
|
|
405
|
+
)
|
|
406
|
+
};
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
throw error;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
const results = [];
|
|
413
|
+
this.currentBatch = await this.getNextBatch();
|
|
414
|
+
for (const definition of definitions) {
|
|
415
|
+
const result = await this.apply(definition, options);
|
|
416
|
+
results.push(result);
|
|
417
|
+
options.onProgress?.(result);
|
|
418
|
+
if (!result.success && !options.continueOnError) {
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
this.currentBatch = null;
|
|
423
|
+
return results;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Rollback a migration
|
|
427
|
+
*/
|
|
428
|
+
async rollback(name, definition, options = {}) {
|
|
429
|
+
await this.initialize();
|
|
430
|
+
const startTime = Date.now();
|
|
431
|
+
const checksum = computeChecksum(definition.down);
|
|
432
|
+
const record = await this.getMigration(name);
|
|
433
|
+
if (!record) {
|
|
434
|
+
return {
|
|
435
|
+
success: false,
|
|
436
|
+
name,
|
|
437
|
+
checksum,
|
|
438
|
+
execution_time_ms: 0,
|
|
439
|
+
error: new Error(`Migration ${name} not found in database`)
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
if (record.status !== "completed") {
|
|
443
|
+
return {
|
|
444
|
+
success: false,
|
|
445
|
+
name,
|
|
446
|
+
checksum,
|
|
447
|
+
execution_time_ms: 0,
|
|
448
|
+
error: new Error(
|
|
449
|
+
`Migration ${name} is not in completed state (current: ${record.status})`
|
|
450
|
+
)
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
if (!definition.down.length) {
|
|
454
|
+
return {
|
|
455
|
+
success: false,
|
|
456
|
+
name,
|
|
457
|
+
checksum,
|
|
458
|
+
execution_time_ms: 0,
|
|
459
|
+
error: new Error(
|
|
460
|
+
`Migration ${name} is not reversible (no down statements)`
|
|
461
|
+
)
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
if (options.dryRun) {
|
|
465
|
+
return {
|
|
466
|
+
success: true,
|
|
467
|
+
name,
|
|
468
|
+
checksum,
|
|
469
|
+
execution_time_ms: Date.now() - startTime,
|
|
470
|
+
rolled_back: true
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
try {
|
|
474
|
+
await this.executeStatements(definition.down, {});
|
|
475
|
+
await this.db.query(
|
|
476
|
+
`UPDATE _smrt_schema_migrations
|
|
477
|
+
SET status = 'rolled_back', rolled_back_at = CURRENT_TIMESTAMP
|
|
478
|
+
WHERE name = ?`,
|
|
479
|
+
name
|
|
480
|
+
);
|
|
481
|
+
return {
|
|
482
|
+
success: true,
|
|
483
|
+
name,
|
|
484
|
+
checksum,
|
|
485
|
+
execution_time_ms: Date.now() - startTime,
|
|
486
|
+
rolled_back: true
|
|
487
|
+
};
|
|
488
|
+
} catch (error) {
|
|
489
|
+
return {
|
|
490
|
+
success: false,
|
|
491
|
+
name,
|
|
492
|
+
checksum,
|
|
493
|
+
execution_time_ms: Date.now() - startTime,
|
|
494
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
495
|
+
rolled_back: false
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Get migration history with optional filtering
|
|
501
|
+
*/
|
|
502
|
+
async getHistory(options = {}) {
|
|
503
|
+
await this.initialize();
|
|
504
|
+
let sql = `SELECT * FROM _smrt_schema_migrations WHERE 1=1`;
|
|
505
|
+
const params = [];
|
|
506
|
+
if (options.status) {
|
|
507
|
+
sql += ` AND status = ?`;
|
|
508
|
+
params.push(options.status);
|
|
509
|
+
}
|
|
510
|
+
if (options.since) {
|
|
511
|
+
sql += ` AND applied_at >= ?`;
|
|
512
|
+
params.push(options.since.toISOString());
|
|
513
|
+
}
|
|
514
|
+
sql += ` ORDER BY applied_at DESC`;
|
|
515
|
+
if (options.limit) {
|
|
516
|
+
sql += ` LIMIT ?`;
|
|
517
|
+
params.push(options.limit);
|
|
518
|
+
}
|
|
519
|
+
const result = await this.db.query(sql, ...params);
|
|
520
|
+
return result.rows.map((row) => ({
|
|
521
|
+
...row,
|
|
522
|
+
applied_at: new Date(row.applied_at),
|
|
523
|
+
rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
|
|
524
|
+
is_reversible: Boolean(row.is_reversible)
|
|
525
|
+
}));
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Execute SQL statements with appropriate transaction handling
|
|
529
|
+
*/
|
|
530
|
+
async executeStatements(statements, options) {
|
|
531
|
+
if (this.dbEngine === "postgres" && options.postgresSafe) {
|
|
532
|
+
await this.executePostgresStatements(statements);
|
|
533
|
+
} else {
|
|
534
|
+
await this.executeWithTransaction(statements);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Execute statements within a transaction (SQLite/DuckDB)
|
|
539
|
+
*/
|
|
540
|
+
async executeWithTransaction(statements) {
|
|
541
|
+
if (this.db.transaction) {
|
|
542
|
+
await this.db.transaction(async (tx) => {
|
|
543
|
+
for (const sql of statements) {
|
|
544
|
+
await tx.query(sql);
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
} else {
|
|
548
|
+
for (const sql of statements) {
|
|
549
|
+
await this.db.query(sql);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Execute statements with PostgreSQL-specific handling
|
|
555
|
+
*
|
|
556
|
+
* - CONCURRENTLY statements run outside transaction
|
|
557
|
+
* - Regular statements run in transaction with lock_timeout
|
|
558
|
+
*
|
|
559
|
+
* Both CREATE and DROP variants of CONCURRENTLY must be detected — Postgres
|
|
560
|
+
* forbids `DROP INDEX CONCURRENTLY` inside a transaction block, just like
|
|
561
|
+
* the create variant. Issue #1165: the migration generator emits
|
|
562
|
+
* `DROP INDEX CONCURRENTLY` for shape-drift recreates and orphan-index
|
|
563
|
+
* cleanups, so the regex needs to cover both keywords.
|
|
564
|
+
*/
|
|
565
|
+
async executePostgresStatements(statements) {
|
|
566
|
+
const { concurrent: finalConcurrent, regular: finalRegular } = planPostgresStatements(statements, !!this.options.useConcurrentIndexes);
|
|
567
|
+
if (finalRegular.length > 0 && this.db.transaction) {
|
|
568
|
+
await this.db.transaction(async (tx) => {
|
|
569
|
+
await tx.query(
|
|
570
|
+
`SET LOCAL lock_timeout = '${this.options.lockTimeout}ms'`
|
|
571
|
+
);
|
|
572
|
+
await tx.query(
|
|
573
|
+
`SET LOCAL statement_timeout = '${this.options.statementTimeout}ms'`
|
|
574
|
+
);
|
|
575
|
+
for (const sql of finalRegular) {
|
|
576
|
+
await tx.query(sql);
|
|
577
|
+
}
|
|
578
|
+
});
|
|
579
|
+
} else if (finalRegular.length > 0) {
|
|
580
|
+
for (const sql of finalRegular) {
|
|
581
|
+
await this.db.query(sql);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
for (const sql of finalConcurrent) {
|
|
585
|
+
await this.db.query(`SET lock_timeout = '${this.options.lockTimeout}ms'`);
|
|
586
|
+
await this.db.query(sql);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
function planPostgresStatements(statements, useConcurrentIndexes) {
|
|
591
|
+
const concurrentRegex = CONCURRENT_INDEX_STATEMENT_RE;
|
|
592
|
+
const concurrent = [];
|
|
593
|
+
const regular = [];
|
|
594
|
+
for (const sql of statements) {
|
|
595
|
+
if (concurrentRegex.test(sql)) {
|
|
596
|
+
concurrent.push(sql);
|
|
597
|
+
continue;
|
|
598
|
+
}
|
|
599
|
+
if (useConcurrentIndexes) {
|
|
600
|
+
if (/CREATE\s+(UNIQUE\s+)?INDEX\s+(?!CONCURRENTLY)/i.test(sql)) {
|
|
601
|
+
concurrent.push(
|
|
602
|
+
sql.replace(
|
|
603
|
+
/CREATE\s+(UNIQUE\s+)?INDEX\s+/i,
|
|
604
|
+
"CREATE $1INDEX CONCURRENTLY "
|
|
605
|
+
)
|
|
606
|
+
);
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
if (/DROP\s+INDEX\s+(?!CONCURRENTLY)/i.test(sql)) {
|
|
610
|
+
concurrent.push(
|
|
611
|
+
sql.replace(/DROP\s+INDEX\s+/i, "DROP INDEX CONCURRENTLY ")
|
|
612
|
+
);
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
regular.push(sql);
|
|
617
|
+
}
|
|
618
|
+
return { concurrent, regular };
|
|
619
|
+
}
|
|
620
|
+
export {
|
|
621
|
+
MigrationTracker,
|
|
622
|
+
planPostgresStatements
|
|
623
|
+
};
|
|
624
|
+
//# sourceMappingURL=tracker.js.map
|