@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,244 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
import { ConfigurationError } from "../errors.js";
|
|
3
|
+
import { ObjectRegistry } from "../registry.js";
|
|
4
|
+
import { prependSmrtSystemFields } from "../system-fields.js";
|
|
5
|
+
import { findClass, findClassStrict } from "./name-resolver.js";
|
|
6
|
+
import { getInheritanceCache, verboseLog, getInheritanceConfig } from "./shared-state.js";
|
|
7
|
+
const logger = createLogger({ level: "info" });
|
|
8
|
+
function buildInheritanceChain(ctor) {
|
|
9
|
+
const chain = [];
|
|
10
|
+
const visited = /* @__PURE__ */ new Set();
|
|
11
|
+
let current = ctor;
|
|
12
|
+
while (current?.name) {
|
|
13
|
+
if (current.name === "SmrtObject") {
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
if (visited.has(current)) {
|
|
17
|
+
throw ConfigurationError.circularInheritance(
|
|
18
|
+
current.name,
|
|
19
|
+
Array.from(chain)
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
visited.add(current);
|
|
23
|
+
chain.unshift(current.name);
|
|
24
|
+
current = Object.getPrototypeOf(current);
|
|
25
|
+
}
|
|
26
|
+
return chain;
|
|
27
|
+
}
|
|
28
|
+
function getInheritanceChain(className) {
|
|
29
|
+
const cache = getInheritanceCache();
|
|
30
|
+
const cached = cache.get(className);
|
|
31
|
+
if (cached) {
|
|
32
|
+
return cached;
|
|
33
|
+
}
|
|
34
|
+
const registered = findClass(className);
|
|
35
|
+
if (!registered) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
if (registered.inheritanceChain) {
|
|
39
|
+
cache.set(className, registered.inheritanceChain);
|
|
40
|
+
return registered.inheritanceChain;
|
|
41
|
+
}
|
|
42
|
+
const chain = [];
|
|
43
|
+
const visited = /* @__PURE__ */ new Set();
|
|
44
|
+
let current = registered;
|
|
45
|
+
let circularDetected = false;
|
|
46
|
+
while (current) {
|
|
47
|
+
if (visited.has(current)) {
|
|
48
|
+
if (chain.length > 1) {
|
|
49
|
+
logger.warn(
|
|
50
|
+
`[ObjectRegistry] Circular inheritance detected in chain: ${chain.join(" -> ")} -> ${current.name}. Check that '${current.extends ?? current.name}' resolves to the correct package class.`
|
|
51
|
+
);
|
|
52
|
+
circularDetected = true;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
visited.add(current);
|
|
57
|
+
chain.unshift(current.qualifiedName ?? current.name);
|
|
58
|
+
if (!current.extends) break;
|
|
59
|
+
if (current.extends === "SmrtObject" || current.extends === "SmrtClass" || current.extends === "SmrtCollection") {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
const parent = findClassStrict(current.extends, current.packageName);
|
|
63
|
+
if (!parent) {
|
|
64
|
+
verboseLog(
|
|
65
|
+
`[ObjectRegistry] Parent class '${current.extends}' not found while building inheritance chain. Ensure the parent package is installed and loadAllManifests() was called at startup.`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
current = parent;
|
|
69
|
+
}
|
|
70
|
+
if (!circularDetected) {
|
|
71
|
+
registered.inheritanceChain = chain;
|
|
72
|
+
cache.set(className, chain);
|
|
73
|
+
}
|
|
74
|
+
return chain;
|
|
75
|
+
}
|
|
76
|
+
async function getAllFields(className) {
|
|
77
|
+
let registered = findClass(className);
|
|
78
|
+
if (!registered) {
|
|
79
|
+
const loaded = await ObjectRegistry.tryLoadFromExternalPackage(className);
|
|
80
|
+
if (!loaded) {
|
|
81
|
+
return /* @__PURE__ */ new Map();
|
|
82
|
+
}
|
|
83
|
+
registered = findClass(className);
|
|
84
|
+
}
|
|
85
|
+
if (!registered) {
|
|
86
|
+
return /* @__PURE__ */ new Map();
|
|
87
|
+
}
|
|
88
|
+
await ObjectRegistry.ensureManifestLoaded(className);
|
|
89
|
+
if (registered.inheritedFields) {
|
|
90
|
+
return prependSmrtSystemFields(new Map(registered.inheritedFields));
|
|
91
|
+
}
|
|
92
|
+
const { onMissingAncestor } = getInheritanceConfig();
|
|
93
|
+
const allFields = /* @__PURE__ */ new Map();
|
|
94
|
+
const chain = getInheritanceChain(className);
|
|
95
|
+
for (const ancestorName of chain) {
|
|
96
|
+
if (ancestorName === "SmrtObject" || ancestorName === "SmrtClass" || ancestorName === "SmrtCollection") {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
await ObjectRegistry.ensureManifestLoaded(ancestorName);
|
|
101
|
+
} catch {
|
|
102
|
+
}
|
|
103
|
+
const ancestor = findClass(ancestorName);
|
|
104
|
+
if (!ancestor) {
|
|
105
|
+
const message = `Missing ancestor class "${ancestorName}" in inheritance chain for "${className}"`;
|
|
106
|
+
if (onMissingAncestor === "error") {
|
|
107
|
+
throw new Error(
|
|
108
|
+
`${message}
|
|
109
|
+
|
|
110
|
+
This usually means:
|
|
111
|
+
1. The parent class is not registered with @smrt()
|
|
112
|
+
2. The parent class file is not imported
|
|
113
|
+
3. The manifest does not include the parent class
|
|
114
|
+
|
|
115
|
+
To fix:
|
|
116
|
+
- Ensure all parent classes use @smrt() decorator
|
|
117
|
+
- Import all parent class files before child classes
|
|
118
|
+
- Rebuild to regenerate manifest
|
|
119
|
+
- Or set smrt.inheritance.onMissingAncestor='warn' in config`
|
|
120
|
+
);
|
|
121
|
+
} else if (onMissingAncestor === "warn") {
|
|
122
|
+
logger.warn(`[ObjectRegistry] ${message}`);
|
|
123
|
+
}
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
for (const [fieldName, field] of ancestor.fields) {
|
|
127
|
+
const normalizedField = normalizeFrameworkInheritedField(
|
|
128
|
+
ancestorName,
|
|
129
|
+
fieldName,
|
|
130
|
+
field,
|
|
131
|
+
className
|
|
132
|
+
);
|
|
133
|
+
const existingField = allFields.get(fieldName);
|
|
134
|
+
if (!existingField) {
|
|
135
|
+
allFields.set(fieldName, normalizedField);
|
|
136
|
+
} else {
|
|
137
|
+
allFields.set(
|
|
138
|
+
fieldName,
|
|
139
|
+
mergeFieldConfigs(existingField, normalizedField, fieldName)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
registered.inheritedFields = new Map(allFields);
|
|
145
|
+
return prependSmrtSystemFields(allFields);
|
|
146
|
+
}
|
|
147
|
+
function normalizeFrameworkInheritedField(ancestorName, fieldName, field, childClassName) {
|
|
148
|
+
const simpleAncestorName = ancestorName.includes(":") ? ancestorName.split(":").pop() : ancestorName;
|
|
149
|
+
if (simpleAncestorName === "SmrtHierarchical" && fieldName === "parentId") {
|
|
150
|
+
return {
|
|
151
|
+
...field,
|
|
152
|
+
type: "foreignKey",
|
|
153
|
+
related: childClassName,
|
|
154
|
+
required: false,
|
|
155
|
+
_meta: {
|
|
156
|
+
...field._meta || {},
|
|
157
|
+
nullable: true
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return field;
|
|
162
|
+
}
|
|
163
|
+
function mergeFieldConfigs(parentField, childField, fieldName) {
|
|
164
|
+
const merged = { ...parentField };
|
|
165
|
+
if (childField.type && childField.type !== parentField.type) {
|
|
166
|
+
const isTenantField = parentField.__tenancy?.isTenantIdField || parentField._meta?.__tenancy?.isTenantIdField;
|
|
167
|
+
if (!(isTenantField && fieldName === "tenantId")) {
|
|
168
|
+
logger.warn(
|
|
169
|
+
`Field type mismatch: "${fieldName}" is ${parentField.type} in parent but ${childField.type} in child. Using child type.`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
merged.type = childField.type;
|
|
173
|
+
}
|
|
174
|
+
if (childField._meta || parentField._meta) {
|
|
175
|
+
merged._meta = {
|
|
176
|
+
...parentField._meta || {},
|
|
177
|
+
...childField._meta || {}
|
|
178
|
+
};
|
|
179
|
+
if (parentField._meta?.min !== void 0 && childField._meta?.min !== void 0) {
|
|
180
|
+
merged._meta.min = Math.max(parentField._meta.min, childField._meta.min);
|
|
181
|
+
}
|
|
182
|
+
if (parentField._meta?.max !== void 0 && childField._meta?.max !== void 0) {
|
|
183
|
+
merged._meta.max = Math.min(parentField._meta.max, childField._meta.max);
|
|
184
|
+
}
|
|
185
|
+
if (parentField._meta?.validate && childField._meta?.validate) {
|
|
186
|
+
const parentValidator = parentField._meta.validate;
|
|
187
|
+
const childValidator = childField._meta.validate;
|
|
188
|
+
merged._meta.validate = async (value) => {
|
|
189
|
+
const parentResult = await parentValidator(value);
|
|
190
|
+
const childResult = await childValidator(value);
|
|
191
|
+
return parentResult && childResult;
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (parentField._meta?.unique || childField._meta?.unique) {
|
|
195
|
+
merged._meta.unique = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (parentField.__tenancy || childField.__tenancy) {
|
|
199
|
+
merged.__tenancy = {
|
|
200
|
+
...childField.__tenancy || {},
|
|
201
|
+
...parentField.__tenancy || {}
|
|
202
|
+
// Parent (decorator) wins
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
if (childField.value !== void 0) {
|
|
206
|
+
merged.value = childField.value;
|
|
207
|
+
}
|
|
208
|
+
return merged;
|
|
209
|
+
}
|
|
210
|
+
async function getAllMethods(className) {
|
|
211
|
+
const registered = findClass(className);
|
|
212
|
+
if (!registered) {
|
|
213
|
+
return /* @__PURE__ */ new Map();
|
|
214
|
+
}
|
|
215
|
+
if (registered.inheritedMethods) {
|
|
216
|
+
return new Map(registered.inheritedMethods);
|
|
217
|
+
}
|
|
218
|
+
const allMethods = /* @__PURE__ */ new Map();
|
|
219
|
+
const chain = getInheritanceChain(className);
|
|
220
|
+
for (const ancestorName of chain) {
|
|
221
|
+
if (ancestorName === "SmrtObject" || ancestorName === "SmrtClass" || ancestorName === "SmrtCollection") {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
await ObjectRegistry.ensureManifestLoaded(ancestorName);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
}
|
|
228
|
+
const ancestor = findClass(ancestorName);
|
|
229
|
+
if (!ancestor) continue;
|
|
230
|
+
for (const [methodName, method] of ancestor.methods) {
|
|
231
|
+
allMethods.set(methodName, method);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
registered.inheritedMethods = allMethods;
|
|
235
|
+
return new Map(allMethods);
|
|
236
|
+
}
|
|
237
|
+
export {
|
|
238
|
+
buildInheritanceChain,
|
|
239
|
+
getAllFields,
|
|
240
|
+
getAllMethods,
|
|
241
|
+
getInheritanceChain,
|
|
242
|
+
mergeFieldConfigs
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=inheritance-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance-resolver.js","sources":["../../src/registry/inheritance-resolver.ts"],"sourcesContent":["/**\n * Inheritance resolution module for the SMRT ObjectRegistry.\n *\n * Extracted from registry.ts as part of issue #1006.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { ConfigurationError } from '../errors';\nimport type { SmrtObject } from '../object';\nimport { ObjectRegistry } from '../registry';\nimport { prependSmrtSystemFields } from '../system-fields';\nimport { findClass, findClassStrict } from './name-resolver';\nimport {\n getInheritanceCache,\n getInheritanceConfig,\n verboseLog,\n} from './shared-state';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Build inheritance chain by walking prototype chain\n *\n * Walks from child → parent → ... → SmrtObject, building array from base to child.\n * Stops at SmrtObject (the framework base class).\n */\nexport function buildInheritanceChain(ctor: typeof SmrtObject): string[] {\n const chain: string[] = [];\n const visited = new Set<Function>();\n let current: any = ctor;\n\n // Walk up the prototype chain\n while (current?.name) {\n if (current.name === 'SmrtObject') {\n break;\n }\n\n if (visited.has(current)) {\n throw ConfigurationError.circularInheritance(\n current.name,\n Array.from(chain),\n );\n }\n\n visited.add(current);\n chain.unshift(current.name);\n\n current = Object.getPrototypeOf(current);\n }\n\n return chain;\n}\n\nexport function getInheritanceChain(className: string): string[] {\n const cache = getInheritanceCache();\n\n // Check cache first\n const cached = cache.get(className);\n if (cached) {\n return cached;\n }\n\n // Get registered class\n const registered = findClass(className);\n if (!registered) {\n return [];\n }\n\n // Check if already computed and stored\n if (registered.inheritanceChain) {\n cache.set(className, registered.inheritanceChain);\n return registered.inheritanceChain;\n }\n\n // Build chain from `extends` field (works for manifest-loaded classes)\n // This is critical because manifest-loaded classes have stub constructors\n // that only extend SmrtObject, not their actual parent class.\n // The `extends` field IS stored correctly during registerFromManifest().\n const chain: string[] = [];\n const visited = new Set<any>(); // Cycle detection using object identity\n let current: any = registered;\n let circularDetected = false;\n while (current) {\n // Cycle detection: use object identity to handle cases where distinct\n // classes share the same name (e.g., histrio:Performer vs smrt-video:Performer)\n if (visited.has(current)) {\n // Self-referential (chain length 1) is expected when a child package\n // extends a parent with the same className and only one is installed.\n // Longer cycles indicate misconfigured manifests.\n if (chain.length > 1) {\n logger.warn(\n `[ObjectRegistry] Circular inheritance detected in chain: ${chain.join(' -> ')} -> ${current.name}. ` +\n `Check that '${current.extends ?? current.name}' resolves to the correct package class.`,\n );\n circularDetected = true;\n }\n break;\n }\n visited.add(current);\n\n // R5-canon: emit qualified names when available, matching the\n // public `ObjectRegistry.getInheritanceChain` contract. Falls back\n // to simple name for classes registered without a package context.\n chain.unshift(current.qualifiedName ?? current.name); // [ancestor, ..., descendant]\n if (!current.extends) break;\n\n // Skip framework base classes that are never registered\n if (\n current.extends === 'SmrtObject' ||\n current.extends === 'SmrtClass' ||\n current.extends === 'SmrtCollection'\n ) {\n break;\n }\n\n // Try to find the parent class\n // Issue #1004/#1005: Use findClassStrict with package context for\n // unambiguous resolution. If extends is already qualified (from\n // qualifyExtendsName), this is an O(1) direct lookup.\n // If ambiguous, let the ConfigurationError propagate — callers\n // should fix their manifests rather than silently get wrong results.\n const parent = findClassStrict(current.extends, current.packageName);\n\n // Issue #1007: Parent not found — the class is not registered.\n // After loadAllManifests() completes at startup, all classes are\n // pre-registered so this path is only hit when a package is not\n // installed or the manifest is stale. We gracefully end the chain\n // here instead of mutating registry state during a read operation.\n if (!parent) {\n verboseLog(\n `[ObjectRegistry] Parent class '${current.extends}' not found ` +\n `while building inheritance chain. Ensure the parent package ` +\n `is installed and loadAllManifests() was called at startup.`,\n );\n }\n\n current = parent;\n }\n\n // Only cache complete, non-circular chains.\n // Caching a broken chain from a circular detection would cause all future\n // lookups to return incorrect inheritance data (e.g., [\"VideoShot\",\"VideoShot\"]\n // instead of [\"Content\",\"VideoShot\"]), breaking STI table resolution.\n if (!circularDetected) {\n registered.inheritanceChain = chain;\n cache.set(className, chain);\n }\n\n return chain;\n}\n\nexport async function getAllFields(\n className: string,\n): Promise<Map<string, any>> {\n let registered = findClass(className);\n if (!registered) {\n const loaded = await ObjectRegistry.tryLoadFromExternalPackage(className);\n if (!loaded) {\n return new Map();\n }\n\n registered = findClass(className);\n }\n\n if (!registered) {\n return new Map();\n }\n\n // Ensure manifest is loaded (handles external packages)\n await ObjectRegistry.ensureManifestLoaded(className);\n\n // Check if class has inheritedFields cache (set during manifest loading)\n if (registered.inheritedFields) {\n return prependSmrtSystemFields(new Map(registered.inheritedFields));\n }\n\n // Get config for error handling behavior\n const { onMissingAncestor } = getInheritanceConfig();\n\n // For local classes (not from manifests), merge fields from inheritance chain\n const allFields = new Map<string, any>();\n const chain = getInheritanceChain(className);\n\n // Walk chain from base to child (parent fields first)\n for (const ancestorName of chain) {\n // Skip framework base classes\n if (\n ancestorName === 'SmrtObject' ||\n ancestorName === 'SmrtClass' ||\n ancestorName === 'SmrtCollection'\n ) {\n continue;\n }\n\n try {\n await ObjectRegistry.ensureManifestLoaded(ancestorName);\n } catch {\n // Local classes and pure test fixtures may not have manifests. Continue\n // with whatever runtime metadata is already available.\n }\n\n const ancestor = findClass(ancestorName);\n if (!ancestor) {\n // Handle missing ancestors according to config\n const message = `Missing ancestor class \"${ancestorName}\" in inheritance chain for \"${className}\"`;\n\n if (onMissingAncestor === 'error') {\n throw new Error(\n `${message}\\n\\n` +\n `This usually means:\\n` +\n ` 1. The parent class is not registered with @smrt()\\n` +\n ` 2. The parent class file is not imported\\n` +\n ` 3. The manifest does not include the parent class\\n\\n` +\n `To fix:\\n` +\n ` - Ensure all parent classes use @smrt() decorator\\n` +\n ` - Import all parent class files before child classes\\n` +\n ` - Rebuild to regenerate manifest\\n` +\n ` - Or set smrt.inheritance.onMissingAncestor='warn' in config`,\n );\n } else if (onMissingAncestor === 'warn') {\n logger.warn(`[ObjectRegistry] ${message}`);\n }\n\n continue;\n }\n\n // Merge fields from this ancestor\n for (const [fieldName, field] of ancestor.fields) {\n const normalizedField = normalizeFrameworkInheritedField(\n ancestorName,\n fieldName,\n field,\n className,\n );\n const existingField = allFields.get(fieldName);\n if (!existingField) {\n // New field from parent\n allFields.set(fieldName, normalizedField);\n } else {\n // Field exists - merge configs\n allFields.set(\n fieldName,\n mergeFieldConfigs(existingField, normalizedField, fieldName),\n );\n }\n }\n }\n\n registered.inheritedFields = new Map(allFields);\n\n return prependSmrtSystemFields(allFields);\n}\n\nfunction normalizeFrameworkInheritedField(\n ancestorName: string,\n fieldName: string,\n field: any,\n childClassName: string,\n): any {\n const simpleAncestorName = ancestorName.includes(':')\n ? ancestorName.split(':').pop()\n : ancestorName;\n\n if (simpleAncestorName === 'SmrtHierarchical' && fieldName === 'parentId') {\n return {\n ...field,\n type: 'foreignKey',\n related: childClassName,\n required: false,\n _meta: {\n ...(field._meta || {}),\n nullable: true,\n },\n };\n }\n\n return field;\n}\n\nexport function mergeFieldConfigs(\n parentField: any,\n childField: any,\n fieldName: string,\n): any {\n // Start with parent field as base\n const merged = { ...parentField };\n\n // Type: Child wins (warn if different)\n if (childField.type && childField.type !== parentField.type) {\n // Don't warn for tenantId field - expected type conflict between decorator and AST\n // The @tenantId decorator registers as 'foreignKey' but AST sees 'text' from type annotation\n // __tenancy can be at root level (from @tenantId decorator) or under _meta (from @smrt({ tenantScoped: true }))\n const isTenantField =\n parentField.__tenancy?.isTenantIdField ||\n parentField._meta?.__tenancy?.isTenantIdField;\n if (!(isTenantField && fieldName === 'tenantId')) {\n logger.warn(\n `Field type mismatch: \"${fieldName}\" is ${parentField.type} in parent but ${childField.type} in child. Using child type.`,\n );\n }\n merged.type = childField.type;\n }\n\n // _meta: Merge with child precedence\n if (childField._meta || parentField._meta) {\n merged._meta = {\n ...(parentField._meta || {}),\n ...(childField._meta || {}),\n };\n\n // Special handling for numeric constraints (take strictest)\n if (\n parentField._meta?.min !== undefined &&\n childField._meta?.min !== undefined\n ) {\n // Take the larger min (strictest lower bound)\n merged._meta.min = Math.max(parentField._meta.min, childField._meta.min);\n }\n if (\n parentField._meta?.max !== undefined &&\n childField._meta?.max !== undefined\n ) {\n // Take the smaller max (strictest upper bound)\n merged._meta.max = Math.min(parentField._meta.max, childField._meta.max);\n }\n\n // Validators: Combine (both must pass)\n if (parentField._meta?.validate && childField._meta?.validate) {\n const parentValidator = parentField._meta.validate;\n const childValidator = childField._meta.validate;\n merged._meta.validate = async (value: any) => {\n const parentResult = await parentValidator(value);\n const childResult = await childValidator(value);\n return parentResult && childResult;\n };\n }\n\n // Unique: Take OR (unique if either says unique)\n if (parentField._meta?.unique || childField._meta?.unique) {\n merged._meta.unique = true;\n }\n }\n\n // __tenancy: Preserve from parent (decorator takes precedence)\n // This ensures @tenantId decorator metadata survives type conflicts (Issue #841)\n // The decorator registers __tenancy metadata, but AST scanner may override the type.\n // We need to preserve __tenancy so the interceptor can identify tenant fields.\n if (parentField.__tenancy || childField.__tenancy) {\n merged.__tenancy = {\n ...(childField.__tenancy || {}),\n ...(parentField.__tenancy || {}), // Parent (decorator) wins\n };\n }\n\n // Value: Child wins\n if (childField.value !== undefined) {\n merged.value = childField.value;\n }\n\n return merged;\n}\n\nexport async function getAllMethods(\n className: string,\n): Promise<Map<string, any>> {\n const registered = findClass(className);\n if (!registered) {\n return new Map();\n }\n\n // Check cache first\n if (registered.inheritedMethods) {\n return new Map(registered.inheritedMethods);\n }\n\n // Build merged methods from inheritance chain\n const allMethods = new Map<string, any>();\n const chain = getInheritanceChain(className);\n\n // Walk chain from base to child (parent methods first)\n for (const ancestorName of chain) {\n // Skip framework base classes (check BEFORE looking up in registry)\n if (\n ancestorName === 'SmrtObject' ||\n ancestorName === 'SmrtClass' ||\n ancestorName === 'SmrtCollection'\n ) {\n continue;\n }\n\n // Load manifest for ancestor class (handles external packages)\n // This ensures inherited methods from external packages are available\n try {\n await ObjectRegistry.ensureManifestLoaded(ancestorName);\n } catch (error) {\n // Manifest loading failed - this is expected for classes not in manifest\n // Continue to next ancestor\n }\n\n const ancestor = findClass(ancestorName);\n if (!ancestor) continue;\n\n // Merge parent methods into result\n for (const [methodName, method] of ancestor.methods) {\n // Child methods override parent methods (no merging)\n allMethods.set(methodName, method);\n }\n }\n\n // Cache the merged result\n registered.inheritedMethods = allMethods;\n\n return new Map(allMethods);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function createFieldFromManifest(fieldDef: any): any;
|
|
2
|
+
export declare function mergeManifestField(existingField: any, fieldDef: any): any;
|
|
3
|
+
export declare function manifestFieldDiffers(existingField: any, fieldDef: any): boolean;
|
|
4
|
+
//# sourceMappingURL=manifest-field-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-field-merge.d.ts","sourceRoot":"","sources":["../../src/registry/manifest-field-merge.ts"],"names":[],"mappings":"AAoDA,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAsB1D;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,CA8BzE;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,GAAG,EAClB,QAAQ,EAAE,GAAG,GACZ,OAAO,CAQT"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
function hasOwnDefinedValue(source, key) {
|
|
2
|
+
return !!source && Object.hasOwn(source, key) && source[key] !== void 0;
|
|
3
|
+
}
|
|
4
|
+
function readExistingFieldMeta(existingField, key) {
|
|
5
|
+
if (hasOwnDefinedValue(existingField, key)) {
|
|
6
|
+
return existingField[key];
|
|
7
|
+
}
|
|
8
|
+
if (hasOwnDefinedValue(existingField?._meta, key)) {
|
|
9
|
+
return existingField._meta[key];
|
|
10
|
+
}
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
function readManifestFieldMeta(fieldDef, key) {
|
|
14
|
+
if (hasOwnDefinedValue(fieldDef, key)) {
|
|
15
|
+
return fieldDef[key];
|
|
16
|
+
}
|
|
17
|
+
if (hasOwnDefinedValue(fieldDef?._meta, key)) {
|
|
18
|
+
return fieldDef._meta[key];
|
|
19
|
+
}
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
function assignDefinedMeta(target, source) {
|
|
23
|
+
if (!source) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (const [key, value] of Object.entries(source)) {
|
|
27
|
+
if (value !== void 0) {
|
|
28
|
+
target[key] = value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function createFieldFromManifest(fieldDef) {
|
|
33
|
+
const meta = {};
|
|
34
|
+
assignDefinedMeta(meta, fieldDef?._meta);
|
|
35
|
+
for (const key of ["required", "default", "description"]) {
|
|
36
|
+
const value = readManifestFieldMeta(fieldDef, key);
|
|
37
|
+
if (value !== void 0) {
|
|
38
|
+
meta[key] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const out = {
|
|
42
|
+
type: fieldDef.type,
|
|
43
|
+
_meta: meta
|
|
44
|
+
};
|
|
45
|
+
if (fieldDef.related !== void 0) {
|
|
46
|
+
out.related = fieldDef.related;
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function mergeManifestField(existingField, fieldDef) {
|
|
51
|
+
const hasTenancyMarker = existingField.__tenancy?.isTenantIdField || existingField._meta?.__tenancy?.isTenantIdField;
|
|
52
|
+
const nextMeta = {
|
|
53
|
+
...existingField._meta || {}
|
|
54
|
+
};
|
|
55
|
+
assignDefinedMeta(nextMeta, fieldDef?._meta);
|
|
56
|
+
for (const key of ["required", "default", "description"]) {
|
|
57
|
+
const manifestValue = readManifestFieldMeta(fieldDef, key);
|
|
58
|
+
if (manifestValue !== void 0) {
|
|
59
|
+
nextMeta[key] = manifestValue;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const existingValue = readExistingFieldMeta(existingField, key);
|
|
63
|
+
if (existingValue !== void 0 && nextMeta[key] === void 0) {
|
|
64
|
+
nextMeta[key] = existingValue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
...existingField,
|
|
69
|
+
type: !hasTenancyMarker && fieldDef.type ? fieldDef.type : existingField.type,
|
|
70
|
+
_meta: nextMeta
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function manifestFieldDiffers(existingField, fieldDef) {
|
|
74
|
+
const mergedField = mergeManifestField(existingField, fieldDef);
|
|
75
|
+
return mergedField.type !== existingField.type || JSON.stringify(mergedField._meta || {}) !== JSON.stringify(existingField._meta || {});
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
createFieldFromManifest,
|
|
79
|
+
manifestFieldDiffers,
|
|
80
|
+
mergeManifestField
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=manifest-field-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-field-merge.js","sources":["../../src/registry/manifest-field-merge.ts"],"sourcesContent":["function hasOwnDefinedValue(\n source: Record<string, any> | undefined,\n key: string,\n) {\n return !!source && Object.hasOwn(source, key) && source[key] !== undefined;\n}\n\nfunction readExistingFieldMeta(\n existingField: any,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(existingField, key)) {\n return existingField[key];\n }\n\n if (hasOwnDefinedValue(existingField?._meta, key)) {\n return existingField._meta[key];\n }\n\n return undefined;\n}\n\nfunction readManifestFieldMeta(\n fieldDef: any,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(fieldDef, key)) {\n return fieldDef[key];\n }\n\n if (hasOwnDefinedValue(fieldDef?._meta, key)) {\n return fieldDef._meta[key];\n }\n\n return undefined;\n}\n\nfunction assignDefinedMeta(\n target: Record<string, any>,\n source: Record<string, any> | undefined,\n) {\n if (!source) {\n return;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined) {\n target[key] = value;\n }\n }\n}\n\nexport function createFieldFromManifest(fieldDef: any): any {\n const meta: Record<string, any> = {};\n\n assignDefinedMeta(meta, fieldDef?._meta);\n\n for (const key of ['required', 'default', 'description'] as const) {\n const value = readManifestFieldMeta(fieldDef, key);\n if (value !== undefined) {\n meta[key] = value;\n }\n }\n\n // Preserve top-level `related` for relationship-graph lookups\n // (foreignKey / crossPackageRef / oneToMany / manyToMany all rely on it).\n const out: Record<string, any> = {\n type: fieldDef.type,\n _meta: meta,\n };\n if (fieldDef.related !== undefined) {\n out.related = fieldDef.related;\n }\n return out;\n}\n\nexport function mergeManifestField(existingField: any, fieldDef: any): any {\n const hasTenancyMarker =\n existingField.__tenancy?.isTenantIdField ||\n existingField._meta?.__tenancy?.isTenantIdField;\n\n const nextMeta: Record<string, any> = {\n ...(existingField._meta || {}),\n };\n\n assignDefinedMeta(nextMeta, fieldDef?._meta);\n\n for (const key of ['required', 'default', 'description'] as const) {\n const manifestValue = readManifestFieldMeta(fieldDef, key);\n if (manifestValue !== undefined) {\n nextMeta[key] = manifestValue;\n continue;\n }\n\n const existingValue = readExistingFieldMeta(existingField, key);\n if (existingValue !== undefined && nextMeta[key] === undefined) {\n nextMeta[key] = existingValue;\n }\n }\n\n return {\n ...existingField,\n type:\n !hasTenancyMarker && fieldDef.type ? fieldDef.type : existingField.type,\n _meta: nextMeta,\n };\n}\n\nexport function manifestFieldDiffers(\n existingField: any,\n fieldDef: any,\n): boolean {\n const mergedField = mergeManifestField(existingField, fieldDef);\n\n return (\n mergedField.type !== existingField.type ||\n JSON.stringify(mergedField._meta || {}) !==\n JSON.stringify(existingField._meta || {})\n );\n}\n"],"names":[],"mappings":"AAAA,SAAS,mBACP,QACA,KACA;AACA,SAAO,CAAC,CAAC,UAAU,OAAO,OAAO,QAAQ,GAAG,KAAK,OAAO,GAAG,MAAM;AACnE;AAEA,SAAS,sBACP,eACA,KACA;AACA,MAAI,mBAAmB,eAAe,GAAG,GAAG;AAC1C,WAAO,cAAc,GAAG;AAAA,EAC1B;AAEA,MAAI,mBAAmB,eAAe,OAAO,GAAG,GAAG;AACjD,WAAO,cAAc,MAAM,GAAG;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,UACA,KACA;AACA,MAAI,mBAAmB,UAAU,GAAG,GAAG;AACrC,WAAO,SAAS,GAAG;AAAA,EACrB;AAEA,MAAI,mBAAmB,UAAU,OAAO,GAAG,GAAG;AAC5C,WAAO,SAAS,MAAM,GAAG;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,QACA,QACA;AACA,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,UAAoB;AAC1D,QAAM,OAA4B,CAAA;AAElC,oBAAkB,MAAM,UAAU,KAAK;AAEvC,aAAW,OAAO,CAAC,YAAY,WAAW,aAAa,GAAY;AACjE,UAAM,QAAQ,sBAAsB,UAAU,GAAG;AACjD,QAAI,UAAU,QAAW;AACvB,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAIA,QAAM,MAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO;AAAA,EAAA;AAET,MAAI,SAAS,YAAY,QAAW;AAClC,QAAI,UAAU,SAAS;AAAA,EACzB;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,eAAoB,UAAoB;AACzE,QAAM,mBACJ,cAAc,WAAW,mBACzB,cAAc,OAAO,WAAW;AAElC,QAAM,WAAgC;AAAA,IACpC,GAAI,cAAc,SAAS,CAAA;AAAA,EAAC;AAG9B,oBAAkB,UAAU,UAAU,KAAK;AAE3C,aAAW,OAAO,CAAC,YAAY,WAAW,aAAa,GAAY;AACjE,UAAM,gBAAgB,sBAAsB,UAAU,GAAG;AACzD,QAAI,kBAAkB,QAAW;AAC/B,eAAS,GAAG,IAAI;AAChB;AAAA,IACF;AAEA,UAAM,gBAAgB,sBAAsB,eAAe,GAAG;AAC9D,QAAI,kBAAkB,UAAa,SAAS,GAAG,MAAM,QAAW;AAC9D,eAAS,GAAG,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MACE,CAAC,oBAAoB,SAAS,OAAO,SAAS,OAAO,cAAc;AAAA,IACrE,OAAO;AAAA,EAAA;AAEX;AAEO,SAAS,qBACd,eACA,UACS;AACT,QAAM,cAAc,mBAAmB,eAAe,QAAQ;AAE9D,SACE,YAAY,SAAS,cAAc,QACnC,KAAK,UAAU,YAAY,SAAS,CAAA,CAAE,MACpC,KAAK,UAAU,cAAc,SAAS,EAAE;AAE9C;"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { QualifiedClassName, SmrtVisibility } from '../scanner/types.js';
|
|
2
|
+
import { RegisteredClass, SmrtObjectConstructor } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a class is already registered (case-insensitive).
|
|
5
|
+
* Returns the canonical name if found, undefined otherwise. Returns
|
|
6
|
+
* undefined if the simple name is ambiguous across multiple packages.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getCanonicalClassName(name: string): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a class exists by name (case-insensitive).
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasClassCaseInsensitive(name: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Helper for class lookup with qualified name support.
|
|
15
|
+
*
|
|
16
|
+
* Lookup priority:
|
|
17
|
+
* 1. Direct hit on classes map (works for qualified names as keys)
|
|
18
|
+
* 2. If input contains ':', prefer direct qualified lookup, then fall back
|
|
19
|
+
* to an exact/simple registration when runtime source imports registered
|
|
20
|
+
* the class before package-qualified promotion happened
|
|
21
|
+
* 3. Simple-name iteration by lowercase
|
|
22
|
+
* - Unambiguous (1 match) → return it
|
|
23
|
+
* - Ambiguous (>1 matches) → log warning, return first
|
|
24
|
+
*/
|
|
25
|
+
export declare function findClass(name: string): RegisteredClass | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Strict class lookup with package-aware disambiguation.
|
|
28
|
+
*
|
|
29
|
+
* Unlike `findClass()` which silently returns the first match when a simple
|
|
30
|
+
* name is ambiguous, this method throws a `ConfigurationError` — making it
|
|
31
|
+
* safe for inheritance-critical paths.
|
|
32
|
+
*
|
|
33
|
+
* @throws {ConfigurationError} When simple name is ambiguous and no package context resolves it
|
|
34
|
+
* @see https://github.com/happyvertical/smrt/issues/1005
|
|
35
|
+
*/
|
|
36
|
+
export declare function findClassStrict(name: string, fromPackage?: string): RegisteredClass | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Qualify an `extends` value with the parent class's package name.
|
|
39
|
+
*
|
|
40
|
+
* @see https://github.com/happyvertical/smrt/issues/1004
|
|
41
|
+
*/
|
|
42
|
+
export declare function qualifyExtendsName(extendsValue: string, currentPackage: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get a registered class by name (case-insensitive).
|
|
45
|
+
*/
|
|
46
|
+
export declare function getClass(name: string): RegisteredClass | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Get a registered class by its constructor reference (O(1) WeakMap lookup).
|
|
49
|
+
*/
|
|
50
|
+
export declare function getClassByConstructor(ctor: SmrtObjectConstructor): RegisteredClass | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Get a registered class by its qualified name (O(1) direct lookup).
|
|
53
|
+
*/
|
|
54
|
+
export declare function getClassByQualifiedName(qualifiedName: string): RegisteredClass | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Get a registered class by package name and class name.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getClassInPackage(packageName: string, className: string): RegisteredClass | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Find all registered classes with a given simple class name.
|
|
61
|
+
*/
|
|
62
|
+
export declare function findClassesByName(className: string): RegisteredClass[];
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a short class name to its qualified name.
|
|
65
|
+
* @throws {Error} If no class or ambiguous classes registered
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveType(shortName: string): QualifiedClassName;
|
|
68
|
+
/**
|
|
69
|
+
* Get all registered classes from a specific package.
|
|
70
|
+
*/
|
|
71
|
+
export declare function getClassesByPackage(packageName: string): Map<string, RegisteredClass>;
|
|
72
|
+
/**
|
|
73
|
+
* Get all registered classes with a specific visibility level.
|
|
74
|
+
*/
|
|
75
|
+
export declare function getClassesByVisibility(visibility: SmrtVisibility): Map<string, RegisteredClass>;
|
|
76
|
+
/**
|
|
77
|
+
* Get all public registered classes.
|
|
78
|
+
*/
|
|
79
|
+
export declare function getPublicClasses(): Map<string, RegisteredClass>;
|
|
80
|
+
/**
|
|
81
|
+
* Get all registered classes.
|
|
82
|
+
*/
|
|
83
|
+
export declare function getAllClasses(): Map<string, RegisteredClass>;
|
|
84
|
+
/**
|
|
85
|
+
* Get class names (simple names, deduplicated).
|
|
86
|
+
*/
|
|
87
|
+
export declare function getClassNames(): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Get lookup names for every registered class without collapsing
|
|
90
|
+
* cross-package simple-name collisions.
|
|
91
|
+
*
|
|
92
|
+
* Prefer each registration's qualified name when available, fall back to the
|
|
93
|
+
* registry key, then to the simple class name for package-less registrations.
|
|
94
|
+
* De-duplicates aliases that point to the same RegisteredClass object while
|
|
95
|
+
* preserving distinct packages that intentionally share a simple class name.
|
|
96
|
+
*/
|
|
97
|
+
export declare function getQualifiedClassNames(): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Check if a class is registered (case-insensitive).
|
|
100
|
+
*/
|
|
101
|
+
export declare function hasClass(name: string): boolean;
|
|
102
|
+
//# sourceMappingURL=name-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/name-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO9E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AA6CtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAuDnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,GAAG,SAAS,CAyC7B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,MAAM,CAkCR;AAID;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,qBAAqB,GAC1B,eAAe,GAAG,SAAS,CAM7B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GACpB,eAAe,GAAG,SAAS,CAE7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,SAAS,CAG7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAWtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAgCjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAClB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAU9B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,cAAc,GACzB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAW9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAE/D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAGxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAqBjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C"}
|