@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,474 @@
|
|
|
1
|
+
import { ObjectRegistry } from "../registry.js";
|
|
2
|
+
import { quoteIdentifier, formatDefaultValue as formatDefaultValue$1 } from "../schema/sql-identifiers.js";
|
|
3
|
+
import "../utils.js";
|
|
4
|
+
import { isCollectionRegistration } from "./collection-resolution.js";
|
|
5
|
+
import { findClass } from "./name-resolver.js";
|
|
6
|
+
import { getCollectionTableNames, getClasses } from "./shared-state.js";
|
|
7
|
+
import { toSnakeCase, classnameToTablename } from "../utils/naming.js";
|
|
8
|
+
const collectionRegistrationLookup = {
|
|
9
|
+
findClass,
|
|
10
|
+
findClassInPackage: (packageName, className) => ObjectRegistry.getClassInPackage(packageName, className),
|
|
11
|
+
getInheritanceChain: (className) => ObjectRegistry.getInheritanceChain(className)
|
|
12
|
+
};
|
|
13
|
+
function applyDecoratorSqlTypeOverrides(className, columns) {
|
|
14
|
+
const decorators = ObjectRegistry.getFieldDecorators(className);
|
|
15
|
+
if (!decorators.size) {
|
|
16
|
+
return columns;
|
|
17
|
+
}
|
|
18
|
+
for (const [fieldName, options] of decorators) {
|
|
19
|
+
if (!options?.sqlType) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const columnName = toSnakeCase(fieldName);
|
|
23
|
+
const existing = columns[columnName];
|
|
24
|
+
if (!existing) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const referenceKind = getReferenceKind(options);
|
|
28
|
+
columns[columnName] = {
|
|
29
|
+
...existing,
|
|
30
|
+
type: String(options.sqlType).toUpperCase(),
|
|
31
|
+
...referenceKind ? { referenceKind } : {}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return columns;
|
|
35
|
+
}
|
|
36
|
+
function mergeRuntimeFieldColumns(className, schemaColumns, fields) {
|
|
37
|
+
const columnsToUse = { ...schemaColumns || {} };
|
|
38
|
+
if (fields.size > 0) {
|
|
39
|
+
const fieldColumns = fieldsToColumns(fields);
|
|
40
|
+
for (const [columnName, columnDef] of Object.entries(fieldColumns)) {
|
|
41
|
+
if (!columnsToUse[columnName]) {
|
|
42
|
+
columnsToUse[columnName] = columnDef;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const [fieldName, fieldDef] of fields) {
|
|
46
|
+
const columnName = toSnakeCase(fieldName);
|
|
47
|
+
const existing = columnsToUse[columnName];
|
|
48
|
+
if (!existing) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const sqlType = fieldDef._meta?.sqlType || fieldDef.sqlType;
|
|
52
|
+
const referenceKind = getReferenceKind(fieldDef);
|
|
53
|
+
columnsToUse[columnName] = {
|
|
54
|
+
...existing,
|
|
55
|
+
...sqlType ? { type: String(sqlType).toUpperCase() } : {},
|
|
56
|
+
...referenceKind ? { referenceKind } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
applyDecoratorSqlTypeOverrides(className, columnsToUse);
|
|
61
|
+
return columnsToUse;
|
|
62
|
+
}
|
|
63
|
+
function getReferenceKind(fieldDef) {
|
|
64
|
+
if (fieldDef.__tenancy?.isTenantIdField || fieldDef._meta?.__tenancy?.isTenantIdField) {
|
|
65
|
+
return "tenantId";
|
|
66
|
+
}
|
|
67
|
+
if (fieldDef.type === "foreignKey") {
|
|
68
|
+
return "foreignKey";
|
|
69
|
+
}
|
|
70
|
+
if (fieldDef.type === "crossPackageRef") {
|
|
71
|
+
return "crossPackageRef";
|
|
72
|
+
}
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
function shouldEmitDefault(fieldDef, sqlType) {
|
|
76
|
+
return !(getReferenceKind(fieldDef) === "tenantId" && sqlType === "UUID" && fieldDef.default === "");
|
|
77
|
+
}
|
|
78
|
+
function createBaseColumns(registered) {
|
|
79
|
+
return {
|
|
80
|
+
id: {
|
|
81
|
+
type: registered.config?.idType === "text" ? "TEXT" : "UUID",
|
|
82
|
+
primaryKey: true,
|
|
83
|
+
referenceKind: "id"
|
|
84
|
+
},
|
|
85
|
+
slug: { type: "TEXT", notNull: true },
|
|
86
|
+
context: { type: "TEXT" },
|
|
87
|
+
created_at: { type: "TIMESTAMP" },
|
|
88
|
+
updated_at: { type: "TIMESTAMP" }
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function getSchema(name) {
|
|
92
|
+
const registered = findClass(name);
|
|
93
|
+
return registered?.schema;
|
|
94
|
+
}
|
|
95
|
+
function getSchemaDDL(name) {
|
|
96
|
+
return getSchema(name)?.ddl;
|
|
97
|
+
}
|
|
98
|
+
function getTableName(name) {
|
|
99
|
+
const collectionTableName = getCollectionTableNames().get(name);
|
|
100
|
+
if (collectionTableName) {
|
|
101
|
+
return collectionTableName;
|
|
102
|
+
}
|
|
103
|
+
const stiBase = ObjectRegistry.getSTIBase(name);
|
|
104
|
+
const registered = ObjectRegistry.getClass(name);
|
|
105
|
+
const qualifiedName = registered?.qualifiedName ?? registered?.name ?? name;
|
|
106
|
+
if (stiBase && stiBase !== qualifiedName) {
|
|
107
|
+
return getSchema(stiBase)?.tableName;
|
|
108
|
+
}
|
|
109
|
+
return getSchema(name)?.tableName;
|
|
110
|
+
}
|
|
111
|
+
function getAllSchemas() {
|
|
112
|
+
const tableSchemas = {};
|
|
113
|
+
for (const [_className, registered] of getClasses()) {
|
|
114
|
+
if (isCollectionRegistration(
|
|
115
|
+
_className,
|
|
116
|
+
registered,
|
|
117
|
+
collectionRegistrationLookup
|
|
118
|
+
)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const simpleName = registered.name || _className;
|
|
122
|
+
if (!registered.schema?.tableName && registered.extends) {
|
|
123
|
+
const qualifiedName = registered.qualifiedName ?? simpleName;
|
|
124
|
+
const lookupKey = qualifiedName;
|
|
125
|
+
const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);
|
|
126
|
+
if (tableStrategy === "sti") {
|
|
127
|
+
const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);
|
|
128
|
+
if (stiBaseName && stiBaseName !== qualifiedName) {
|
|
129
|
+
const stiBaseClass = findClass(stiBaseName);
|
|
130
|
+
if (stiBaseClass?.schema?.tableName) {
|
|
131
|
+
if (!registered.schema) {
|
|
132
|
+
registered.schema = {
|
|
133
|
+
tableName: "",
|
|
134
|
+
ddl: "",
|
|
135
|
+
columns: {},
|
|
136
|
+
indexes: [],
|
|
137
|
+
triggers: [],
|
|
138
|
+
foreignKeys: [],
|
|
139
|
+
dependencies: [],
|
|
140
|
+
version: ""
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
registered.schema.tableName = stiBaseClass.schema.tableName;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (registered.schema?.tableName) {
|
|
149
|
+
let tableName = registered.schema.tableName;
|
|
150
|
+
const qualifiedName = registered.qualifiedName ?? simpleName;
|
|
151
|
+
const lookupKey = qualifiedName;
|
|
152
|
+
const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);
|
|
153
|
+
if (tableStrategy === "sti") {
|
|
154
|
+
const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);
|
|
155
|
+
if (stiBaseName && stiBaseName !== qualifiedName) {
|
|
156
|
+
const stiBaseClass = findClass(stiBaseName);
|
|
157
|
+
if (stiBaseClass?.schema?.tableName) {
|
|
158
|
+
tableName = stiBaseClass.schema.tableName;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const columnsToUse = mergeRuntimeFieldColumns(
|
|
163
|
+
simpleName,
|
|
164
|
+
registered.schema.columns,
|
|
165
|
+
registered.fields
|
|
166
|
+
);
|
|
167
|
+
if (!tableSchemas[tableName]) {
|
|
168
|
+
const baseColumns = createBaseColumns(registered);
|
|
169
|
+
const isSTI = tableStrategy === "sti";
|
|
170
|
+
if (isSTI) {
|
|
171
|
+
baseColumns._meta_type = {
|
|
172
|
+
type: "TEXT",
|
|
173
|
+
notNull: true,
|
|
174
|
+
defaultValue: ""
|
|
175
|
+
};
|
|
176
|
+
baseColumns._meta_data = { type: "JSON" };
|
|
177
|
+
}
|
|
178
|
+
tableSchemas[tableName] = {
|
|
179
|
+
tableName,
|
|
180
|
+
columns: { ...baseColumns, ...columnsToUse },
|
|
181
|
+
indexes: [],
|
|
182
|
+
ddl: registered.schema.ddl || "",
|
|
183
|
+
isSTI
|
|
184
|
+
};
|
|
185
|
+
} else {
|
|
186
|
+
for (const [colName, colDef] of Object.entries(columnsToUse)) {
|
|
187
|
+
if (!tableSchemas[tableName].columns[colName]) {
|
|
188
|
+
tableSchemas[tableName].columns[colName] = colDef;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (registered.schema.indexes && registered.schema.indexes.length > 0) {
|
|
193
|
+
const existingNames = new Set(
|
|
194
|
+
tableSchemas[tableName].indexes.map(
|
|
195
|
+
(idx) => typeof idx === "string" ? idx : idx.name
|
|
196
|
+
)
|
|
197
|
+
);
|
|
198
|
+
for (const idx of registered.schema.indexes) {
|
|
199
|
+
const indexName = typeof idx === "string" ? idx : idx.name;
|
|
200
|
+
if (!existingNames.has(indexName)) {
|
|
201
|
+
if (typeof idx === "string") ;
|
|
202
|
+
else {
|
|
203
|
+
tableSchemas[tableName].indexes.push(idx);
|
|
204
|
+
existingNames.add(idx.name);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const schemas = {};
|
|
212
|
+
for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {
|
|
213
|
+
let ddl;
|
|
214
|
+
if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl) {
|
|
215
|
+
ddl = tableSchema.ddl;
|
|
216
|
+
} else if (Object.keys(tableSchema.columns).length === 0) {
|
|
217
|
+
continue;
|
|
218
|
+
} else {
|
|
219
|
+
ddl = generateDDLFromColumns(
|
|
220
|
+
tableName,
|
|
221
|
+
tableSchema.columns,
|
|
222
|
+
tableSchema.isSTI
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
let indexSQL;
|
|
226
|
+
if (tableSchema.indexes.length > 0) {
|
|
227
|
+
indexSQL = tableSchema.indexes.map((idx) => {
|
|
228
|
+
const indexType = idx.unique ? "UNIQUE INDEX" : "INDEX";
|
|
229
|
+
const columnList = idx.columns.map((col) => quoteIdentifier(col)).join(", ");
|
|
230
|
+
return `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(
|
|
231
|
+
idx.name
|
|
232
|
+
)} ON ${quoteIdentifier(tableName)} (${columnList});`;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
schemas[tableName] = {
|
|
236
|
+
tableName,
|
|
237
|
+
ddl,
|
|
238
|
+
indexes: indexSQL
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return schemas;
|
|
242
|
+
}
|
|
243
|
+
function getAllSchemasAsDefinitions() {
|
|
244
|
+
const tableSchemas = {};
|
|
245
|
+
for (const [_className, registered] of getClasses()) {
|
|
246
|
+
if (isCollectionRegistration(
|
|
247
|
+
_className,
|
|
248
|
+
registered,
|
|
249
|
+
collectionRegistrationLookup
|
|
250
|
+
)) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const simpleName = registered.name || _className;
|
|
254
|
+
if (!registered.schema?.tableName && registered.extends) {
|
|
255
|
+
const qualifiedName = registered.qualifiedName ?? simpleName;
|
|
256
|
+
const lookupKey = qualifiedName;
|
|
257
|
+
const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);
|
|
258
|
+
if (tableStrategy === "sti") {
|
|
259
|
+
const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);
|
|
260
|
+
if (stiBaseName && stiBaseName !== qualifiedName) {
|
|
261
|
+
const stiBaseClass = findClass(stiBaseName);
|
|
262
|
+
if (stiBaseClass?.schema?.tableName) {
|
|
263
|
+
if (!registered.schema) {
|
|
264
|
+
registered.schema = {
|
|
265
|
+
tableName: "",
|
|
266
|
+
ddl: "",
|
|
267
|
+
columns: {},
|
|
268
|
+
indexes: [],
|
|
269
|
+
triggers: [],
|
|
270
|
+
foreignKeys: [],
|
|
271
|
+
dependencies: [],
|
|
272
|
+
version: ""
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
registered.schema.tableName = stiBaseClass.schema.tableName;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (registered.schema?.tableName) {
|
|
281
|
+
let tableName = registered.schema.tableName;
|
|
282
|
+
const qualifiedName = registered.qualifiedName ?? simpleName;
|
|
283
|
+
const lookupKey = qualifiedName;
|
|
284
|
+
const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);
|
|
285
|
+
if (tableStrategy === "sti") {
|
|
286
|
+
const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);
|
|
287
|
+
if (stiBaseName && stiBaseName !== qualifiedName) {
|
|
288
|
+
const stiBaseClass = findClass(stiBaseName);
|
|
289
|
+
if (stiBaseClass?.schema?.tableName) {
|
|
290
|
+
tableName = stiBaseClass.schema.tableName;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const columnsToUse = mergeRuntimeFieldColumns(
|
|
295
|
+
simpleName,
|
|
296
|
+
registered.schema.columns,
|
|
297
|
+
registered.fields
|
|
298
|
+
);
|
|
299
|
+
if (!tableSchemas[tableName]) {
|
|
300
|
+
const baseColumns = createBaseColumns(registered);
|
|
301
|
+
const isSTI = tableStrategy === "sti";
|
|
302
|
+
if (isSTI) {
|
|
303
|
+
baseColumns._meta_type = {
|
|
304
|
+
type: "TEXT",
|
|
305
|
+
notNull: true,
|
|
306
|
+
defaultValue: ""
|
|
307
|
+
};
|
|
308
|
+
baseColumns._meta_data = { type: "JSON" };
|
|
309
|
+
}
|
|
310
|
+
tableSchemas[tableName] = {
|
|
311
|
+
tableName,
|
|
312
|
+
columns: { ...baseColumns, ...columnsToUse },
|
|
313
|
+
indexes: [],
|
|
314
|
+
isSTI
|
|
315
|
+
};
|
|
316
|
+
} else {
|
|
317
|
+
for (const [colName, colDef] of Object.entries(columnsToUse)) {
|
|
318
|
+
if (!tableSchemas[tableName].columns[colName]) {
|
|
319
|
+
tableSchemas[tableName].columns[colName] = colDef;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (registered.schema.indexes && registered.schema.indexes.length > 0) {
|
|
324
|
+
const existingNames = new Set(
|
|
325
|
+
tableSchemas[tableName].indexes.map((idx) => idx.name)
|
|
326
|
+
);
|
|
327
|
+
for (const idx of registered.schema.indexes) {
|
|
328
|
+
if (!existingNames.has(idx.name)) {
|
|
329
|
+
tableSchemas[tableName].indexes.push(idx);
|
|
330
|
+
existingNames.add(idx.name);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const schemas = {};
|
|
337
|
+
for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {
|
|
338
|
+
if (Object.keys(tableSchema.columns).length === 0) {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const ddl = generateDDLFromColumns(
|
|
342
|
+
tableName,
|
|
343
|
+
tableSchema.columns,
|
|
344
|
+
tableSchema.isSTI
|
|
345
|
+
);
|
|
346
|
+
schemas[tableName] = {
|
|
347
|
+
tableName,
|
|
348
|
+
ddl,
|
|
349
|
+
columns: tableSchema.columns,
|
|
350
|
+
indexes: tableSchema.indexes,
|
|
351
|
+
// Keep as IndexDefinition[]
|
|
352
|
+
triggers: [],
|
|
353
|
+
foreignKeys: [],
|
|
354
|
+
version: "",
|
|
355
|
+
dependencies: []
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
return schemas;
|
|
359
|
+
}
|
|
360
|
+
function generateDDLFromColumns(tableName, columns, isSTI = false) {
|
|
361
|
+
let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (
|
|
362
|
+
`;
|
|
363
|
+
const columnLines = [];
|
|
364
|
+
for (const [columnName, columnDef] of Object.entries(columns)) {
|
|
365
|
+
const parts = [];
|
|
366
|
+
parts.push(` ${quoteIdentifier(columnName)} ${columnDef.type}`);
|
|
367
|
+
if (columnDef.primaryKey) {
|
|
368
|
+
parts.push("PRIMARY KEY");
|
|
369
|
+
}
|
|
370
|
+
if (columnDef.notNull) {
|
|
371
|
+
parts.push("NOT NULL");
|
|
372
|
+
}
|
|
373
|
+
if (columnDef.unique && !columnDef.primaryKey) {
|
|
374
|
+
parts.push("UNIQUE");
|
|
375
|
+
}
|
|
376
|
+
if (columnDef.defaultValue !== void 0) {
|
|
377
|
+
const defaultSQL = formatDefaultValue(
|
|
378
|
+
columnDef.defaultValue,
|
|
379
|
+
columnDef.type
|
|
380
|
+
);
|
|
381
|
+
parts.push(`DEFAULT ${defaultSQL}`);
|
|
382
|
+
}
|
|
383
|
+
columnLines.push(parts.join(" "));
|
|
384
|
+
}
|
|
385
|
+
sql += columnLines.join(",\n");
|
|
386
|
+
if (columns.slug && columns.context) {
|
|
387
|
+
if (isSTI && columns._meta_type) {
|
|
388
|
+
sql += ",\n UNIQUE(slug, context, _meta_type)";
|
|
389
|
+
} else {
|
|
390
|
+
sql += ",\n UNIQUE(slug, context)";
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
sql += "\n);";
|
|
394
|
+
return sql;
|
|
395
|
+
}
|
|
396
|
+
function formatDefaultValue(value, type) {
|
|
397
|
+
return formatDefaultValue$1(value, type);
|
|
398
|
+
}
|
|
399
|
+
function fieldsToColumns(fields) {
|
|
400
|
+
const columns = {};
|
|
401
|
+
for (const [fieldName, fieldDef] of fields) {
|
|
402
|
+
if (fieldName === "id" || fieldName === "created_at" || fieldName === "updated_at" || fieldName === "slug" || fieldName === "context") {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (fieldDef.transient || fieldDef._meta?.transient) {
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
if (fieldDef.type === "oneToMany" || fieldDef.type === "manyToMany") {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
if (fieldDef.type === "meta") {
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
const sqlType = fieldDef._meta?.sqlType || (fieldDef.type === "crossPackageRef" && (fieldDef._meta?.idType === "text" || fieldDef.idType === "text") ? "TEXT" : mapFieldTypeToSQL(fieldDef.type));
|
|
415
|
+
const normalizedSqlType = String(sqlType).toUpperCase();
|
|
416
|
+
const referenceKind = getReferenceKind(fieldDef);
|
|
417
|
+
const column = {
|
|
418
|
+
type: normalizedSqlType,
|
|
419
|
+
referenceKind,
|
|
420
|
+
notNull: fieldDef._meta?.nullable ? false : fieldDef.required || false,
|
|
421
|
+
unique: fieldDef._meta?.unique || false,
|
|
422
|
+
description: fieldDef.description
|
|
423
|
+
};
|
|
424
|
+
if (fieldDef.default !== void 0 && shouldEmitDefault(fieldDef, normalizedSqlType)) {
|
|
425
|
+
column.defaultValue = fieldDef.default;
|
|
426
|
+
}
|
|
427
|
+
if (fieldDef.type === "foreignKey" && fieldDef.related) {
|
|
428
|
+
const [table, columnName = "id"] = fieldDef.related.split(".");
|
|
429
|
+
const fieldMeta = fieldDef._meta;
|
|
430
|
+
column.foreignKey = {
|
|
431
|
+
table: classnameToTablename(table),
|
|
432
|
+
column: columnName,
|
|
433
|
+
onDelete: fieldMeta?.onDelete ?? "CASCADE",
|
|
434
|
+
onUpdate: fieldMeta?.onUpdate ?? "CASCADE"
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
columns[toSnakeCase(fieldName)] = column;
|
|
438
|
+
}
|
|
439
|
+
return columns;
|
|
440
|
+
}
|
|
441
|
+
function mapFieldTypeToSQL(fieldType) {
|
|
442
|
+
switch (fieldType) {
|
|
443
|
+
case "text":
|
|
444
|
+
return "TEXT";
|
|
445
|
+
case "integer":
|
|
446
|
+
return "INTEGER";
|
|
447
|
+
case "decimal":
|
|
448
|
+
return "REAL";
|
|
449
|
+
case "boolean":
|
|
450
|
+
return "BOOLEAN";
|
|
451
|
+
case "datetime":
|
|
452
|
+
return "TIMESTAMP";
|
|
453
|
+
case "json":
|
|
454
|
+
return "JSON";
|
|
455
|
+
case "foreignKey":
|
|
456
|
+
return "UUID";
|
|
457
|
+
case "crossPackageRef":
|
|
458
|
+
return "UUID";
|
|
459
|
+
default:
|
|
460
|
+
return "TEXT";
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
export {
|
|
464
|
+
fieldsToColumns,
|
|
465
|
+
formatDefaultValue,
|
|
466
|
+
generateDDLFromColumns,
|
|
467
|
+
getAllSchemas,
|
|
468
|
+
getAllSchemasAsDefinitions,
|
|
469
|
+
getSchema,
|
|
470
|
+
getSchemaDDL,
|
|
471
|
+
getTableName,
|
|
472
|
+
mapFieldTypeToSQL
|
|
473
|
+
};
|
|
474
|
+
//# sourceMappingURL=schema-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-builder.js","sources":["../../src/registry/schema-builder.ts"],"sourcesContent":["/**\n * Schema building logic for the SMRT ObjectRegistry.\n *\n * Extracted from registry.ts as part of issue #1006.\n */\n\nimport { ObjectRegistry } from '../registry';\nimport type { FieldDefinition } from '../scanner/types.js';\nimport {\n formatDefaultValue as formatDefaultValueShared,\n quoteIdentifier,\n} from '../schema/sql-identifiers.js';\nimport type {\n ColumnDefinition,\n IndexDefinition,\n SchemaDefinition,\n SQLDataType,\n} from '../schema/types.js';\nimport { classnameToTablename, toSnakeCase } from '../utils';\nimport {\n type CollectionRegistrationLookup,\n isCollectionRegistration,\n} from './collection-resolution';\nimport { findClass } from './name-resolver';\nimport { getClasses, getCollectionTableNames } from './shared-state';\n\ntype ForeignKeyAction = NonNullable<\n NonNullable<ColumnDefinition['foreignKey']>['onDelete']\n>;\n\nconst collectionRegistrationLookup: CollectionRegistrationLookup = {\n findClass,\n findClassInPackage: (packageName, className) =>\n ObjectRegistry.getClassInPackage(packageName, className),\n getInheritanceChain: (className) =>\n ObjectRegistry.getInheritanceChain(className),\n};\n\nfunction applyDecoratorSqlTypeOverrides(\n className: string,\n columns: Record<string, ColumnDefinition>,\n): Record<string, ColumnDefinition> {\n const decorators = ObjectRegistry.getFieldDecorators(className);\n if (!decorators.size) {\n return columns;\n }\n\n for (const [fieldName, options] of decorators) {\n if (!options?.sqlType) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n const existing = columns[columnName];\n if (!existing) {\n continue;\n }\n\n const referenceKind = getReferenceKind(options as FieldDefinition);\n columns[columnName] = {\n ...existing,\n type: String(options.sqlType).toUpperCase() as SQLDataType,\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n\n return columns;\n}\n\nfunction mergeRuntimeFieldColumns(\n className: string,\n schemaColumns: Record<string, ColumnDefinition> | undefined,\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columnsToUse = { ...(schemaColumns || {}) };\n\n if (fields.size > 0) {\n const fieldColumns = fieldsToColumns(fields);\n for (const [columnName, columnDef] of Object.entries(fieldColumns)) {\n if (!columnsToUse[columnName]) {\n columnsToUse[columnName] = columnDef;\n }\n }\n\n for (const [fieldName, fieldDef] of fields) {\n const columnName = toSnakeCase(fieldName);\n const existing = columnsToUse[columnName];\n if (!existing) {\n continue;\n }\n\n const sqlType = fieldDef._meta?.sqlType || (fieldDef as any).sqlType;\n const referenceKind = getReferenceKind(fieldDef);\n columnsToUse[columnName] = {\n ...existing,\n ...(sqlType\n ? { type: String(sqlType).toUpperCase() as SQLDataType }\n : {}),\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n }\n\n applyDecoratorSqlTypeOverrides(className, columnsToUse);\n return columnsToUse;\n}\n\nfunction getReferenceKind(\n fieldDef: FieldDefinition,\n): ColumnDefinition['referenceKind'] | undefined {\n if (\n (fieldDef as any).__tenancy?.isTenantIdField ||\n fieldDef._meta?.__tenancy?.isTenantIdField\n ) {\n return 'tenantId';\n }\n\n if (fieldDef.type === 'foreignKey') {\n return 'foreignKey';\n }\n\n if (fieldDef.type === 'crossPackageRef') {\n return 'crossPackageRef';\n }\n\n return undefined;\n}\n\nfunction shouldEmitDefault(fieldDef: FieldDefinition, sqlType: SQLDataType) {\n return !(\n getReferenceKind(fieldDef) === 'tenantId' &&\n sqlType === 'UUID' &&\n fieldDef.default === ''\n );\n}\n\nfunction createBaseColumns(registered: {\n config?: { idType?: 'uuid' | 'text' };\n}): Record<string, ColumnDefinition> {\n return {\n id: {\n type: registered.config?.idType === 'text' ? 'TEXT' : 'UUID',\n primaryKey: true,\n referenceKind: 'id',\n },\n slug: { type: 'TEXT', notNull: true },\n context: { type: 'TEXT' },\n created_at: { type: 'TIMESTAMP' },\n updated_at: { type: 'TIMESTAMP' },\n };\n}\n\n/**\n * Get cached schema definition for a registered class\n *\n * @param name - Name of the registered class\n * @returns Schema definition or undefined if not found\n * @example\n * ```typescript\n * const schema = getSchema('Product');\n * console.log(schema.tableName); // 'products'\n * console.log(schema.ddl); // 'CREATE TABLE...'\n * ```\n */\nexport function getSchema(name: string): SchemaDefinition | undefined {\n // Issue #951: Use findClass for multi-strategy lookup\n const registered = findClass(name);\n return registered?.schema;\n}\n\n/**\n * Get SQL DDL statement for a registered class\n *\n * @param name - Name of the registered class\n * @returns SQL DDL statement or undefined if not found\n * @example\n * ```typescript\n * const ddl = ObjectRegistry.getSchemaDDL('Product');\n * await db.query(ddl);\n * ```\n */\nexport function getSchemaDDL(name: string): string | undefined {\n return getSchema(name)?.ddl;\n}\n\n/**\n * Get table name for a registered class\n *\n * @param name - Name of the registered class\n * @returns Table name or undefined if not found\n * @example\n * ```typescript\n * const tableName = getTableName('Product');\n * console.log(tableName); // 'products'\n * ```\n */\nexport function getTableName(name: string): string | undefined {\n // Check if this is a collection class - collections have their own tableName mapping\n const collectionTableName = getCollectionTableNames().get(name);\n if (collectionTableName) {\n return collectionTableName;\n }\n\n // For STI classes, return the STI base class's table name.\n // R5-canon: `getSTIBase` returns the qualified name; resolve `name`\n // (which may be simple) to its registration's qualified form for the\n // comparison.\n const stiBase = ObjectRegistry.getSTIBase(name);\n const registered = ObjectRegistry.getClass(name);\n const qualifiedName = registered?.qualifiedName ?? registered?.name ?? name;\n if (stiBase && stiBase !== qualifiedName) {\n return getSchema(stiBase)?.tableName;\n }\n return getSchema(name)?.tableName;\n}\n\n/**\n * Get all pre-generated schemas for explicit adapter bootstrap paths.\n *\n * Returns schemas in SDK SchemaProvider format for all registered classes.\n * Tooling and test helpers can pass these to `getDatabase()` when they want\n * to bootstrap schema before runtime. Core runtime no longer does this\n * implicitly.\n *\n * @returns Record of table names to schema definitions\n * @example\n * ```typescript\n * const schemas = ObjectRegistry.getAllSchemas();\n * const db = await getDatabase({ type: 'json', url: './data', schemas });\n * ```\n */\nexport function getAllSchemas(): Record<\n string,\n { tableName: string; ddl: string; indexes?: string[] }\n> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: Array<{ name: string; columns: string[]; unique?: boolean }>;\n ddl: string;\n isSTI: boolean;\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n // Their schemas incorrectly contain collection properties (loaded, options, etc.)\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Issue #703: Handle STI subclasses with null tableName from external manifests\n // When loaded from external manifests, tableName may be null, causing\n // registerFromManifest() to derive a tableName from class name.\n // For STI subclasses, we need to use the STI base's tableName instead.\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = (registered as any).qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n // Ensure we have a schema object to modify\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n // Set tableName from STI base so the following block processes this class\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName\n // This ensures all STI subclass columns are merged into the parent table\n // (Issue #693: STI subclasses with separate tableName still serialize to parent table)\n let tableName = registered.schema.tableName;\n // R5-canon: same qualified-key strategy as the block above.\n const qualifiedName = (registered as any).qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n // This is an STI subclass - use the base class's tableName\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Start with manifest columns, then backfill any columns that only exist\n // in runtime field metadata (for example tenantScoped injections). We do\n // not replace existing manifest column metadata here, because the manifest\n // is authoritative for foreign keys, defaults, and other schema details.\n // Explicit decorator sqlType overrides are patched onto the merged column.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n // These are required for all tables but are skipped by fieldsToColumns()\n const baseColumns = createBaseColumns(registered);\n\n // For STI tables, add discriminator and data columns\n // (Issue #690: db:diff needs these columns to detect schema changes)\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n ddl: registered.schema.ddl || '',\n isSTI,\n };\n } else {\n // Additional class sharing this table (STI scenario)\n // Merge columns from this class into the existing schema\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n // New column from this subtype - add it\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) =>\n typeof idx === 'string' ? idx : idx.name,\n ),\n );\n for (const idx of registered.schema.indexes) {\n const indexName = typeof idx === 'string' ? idx : idx.name;\n if (!existingNames.has(indexName)) {\n if (typeof idx === 'string') {\n // Legacy string format - skip, can't merge properly\n } else {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n }\n\n // Step 2: Convert to output format, regenerating DDL for merged schemas\n const schemas: Record<\n string,\n { tableName: string; ddl: string; indexes?: string[] }\n > = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n // Generate DDL from merged columns (or use original DDL if columns are empty)\n let ddl: string;\n if (Object.keys(tableSchema.columns).length === 0 && tableSchema.ddl) {\n // No columns merged - use original DDL to avoid generating invalid SQL\n ddl = tableSchema.ddl;\n } else if (Object.keys(tableSchema.columns).length === 0) {\n // Skip schemas with no columns and no original DDL\n continue;\n } else {\n ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n }\n\n // Convert index definitions to SQL strings for SDK compatibility\n let indexSQL: string[] | undefined;\n if (tableSchema.indexes.length > 0) {\n indexSQL = tableSchema.indexes.map((idx) => {\n const indexType = idx.unique ? 'UNIQUE INDEX' : 'INDEX';\n const columnList = idx.columns\n .map((col) => quoteIdentifier(col))\n .join(', ');\n return `CREATE ${indexType} IF NOT EXISTS ${quoteIdentifier(\n idx.name,\n )} ON ${quoteIdentifier(tableName)} (${columnList});`;\n });\n }\n\n schemas[tableName] = {\n tableName,\n ddl,\n indexes: indexSQL,\n };\n }\n\n return schemas;\n}\n\n/**\n * Get all registered schemas as SchemaDefinition objects\n *\n * Similar to getAllSchemas(), but returns SchemaDefinition format suitable\n * for use with SchemaComparer (migrations/differ.ts).\n *\n * Key difference: Indexes are kept as IndexDefinition objects instead of\n * being converted to SQL strings.\n *\n * @returns Map of tableName to SchemaDefinition\n */\nexport function getAllSchemasAsDefinitions(): Record<string, SchemaDefinition> {\n // Step 1: Collect all schemas grouped by tableName\n // For STI, multiple classes may share the same table\n const tableSchemas: Record<\n string,\n {\n tableName: string;\n columns: Record<string, ColumnDefinition>;\n indexes: IndexDefinition[];\n isSTI: boolean;\n }\n > = {};\n\n for (const [_className, registered] of getClasses()) {\n // Skip collection classes - they don't have their own tables\n if (\n isCollectionRegistration(\n _className,\n registered,\n collectionRegistrationLookup,\n )\n ) {\n continue;\n }\n\n // Issue #951: Use simple name for STI comparisons (map key may be qualified)\n const simpleName = registered.name || _className;\n\n // Handle STI subclasses with null tableName from external manifests\n if (!registered.schema?.tableName && registered.extends) {\n // R5-canon: use the qualified key for STI lookups so colliding\n // simple names don't resolve to the wrong package's class.\n // `getTableStrategy` / `getSTIBase` both accept qualified names\n // via `findClass`'s multi-strategy lookup.\n const qualifiedName = (registered as any).qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n if (!registered.schema) {\n registered.schema = {\n tableName: '',\n ddl: '',\n columns: {},\n indexes: [],\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: '',\n };\n }\n registered.schema.tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n }\n\n if (registered.schema?.tableName) {\n // For STI subclasses, use the STI base class's tableName.\n // R5-canon: qualified-key lookup so a colliding simple name in\n // another package can't yield the wrong tableStrategy / STI base\n // and move this class's columns under that other package's table.\n let tableName = registered.schema.tableName;\n const qualifiedName = (registered as any).qualifiedName ?? simpleName;\n const lookupKey = qualifiedName;\n const tableStrategy = ObjectRegistry.getTableStrategy(lookupKey);\n if (tableStrategy === 'sti') {\n const stiBaseName = ObjectRegistry.getSTIBase(lookupKey);\n if (stiBaseName && stiBaseName !== qualifiedName) {\n const stiBaseClass = findClass(stiBaseName);\n if (stiBaseClass?.schema?.tableName) {\n tableName = stiBaseClass.schema.tableName;\n }\n }\n }\n\n // Manifest schema remains authoritative for existing columns. Runtime\n // field metadata can backfill missing columns and apply explicit sqlType\n // overrides without erasing richer manifest metadata.\n const columnsToUse = mergeRuntimeFieldColumns(\n simpleName,\n registered.schema.columns,\n registered.fields,\n );\n\n if (!tableSchemas[tableName]) {\n // First class for this table - initialize with base columns\n const baseColumns = createBaseColumns(registered);\n\n const isSTI = tableStrategy === 'sti';\n if (isSTI) {\n baseColumns._meta_type = {\n type: 'TEXT',\n notNull: true,\n defaultValue: '',\n };\n baseColumns._meta_data = { type: 'JSON' };\n }\n\n tableSchemas[tableName] = {\n tableName,\n columns: { ...baseColumns, ...columnsToUse },\n indexes: [],\n isSTI,\n };\n } else {\n // Additional class sharing this table (STI scenario) - merge columns\n for (const [colName, colDef] of Object.entries(columnsToUse)) {\n if (!tableSchemas[tableName].columns[colName]) {\n tableSchemas[tableName].columns[colName] = colDef;\n }\n }\n }\n\n // Merge indexes (avoid duplicates by name)\n if (registered.schema.indexes && registered.schema.indexes.length > 0) {\n const existingNames = new Set(\n tableSchemas[tableName].indexes.map((idx) => idx.name),\n );\n for (const idx of registered.schema.indexes) {\n if (!existingNames.has(idx.name)) {\n tableSchemas[tableName].indexes.push(idx);\n existingNames.add(idx.name);\n }\n }\n }\n }\n }\n\n // Step 2: Convert to SchemaDefinition format\n const schemas: Record<string, SchemaDefinition> = {};\n\n for (const [tableName, tableSchema] of Object.entries(tableSchemas)) {\n if (Object.keys(tableSchema.columns).length === 0) {\n continue;\n }\n\n // Generate DDL from columns\n const ddl = generateDDLFromColumns(\n tableName,\n tableSchema.columns,\n tableSchema.isSTI,\n );\n\n schemas[tableName] = {\n tableName,\n ddl,\n columns: tableSchema.columns,\n indexes: tableSchema.indexes, // Keep as IndexDefinition[]\n triggers: [],\n foreignKeys: [],\n version: '',\n dependencies: [],\n };\n }\n\n return schemas;\n}\n\n/**\n * Generate DDL CREATE TABLE statement from columns\n *\n * Used internally by getAllSchemas() to regenerate DDL after merging\n * columns from multiple STI subtypes that share the same table.\n *\n * @param tableName - Name of the table\n * @param columns - Column definitions\n * @returns DDL CREATE TABLE statement\n */\nexport function generateDDLFromColumns(\n tableName: string,\n columns: Record<string, ColumnDefinition>,\n isSTI = false,\n): string {\n let sql = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)} (\\n`;\n\n const columnLines: string[] = [];\n for (const [columnName, columnDef] of Object.entries(columns)) {\n const parts: string[] = [];\n\n // Column name and type\n parts.push(` ${quoteIdentifier(columnName)} ${columnDef.type}`);\n\n // Primary key\n if (columnDef.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n\n // Not null constraint\n if (columnDef.notNull) {\n parts.push('NOT NULL');\n }\n\n // Unique constraint (skip if primary key already implies uniqueness)\n if (columnDef.unique && !columnDef.primaryKey) {\n parts.push('UNIQUE');\n }\n\n // Default value\n if (columnDef.defaultValue !== undefined) {\n const defaultSQL = formatDefaultValue(\n columnDef.defaultValue,\n columnDef.type,\n );\n parts.push(`DEFAULT ${defaultSQL}`);\n }\n\n columnLines.push(parts.join(' '));\n }\n\n sql += columnLines.join(',\\n');\n\n // Add UNIQUE constraint for UPSERT operations\n // For STI tables: UNIQUE(slug, context, _meta_type) - different types can have same slug+context\n // For non-STI tables: UNIQUE(slug, context)\n if (columns.slug && columns.context) {\n if (isSTI && columns._meta_type) {\n sql += ',\\n UNIQUE(slug, context, _meta_type)';\n } else {\n sql += ',\\n UNIQUE(slug, context)';\n }\n }\n\n sql += '\\n);';\n\n return sql;\n}\n\n/**\n * Format default value for SQL DDL.\n *\n * Thin wrapper over the shared, injection-safe formatter\n * (`schema/sql-identifiers.ts`) so the registry schema-builder uses the same\n * rules as the DDL strategies and schema generator: an allowlist of SQL\n * keyword/function defaults (not \"contains `(`\"), type-driven literal quoting,\n * and no folding of a literal string `\"null\"` into the SQL NULL keyword.\n *\n * @param value - Default value\n * @param type - Column SQL type\n * @returns Formatted SQL default value\n */\nexport function formatDefaultValue(value: any, type: string): string {\n return formatDefaultValueShared(value, type);\n}\n\n/**\n * Convert a Map of field definitions to column definitions\n *\n * Used by getAllSchemas() to generate columns from fields when a class\n * has no pre-generated schema (e.g., STI subclasses registered from manifest).\n *\n * @param fields - Map of field name to field definition\n * @returns Record of column name to column definition\n * @private\n */\nexport function fieldsToColumns(\n fields: Map<string, FieldDefinition>,\n): Record<string, ColumnDefinition> {\n const columns: Record<string, ColumnDefinition> = {};\n\n for (const [fieldName, fieldDef] of fields) {\n // Skip id, timestamps - they're on the base table\n if (\n fieldName === 'id' ||\n fieldName === 'created_at' ||\n fieldName === 'updated_at' ||\n fieldName === 'slug' ||\n fieldName === 'context'\n ) {\n continue;\n }\n\n // Skip transient fields (non-persisted)\n if (fieldDef.transient || fieldDef._meta?.transient) {\n continue;\n }\n\n // Skip relationship fields that don't create columns\n // oneToMany and manyToMany are relationship metadata, not actual database columns\n if (fieldDef.type === 'oneToMany' || fieldDef.type === 'manyToMany') {\n continue;\n }\n\n // Skip meta fields - they're stored in _meta_data JSONB column\n if (fieldDef.type === 'meta') {\n continue;\n }\n\n // Map field type to SQL type\n const sqlType =\n fieldDef._meta?.sqlType ||\n (fieldDef.type === 'crossPackageRef' &&\n (fieldDef._meta?.idType === 'text' || (fieldDef as any).idType === 'text')\n ? 'TEXT'\n : mapFieldTypeToSQL(fieldDef.type));\n const normalizedSqlType = String(sqlType).toUpperCase() as SQLDataType;\n const referenceKind = getReferenceKind(fieldDef);\n\n const column: ColumnDefinition = {\n type: normalizedSqlType,\n referenceKind,\n notNull: fieldDef._meta?.nullable ? false : fieldDef.required || false,\n unique: fieldDef._meta?.unique || false,\n description: fieldDef.description,\n };\n\n // Handle default values\n if (\n fieldDef.default !== undefined &&\n shouldEmitDefault(fieldDef, normalizedSqlType)\n ) {\n column.defaultValue = fieldDef.default;\n }\n\n // Handle foreign keys\n if (fieldDef.type === 'foreignKey' && fieldDef.related) {\n const [table, columnName = 'id'] = fieldDef.related.split('.');\n const fieldMeta = fieldDef._meta as\n | {\n onDelete?: ForeignKeyAction;\n onUpdate?: ForeignKeyAction;\n }\n | undefined;\n column.foreignKey = {\n table: classnameToTablename(table),\n column: columnName,\n onDelete: fieldMeta?.onDelete ?? 'CASCADE',\n onUpdate: fieldMeta?.onUpdate ?? 'CASCADE',\n };\n }\n\n // Use snake_case for column names\n columns[toSnakeCase(fieldName)] = column;\n }\n\n return columns;\n}\n\n/**\n * Map field type to SQL data type\n * @private\n */\nexport function mapFieldTypeToSQL(\n fieldType: FieldDefinition['type'],\n): SQLDataType {\n switch (fieldType) {\n case 'text':\n return 'TEXT';\n case 'integer':\n return 'INTEGER';\n case 'decimal':\n return 'REAL';\n case 'boolean':\n return 'BOOLEAN';\n case 'datetime':\n return 'TIMESTAMP';\n case 'json':\n return 'JSON';\n case 'foreignKey':\n return 'UUID';\n case 'crossPackageRef':\n return 'UUID';\n default:\n return 'TEXT';\n }\n}\n"],"names":["formatDefaultValueShared"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { SmrtCollection } from '../collection';
|
|
2
|
+
import { LRUCache } from '../utils/lru-cache';
|
|
3
|
+
import { RegisteredClass, SmrtObjectConstructor } from './types';
|
|
4
|
+
declare global {
|
|
5
|
+
var __smrtRegistryClasses: Map<string, any> | undefined;
|
|
6
|
+
var __smrtRegistryCollections: Map<string, typeof SmrtCollection> | undefined;
|
|
7
|
+
var __smrtRegistryCollectionCache: LRUCache<string, SmrtCollection<any>> | undefined;
|
|
8
|
+
var __smrtRegistryDbInstanceIds: WeakMap<object, number> | undefined;
|
|
9
|
+
var __smrtRegistryNextDbId: number | undefined;
|
|
10
|
+
var __smrtRegistryInheritanceChainCache: LRUCache<string, string[]> | undefined;
|
|
11
|
+
var __smrtRegistryFieldDecorators: Map<string, Map<string, any>> | undefined;
|
|
12
|
+
var __smrtRegistryStiSiblingsLoaded: Set<string> | undefined;
|
|
13
|
+
var __smrtRegistryCollectionTableNames: Map<string, string> | undefined;
|
|
14
|
+
var __smrtRegistrySchemasInitialized: WeakSet<object> | undefined;
|
|
15
|
+
var __smrtRegistryConstructorIndex: WeakMap<SmrtObjectConstructor, string> | undefined;
|
|
16
|
+
var __smrtRegistryDiscoveryAttemptCache: Map<string, boolean> | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Cached verbose flag evaluated once at module load time.
|
|
20
|
+
* Checks SMRT_VERBOSE=true or DEBUG containing 'smrt'.
|
|
21
|
+
* Avoids repeated env var parsing on every log statement.
|
|
22
|
+
* @see https://github.com/happyvertical/smrt/issues/782
|
|
23
|
+
*/
|
|
24
|
+
export declare const VERBOSE_ENABLED: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Log a message only when verbose mode is enabled.
|
|
27
|
+
* Used throughout registry modules to reduce noise during normal operation.
|
|
28
|
+
* @param args - Arguments to pass to console.log
|
|
29
|
+
*/
|
|
30
|
+
export declare function verboseLog(...args: unknown[]): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get inheritance config synchronously.
|
|
33
|
+
* Uses the config package's sync accessor which returns already-loaded config.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getInheritanceConfig(): {
|
|
36
|
+
cacheSize: number;
|
|
37
|
+
onMissingAncestor: "warn" | "error";
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Extract the source file path from the call stack.
|
|
41
|
+
*
|
|
42
|
+
* Used to identify where a class was defined for collision detection.
|
|
43
|
+
* This allows the same class to be re-registered when modules are re-evaluated
|
|
44
|
+
* (e.g., during vitest test file collection with isolation enabled).
|
|
45
|
+
*
|
|
46
|
+
* @returns The file path where the @smrt() decorator was called, or undefined
|
|
47
|
+
*/
|
|
48
|
+
export declare function getSourceFileFromStack(): string | undefined;
|
|
49
|
+
export declare function getClasses(): Map<string, RegisteredClass>;
|
|
50
|
+
export declare function getCollections(): Map<string, typeof SmrtCollection>;
|
|
51
|
+
export declare function getCollectionTableNames(): Map<string, string>;
|
|
52
|
+
export declare function getCollectionCache(): LRUCache<string, SmrtCollection<any>>;
|
|
53
|
+
export declare function getDbInstanceIds(): WeakMap<object, number>;
|
|
54
|
+
export declare function getNextDbId(): number;
|
|
55
|
+
export declare function setNextDbId(value: number): void;
|
|
56
|
+
export declare function getFieldDecorators(): Map<string, Map<string, any>>;
|
|
57
|
+
export declare function getStiSiblingsLoaded(): Set<string>;
|
|
58
|
+
export declare function getSchemasInitialized(): WeakSet<object>;
|
|
59
|
+
export declare function getConstructorIndex(): WeakMap<SmrtObjectConstructor, string>;
|
|
60
|
+
export declare function getInheritanceCache(): LRUCache<string, string[]>;
|
|
61
|
+
export declare function getDiscoveryAttemptCache(): Map<string, boolean>;
|
|
62
|
+
//# sourceMappingURL=shared-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-state.d.ts","sourceRoot":"","sources":["../../src/registry/shared-state.ts"],"names":[],"mappings":"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"}
|