@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,KAAK,cAAc,EACnB,eAAe,EACf,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,0BAA0B,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,KAAK,6BAA6B,GACnC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGxE,YAAY,EACV,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,cAAc,EACd,iBAAiB,EAEjB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,eAAe,EACf,SAAS,EACT,mBAAmB,EACnB,aAAa,EACb,eAAe,EAEf,eAAe,EACf,gBAAgB,EAEhB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { DatabaseEngine } from '../schema/ddl/types.js';
|
|
3
|
+
import { MigrationResult, SchemaChange } from '../schema/types.js';
|
|
4
|
+
import { generateSchemaDiff } from './differ.js';
|
|
5
|
+
export interface MigrateSmrtSchemasOptions {
|
|
6
|
+
db: DatabaseInterface;
|
|
7
|
+
/** Stored on the migration record so the audit log shows which app applied it. */
|
|
8
|
+
packageName: string;
|
|
9
|
+
/**
|
|
10
|
+
* Stored on the migration record. Typically the app's package.json
|
|
11
|
+
* version. Optional because most apps don't have a runtime-readable
|
|
12
|
+
* version handy and would hardcode a stale string if forced to supply
|
|
13
|
+
* one — `'unknown'` is honest. Pass an explicit value when you can
|
|
14
|
+
* (e.g. `version: process.env.APP_VERSION`).
|
|
15
|
+
*/
|
|
16
|
+
version?: string;
|
|
17
|
+
/** Override the description on the synthetic migration definition. */
|
|
18
|
+
description?: string;
|
|
19
|
+
/** Override the migration name (default: `<timestamp>_smrt_schema_sync`). */
|
|
20
|
+
name?: string;
|
|
21
|
+
/** Forwarded to MigrationTracker — defaults to true for pg-safe runs. */
|
|
22
|
+
postgresSafe?: boolean;
|
|
23
|
+
/** Forwarded to MigrationTracker — defaults to true. */
|
|
24
|
+
reconcile?: boolean;
|
|
25
|
+
/** Forwarded to MigrationTracker — defaults to true for `CREATE INDEX CONCURRENTLY`. */
|
|
26
|
+
useConcurrentIndexes?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Forwarded to MigrationTracker (Postgres lock timeout, milliseconds).
|
|
29
|
+
* Lets apps that customize tracker timeouts directly preserve their
|
|
30
|
+
* tuning when going through the orchestrator. Falls back to the
|
|
31
|
+
* tracker's default (30000ms) when omitted.
|
|
32
|
+
*/
|
|
33
|
+
lockTimeout?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Forwarded to MigrationTracker (Postgres statement timeout, ms). Falls
|
|
36
|
+
* back to the tracker's default (60000ms) when omitted.
|
|
37
|
+
*/
|
|
38
|
+
statementTimeout?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Explicit engine hint forwarded to `detectEngine`, `SchemaComparer`, and
|
|
41
|
+
* `MigrationTracker`. Useful when `db.url` doesn't unambiguously identify
|
|
42
|
+
* the engine (e.g. the JSON adapter, which uses DuckDB internally and may
|
|
43
|
+
* not be recognizable by URL alone). All three layers honor the same hint
|
|
44
|
+
* so the generated DDL, drift comparison, and execution path stay
|
|
45
|
+
* consistent — without it, an empty-URL connection could produce
|
|
46
|
+
* Postgres-flavored DDL but run through the SQLite tracker path.
|
|
47
|
+
*
|
|
48
|
+
* Typed as `DatabaseEngine` so unsupported values (e.g. `'mysql'`) fail at
|
|
49
|
+
* compile time rather than silently falling back to `'sqlite'` at runtime.
|
|
50
|
+
*/
|
|
51
|
+
engineHint?: DatabaseEngine;
|
|
52
|
+
}
|
|
53
|
+
export interface MigrateSmrtSchemasResult {
|
|
54
|
+
applied: boolean;
|
|
55
|
+
results: MigrationResult[];
|
|
56
|
+
statements: string[];
|
|
57
|
+
schemaCount: number;
|
|
58
|
+
/**
|
|
59
|
+
* Schema changes the orchestrator detected but cannot apply automatically
|
|
60
|
+
* (incompatible type mismatches, SQLite type upgrades that require table
|
|
61
|
+
* recreation, etc.). Empty when the schema is fully reconciled. Inspect
|
|
62
|
+
* this to surface a "manual migration required" warning in CLI output.
|
|
63
|
+
*/
|
|
64
|
+
unactionableChanges: SchemaChange[];
|
|
65
|
+
/**
|
|
66
|
+
* Convenience: `unactionableChanges.length > 0`. Lets a caller write
|
|
67
|
+
* `if (result.hasManualDrift) ...` without iterating the array first,
|
|
68
|
+
* and makes the case visible to anyone scanning the result shape (the
|
|
69
|
+
* full array is easy to gloss over when `applied: false`).
|
|
70
|
+
*/
|
|
71
|
+
hasManualDrift: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface PendingSchemaStatementsResult {
|
|
74
|
+
diff: Awaited<ReturnType<typeof generateSchemaDiff>>;
|
|
75
|
+
statements: string[];
|
|
76
|
+
schemaCount: number;
|
|
77
|
+
hasChanges: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Schema changes the differ detected but that have no executable SQL
|
|
80
|
+
* (incompatible `type_mismatch` entries, or `type_upgrade` entries whose
|
|
81
|
+
* only generated SQL is an advisory comment because the engine cannot
|
|
82
|
+
* upgrade the column in place — e.g. SQLite type widening). Surfacing
|
|
83
|
+
* these lets status commands distinguish "no drift" from "drift the
|
|
84
|
+
* orchestrator can't fix on its own."
|
|
85
|
+
*/
|
|
86
|
+
unactionableChanges: SchemaChange[];
|
|
87
|
+
/**
|
|
88
|
+
* Convenience: `unactionableChanges.length > 0`. Mirrors the
|
|
89
|
+
* `MigrateSmrtSchemasResult.hasManualDrift` shortcut.
|
|
90
|
+
*/
|
|
91
|
+
hasManualDrift: boolean;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compute the SQL statements needed to bring `db` in sync with the
|
|
95
|
+
* currently-registered SMRT object schemas. Pure inspection — no writes.
|
|
96
|
+
*
|
|
97
|
+
* Useful for status commands ("how far behind is the schema?") and as the
|
|
98
|
+
* inner step of `migrateSmrtSchemas`.
|
|
99
|
+
*
|
|
100
|
+
* **Note on the returned `statements`:** these are the engine-correct DDL
|
|
101
|
+
* statements as the differ + DDL strategy produce them, *prior to* any
|
|
102
|
+
* Postgres-specific rewrites the `MigrationTracker` applies at execution
|
|
103
|
+
* time (e.g. rewriting `CREATE INDEX` → `CREATE INDEX CONCURRENTLY` and
|
|
104
|
+
* moving CONCURRENTLY statements outside the surrounding transaction).
|
|
105
|
+
* The list is suitable for preview/status/"what would change?" use cases.
|
|
106
|
+
* For the exact byte-for-byte SQL the tracker ran, inspect the
|
|
107
|
+
* `MigrationResult`s from `migrateSmrtSchemas` or the tracker's own logs.
|
|
108
|
+
*/
|
|
109
|
+
export declare function getPendingSchemaStatements(db: DatabaseInterface, options?: {
|
|
110
|
+
engineHint?: DatabaseEngine;
|
|
111
|
+
}): Promise<PendingSchemaStatementsResult>;
|
|
112
|
+
/**
|
|
113
|
+
* Apply any pending schema changes from `ObjectRegistry` to `db`.
|
|
114
|
+
*
|
|
115
|
+
* Returns `applied: false` (with no error) if the database is already in
|
|
116
|
+
* sync. Throws on the first migration failure with the underlying error
|
|
117
|
+
* preserved (callers should let it propagate to the CLI).
|
|
118
|
+
*
|
|
119
|
+
* **Note on the returned `statements`:** mirrors `getPendingSchemaStatements`
|
|
120
|
+
* — the list is the planned DDL, prior to Postgres-specific tracker rewrites
|
|
121
|
+
* (CONCURRENTLY, transaction reordering). The actual executed SQL is
|
|
122
|
+
* tracked in the returned `results`.
|
|
123
|
+
*
|
|
124
|
+
* **Note on `applied` semantics under `reconcile: true` (the default):**
|
|
125
|
+
* the tracker may re-execute a migration that is already in `completed`
|
|
126
|
+
* state when the checksum matches — that counts as `applied: true` in the
|
|
127
|
+
* returned `MigrationResult`. So `result.applied === true` means "the
|
|
128
|
+
* tracker ran the migration", not specifically "the database changed for
|
|
129
|
+
* the first time." Pass `reconcile: false` if you need to distinguish a
|
|
130
|
+
* fresh apply from a reconcile-replay over an existing completed record.
|
|
131
|
+
*
|
|
132
|
+
* **Note on repeated failures:** the migration name defaults to a fresh
|
|
133
|
+
* timestamp on every call, so a sequence of failed runs leaves one
|
|
134
|
+
* `failed` row in `_smrt_schema_migrations` per attempt. Pass an explicit
|
|
135
|
+
* `name` if you want to overwrite the same record across retries.
|
|
136
|
+
*
|
|
137
|
+
* **Note on `unactionableChanges`:** the differ can detect schema drift
|
|
138
|
+
* the migration step can't auto-resolve — incompatible type mismatches,
|
|
139
|
+
* SQLite type widening that needs table recreation, etc. Those changes
|
|
140
|
+
* appear in `result.unactionableChanges` and are NOT applied (the
|
|
141
|
+
* statements list is filtered to executable DDL only). When the diff
|
|
142
|
+
* contains *only* unactionable changes, the function returns
|
|
143
|
+
* `applied: false` with a populated `unactionableChanges` so callers can
|
|
144
|
+
* surface a "manual migration required" signal. Without inspecting that
|
|
145
|
+
* field, the result would look indistinguishable from "already in sync."
|
|
146
|
+
*/
|
|
147
|
+
export declare function migrateSmrtSchemas(options: MigrateSmrtSchemasOptions): Promise<MigrateSmrtSchemasResult>;
|
|
148
|
+
//# sourceMappingURL=orchestrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../src/migrations/orchestrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAGnB,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,iBAAiB,CAAC;IACtB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC;;;;;OAKG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;IACrD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,cAAc,CAAA;CAAO,GAC5C,OAAO,CAAC,6BAA6B,CAAC,CAoBxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAyDnC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ObjectRegistry } from "../registry.js";
|
|
2
|
+
import { getDDLStrategy, detectEngine } from "../schema/ddl/index.js";
|
|
3
|
+
import { generateSchemaDiff, hasActionableChanges, getSQLFromDiff } from "./differ.js";
|
|
4
|
+
import { createMigrationDefinition, generateMigrationTimestamp } from "./generator.js";
|
|
5
|
+
import { MigrationTracker } from "./tracker.js";
|
|
6
|
+
async function getPendingSchemaStatements(db, options = {}) {
|
|
7
|
+
const schemas = ObjectRegistry.getAllSchemasAsDefinitions();
|
|
8
|
+
const diff = await generateSchemaDiff(db, schemas, {
|
|
9
|
+
engineHint: options.engineHint
|
|
10
|
+
});
|
|
11
|
+
const statements = collectStatementsFromDiff(diff, db, options.engineHint);
|
|
12
|
+
const unactionableChanges = collectUnactionableChanges(diff);
|
|
13
|
+
return {
|
|
14
|
+
diff,
|
|
15
|
+
schemaCount: Object.keys(schemas).length,
|
|
16
|
+
statements,
|
|
17
|
+
hasChanges: hasActionableChanges(diff),
|
|
18
|
+
unactionableChanges,
|
|
19
|
+
hasManualDrift: unactionableChanges.length > 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function migrateSmrtSchemas(options) {
|
|
23
|
+
const pending = await getPendingSchemaStatements(options.db, {
|
|
24
|
+
engineHint: options.engineHint
|
|
25
|
+
});
|
|
26
|
+
if (!pending.hasChanges || pending.statements.length === 0) {
|
|
27
|
+
return {
|
|
28
|
+
applied: false,
|
|
29
|
+
results: [],
|
|
30
|
+
statements: [],
|
|
31
|
+
schemaCount: pending.schemaCount,
|
|
32
|
+
unactionableChanges: pending.unactionableChanges,
|
|
33
|
+
hasManualDrift: pending.hasManualDrift
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const tracker = new MigrationTracker({
|
|
37
|
+
db: options.db,
|
|
38
|
+
engineHint: options.engineHint,
|
|
39
|
+
lockTimeout: options.lockTimeout,
|
|
40
|
+
statementTimeout: options.statementTimeout,
|
|
41
|
+
useConcurrentIndexes: options.useConcurrentIndexes ?? true
|
|
42
|
+
});
|
|
43
|
+
const migration = createMigrationDefinition(
|
|
44
|
+
options.name ?? `${generateMigrationTimestamp()}_smrt_schema_sync`,
|
|
45
|
+
pending.statements,
|
|
46
|
+
[],
|
|
47
|
+
{
|
|
48
|
+
description: options.description ?? "Synchronize SMRT object schemas",
|
|
49
|
+
packageName: options.packageName,
|
|
50
|
+
version: options.version ?? "unknown"
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
const results = await tracker.applyAll([migration], {
|
|
54
|
+
postgresSafe: options.postgresSafe ?? true,
|
|
55
|
+
reconcile: options.reconcile ?? true
|
|
56
|
+
});
|
|
57
|
+
const failed = results.find((result) => !result.success);
|
|
58
|
+
if (failed) {
|
|
59
|
+
throw failed.error instanceof Error ? failed.error : new Error(String(failed.error ?? `Migration ${failed.name} failed`));
|
|
60
|
+
}
|
|
61
|
+
const applied = results.some(
|
|
62
|
+
(result) => result.applied !== false && result.skipped !== true
|
|
63
|
+
);
|
|
64
|
+
return {
|
|
65
|
+
applied,
|
|
66
|
+
results,
|
|
67
|
+
statements: pending.statements,
|
|
68
|
+
schemaCount: pending.schemaCount,
|
|
69
|
+
unactionableChanges: pending.unactionableChanges,
|
|
70
|
+
hasManualDrift: pending.hasManualDrift
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function resolveDatabaseUrl(db) {
|
|
74
|
+
const dbWithConfig = db;
|
|
75
|
+
return db.url || dbWithConfig.config?.url || "";
|
|
76
|
+
}
|
|
77
|
+
function collectStatementsFromDiff(diff, db, engineHint) {
|
|
78
|
+
const strategy = getDDLStrategy(
|
|
79
|
+
detectEngine(resolveDatabaseUrl(db), engineHint)
|
|
80
|
+
);
|
|
81
|
+
const statements = [];
|
|
82
|
+
for (const schema of diff.added_tables) {
|
|
83
|
+
statements.push(strategy.generateCreateTable(schema));
|
|
84
|
+
statements.push(...strategy.generateIndexes(schema));
|
|
85
|
+
statements.push(...strategy.generateTriggers(schema));
|
|
86
|
+
}
|
|
87
|
+
statements.push(...getSQLFromDiff(diff));
|
|
88
|
+
return statements.filter((statement) => {
|
|
89
|
+
const trimmed = statement.trim();
|
|
90
|
+
if (trimmed.length === 0) return false;
|
|
91
|
+
return !isCommentOnlySql(trimmed);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function isCommentOnlySql(sql) {
|
|
95
|
+
const withoutBlockComments = sql.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
96
|
+
const lines = withoutBlockComments.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
|
|
97
|
+
if (lines.length === 0) return sql.trim().length > 0;
|
|
98
|
+
return lines.every((line) => line.startsWith("--"));
|
|
99
|
+
}
|
|
100
|
+
function collectUnactionableChanges(diff) {
|
|
101
|
+
const unactionable = [];
|
|
102
|
+
for (const change of diff.changes) {
|
|
103
|
+
if (change.type === "type_mismatch") {
|
|
104
|
+
unactionable.push(change);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const statements = change.sqlStatements ?? (change.sql ? [change.sql] : []);
|
|
108
|
+
if (statements.length > 0 && statements.every((stmt) => isCommentOnlySql(stmt.trim()))) {
|
|
109
|
+
unactionable.push(change);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return unactionable;
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
getPendingSchemaStatements,
|
|
116
|
+
migrateSmrtSchemas
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=orchestrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sources":["../../src/migrations/orchestrate.ts"],"sourcesContent":["/**\n * High-level \"make my SMRT app's schema match its database\" orchestration.\n *\n * Wraps `ObjectRegistry.getAllSchemasAsDefinitions()` → `generateSchemaDiff`\n * → `MigrationTracker.applyAll`. Apps that just want to run pending\n * schema changes call `migrateSmrtSchemas({ db, packageName, version })`\n * and don't have to assemble the migration definition by hand.\n *\n * The migration name is timestamped, so re-running on an up-to-date\n * database is a no-op (the diff is empty, no statements are generated,\n * `applied: false` is returned).\n */\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { ObjectRegistry } from '../registry.js';\nimport { detectEngine, getDDLStrategy } from '../schema/ddl/index.js';\nimport type { DatabaseEngine } from '../schema/ddl/types.js';\nimport type { MigrationResult, SchemaChange } from '../schema/types.js';\nimport {\n generateSchemaDiff,\n getSQLFromDiff,\n hasActionableChanges,\n} from './differ.js';\nimport {\n createMigrationDefinition,\n generateMigrationTimestamp,\n} from './generator.js';\nimport { MigrationTracker } from './tracker.js';\n\nexport interface MigrateSmrtSchemasOptions {\n db: DatabaseInterface;\n /** Stored on the migration record so the audit log shows which app applied it. */\n packageName: string;\n /**\n * Stored on the migration record. Typically the app's package.json\n * version. Optional because most apps don't have a runtime-readable\n * version handy and would hardcode a stale string if forced to supply\n * one — `'unknown'` is honest. Pass an explicit value when you can\n * (e.g. `version: process.env.APP_VERSION`).\n */\n version?: string;\n /** Override the description on the synthetic migration definition. */\n description?: string;\n /** Override the migration name (default: `<timestamp>_smrt_schema_sync`). */\n name?: string;\n /** Forwarded to MigrationTracker — defaults to true for pg-safe runs. */\n postgresSafe?: boolean;\n /** Forwarded to MigrationTracker — defaults to true. */\n reconcile?: boolean;\n /** Forwarded to MigrationTracker — defaults to true for `CREATE INDEX CONCURRENTLY`. */\n useConcurrentIndexes?: boolean;\n /**\n * Forwarded to MigrationTracker (Postgres lock timeout, milliseconds).\n * Lets apps that customize tracker timeouts directly preserve their\n * tuning when going through the orchestrator. Falls back to the\n * tracker's default (30000ms) when omitted.\n */\n lockTimeout?: number;\n /**\n * Forwarded to MigrationTracker (Postgres statement timeout, ms). Falls\n * back to the tracker's default (60000ms) when omitted.\n */\n statementTimeout?: number;\n /**\n * Explicit engine hint forwarded to `detectEngine`, `SchemaComparer`, and\n * `MigrationTracker`. Useful when `db.url` doesn't unambiguously identify\n * the engine (e.g. the JSON adapter, which uses DuckDB internally and may\n * not be recognizable by URL alone). All three layers honor the same hint\n * so the generated DDL, drift comparison, and execution path stay\n * consistent — without it, an empty-URL connection could produce\n * Postgres-flavored DDL but run through the SQLite tracker path.\n *\n * Typed as `DatabaseEngine` so unsupported values (e.g. `'mysql'`) fail at\n * compile time rather than silently falling back to `'sqlite'` at runtime.\n */\n engineHint?: DatabaseEngine;\n}\n\nexport interface MigrateSmrtSchemasResult {\n applied: boolean;\n results: MigrationResult[];\n statements: string[];\n schemaCount: number;\n /**\n * Schema changes the orchestrator detected but cannot apply automatically\n * (incompatible type mismatches, SQLite type upgrades that require table\n * recreation, etc.). Empty when the schema is fully reconciled. Inspect\n * this to surface a \"manual migration required\" warning in CLI output.\n */\n unactionableChanges: SchemaChange[];\n /**\n * Convenience: `unactionableChanges.length > 0`. Lets a caller write\n * `if (result.hasManualDrift) ...` without iterating the array first,\n * and makes the case visible to anyone scanning the result shape (the\n * full array is easy to gloss over when `applied: false`).\n */\n hasManualDrift: boolean;\n}\n\nexport interface PendingSchemaStatementsResult {\n diff: Awaited<ReturnType<typeof generateSchemaDiff>>;\n statements: string[];\n schemaCount: number;\n hasChanges: boolean;\n /**\n * Schema changes the differ detected but that have no executable SQL\n * (incompatible `type_mismatch` entries, or `type_upgrade` entries whose\n * only generated SQL is an advisory comment because the engine cannot\n * upgrade the column in place — e.g. SQLite type widening). Surfacing\n * these lets status commands distinguish \"no drift\" from \"drift the\n * orchestrator can't fix on its own.\"\n */\n unactionableChanges: SchemaChange[];\n /**\n * Convenience: `unactionableChanges.length > 0`. Mirrors the\n * `MigrateSmrtSchemasResult.hasManualDrift` shortcut.\n */\n hasManualDrift: boolean;\n}\n\n/**\n * Compute the SQL statements needed to bring `db` in sync with the\n * currently-registered SMRT object schemas. Pure inspection — no writes.\n *\n * Useful for status commands (\"how far behind is the schema?\") and as the\n * inner step of `migrateSmrtSchemas`.\n *\n * **Note on the returned `statements`:** these are the engine-correct DDL\n * statements as the differ + DDL strategy produce them, *prior to* any\n * Postgres-specific rewrites the `MigrationTracker` applies at execution\n * time (e.g. rewriting `CREATE INDEX` → `CREATE INDEX CONCURRENTLY` and\n * moving CONCURRENTLY statements outside the surrounding transaction).\n * The list is suitable for preview/status/\"what would change?\" use cases.\n * For the exact byte-for-byte SQL the tracker ran, inspect the\n * `MigrationResult`s from `migrateSmrtSchemas` or the tracker's own logs.\n */\nexport async function getPendingSchemaStatements(\n db: DatabaseInterface,\n options: { engineHint?: DatabaseEngine } = {},\n): Promise<PendingSchemaStatementsResult> {\n const schemas = ObjectRegistry.getAllSchemasAsDefinitions();\n // Forward engineHint into the diff itself so the SchemaComparer's\n // existing-table SQL (ALTER/index drift) uses the same DDL strategy\n // we use for newly-added tables — otherwise the two halves of the\n // statement list can land on different engines (split-brain) when\n // `db.url` is empty or ambiguous.\n const diff = await generateSchemaDiff(db, schemas, {\n engineHint: options.engineHint,\n });\n const statements = collectStatementsFromDiff(diff, db, options.engineHint);\n const unactionableChanges = collectUnactionableChanges(diff);\n return {\n diff,\n schemaCount: Object.keys(schemas).length,\n statements,\n hasChanges: hasActionableChanges(diff),\n unactionableChanges,\n hasManualDrift: unactionableChanges.length > 0,\n };\n}\n\n/**\n * Apply any pending schema changes from `ObjectRegistry` to `db`.\n *\n * Returns `applied: false` (with no error) if the database is already in\n * sync. Throws on the first migration failure with the underlying error\n * preserved (callers should let it propagate to the CLI).\n *\n * **Note on the returned `statements`:** mirrors `getPendingSchemaStatements`\n * — the list is the planned DDL, prior to Postgres-specific tracker rewrites\n * (CONCURRENTLY, transaction reordering). The actual executed SQL is\n * tracked in the returned `results`.\n *\n * **Note on `applied` semantics under `reconcile: true` (the default):**\n * the tracker may re-execute a migration that is already in `completed`\n * state when the checksum matches — that counts as `applied: true` in the\n * returned `MigrationResult`. So `result.applied === true` means \"the\n * tracker ran the migration\", not specifically \"the database changed for\n * the first time.\" Pass `reconcile: false` if you need to distinguish a\n * fresh apply from a reconcile-replay over an existing completed record.\n *\n * **Note on repeated failures:** the migration name defaults to a fresh\n * timestamp on every call, so a sequence of failed runs leaves one\n * `failed` row in `_smrt_schema_migrations` per attempt. Pass an explicit\n * `name` if you want to overwrite the same record across retries.\n *\n * **Note on `unactionableChanges`:** the differ can detect schema drift\n * the migration step can't auto-resolve — incompatible type mismatches,\n * SQLite type widening that needs table recreation, etc. Those changes\n * appear in `result.unactionableChanges` and are NOT applied (the\n * statements list is filtered to executable DDL only). When the diff\n * contains *only* unactionable changes, the function returns\n * `applied: false` with a populated `unactionableChanges` so callers can\n * surface a \"manual migration required\" signal. Without inspecting that\n * field, the result would look indistinguishable from \"already in sync.\"\n */\nexport async function migrateSmrtSchemas(\n options: MigrateSmrtSchemasOptions,\n): Promise<MigrateSmrtSchemasResult> {\n const pending = await getPendingSchemaStatements(options.db, {\n engineHint: options.engineHint,\n });\n if (!pending.hasChanges || pending.statements.length === 0) {\n return {\n applied: false,\n results: [],\n statements: [],\n schemaCount: pending.schemaCount,\n unactionableChanges: pending.unactionableChanges,\n hasManualDrift: pending.hasManualDrift,\n };\n }\n\n const tracker = new MigrationTracker({\n db: options.db,\n engineHint: options.engineHint,\n lockTimeout: options.lockTimeout,\n statementTimeout: options.statementTimeout,\n useConcurrentIndexes: options.useConcurrentIndexes ?? true,\n });\n const migration = createMigrationDefinition(\n options.name ?? `${generateMigrationTimestamp()}_smrt_schema_sync`,\n pending.statements,\n [],\n {\n description: options.description ?? 'Synchronize SMRT object schemas',\n packageName: options.packageName,\n version: options.version ?? 'unknown',\n },\n );\n\n const results = await tracker.applyAll([migration], {\n postgresSafe: options.postgresSafe ?? true,\n reconcile: options.reconcile ?? true,\n });\n\n const failed = results.find((result) => !result.success);\n if (failed) {\n throw failed.error instanceof Error\n ? failed.error\n : new Error(String(failed.error ?? `Migration ${failed.name} failed`));\n }\n\n const applied = results.some(\n (result) => result.applied !== false && result.skipped !== true,\n );\n\n return {\n applied,\n results,\n statements: pending.statements,\n schemaCount: pending.schemaCount,\n unactionableChanges: pending.unactionableChanges,\n hasManualDrift: pending.hasManualDrift,\n };\n}\n\n/** Mirror of the `getDatabaseUrl` helper in class.ts — some adapters\n * (JSON, certain in-memory wrappers) leave `db.url` undefined and expose\n * the URL on `db.config?.url` instead. Detecting the engine from a raw\n * `db.url` would throw or silently fall through to the sqlite default.\n */\nfunction resolveDatabaseUrl(db: DatabaseInterface): string {\n const dbWithConfig = db as DatabaseInterface & {\n config?: { url?: string };\n };\n return db.url || dbWithConfig.config?.url || '';\n}\n\n/**\n * Materialize the diff into the engine-correct SQL statements.\n *\n * For new tables we delegate to the engine's `DDLStrategy` so column types\n * (`REAL` → `DOUBLE PRECISION` on Postgres, `JSON` → `JSONB`, etc.),\n * partial-index `WHERE` clauses, and trigger syntax all match what the\n * SchemaComparer would expect on subsequent runs. Emitting the raw\n * abstract `SchemaDefinition.ddl` here would cause immediate type-drift\n * migrations on Postgres/DuckDB.\n *\n * Column/index/trigger changes for existing tables continue to come from\n * `getSQLFromDiff`, which is already engine-aware via the differ's per-\n * change `sqlStatements`.\n */\nfunction collectStatementsFromDiff(\n diff: Awaited<ReturnType<typeof generateSchemaDiff>>,\n db: DatabaseInterface,\n engineHint?: DatabaseEngine,\n): string[] {\n const strategy = getDDLStrategy(\n detectEngine(resolveDatabaseUrl(db), engineHint),\n );\n const statements: string[] = [];\n for (const schema of diff.added_tables) {\n statements.push(strategy.generateCreateTable(schema));\n statements.push(...strategy.generateIndexes(schema));\n statements.push(...strategy.generateTriggers(schema));\n }\n statements.push(...getSQLFromDiff(diff));\n // Drop empty and comment-only entries. SQLite type-widening upgrades\n // surface as `-- SQLite: Type upgrade for X requires table recreation`\n // — passing those through to the tracker records a successful migration\n // without actually fixing the column, so the same drift re-appears on\n // every subsequent run. Those changes are surfaced separately via\n // `unactionableChanges` so callers can prompt for manual remediation.\n return statements.filter((statement) => {\n const trimmed = statement.trim();\n if (trimmed.length === 0) return false;\n return !isCommentOnlySql(trimmed);\n });\n}\n\n/**\n * True if `sql` contains no executable DDL — only line comments (`--`)\n * and/or block comments (`/* … */`). Used to discard advisory comments\n * the differ emits when a column upgrade can't be performed in place\n * (e.g. SQLite type widening). Defensive: strips block comments first so\n * a future differ that emits `/* type_upgrade: no-op */` doesn't slip\n * through.\n */\nfunction isCommentOnlySql(sql: string): boolean {\n // Strip /* ... */ block comments (non-greedy, spans newlines).\n const withoutBlockComments = sql.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n const lines = withoutBlockComments\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) return sql.trim().length > 0;\n return lines.every((line) => line.startsWith('--'));\n}\n\n/**\n * Surface changes the differ produced but that the migrator cannot apply\n * automatically — either `type_mismatch` entries (the differ explicitly\n * gives up on these) or `type_upgrade` entries whose generated SQL is\n * advisory-comment-only (SQLite table-recreation cases, etc.). Callers\n * use this to distinguish \"schema is in sync\" from \"schema is drifted but\n * we can't fix it from here.\"\n */\nfunction collectUnactionableChanges(\n diff: Awaited<ReturnType<typeof generateSchemaDiff>>,\n): SchemaChange[] {\n const unactionable: SchemaChange[] = [];\n for (const change of diff.changes) {\n if (change.type === 'type_mismatch') {\n unactionable.push(change);\n continue;\n }\n const statements = change.sqlStatements ?? (change.sql ? [change.sql] : []);\n if (\n statements.length > 0 &&\n statements.every((stmt) => isCommentOnlySql(stmt.trim()))\n ) {\n unactionable.push(change);\n }\n }\n return unactionable;\n}\n"],"names":[],"mappings":";;;;;AAuIA,eAAsB,2BACpB,IACA,UAA2C,IACH;AACxC,QAAM,UAAU,eAAe,2BAAA;AAM/B,QAAM,OAAO,MAAM,mBAAmB,IAAI,SAAS;AAAA,IACjD,YAAY,QAAQ;AAAA,EAAA,CACrB;AACD,QAAM,aAAa,0BAA0B,MAAM,IAAI,QAAQ,UAAU;AACzE,QAAM,sBAAsB,2BAA2B,IAAI;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAO,KAAK,OAAO,EAAE;AAAA,IAClC;AAAA,IACA,YAAY,qBAAqB,IAAI;AAAA,IACrC;AAAA,IACA,gBAAgB,oBAAoB,SAAS;AAAA,EAAA;AAEjD;AAqCA,eAAsB,mBACpB,SACmC;AACnC,QAAM,UAAU,MAAM,2BAA2B,QAAQ,IAAI;AAAA,IAC3D,YAAY,QAAQ;AAAA,EAAA,CACrB;AACD,MAAI,CAAC,QAAQ,cAAc,QAAQ,WAAW,WAAW,GAAG;AAC1D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,CAAA;AAAA,MACT,YAAY,CAAA;AAAA,MACZ,aAAa,QAAQ;AAAA,MACrB,qBAAqB,QAAQ;AAAA,MAC7B,gBAAgB,QAAQ;AAAA,IAAA;AAAA,EAE5B;AAEA,QAAM,UAAU,IAAI,iBAAiB;AAAA,IACnC,IAAI,QAAQ;AAAA,IACZ,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,kBAAkB,QAAQ;AAAA,IAC1B,sBAAsB,QAAQ,wBAAwB;AAAA,EAAA,CACvD;AACD,QAAM,YAAY;AAAA,IAChB,QAAQ,QAAQ,GAAG,2BAAA,CAA4B;AAAA,IAC/C,QAAQ;AAAA,IACR,CAAA;AAAA,IACA;AAAA,MACE,aAAa,QAAQ,eAAe;AAAA,MACpC,aAAa,QAAQ;AAAA,MACrB,SAAS,QAAQ,WAAW;AAAA,IAAA;AAAA,EAC9B;AAGF,QAAM,UAAU,MAAM,QAAQ,SAAS,CAAC,SAAS,GAAG;AAAA,IAClD,cAAc,QAAQ,gBAAgB;AAAA,IACtC,WAAW,QAAQ,aAAa;AAAA,EAAA,CACjC;AAED,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,CAAC,OAAO,OAAO;AACvD,MAAI,QAAQ;AACV,UAAM,OAAO,iBAAiB,QAC1B,OAAO,QACP,IAAI,MAAM,OAAO,OAAO,SAAS,aAAa,OAAO,IAAI,SAAS,CAAC;AAAA,EACzE;AAEA,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,WAAW,OAAO,YAAY,SAAS,OAAO,YAAY;AAAA,EAAA;AAG7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,qBAAqB,QAAQ;AAAA,IAC7B,gBAAgB,QAAQ;AAAA,EAAA;AAE5B;AAOA,SAAS,mBAAmB,IAA+B;AACzD,QAAM,eAAe;AAGrB,SAAO,GAAG,OAAO,aAAa,QAAQ,OAAO;AAC/C;AAgBA,SAAS,0BACP,MACA,IACA,YACU;AACV,QAAM,WAAW;AAAA,IACf,aAAa,mBAAmB,EAAE,GAAG,UAAU;AAAA,EAAA;AAEjD,QAAM,aAAuB,CAAA;AAC7B,aAAW,UAAU,KAAK,cAAc;AACtC,eAAW,KAAK,SAAS,oBAAoB,MAAM,CAAC;AACpD,eAAW,KAAK,GAAG,SAAS,gBAAgB,MAAM,CAAC;AACnD,eAAW,KAAK,GAAG,SAAS,iBAAiB,MAAM,CAAC;AAAA,EACtD;AACA,aAAW,KAAK,GAAG,eAAe,IAAI,CAAC;AAOvC,SAAO,WAAW,OAAO,CAAC,cAAc;AACtC,UAAM,UAAU,UAAU,KAAA;AAC1B,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,WAAO,CAAC,iBAAiB,OAAO;AAAA,EAClC,CAAC;AACH;AAUA,SAAS,iBAAiB,KAAsB;AAE9C,QAAM,uBAAuB,IAAI,QAAQ,qBAAqB,EAAE;AAChE,QAAM,QAAQ,qBACX,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAA,CAAM,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAI,MAAM,WAAW,UAAU,IAAI,KAAA,EAAO,SAAS;AACnD,SAAO,MAAM,MAAM,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC;AACpD;AAUA,SAAS,2BACP,MACgB;AAChB,QAAM,eAA+B,CAAA;AACrC,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,SAAS,iBAAiB;AACnC,mBAAa,KAAK,MAAM;AACxB;AAAA,IACF;AACA,UAAM,aAAa,OAAO,kBAAkB,OAAO,MAAM,CAAC,OAAO,GAAG,IAAI;AACxE,QACE,WAAW,SAAS,KACpB,WAAW,MAAM,CAAC,SAAS,iBAAiB,KAAK,KAAA,CAAM,CAAC,GACxD;AACA,mBAAa,KAAK,MAAM;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { DatabaseEngine } from '../schema/ddl/types.js';
|
|
2
|
+
import { DriftReport, MigrationDefinition, MigrationResult, MigrationStatus, SchemaMigrationRecord } from '../schema/types.js';
|
|
3
|
+
import { ApplyMigrationsOptions, MigrationTrackerOptions, RollbackOptions } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* MigrationTracker class
|
|
6
|
+
*
|
|
7
|
+
* Provides migration tracking and state management:
|
|
8
|
+
* - Initializes the _smrt_schema_migrations tracking table
|
|
9
|
+
* - Tracks applied migrations with checksums
|
|
10
|
+
* - Provides idempotent migration application
|
|
11
|
+
* - Supports rollback via DOWN scripts
|
|
12
|
+
* - Handles PostgreSQL-specific concerns (CONCURRENTLY, lock timeout)
|
|
13
|
+
*/
|
|
14
|
+
export declare class MigrationTracker {
|
|
15
|
+
private db;
|
|
16
|
+
private options;
|
|
17
|
+
private engineHint?;
|
|
18
|
+
private dbEngine;
|
|
19
|
+
/**
|
|
20
|
+
* Memoized initialization promise. Storing the in-flight promise (rather
|
|
21
|
+
* than a `boolean` flag set after the DDL completes) makes `initialize()`
|
|
22
|
+
* safe under concurrency: multiple parallel callers all `await` the same
|
|
23
|
+
* promise instead of independently re-running the DDL. On error the slot
|
|
24
|
+
* is cleared so the next caller retries — a transient failure doesn't
|
|
25
|
+
* permanently poison the instance.
|
|
26
|
+
*/
|
|
27
|
+
private initializePromise;
|
|
28
|
+
private currentBatch;
|
|
29
|
+
constructor(options: MigrationTrackerOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Detect the database engine. Honors an explicit `engineHint` (passed via
|
|
32
|
+
* `MigrationTrackerOptions`) before falling back to URL parsing — this is
|
|
33
|
+
* the same `detectEngine` contract used by `SchemaComparer` and the rest
|
|
34
|
+
* of the migration stack, so the tracker stays consistent with the DDL
|
|
35
|
+
* the orchestrator generated.
|
|
36
|
+
*/
|
|
37
|
+
private detectDbEngine;
|
|
38
|
+
/**
|
|
39
|
+
* Get the current database engine
|
|
40
|
+
*/
|
|
41
|
+
getEngine(): DatabaseEngine;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the migrations tracking table
|
|
44
|
+
*/
|
|
45
|
+
initialize(): Promise<void>;
|
|
46
|
+
private runInitializeDdl;
|
|
47
|
+
/**
|
|
48
|
+
* Get all applied migrations ordered by applied_at
|
|
49
|
+
*/
|
|
50
|
+
getAppliedMigrations(): Promise<SchemaMigrationRecord[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Get pending migrations (defined but not applied)
|
|
53
|
+
*/
|
|
54
|
+
getPendingMigrations(definitions: MigrationDefinition[]): Promise<MigrationDefinition[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Check if a migration has been applied
|
|
57
|
+
*/
|
|
58
|
+
isApplied(migrationId: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Get a single migration record by name
|
|
61
|
+
*/
|
|
62
|
+
getMigration(name: string): Promise<SchemaMigrationRecord | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Get the next batch number
|
|
65
|
+
*/
|
|
66
|
+
getNextBatch(): Promise<number>;
|
|
67
|
+
/**
|
|
68
|
+
* Detect drift between migration definitions and applied migrations
|
|
69
|
+
*/
|
|
70
|
+
detectDrift(definitions: MigrationDefinition[]): Promise<DriftReport[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Apply a single migration
|
|
73
|
+
*/
|
|
74
|
+
apply(definition: MigrationDefinition, options?: ApplyMigrationsOptions): Promise<MigrationResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Apply multiple migrations in order
|
|
77
|
+
*/
|
|
78
|
+
applyAll(definitions: MigrationDefinition[], options?: ApplyMigrationsOptions): Promise<MigrationResult[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Rollback a migration
|
|
81
|
+
*/
|
|
82
|
+
rollback(name: string, definition: MigrationDefinition, options?: RollbackOptions): Promise<MigrationResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Get migration history with optional filtering
|
|
85
|
+
*/
|
|
86
|
+
getHistory(options?: {
|
|
87
|
+
limit?: number;
|
|
88
|
+
since?: Date;
|
|
89
|
+
status?: MigrationStatus;
|
|
90
|
+
}): Promise<SchemaMigrationRecord[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Execute SQL statements with appropriate transaction handling
|
|
93
|
+
*/
|
|
94
|
+
private executeStatements;
|
|
95
|
+
/**
|
|
96
|
+
* Execute statements within a transaction (SQLite/DuckDB)
|
|
97
|
+
*/
|
|
98
|
+
private executeWithTransaction;
|
|
99
|
+
/**
|
|
100
|
+
* Execute statements with PostgreSQL-specific handling
|
|
101
|
+
*
|
|
102
|
+
* - CONCURRENTLY statements run outside transaction
|
|
103
|
+
* - Regular statements run in transaction with lock_timeout
|
|
104
|
+
*
|
|
105
|
+
* Both CREATE and DROP variants of CONCURRENTLY must be detected — Postgres
|
|
106
|
+
* forbids `DROP INDEX CONCURRENTLY` inside a transaction block, just like
|
|
107
|
+
* the create variant. Issue #1165: the migration generator emits
|
|
108
|
+
* `DROP INDEX CONCURRENTLY` for shape-drift recreates and orphan-index
|
|
109
|
+
* cleanups, so the regex needs to cover both keywords.
|
|
110
|
+
*/
|
|
111
|
+
private executePostgresStatements;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Split a batch of SQL statements into a transaction-safe set and a
|
|
115
|
+
* concurrent set, applying `--postgres-safe` rewriting if requested.
|
|
116
|
+
*
|
|
117
|
+
* Exported for unit testing and to give external callers a way to
|
|
118
|
+
* reason about what the tracker would execute in PostgreSQL safe mode.
|
|
119
|
+
*
|
|
120
|
+
* Rules:
|
|
121
|
+
* - Statements already containing `CONCURRENTLY` for CREATE/DROP INDEX or
|
|
122
|
+
* REINDEX operations always go to the concurrent set — Postgres rejects
|
|
123
|
+
* them inside transactions.
|
|
124
|
+
* - When `useConcurrentIndexes` is true, plain `CREATE INDEX` and plain
|
|
125
|
+
* `DROP INDEX` are rewritten to use `CONCURRENTLY`, then routed to
|
|
126
|
+
* the concurrent set. This is what the CLI `--postgres-safe` flag and
|
|
127
|
+
* the auto-migrate path rely on for issue #1165's shape-drift drops.
|
|
128
|
+
* - All other statements stay in the regular (transaction) set.
|
|
129
|
+
*/
|
|
130
|
+
export declare function planPostgresStatements(statements: string[], useConcurrentIndexes: boolean): {
|
|
131
|
+
concurrent: string[];
|
|
132
|
+
regular: string[];
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/migrations/tracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EACV,sBAAsB,EAEtB,uBAAuB,EACvB,eAAe,EAChB,MAAM,YAAY,CAAC;AAkEpB;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAiB;IACjC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAuB;gBAE/B,OAAO,EAAE,uBAAuB;IAa5C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAUnB,gBAAgB;IAW9B;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAe9D;;OAEG;IACG,oBAAoB,CACxB,WAAW,EAAE,mBAAmB,EAAE,GACjC,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAMjC;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtD;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAmBvE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAWrC;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,mBAAmB,EAAE,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC;IAkDzB;;OAEG;IACG,KAAK,CACT,UAAU,EAAE,mBAAmB,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,CAAC;IAyL3B;;OAEG;IACG,QAAQ,CACZ,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC;IAsF7B;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,mBAAmB,EAC/B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC;IAiF3B;;OAEG;IACG,UAAU,CACd,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,eAAe,CAAA;KAAO,GACvE,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAiCnC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,sBAAsB;IAepC;;;;;;;;;;;OAWG;YACW,yBAAyB;CAqCxC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAAE,EACpB,oBAAoB,EAAE,OAAO,GAC5B;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAgC7C"}
|