@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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for SMRT Framework Advisor MCP server
|
|
3
|
+
*
|
|
4
|
+
* These types define the inputs and outputs for all advisor tools
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base response type for all tools
|
|
8
|
+
*/
|
|
9
|
+
export interface ToolResponse {
|
|
10
|
+
success: boolean;
|
|
11
|
+
data?: any;
|
|
12
|
+
error?: string;
|
|
13
|
+
warnings?: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Input for generate-smrt-class tool
|
|
17
|
+
*/
|
|
18
|
+
export interface GenerateSmrtClassInput {
|
|
19
|
+
className: string;
|
|
20
|
+
properties: Array<{
|
|
21
|
+
name: string;
|
|
22
|
+
type: 'text' | 'integer' | 'decimal' | 'boolean' | 'datetime' | 'json';
|
|
23
|
+
required?: boolean;
|
|
24
|
+
description?: string;
|
|
25
|
+
}>;
|
|
26
|
+
baseClass?: 'SmrtObject' | 'SmrtCollection';
|
|
27
|
+
includeApiConfig?: boolean;
|
|
28
|
+
includeMcpConfig?: boolean;
|
|
29
|
+
includeCliConfig?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Input for add-ai-methods tool
|
|
33
|
+
*/
|
|
34
|
+
export interface AddAiMethodsInput {
|
|
35
|
+
className: string;
|
|
36
|
+
methods: Array<'is' | 'do' | 'tool'>;
|
|
37
|
+
filePath?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Input for generate-field-definitions tool
|
|
41
|
+
*/
|
|
42
|
+
export interface GenerateFieldDefinitionsInput {
|
|
43
|
+
fields: Array<{
|
|
44
|
+
name: string;
|
|
45
|
+
type: 'text' | 'integer' | 'decimal' | 'boolean' | 'datetime' | 'json' | 'foreignKey';
|
|
46
|
+
_meta?: Record<string, any>;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Input for generate-collection tool
|
|
51
|
+
*/
|
|
52
|
+
export interface GenerateCollectionInput {
|
|
53
|
+
collectionName: string;
|
|
54
|
+
itemClassName: string;
|
|
55
|
+
itemClassPath: string;
|
|
56
|
+
includeCustomMethods?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Input for configure-decorators tool
|
|
60
|
+
*/
|
|
61
|
+
export interface ConfigureDecoratorsInput {
|
|
62
|
+
className: string;
|
|
63
|
+
api?: {
|
|
64
|
+
include?: string[];
|
|
65
|
+
exclude?: string[];
|
|
66
|
+
routes?: Record<string, {
|
|
67
|
+
scope?: 'item' | 'collection';
|
|
68
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
69
|
+
path?: string;
|
|
70
|
+
}>;
|
|
71
|
+
};
|
|
72
|
+
mcp?: {
|
|
73
|
+
include?: string[];
|
|
74
|
+
exclude?: string[];
|
|
75
|
+
};
|
|
76
|
+
cli?: boolean;
|
|
77
|
+
hooks?: {
|
|
78
|
+
beforeSave?: string;
|
|
79
|
+
afterSave?: string;
|
|
80
|
+
beforeDelete?: string;
|
|
81
|
+
afterDelete?: string;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Input for validate-smrt-object tool
|
|
86
|
+
*/
|
|
87
|
+
export interface ValidateSmrtObjectInput {
|
|
88
|
+
filePath: string;
|
|
89
|
+
strictMode?: boolean;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Validation result
|
|
93
|
+
*/
|
|
94
|
+
export interface ValidationResult {
|
|
95
|
+
valid: boolean;
|
|
96
|
+
errors: Array<{
|
|
97
|
+
type: 'error' | 'warning';
|
|
98
|
+
message: string;
|
|
99
|
+
line?: number;
|
|
100
|
+
suggestion?: string;
|
|
101
|
+
}>;
|
|
102
|
+
className?: string;
|
|
103
|
+
hasDecorator?: boolean;
|
|
104
|
+
hasRequiredMethods?: boolean;
|
|
105
|
+
fieldCount?: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Input for preview-api-endpoints tool
|
|
109
|
+
*/
|
|
110
|
+
export interface PreviewApiEndpointsInput {
|
|
111
|
+
className: string;
|
|
112
|
+
basePath?: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* API endpoint definition
|
|
116
|
+
*/
|
|
117
|
+
export interface ApiEndpoint {
|
|
118
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
119
|
+
path: string;
|
|
120
|
+
description: string;
|
|
121
|
+
parameters?: Array<{
|
|
122
|
+
name: string;
|
|
123
|
+
type: string;
|
|
124
|
+
required: boolean;
|
|
125
|
+
location: 'path' | 'query' | 'body';
|
|
126
|
+
}>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Input for preview-mcp-tools tool
|
|
130
|
+
*/
|
|
131
|
+
export interface PreviewMcpToolsInput {
|
|
132
|
+
className: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* MCP tool definition
|
|
136
|
+
*/
|
|
137
|
+
export interface McpToolDefinition {
|
|
138
|
+
name: string;
|
|
139
|
+
description: string;
|
|
140
|
+
inputSchema: {
|
|
141
|
+
type: string;
|
|
142
|
+
properties: Record<string, any>;
|
|
143
|
+
required?: string[];
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Input for list-registered-objects tool
|
|
148
|
+
*/
|
|
149
|
+
export interface ListRegisteredObjectsInput {
|
|
150
|
+
filter?: 'all' | 'objects' | 'collections';
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Registered object info
|
|
154
|
+
*/
|
|
155
|
+
export interface RegisteredObjectInfo {
|
|
156
|
+
name: string;
|
|
157
|
+
type: 'object' | 'collection';
|
|
158
|
+
hasDecorator: boolean;
|
|
159
|
+
fieldCount: number;
|
|
160
|
+
apiEnabled: boolean;
|
|
161
|
+
mcpEnabled: boolean;
|
|
162
|
+
cliEnabled: boolean;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Input for get-object-schema tool
|
|
166
|
+
*/
|
|
167
|
+
export interface GetObjectSchemaInput {
|
|
168
|
+
className: string;
|
|
169
|
+
format?: 'json' | 'typescript' | 'table';
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Field definition
|
|
173
|
+
*/
|
|
174
|
+
export interface FieldDefinition {
|
|
175
|
+
name: string;
|
|
176
|
+
type: string;
|
|
177
|
+
required: boolean;
|
|
178
|
+
default?: any;
|
|
179
|
+
description?: string;
|
|
180
|
+
constraints?: Record<string, any>;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Input for get-object-config tool
|
|
184
|
+
*/
|
|
185
|
+
export interface GetObjectConfigInput {
|
|
186
|
+
className: string;
|
|
187
|
+
format?: 'json' | 'yaml';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Object configuration
|
|
191
|
+
*/
|
|
192
|
+
export interface ObjectConfig {
|
|
193
|
+
className: string;
|
|
194
|
+
decorator: {
|
|
195
|
+
api?: boolean | {
|
|
196
|
+
include?: string[];
|
|
197
|
+
exclude?: string[];
|
|
198
|
+
};
|
|
199
|
+
mcp?: boolean | {
|
|
200
|
+
include?: string[];
|
|
201
|
+
exclude?: string[];
|
|
202
|
+
};
|
|
203
|
+
cli?: boolean;
|
|
204
|
+
hooks?: Record<string, string>;
|
|
205
|
+
};
|
|
206
|
+
fields: FieldDefinition[];
|
|
207
|
+
customMethods: string[];
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp-advisor/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
export interface BackfillTrackerOptions {
|
|
3
|
+
db: DatabaseInterface;
|
|
4
|
+
}
|
|
5
|
+
export interface BackfillRecord {
|
|
6
|
+
name: string;
|
|
7
|
+
appliedAt: string;
|
|
8
|
+
description: string | null;
|
|
9
|
+
packageName: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare class BackfillTracker {
|
|
12
|
+
private readonly db;
|
|
13
|
+
/**
|
|
14
|
+
* Memoized initialization promise. Storing the promise (rather than a
|
|
15
|
+
* `boolean` flag set after the DDL completes) makes `initialize()` safe
|
|
16
|
+
* under concurrency: multiple parallel callers all `await` the same
|
|
17
|
+
* in-flight promise instead of independently re-running the DDL. On
|
|
18
|
+
* error the slot is cleared so the next caller retries — a transient
|
|
19
|
+
* failure doesn't permanently poison the instance.
|
|
20
|
+
*/
|
|
21
|
+
private initializePromise;
|
|
22
|
+
constructor(options: BackfillTrackerOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Create the `_smrt_backfills` table if it doesn't already exist.
|
|
25
|
+
* Safe to call repeatedly and concurrently.
|
|
26
|
+
*/
|
|
27
|
+
initialize(): Promise<void>;
|
|
28
|
+
/** Has the backfill named `name` already run? */
|
|
29
|
+
isApplied(name: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Record that the backfill named `name` ran. Uses INSERT ... ON CONFLICT
|
|
32
|
+
* so callers don't need to check `isApplied` first if they don't care
|
|
33
|
+
* about distinguishing "already applied" from "just applied".
|
|
34
|
+
*/
|
|
35
|
+
recordApplied(name: string, options?: {
|
|
36
|
+
description?: string;
|
|
37
|
+
packageName?: string;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Convenience wrapper: if `name` hasn't been applied, run `fn` and
|
|
41
|
+
* record the result. Returns `{ ran, result }`:
|
|
42
|
+
* - `{ ran: true, result: T }` — backfill was pending and `fn` ran
|
|
43
|
+
* - `{ ran: false, result: null }` — backfill was already applied
|
|
44
|
+
*
|
|
45
|
+
* The discriminator avoids the `T | null` ambiguity an earlier shape had
|
|
46
|
+
* (a backfill that legitimately returns `null` was indistinguishable
|
|
47
|
+
* from "already applied"). Callers check `ran` to decide whether `fn`
|
|
48
|
+
* executed; `result` carries whatever `fn` returned.
|
|
49
|
+
*
|
|
50
|
+
* This is the common pattern an app's migrate orchestration follows:
|
|
51
|
+
* a list of `(name, runner)` pairs, each guarded by isApplied/run/record.
|
|
52
|
+
*
|
|
53
|
+
* **Single-runner only.** This is a check-then-act pattern with no
|
|
54
|
+
* locking: two processes that call `runIfPending` for the same `name`
|
|
55
|
+
* concurrently can both observe `isApplied === false`, both execute
|
|
56
|
+
* `fn`, and only then race to `recordApplied`. The `ON CONFLICT DO
|
|
57
|
+
* NOTHING` in `recordApplied` keeps the table clean but does NOT prevent
|
|
58
|
+
* `fn` from running twice. Acceptable when backfills are run from a
|
|
59
|
+
* single deploy-time migration step (the common case); if you need to
|
|
60
|
+
* fan out backfills across multiple workers, wrap the call in your own
|
|
61
|
+
* mutex (e.g. a Postgres advisory lock keyed by backfill name).
|
|
62
|
+
*
|
|
63
|
+
* **`fn` MUST be idempotent.** The order is `fn` → `recordApplied`, with
|
|
64
|
+
* no surrounding transaction. If `fn` succeeds but `recordApplied`
|
|
65
|
+
* throws (DB connection drops, transient error), the work has happened
|
|
66
|
+
* but is not recorded — the next call sees `isApplied === false` and
|
|
67
|
+
* re-runs `fn`. For non-idempotent work (slug rewrites that consume
|
|
68
|
+
* source rows, one-shot lookups), wrap the entire call in a transaction
|
|
69
|
+
* yourself or structure `fn` so a second execution is a no-op.
|
|
70
|
+
*/
|
|
71
|
+
runIfPending<T>(name: string, fn: () => Promise<T>, options?: {
|
|
72
|
+
description?: string;
|
|
73
|
+
packageName?: string;
|
|
74
|
+
}): Promise<{
|
|
75
|
+
ran: false;
|
|
76
|
+
result: null;
|
|
77
|
+
} | {
|
|
78
|
+
ran: true;
|
|
79
|
+
result: T;
|
|
80
|
+
}>;
|
|
81
|
+
/** List every recorded backfill, oldest first. */
|
|
82
|
+
listApplied(): Promise<BackfillRecord[]>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=backfill-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-tracker.d.ts","sourceRoot":"","sources":["../../src/migrations/backfill-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,iBAAiB,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,OAAO,EAAE,sBAAsB;IAI3C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC,iDAAiD;IAC3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS/C;;;;OAIG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACG,YAAY,CAAC,CAAC,EAClB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,OAAO,CAAC;QAAE,GAAG,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;IAOnE,kDAAkD;IAC5C,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAY/C"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { CREATE_SMRT_BACKFILLS_TABLE } from "../system/schema.js";
|
|
2
|
+
class BackfillTracker {
|
|
3
|
+
db;
|
|
4
|
+
/**
|
|
5
|
+
* Memoized initialization promise. Storing the promise (rather than a
|
|
6
|
+
* `boolean` flag set after the DDL completes) makes `initialize()` safe
|
|
7
|
+
* under concurrency: multiple parallel callers all `await` the same
|
|
8
|
+
* in-flight promise instead of independently re-running the DDL. On
|
|
9
|
+
* error the slot is cleared so the next caller retries — a transient
|
|
10
|
+
* failure doesn't permanently poison the instance.
|
|
11
|
+
*/
|
|
12
|
+
initializePromise = null;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.db = options.db;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create the `_smrt_backfills` table if it doesn't already exist.
|
|
18
|
+
* Safe to call repeatedly and concurrently.
|
|
19
|
+
*/
|
|
20
|
+
async initialize() {
|
|
21
|
+
if (!this.initializePromise) {
|
|
22
|
+
this.initializePromise = this.db.query(CREATE_SMRT_BACKFILLS_TABLE).then(() => void 0).catch((error) => {
|
|
23
|
+
this.initializePromise = null;
|
|
24
|
+
throw error;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return this.initializePromise;
|
|
28
|
+
}
|
|
29
|
+
/** Has the backfill named `name` already run? */
|
|
30
|
+
async isApplied(name) {
|
|
31
|
+
await this.initialize();
|
|
32
|
+
const result = await this.db.query(
|
|
33
|
+
"SELECT 1 FROM _smrt_backfills WHERE name = ? LIMIT 1",
|
|
34
|
+
name
|
|
35
|
+
);
|
|
36
|
+
return result.rows.length > 0;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Record that the backfill named `name` ran. Uses INSERT ... ON CONFLICT
|
|
40
|
+
* so callers don't need to check `isApplied` first if they don't care
|
|
41
|
+
* about distinguishing "already applied" from "just applied".
|
|
42
|
+
*/
|
|
43
|
+
async recordApplied(name, options = {}) {
|
|
44
|
+
await this.initialize();
|
|
45
|
+
await this.db.query(
|
|
46
|
+
`INSERT INTO _smrt_backfills (name, description, package_name)
|
|
47
|
+
VALUES (?, ?, ?)
|
|
48
|
+
ON CONFLICT (name) DO NOTHING`,
|
|
49
|
+
name,
|
|
50
|
+
options.description ?? null,
|
|
51
|
+
options.packageName ?? null
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convenience wrapper: if `name` hasn't been applied, run `fn` and
|
|
56
|
+
* record the result. Returns `{ ran, result }`:
|
|
57
|
+
* - `{ ran: true, result: T }` — backfill was pending and `fn` ran
|
|
58
|
+
* - `{ ran: false, result: null }` — backfill was already applied
|
|
59
|
+
*
|
|
60
|
+
* The discriminator avoids the `T | null` ambiguity an earlier shape had
|
|
61
|
+
* (a backfill that legitimately returns `null` was indistinguishable
|
|
62
|
+
* from "already applied"). Callers check `ran` to decide whether `fn`
|
|
63
|
+
* executed; `result` carries whatever `fn` returned.
|
|
64
|
+
*
|
|
65
|
+
* This is the common pattern an app's migrate orchestration follows:
|
|
66
|
+
* a list of `(name, runner)` pairs, each guarded by isApplied/run/record.
|
|
67
|
+
*
|
|
68
|
+
* **Single-runner only.** This is a check-then-act pattern with no
|
|
69
|
+
* locking: two processes that call `runIfPending` for the same `name`
|
|
70
|
+
* concurrently can both observe `isApplied === false`, both execute
|
|
71
|
+
* `fn`, and only then race to `recordApplied`. The `ON CONFLICT DO
|
|
72
|
+
* NOTHING` in `recordApplied` keeps the table clean but does NOT prevent
|
|
73
|
+
* `fn` from running twice. Acceptable when backfills are run from a
|
|
74
|
+
* single deploy-time migration step (the common case); if you need to
|
|
75
|
+
* fan out backfills across multiple workers, wrap the call in your own
|
|
76
|
+
* mutex (e.g. a Postgres advisory lock keyed by backfill name).
|
|
77
|
+
*
|
|
78
|
+
* **`fn` MUST be idempotent.** The order is `fn` → `recordApplied`, with
|
|
79
|
+
* no surrounding transaction. If `fn` succeeds but `recordApplied`
|
|
80
|
+
* throws (DB connection drops, transient error), the work has happened
|
|
81
|
+
* but is not recorded — the next call sees `isApplied === false` and
|
|
82
|
+
* re-runs `fn`. For non-idempotent work (slug rewrites that consume
|
|
83
|
+
* source rows, one-shot lookups), wrap the entire call in a transaction
|
|
84
|
+
* yourself or structure `fn` so a second execution is a no-op.
|
|
85
|
+
*/
|
|
86
|
+
async runIfPending(name, fn, options = {}) {
|
|
87
|
+
if (await this.isApplied(name)) return { ran: false, result: null };
|
|
88
|
+
const result = await fn();
|
|
89
|
+
await this.recordApplied(name, options);
|
|
90
|
+
return { ran: true, result };
|
|
91
|
+
}
|
|
92
|
+
/** List every recorded backfill, oldest first. */
|
|
93
|
+
async listApplied() {
|
|
94
|
+
await this.initialize();
|
|
95
|
+
const result = await this.db.query(
|
|
96
|
+
"SELECT name, applied_at, description, package_name FROM _smrt_backfills ORDER BY applied_at ASC, name ASC"
|
|
97
|
+
);
|
|
98
|
+
return result.rows.map((row) => ({
|
|
99
|
+
name: String(row.name ?? ""),
|
|
100
|
+
appliedAt: normalizeAppliedAt(row.applied_at),
|
|
101
|
+
description: row.description == null ? null : String(row.description),
|
|
102
|
+
packageName: row.package_name == null ? null : String(row.package_name)
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function normalizeAppliedAt(value) {
|
|
107
|
+
if (value == null || value === "") return "";
|
|
108
|
+
const raw = String(value);
|
|
109
|
+
const parsed = new Date(raw);
|
|
110
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
111
|
+
return raw;
|
|
112
|
+
}
|
|
113
|
+
return parsed.toISOString();
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
BackfillTracker
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=backfill-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-tracker.js","sources":["../../src/migrations/backfill-tracker.ts"],"sourcesContent":["/**\n * Tracks application-specific data backfills (not schema migrations).\n *\n * Sits next to `MigrationTracker` but is intentionally minimal — backfills\n * have no checksum, no rollback semantics, no DDL. They're \"this data\n * correction has run, don't run it again\" markers, keyed by a stable\n * backfill name the app chooses.\n *\n * Backed by the `_smrt_backfills` system table (see\n * `../system/schema.ts`). The table is created lazily on first use —\n * every public method (`isApplied`, `recordApplied`, `runIfPending`,\n * `listApplied`) awaits `initialize()` itself, so consumers never need\n * to call `initialize()` explicitly.\n */\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { CREATE_SMRT_BACKFILLS_TABLE } from '../system/schema.js';\n\nexport interface BackfillTrackerOptions {\n db: DatabaseInterface;\n}\n\nexport interface BackfillRecord {\n name: string;\n appliedAt: string;\n description: string | null;\n packageName: string | null;\n}\n\nexport class BackfillTracker {\n private readonly db: DatabaseInterface;\n /**\n * Memoized initialization promise. Storing the promise (rather than a\n * `boolean` flag set after the DDL completes) makes `initialize()` safe\n * under concurrency: multiple parallel callers all `await` the same\n * in-flight promise instead of independently re-running the DDL. On\n * error the slot is cleared so the next caller retries — a transient\n * failure doesn't permanently poison the instance.\n */\n private initializePromise: Promise<void> | null = null;\n\n constructor(options: BackfillTrackerOptions) {\n this.db = options.db;\n }\n\n /**\n * Create the `_smrt_backfills` table if it doesn't already exist.\n * Safe to call repeatedly and concurrently.\n */\n async initialize(): Promise<void> {\n if (!this.initializePromise) {\n this.initializePromise = this.db\n .query(CREATE_SMRT_BACKFILLS_TABLE)\n .then(() => undefined)\n .catch((error) => {\n this.initializePromise = null;\n throw error;\n });\n }\n return this.initializePromise;\n }\n\n /** Has the backfill named `name` already run? */\n async isApplied(name: string): Promise<boolean> {\n await this.initialize();\n const result = await this.db.query(\n 'SELECT 1 FROM _smrt_backfills WHERE name = ? LIMIT 1',\n name,\n );\n return result.rows.length > 0;\n }\n\n /**\n * Record that the backfill named `name` ran. Uses INSERT ... ON CONFLICT\n * so callers don't need to check `isApplied` first if they don't care\n * about distinguishing \"already applied\" from \"just applied\".\n */\n async recordApplied(\n name: string,\n options: { description?: string; packageName?: string } = {},\n ): Promise<void> {\n await this.initialize();\n await this.db.query(\n `INSERT INTO _smrt_backfills (name, description, package_name)\n VALUES (?, ?, ?)\n ON CONFLICT (name) DO NOTHING`,\n name,\n options.description ?? null,\n options.packageName ?? null,\n );\n }\n\n /**\n * Convenience wrapper: if `name` hasn't been applied, run `fn` and\n * record the result. Returns `{ ran, result }`:\n * - `{ ran: true, result: T }` — backfill was pending and `fn` ran\n * - `{ ran: false, result: null }` — backfill was already applied\n *\n * The discriminator avoids the `T | null` ambiguity an earlier shape had\n * (a backfill that legitimately returns `null` was indistinguishable\n * from \"already applied\"). Callers check `ran` to decide whether `fn`\n * executed; `result` carries whatever `fn` returned.\n *\n * This is the common pattern an app's migrate orchestration follows:\n * a list of `(name, runner)` pairs, each guarded by isApplied/run/record.\n *\n * **Single-runner only.** This is a check-then-act pattern with no\n * locking: two processes that call `runIfPending` for the same `name`\n * concurrently can both observe `isApplied === false`, both execute\n * `fn`, and only then race to `recordApplied`. The `ON CONFLICT DO\n * NOTHING` in `recordApplied` keeps the table clean but does NOT prevent\n * `fn` from running twice. Acceptable when backfills are run from a\n * single deploy-time migration step (the common case); if you need to\n * fan out backfills across multiple workers, wrap the call in your own\n * mutex (e.g. a Postgres advisory lock keyed by backfill name).\n *\n * **`fn` MUST be idempotent.** The order is `fn` → `recordApplied`, with\n * no surrounding transaction. If `fn` succeeds but `recordApplied`\n * throws (DB connection drops, transient error), the work has happened\n * but is not recorded — the next call sees `isApplied === false` and\n * re-runs `fn`. For non-idempotent work (slug rewrites that consume\n * source rows, one-shot lookups), wrap the entire call in a transaction\n * yourself or structure `fn` so a second execution is a no-op.\n */\n async runIfPending<T>(\n name: string,\n fn: () => Promise<T>,\n options: { description?: string; packageName?: string } = {},\n ): Promise<{ ran: false; result: null } | { ran: true; result: T }> {\n if (await this.isApplied(name)) return { ran: false, result: null };\n const result = await fn();\n await this.recordApplied(name, options);\n return { ran: true, result };\n }\n\n /** List every recorded backfill, oldest first. */\n async listApplied(): Promise<BackfillRecord[]> {\n await this.initialize();\n const result = await this.db.query(\n 'SELECT name, applied_at, description, package_name FROM _smrt_backfills ORDER BY applied_at ASC, name ASC',\n );\n return result.rows.map((row) => ({\n name: String(row.name ?? ''),\n appliedAt: normalizeAppliedAt(row.applied_at),\n description: row.description == null ? null : String(row.description),\n packageName: row.package_name == null ? null : String(row.package_name),\n }));\n }\n}\n\n/**\n * Convert a raw `applied_at` cell into an ISO 8601 string.\n *\n * Different DB drivers return this column in different shapes:\n * - Postgres `node-pg` returns a JS `Date` directly.\n * - SQLite drivers typically return the `CURRENT_TIMESTAMP` literal\n * `'YYYY-MM-DD HH:MM:SS'` (no `T`, no timezone). V8's `Date`\n * constructor parses this as local time, but that's\n * implementation-defined and other runtimes may return Invalid Date.\n * - A corrupted row could return any string.\n *\n * If the value parses to a valid Date we return `toISOString()`. If it\n * doesn't (or the column is null/empty), we fall back to the raw string —\n * better to surface a non-ISO timestamp than crash `listApplied()` with a\n * `RangeError` and take down the caller.\n */\nfunction normalizeAppliedAt(value: unknown): string {\n if (value == null || value === '') return '';\n const raw = String(value);\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) {\n return raw;\n }\n return parsed.toISOString();\n}\n"],"names":[],"mappings":";AA4BO,MAAM,gBAAgB;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,oBAA0C;AAAA,EAElD,YAAY,SAAiC;AAC3C,SAAK,KAAK,QAAQ;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,mBAAmB;AAC3B,WAAK,oBAAoB,KAAK,GAC3B,MAAM,2BAA2B,EACjC,KAAK,MAAM,MAAS,EACpB,MAAM,CAAC,UAAU;AAChB,aAAK,oBAAoB;AACzB,cAAM;AAAA,MACR,CAAC;AAAA,IACL;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,UAAU,MAAgC;AAC9C,UAAM,KAAK,WAAA;AACX,UAAM,SAAS,MAAM,KAAK,GAAG;AAAA,MAC3B;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,OAAO,KAAK,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cACJ,MACA,UAA0D,IAC3C;AACf,UAAM,KAAK,WAAA;AACX,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA;AAAA,MAGA;AAAA,MACA,QAAQ,eAAe;AAAA,MACvB,QAAQ,eAAe;AAAA,IAAA;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,MAAM,aACJ,MACA,IACA,UAA0D,CAAA,GACQ;AAClE,QAAI,MAAM,KAAK,UAAU,IAAI,UAAU,EAAE,KAAK,OAAO,QAAQ,KAAA;AAC7D,UAAM,SAAS,MAAM,GAAA;AACrB,UAAM,KAAK,cAAc,MAAM,OAAO;AACtC,WAAO,EAAE,KAAK,MAAM,OAAA;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,cAAyC;AAC7C,UAAM,KAAK,WAAA;AACX,UAAM,SAAS,MAAM,KAAK,GAAG;AAAA,MAC3B;AAAA,IAAA;AAEF,WAAO,OAAO,KAAK,IAAI,CAAC,SAAS;AAAA,MAC/B,MAAM,OAAO,IAAI,QAAQ,EAAE;AAAA,MAC3B,WAAW,mBAAmB,IAAI,UAAU;AAAA,MAC5C,aAAa,IAAI,eAAe,OAAO,OAAO,OAAO,IAAI,WAAW;AAAA,MACpE,aAAa,IAAI,gBAAgB,OAAO,OAAO,OAAO,IAAI,YAAY;AAAA,IAAA,EACtE;AAAA,EACJ;AACF;AAkBA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,KAAK;AACxB,QAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,MAAI,OAAO,MAAM,OAAO,QAAA,CAAS,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO,OAAO,YAAA;AAChB;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Checksum Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides SHA-256 checksum computation for migration idempotency
|
|
5
|
+
* and drift detection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Compute SHA-256 checksum of migration SQL statements
|
|
9
|
+
*
|
|
10
|
+
* Normalizes SQL before hashing to ensure consistent checksums:
|
|
11
|
+
* - Removes single-line and multi-line comments
|
|
12
|
+
* - Collapses whitespace
|
|
13
|
+
* - Trims each statement
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeChecksum(statements: string[]): string;
|
|
16
|
+
/**
|
|
17
|
+
* Normalize SQL statements for consistent checksums
|
|
18
|
+
*
|
|
19
|
+
* Steps:
|
|
20
|
+
* 1. Remove single-line comments (-- ...)
|
|
21
|
+
* 2. Remove multi-line comments (/* ... *\/)
|
|
22
|
+
* 3. Collapse multiple whitespace to single space
|
|
23
|
+
* 4. Trim each statement
|
|
24
|
+
* 5. Filter empty statements
|
|
25
|
+
* 6. Join with semicolons
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeSQL(statements: string[]): string;
|
|
28
|
+
/**
|
|
29
|
+
* Verify that a migration file hasn't been modified since application
|
|
30
|
+
*
|
|
31
|
+
* @param definitionChecksum - Checksum from current migration definition
|
|
32
|
+
* @param recordChecksum - Checksum stored when migration was applied
|
|
33
|
+
* @param appliedChecksum - Checksum of what was actually applied (for drift)
|
|
34
|
+
*/
|
|
35
|
+
export declare function verifyChecksum(definitionChecksum: string, recordChecksum: string, appliedChecksum?: string | null): {
|
|
36
|
+
valid: boolean;
|
|
37
|
+
drift?: 'file_modified' | 'db_modified';
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Generate a short checksum for display (first 8 characters)
|
|
41
|
+
*/
|
|
42
|
+
export declare function shortChecksum(checksum: string): string;
|
|
43
|
+
//# sourceMappingURL=checksum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/migrations/checksum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAG5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAazD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,EACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,GAAG,aAAa,CAAA;CAAE,CAY7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function computeChecksum(statements) {
|
|
3
|
+
const normalized = normalizeSQL(statements);
|
|
4
|
+
return createHash("sha256").update(normalized).digest("hex");
|
|
5
|
+
}
|
|
6
|
+
function normalizeSQL(statements) {
|
|
7
|
+
return statements.map((sql) => {
|
|
8
|
+
let normalized = sql.replace(/--.*$/gm, "");
|
|
9
|
+
normalized = normalized.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
10
|
+
normalized = normalized.replace(/\s+/g, " ").trim();
|
|
11
|
+
return normalized;
|
|
12
|
+
}).filter((sql) => sql.length > 0).join(";");
|
|
13
|
+
}
|
|
14
|
+
function verifyChecksum(definitionChecksum, recordChecksum, appliedChecksum) {
|
|
15
|
+
if (definitionChecksum !== recordChecksum) {
|
|
16
|
+
return { valid: false, drift: "file_modified" };
|
|
17
|
+
}
|
|
18
|
+
if (appliedChecksum && appliedChecksum !== recordChecksum) {
|
|
19
|
+
return { valid: false, drift: "db_modified" };
|
|
20
|
+
}
|
|
21
|
+
return { valid: true };
|
|
22
|
+
}
|
|
23
|
+
function shortChecksum(checksum) {
|
|
24
|
+
return checksum.substring(0, 8);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
computeChecksum,
|
|
28
|
+
normalizeSQL,
|
|
29
|
+
shortChecksum,
|
|
30
|
+
verifyChecksum
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=checksum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum.js","sources":["../../src/migrations/checksum.ts"],"sourcesContent":["/**\n * Migration Checksum Utilities\n *\n * Provides SHA-256 checksum computation for migration idempotency\n * and drift detection.\n */\n\nimport { createHash } from 'node:crypto';\n\n/**\n * Compute SHA-256 checksum of migration SQL statements\n *\n * Normalizes SQL before hashing to ensure consistent checksums:\n * - Removes single-line and multi-line comments\n * - Collapses whitespace\n * - Trims each statement\n */\nexport function computeChecksum(statements: string[]): string {\n const normalized = normalizeSQL(statements);\n return createHash('sha256').update(normalized).digest('hex');\n}\n\n/**\n * Normalize SQL statements for consistent checksums\n *\n * Steps:\n * 1. Remove single-line comments (-- ...)\n * 2. Remove multi-line comments (/* ... *\\/)\n * 3. Collapse multiple whitespace to single space\n * 4. Trim each statement\n * 5. Filter empty statements\n * 6. Join with semicolons\n */\nexport function normalizeSQL(statements: string[]): string {\n return statements\n .map((sql) => {\n // Remove single-line comments\n let normalized = sql.replace(/--.*$/gm, '');\n // Remove multi-line comments\n normalized = normalized.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n // Collapse whitespace\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n return normalized;\n })\n .filter((sql) => sql.length > 0)\n .join(';');\n}\n\n/**\n * Verify that a migration file hasn't been modified since application\n *\n * @param definitionChecksum - Checksum from current migration definition\n * @param recordChecksum - Checksum stored when migration was applied\n * @param appliedChecksum - Checksum of what was actually applied (for drift)\n */\nexport function verifyChecksum(\n definitionChecksum: string,\n recordChecksum: string,\n appliedChecksum?: string | null,\n): { valid: boolean; drift?: 'file_modified' | 'db_modified' } {\n // Check if definition file was modified after application\n if (definitionChecksum !== recordChecksum) {\n return { valid: false, drift: 'file_modified' };\n }\n\n // Check if what was applied differs from what we expected\n if (appliedChecksum && appliedChecksum !== recordChecksum) {\n return { valid: false, drift: 'db_modified' };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a short checksum for display (first 8 characters)\n */\nexport function shortChecksum(checksum: string): string {\n return checksum.substring(0, 8);\n}\n"],"names":[],"mappings":";AAiBO,SAAS,gBAAgB,YAA8B;AAC5D,QAAM,aAAa,aAAa,UAAU;AAC1C,SAAO,WAAW,QAAQ,EAAE,OAAO,UAAU,EAAE,OAAO,KAAK;AAC7D;AAaO,SAAS,aAAa,YAA8B;AACzD,SAAO,WACJ,IAAI,CAAC,QAAQ;AAEZ,QAAI,aAAa,IAAI,QAAQ,WAAW,EAAE;AAE1C,iBAAa,WAAW,QAAQ,qBAAqB,EAAE;AAEvD,iBAAa,WAAW,QAAQ,QAAQ,GAAG,EAAE,KAAA;AAC7C,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,EAC9B,KAAK,GAAG;AACb;AASO,SAAS,eACd,oBACA,gBACA,iBAC6D;AAE7D,MAAI,uBAAuB,gBAAgB;AACzC,WAAO,EAAE,OAAO,OAAO,OAAO,gBAAA;AAAA,EAChC;AAGA,MAAI,mBAAmB,oBAAoB,gBAAgB;AACzD,WAAO,EAAE,OAAO,OAAO,OAAO,cAAA;AAAA,EAChC;AAEA,SAAO,EAAE,OAAO,KAAA;AAClB;AAKO,SAAS,cAAc,UAA0B;AACtD,SAAO,SAAS,UAAU,GAAG,CAAC;AAChC;"}
|