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