@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,251 @@
|
|
|
1
|
+
import { SmrtObject } from './object.js';
|
|
2
|
+
/**
|
|
3
|
+
* Context passed to interceptors with operation metadata
|
|
4
|
+
*/
|
|
5
|
+
export interface InterceptorContext {
|
|
6
|
+
/** Name of the SMRT class being operated on */
|
|
7
|
+
className: string;
|
|
8
|
+
/** Name of the collection (if applicable) */
|
|
9
|
+
collectionName?: string;
|
|
10
|
+
/** Timestamp of the operation */
|
|
11
|
+
timestamp: Date;
|
|
12
|
+
/** Operation type for debugging */
|
|
13
|
+
operation: 'list' | 'get' | 'query' | 'save' | 'delete';
|
|
14
|
+
/** Additional metadata */
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Options for list operations
|
|
19
|
+
*/
|
|
20
|
+
export interface ListOptions {
|
|
21
|
+
where?: Record<string, unknown>;
|
|
22
|
+
orderBy?: string | string[];
|
|
23
|
+
limit?: number;
|
|
24
|
+
offset?: number;
|
|
25
|
+
include?: string[];
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Options for query operations (raw SQL)
|
|
30
|
+
*/
|
|
31
|
+
export interface QueryOptions {
|
|
32
|
+
/** The raw SQL query */
|
|
33
|
+
sql: string;
|
|
34
|
+
/** Query parameters */
|
|
35
|
+
params: unknown[];
|
|
36
|
+
/** If true, allow raw SQL on tenant-scoped classes (requires explicit opt-in) */
|
|
37
|
+
allowRawOnTenantScoped?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Result from query interceptor - can modify SQL or throw to block
|
|
41
|
+
*/
|
|
42
|
+
export interface QueryInterceptResult {
|
|
43
|
+
sql: string;
|
|
44
|
+
params: unknown[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Interface for collection/object interceptors
|
|
48
|
+
*
|
|
49
|
+
* All methods are optional. Return void to pass through unchanged,
|
|
50
|
+
* or return modified data to transform the operation.
|
|
51
|
+
*/
|
|
52
|
+
export interface CollectionInterceptor {
|
|
53
|
+
/** Unique identifier for this interceptor (for debugging/unregistration) */
|
|
54
|
+
name?: string;
|
|
55
|
+
/** Priority for execution order (higher = earlier). Default: 0 */
|
|
56
|
+
priority?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Called before list() operations
|
|
59
|
+
* @param className - Name of the class being listed
|
|
60
|
+
* @param options - List options (where, orderBy, limit, etc.)
|
|
61
|
+
* @param context - Operation context
|
|
62
|
+
* @returns Modified options or void to pass through
|
|
63
|
+
*/
|
|
64
|
+
beforeList?(className: string, options: ListOptions, context: InterceptorContext): ListOptions | Promise<ListOptions> | void | Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Called after list() operations with results
|
|
67
|
+
* @param className - Name of the class
|
|
68
|
+
* @param results - Array of hydrated instances
|
|
69
|
+
* @param context - Operation context
|
|
70
|
+
* @returns Modified results or void to pass through
|
|
71
|
+
*/
|
|
72
|
+
afterList?<T extends SmrtObject>(className: string, results: T[], context: InterceptorContext): T[] | Promise<T[]> | void | Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Called before get() operations
|
|
75
|
+
* @param className - Name of the class
|
|
76
|
+
* @param filter - ID, slug, or filter object
|
|
77
|
+
* @param context - Operation context
|
|
78
|
+
* @returns Modified filter or void to pass through
|
|
79
|
+
*/
|
|
80
|
+
beforeGet?(className: string, filter: string | Record<string, unknown>, context: InterceptorContext): string | Record<string, unknown> | Promise<string | Record<string, unknown>> | void | Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Called after get() operations with result
|
|
83
|
+
* @param className - Name of the class
|
|
84
|
+
* @param instance - Hydrated instance or null if not found
|
|
85
|
+
* @param context - Operation context
|
|
86
|
+
* @returns Modified instance, null, or void to pass through
|
|
87
|
+
*/
|
|
88
|
+
afterGet?<T extends SmrtObject>(className: string, instance: T | null, context: InterceptorContext): T | null | Promise<T | null> | void | Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Called before query() operations (raw SQL)
|
|
91
|
+
* @param className - Name of the class
|
|
92
|
+
* @param options - Query options with SQL and params
|
|
93
|
+
* @param context - Operation context
|
|
94
|
+
* @returns Modified query options, or throw to block the query
|
|
95
|
+
*/
|
|
96
|
+
beforeQuery?(className: string, options: QueryOptions, context: InterceptorContext): QueryInterceptResult | Promise<QueryInterceptResult> | void | Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Called after query() operations with results
|
|
99
|
+
* @param className - Name of the class
|
|
100
|
+
* @param results - Array of hydrated instances
|
|
101
|
+
* @param context - Operation context
|
|
102
|
+
* @returns Modified results or void to pass through
|
|
103
|
+
*/
|
|
104
|
+
afterQuery?<T extends SmrtObject>(className: string, results: T[], context: InterceptorContext): T[] | Promise<T[]> | void | Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Called before save() operations
|
|
107
|
+
* @param instance - The object being saved
|
|
108
|
+
* @param context - Operation context
|
|
109
|
+
* @returns void (modify instance in place) or throw to block
|
|
110
|
+
*/
|
|
111
|
+
beforeSave?(instance: SmrtObject, context: InterceptorContext): void | Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Called after save() operations
|
|
114
|
+
* @param instance - The saved object
|
|
115
|
+
* @param context - Operation context
|
|
116
|
+
*/
|
|
117
|
+
afterSave?(instance: SmrtObject, context: InterceptorContext): void | Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Called before delete() operations
|
|
120
|
+
* @param instance - The object being deleted
|
|
121
|
+
* @param context - Operation context
|
|
122
|
+
* @returns void or throw to block
|
|
123
|
+
*/
|
|
124
|
+
beforeDelete?(instance: SmrtObject, context: InterceptorContext): void | Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Called after delete() operations
|
|
127
|
+
* @param instance - The deleted object
|
|
128
|
+
* @param context - Operation context
|
|
129
|
+
*/
|
|
130
|
+
afterDelete?(instance: SmrtObject, context: InterceptorContext): void | Promise<void>;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Extend globalThis to include interceptors state.
|
|
134
|
+
* Using globalThis ensures all module instances share the same interceptors,
|
|
135
|
+
* which is critical in monorepos where the same package can be loaded
|
|
136
|
+
* from different paths.
|
|
137
|
+
*
|
|
138
|
+
* @see ObjectRegistry for similar pattern
|
|
139
|
+
*/
|
|
140
|
+
declare global {
|
|
141
|
+
var __smrtInterceptors: unknown[] | undefined;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Global Interceptors Registry
|
|
145
|
+
*
|
|
146
|
+
* Manages collection/object interceptors for the SMRT framework.
|
|
147
|
+
* External packages can register interceptors to hook into operations
|
|
148
|
+
* without modifying core code.
|
|
149
|
+
*/
|
|
150
|
+
export declare class GlobalInterceptors {
|
|
151
|
+
/**
|
|
152
|
+
* Get the global interceptors array (lazy-initialized)
|
|
153
|
+
*/
|
|
154
|
+
private static get interceptors();
|
|
155
|
+
/**
|
|
156
|
+
* Register an interceptor
|
|
157
|
+
*
|
|
158
|
+
* @param interceptor - The interceptor to register
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* GlobalInterceptors.register({
|
|
162
|
+
* name: 'tenancy',
|
|
163
|
+
* priority: 100,
|
|
164
|
+
* beforeList(className, options) {
|
|
165
|
+
* // Add tenant filtering
|
|
166
|
+
* return { ...options, where: { ...options.where, tenantId: 'xxx' } };
|
|
167
|
+
* }
|
|
168
|
+
* });
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
static register(interceptor: CollectionInterceptor): void;
|
|
172
|
+
/**
|
|
173
|
+
* Unregister an interceptor by reference or name
|
|
174
|
+
*
|
|
175
|
+
* @param interceptorOrName - The interceptor instance or name to remove
|
|
176
|
+
* @returns true if removed, false if not found
|
|
177
|
+
*/
|
|
178
|
+
static unregister(interceptorOrName: CollectionInterceptor | string): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Clear all interceptors (useful for testing)
|
|
181
|
+
*/
|
|
182
|
+
static clear(): void;
|
|
183
|
+
/**
|
|
184
|
+
* Get all registered interceptors (readonly)
|
|
185
|
+
*/
|
|
186
|
+
static getAll(): readonly CollectionInterceptor[];
|
|
187
|
+
/**
|
|
188
|
+
* Check if any interceptors are registered
|
|
189
|
+
*/
|
|
190
|
+
static hasInterceptors(): boolean;
|
|
191
|
+
/**
|
|
192
|
+
* Sort interceptors by priority (higher priority first)
|
|
193
|
+
*/
|
|
194
|
+
private static sortByPriority;
|
|
195
|
+
/**
|
|
196
|
+
* Execute beforeList interceptors
|
|
197
|
+
* @internal Called by SmrtCollection.list()
|
|
198
|
+
*/
|
|
199
|
+
static executeBeforeList(className: string, options: ListOptions, context: InterceptorContext): Promise<ListOptions>;
|
|
200
|
+
/**
|
|
201
|
+
* Execute afterList interceptors
|
|
202
|
+
* @internal Called by SmrtCollection.list()
|
|
203
|
+
*/
|
|
204
|
+
static executeAfterList<T extends SmrtObject>(className: string, results: T[], context: InterceptorContext): Promise<T[]>;
|
|
205
|
+
/**
|
|
206
|
+
* Execute beforeGet interceptors
|
|
207
|
+
* @internal Called by SmrtCollection.get()
|
|
208
|
+
*/
|
|
209
|
+
static executeBeforeGet(className: string, filter: string | Record<string, unknown>, context: InterceptorContext): Promise<string | Record<string, unknown>>;
|
|
210
|
+
/**
|
|
211
|
+
* Execute afterGet interceptors
|
|
212
|
+
* @internal Called by SmrtCollection.get()
|
|
213
|
+
*/
|
|
214
|
+
static executeAfterGet<T extends SmrtObject>(className: string, instance: T | null, context: InterceptorContext): Promise<T | null>;
|
|
215
|
+
/**
|
|
216
|
+
* Execute beforeQuery interceptors
|
|
217
|
+
* @internal Called by SmrtCollection.query()
|
|
218
|
+
*/
|
|
219
|
+
static executeBeforeQuery(className: string, options: QueryOptions, context: InterceptorContext): Promise<QueryInterceptResult>;
|
|
220
|
+
/**
|
|
221
|
+
* Execute afterQuery interceptors
|
|
222
|
+
* @internal Called by SmrtCollection.query()
|
|
223
|
+
*/
|
|
224
|
+
static executeAfterQuery<T extends SmrtObject>(className: string, results: T[], context: InterceptorContext): Promise<T[]>;
|
|
225
|
+
/**
|
|
226
|
+
* Execute beforeSave interceptors
|
|
227
|
+
* @internal Called by SmrtObject.save()
|
|
228
|
+
*/
|
|
229
|
+
static executeBeforeSave(instance: SmrtObject, context: InterceptorContext): Promise<void>;
|
|
230
|
+
/**
|
|
231
|
+
* Execute afterSave interceptors
|
|
232
|
+
* @internal Called by SmrtObject.save()
|
|
233
|
+
*/
|
|
234
|
+
static executeAfterSave(instance: SmrtObject, context: InterceptorContext): Promise<void>;
|
|
235
|
+
/**
|
|
236
|
+
* Execute beforeDelete interceptors
|
|
237
|
+
* @internal Called by SmrtObject.delete()
|
|
238
|
+
*/
|
|
239
|
+
static executeBeforeDelete(instance: SmrtObject, context: InterceptorContext): Promise<void>;
|
|
240
|
+
/**
|
|
241
|
+
* Execute afterDelete interceptors
|
|
242
|
+
* @internal Called by SmrtObject.delete()
|
|
243
|
+
*/
|
|
244
|
+
static executeAfterDelete(instance: SmrtObject, context: InterceptorContext): Promise<void>;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Helper function to create an interceptor context
|
|
248
|
+
* @internal
|
|
249
|
+
*/
|
|
250
|
+
export declare function createInterceptorContext(className: string, operation: InterceptorContext['operation'], collectionName?: string, metadata?: Record<string, unknown>): InterceptorContext;
|
|
251
|
+
//# sourceMappingURL=interceptors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../src/interceptors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxD,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,iFAAiF;IACjF,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;OAMG;IACH,UAAU,CAAC,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,kBAAkB,GAC1B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,CAAC,SAAS,UAAU,EAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,kBAAkB,GAC1B,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;;OAMG;IACH,SAAS,CAAC,CACR,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,OAAO,EAAE,kBAAkB,GAEzB,MAAM,GACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACzC,IAAI,GACJ,OAAO,CAAC,IAAI,CAAC,CAAC;IAElB;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,CAAC,SAAS,UAAU,EAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAClB,OAAO,EAAE,kBAAkB,GAC1B,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;;;OAMG;IACH,WAAW,CAAC,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,kBAAkB,GAEzB,oBAAoB,GACpB,OAAO,CAAC,oBAAoB,CAAC,GAC7B,IAAI,GACJ,OAAO,CAAC,IAAI,CAAC,CAAC;IAElB;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,CAAC,SAAS,UAAU,EAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,kBAAkB,GAC1B,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,UAAU,CAAC,CACT,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;OAIG;IACH,SAAS,CAAC,CACR,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;;OAKG;IACH,YAAY,CAAC,CACX,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;OAIG;IACH,WAAW,CAAC,CACV,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,kBAAkB,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,YAAY,GAK9B;IAED;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,GAAG,IAAI;IAkBzD;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,iBAAiB,EAAE,qBAAqB,GAAG,MAAM,GAChD,OAAO;IAaV;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS,qBAAqB,EAAE;IAIjD;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,OAAO;IAIjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B;;;OAGG;WACU,iBAAiB,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC;IAmBvB;;;OAGG;WACU,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAChD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC;IAmBf;;;OAGG;WACU,gBAAgB,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAmB5C;;;OAGG;WACU,eAAe,CAAC,CAAC,SAAS,UAAU,EAC/C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAClB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAepB;;;OAGG;WACU,kBAAkB,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAsBhC;;;OAGG;WACU,iBAAiB,CAAC,CAAC,SAAS,UAAU,EACjD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC;IAmBf;;;OAGG;WACU,iBAAiB,CAC5B,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAQhB;;;OAGG;WACU,gBAAgB,CAC3B,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAQhB;;;OAGG;WACU,mBAAmB,CAC9B,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAQhB;;;OAGG;WACU,kBAAkB,CAC7B,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;CAOjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAC1C,cAAc,CAAC,EAAE,MAAM,EACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,kBAAkB,CAQpB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
class GlobalInterceptors {
|
|
2
|
+
/**
|
|
3
|
+
* Get the global interceptors array (lazy-initialized)
|
|
4
|
+
*/
|
|
5
|
+
static get interceptors() {
|
|
6
|
+
if (!globalThis.__smrtInterceptors) {
|
|
7
|
+
globalThis.__smrtInterceptors = [];
|
|
8
|
+
}
|
|
9
|
+
return globalThis.__smrtInterceptors;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Register an interceptor
|
|
13
|
+
*
|
|
14
|
+
* @param interceptor - The interceptor to register
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* GlobalInterceptors.register({
|
|
18
|
+
* name: 'tenancy',
|
|
19
|
+
* priority: 100,
|
|
20
|
+
* beforeList(className, options) {
|
|
21
|
+
* // Add tenant filtering
|
|
22
|
+
* return { ...options, where: { ...options.where, tenantId: 'xxx' } };
|
|
23
|
+
* }
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
static register(interceptor) {
|
|
28
|
+
if (interceptor.name) {
|
|
29
|
+
const existing = this.interceptors.findIndex(
|
|
30
|
+
(i) => i.name === interceptor.name
|
|
31
|
+
);
|
|
32
|
+
if (existing >= 0) {
|
|
33
|
+
this.interceptors[existing] = interceptor;
|
|
34
|
+
this.sortByPriority();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.interceptors.push(interceptor);
|
|
39
|
+
this.sortByPriority();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Unregister an interceptor by reference or name
|
|
43
|
+
*
|
|
44
|
+
* @param interceptorOrName - The interceptor instance or name to remove
|
|
45
|
+
* @returns true if removed, false if not found
|
|
46
|
+
*/
|
|
47
|
+
static unregister(interceptorOrName) {
|
|
48
|
+
const idx = typeof interceptorOrName === "string" ? this.interceptors.findIndex((i) => i.name === interceptorOrName) : this.interceptors.indexOf(interceptorOrName);
|
|
49
|
+
if (idx >= 0) {
|
|
50
|
+
this.interceptors.splice(idx, 1);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear all interceptors (useful for testing)
|
|
57
|
+
*/
|
|
58
|
+
static clear() {
|
|
59
|
+
globalThis.__smrtInterceptors = [];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all registered interceptors (readonly)
|
|
63
|
+
*/
|
|
64
|
+
static getAll() {
|
|
65
|
+
return [...this.interceptors];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if any interceptors are registered
|
|
69
|
+
*/
|
|
70
|
+
static hasInterceptors() {
|
|
71
|
+
return this.interceptors.length > 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sort interceptors by priority (higher priority first)
|
|
75
|
+
*/
|
|
76
|
+
static sortByPriority() {
|
|
77
|
+
this.interceptors.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
78
|
+
}
|
|
79
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
80
|
+
// Execution methods - called by SmrtCollection and SmrtObject
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Execute beforeList interceptors
|
|
84
|
+
* @internal Called by SmrtCollection.list()
|
|
85
|
+
*/
|
|
86
|
+
static async executeBeforeList(className, options, context) {
|
|
87
|
+
let result = options;
|
|
88
|
+
for (const interceptor of this.interceptors) {
|
|
89
|
+
if (interceptor.beforeList) {
|
|
90
|
+
const modified = await interceptor.beforeList(
|
|
91
|
+
className,
|
|
92
|
+
result,
|
|
93
|
+
context
|
|
94
|
+
);
|
|
95
|
+
if (modified !== void 0 && modified !== null) {
|
|
96
|
+
result = modified;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Execute afterList interceptors
|
|
104
|
+
* @internal Called by SmrtCollection.list()
|
|
105
|
+
*/
|
|
106
|
+
static async executeAfterList(className, results, context) {
|
|
107
|
+
let result = results;
|
|
108
|
+
for (const interceptor of this.interceptors) {
|
|
109
|
+
if (interceptor.afterList) {
|
|
110
|
+
const modified = await interceptor.afterList(
|
|
111
|
+
className,
|
|
112
|
+
result,
|
|
113
|
+
context
|
|
114
|
+
);
|
|
115
|
+
if (modified !== void 0 && modified !== null) {
|
|
116
|
+
result = modified;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Execute beforeGet interceptors
|
|
124
|
+
* @internal Called by SmrtCollection.get()
|
|
125
|
+
*/
|
|
126
|
+
static async executeBeforeGet(className, filter, context) {
|
|
127
|
+
let result = filter;
|
|
128
|
+
for (const interceptor of this.interceptors) {
|
|
129
|
+
if (interceptor.beforeGet) {
|
|
130
|
+
const modified = await interceptor.beforeGet(
|
|
131
|
+
className,
|
|
132
|
+
result,
|
|
133
|
+
context
|
|
134
|
+
);
|
|
135
|
+
if (modified !== void 0 && modified !== null) {
|
|
136
|
+
result = modified;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Execute afterGet interceptors
|
|
144
|
+
* @internal Called by SmrtCollection.get()
|
|
145
|
+
*/
|
|
146
|
+
static async executeAfterGet(className, instance, context) {
|
|
147
|
+
let result = instance;
|
|
148
|
+
for (const interceptor of this.interceptors) {
|
|
149
|
+
if (interceptor.afterGet) {
|
|
150
|
+
const modified = await interceptor.afterGet(className, result, context);
|
|
151
|
+
if (modified !== void 0) {
|
|
152
|
+
result = modified;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Execute beforeQuery interceptors
|
|
160
|
+
* @internal Called by SmrtCollection.query()
|
|
161
|
+
*/
|
|
162
|
+
static async executeBeforeQuery(className, options, context) {
|
|
163
|
+
let result = {
|
|
164
|
+
sql: options.sql,
|
|
165
|
+
params: options.params
|
|
166
|
+
};
|
|
167
|
+
for (const interceptor of this.interceptors) {
|
|
168
|
+
if (interceptor.beforeQuery) {
|
|
169
|
+
const modified = await interceptor.beforeQuery(
|
|
170
|
+
className,
|
|
171
|
+
{ ...options, ...result },
|
|
172
|
+
context
|
|
173
|
+
);
|
|
174
|
+
if (modified !== void 0 && modified !== null) {
|
|
175
|
+
result = modified;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Execute afterQuery interceptors
|
|
183
|
+
* @internal Called by SmrtCollection.query()
|
|
184
|
+
*/
|
|
185
|
+
static async executeAfterQuery(className, results, context) {
|
|
186
|
+
let result = results;
|
|
187
|
+
for (const interceptor of this.interceptors) {
|
|
188
|
+
if (interceptor.afterQuery) {
|
|
189
|
+
const modified = await interceptor.afterQuery(
|
|
190
|
+
className,
|
|
191
|
+
result,
|
|
192
|
+
context
|
|
193
|
+
);
|
|
194
|
+
if (modified !== void 0 && modified !== null) {
|
|
195
|
+
result = modified;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Execute beforeSave interceptors
|
|
203
|
+
* @internal Called by SmrtObject.save()
|
|
204
|
+
*/
|
|
205
|
+
static async executeBeforeSave(instance, context) {
|
|
206
|
+
for (const interceptor of this.interceptors) {
|
|
207
|
+
if (interceptor.beforeSave) {
|
|
208
|
+
await interceptor.beforeSave(instance, context);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Execute afterSave interceptors
|
|
214
|
+
* @internal Called by SmrtObject.save()
|
|
215
|
+
*/
|
|
216
|
+
static async executeAfterSave(instance, context) {
|
|
217
|
+
for (const interceptor of this.interceptors) {
|
|
218
|
+
if (interceptor.afterSave) {
|
|
219
|
+
await interceptor.afterSave(instance, context);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Execute beforeDelete interceptors
|
|
225
|
+
* @internal Called by SmrtObject.delete()
|
|
226
|
+
*/
|
|
227
|
+
static async executeBeforeDelete(instance, context) {
|
|
228
|
+
for (const interceptor of this.interceptors) {
|
|
229
|
+
if (interceptor.beforeDelete) {
|
|
230
|
+
await interceptor.beforeDelete(instance, context);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Execute afterDelete interceptors
|
|
236
|
+
* @internal Called by SmrtObject.delete()
|
|
237
|
+
*/
|
|
238
|
+
static async executeAfterDelete(instance, context) {
|
|
239
|
+
for (const interceptor of this.interceptors) {
|
|
240
|
+
if (interceptor.afterDelete) {
|
|
241
|
+
await interceptor.afterDelete(instance, context);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function createInterceptorContext(className, operation, collectionName, metadata) {
|
|
247
|
+
return {
|
|
248
|
+
className,
|
|
249
|
+
collectionName,
|
|
250
|
+
operation,
|
|
251
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
252
|
+
metadata
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
export {
|
|
256
|
+
GlobalInterceptors,
|
|
257
|
+
createInterceptorContext
|
|
258
|
+
};
|
|
259
|
+
//# sourceMappingURL=interceptors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptors.js","sources":["../src/interceptors.ts"],"sourcesContent":["/**\n * Global Interceptors System for SMRT Collections and Objects\n *\n * Provides a plugin architecture for intercepting collection and object operations.\n * This enables external packages (like @happyvertical/smrt-tenancy) to register\n * interceptors without creating circular dependencies.\n *\n * Pattern: Static methods on GlobalInterceptors class with globalThis state\n * (matches ObjectRegistry pattern for cross-module state sharing)\n *\n * @example Basic interceptor registration\n * ```typescript\n * import { GlobalInterceptors } from '@happyvertical/smrt-core';\n *\n * // Register a beforeList interceptor\n * GlobalInterceptors.register({\n * beforeList(className, options) {\n * console.log(`Listing ${className}`);\n * return options; // Return modified options\n * }\n * });\n * ```\n *\n * @example Tenancy interceptor (from smrt-tenancy)\n * ```typescript\n * GlobalInterceptors.register({\n * beforeList(className, options, context) {\n * const tenantId = getCurrentTenantId();\n * if (tenantId && isTenantScoped(className)) {\n * return {\n * ...options,\n * where: { ...options.where, tenantId }\n * };\n * }\n * return options;\n * },\n * beforeSave(instance, context) {\n * // Validate tenant on save\n * }\n * });\n * ```\n *\n * @see https://github.com/happyvertical/smrt/issues/675\n */\n\nimport type { SmrtObject } from './object.js';\n\n/**\n * Context passed to interceptors with operation metadata\n */\nexport interface InterceptorContext {\n /** Name of the SMRT class being operated on */\n className: string;\n /** Name of the collection (if applicable) */\n collectionName?: string;\n /** Timestamp of the operation */\n timestamp: Date;\n /** Operation type for debugging */\n operation: 'list' | 'get' | 'query' | 'save' | 'delete';\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for list operations\n */\nexport interface ListOptions {\n where?: Record<string, unknown>;\n orderBy?: string | string[];\n limit?: number;\n offset?: number;\n include?: string[];\n [key: string]: unknown;\n}\n\n/**\n * Options for query operations (raw SQL)\n */\nexport interface QueryOptions {\n /** The raw SQL query */\n sql: string;\n /** Query parameters */\n params: unknown[];\n /** If true, allow raw SQL on tenant-scoped classes (requires explicit opt-in) */\n allowRawOnTenantScoped?: boolean;\n}\n\n/**\n * Result from query interceptor - can modify SQL or throw to block\n */\nexport interface QueryInterceptResult {\n sql: string;\n params: unknown[];\n}\n\n/**\n * Interface for collection/object interceptors\n *\n * All methods are optional. Return void to pass through unchanged,\n * or return modified data to transform the operation.\n */\nexport interface CollectionInterceptor {\n /** Unique identifier for this interceptor (for debugging/unregistration) */\n name?: string;\n\n /** Priority for execution order (higher = earlier). Default: 0 */\n priority?: number;\n\n /**\n * Called before list() operations\n * @param className - Name of the class being listed\n * @param options - List options (where, orderBy, limit, etc.)\n * @param context - Operation context\n * @returns Modified options or void to pass through\n */\n beforeList?(\n className: string,\n options: ListOptions,\n context: InterceptorContext,\n ): ListOptions | Promise<ListOptions> | void | Promise<void>;\n\n /**\n * Called after list() operations with results\n * @param className - Name of the class\n * @param results - Array of hydrated instances\n * @param context - Operation context\n * @returns Modified results or void to pass through\n */\n afterList?<T extends SmrtObject>(\n className: string,\n results: T[],\n context: InterceptorContext,\n ): T[] | Promise<T[]> | void | Promise<void>;\n\n /**\n * Called before get() operations\n * @param className - Name of the class\n * @param filter - ID, slug, or filter object\n * @param context - Operation context\n * @returns Modified filter or void to pass through\n */\n beforeGet?(\n className: string,\n filter: string | Record<string, unknown>,\n context: InterceptorContext,\n ):\n | string\n | Record<string, unknown>\n | Promise<string | Record<string, unknown>>\n | void\n | Promise<void>;\n\n /**\n * Called after get() operations with result\n * @param className - Name of the class\n * @param instance - Hydrated instance or null if not found\n * @param context - Operation context\n * @returns Modified instance, null, or void to pass through\n */\n afterGet?<T extends SmrtObject>(\n className: string,\n instance: T | null,\n context: InterceptorContext,\n ): T | null | Promise<T | null> | void | Promise<void>;\n\n /**\n * Called before query() operations (raw SQL)\n * @param className - Name of the class\n * @param options - Query options with SQL and params\n * @param context - Operation context\n * @returns Modified query options, or throw to block the query\n */\n beforeQuery?(\n className: string,\n options: QueryOptions,\n context: InterceptorContext,\n ):\n | QueryInterceptResult\n | Promise<QueryInterceptResult>\n | void\n | Promise<void>;\n\n /**\n * Called after query() operations with results\n * @param className - Name of the class\n * @param results - Array of hydrated instances\n * @param context - Operation context\n * @returns Modified results or void to pass through\n */\n afterQuery?<T extends SmrtObject>(\n className: string,\n results: T[],\n context: InterceptorContext,\n ): T[] | Promise<T[]> | void | Promise<void>;\n\n /**\n * Called before save() operations\n * @param instance - The object being saved\n * @param context - Operation context\n * @returns void (modify instance in place) or throw to block\n */\n beforeSave?(\n instance: SmrtObject,\n context: InterceptorContext,\n ): void | Promise<void>;\n\n /**\n * Called after save() operations\n * @param instance - The saved object\n * @param context - Operation context\n */\n afterSave?(\n instance: SmrtObject,\n context: InterceptorContext,\n ): void | Promise<void>;\n\n /**\n * Called before delete() operations\n * @param instance - The object being deleted\n * @param context - Operation context\n * @returns void or throw to block\n */\n beforeDelete?(\n instance: SmrtObject,\n context: InterceptorContext,\n ): void | Promise<void>;\n\n /**\n * Called after delete() operations\n * @param instance - The deleted object\n * @param context - Operation context\n */\n afterDelete?(\n instance: SmrtObject,\n context: InterceptorContext,\n ): void | Promise<void>;\n}\n\n/**\n * Extend globalThis to include interceptors state.\n * Using globalThis ensures all module instances share the same interceptors,\n * which is critical in monorepos where the same package can be loaded\n * from different paths.\n *\n * @see ObjectRegistry for similar pattern\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __smrtInterceptors: unknown[] | undefined;\n}\n\n/**\n * Global Interceptors Registry\n *\n * Manages collection/object interceptors for the SMRT framework.\n * External packages can register interceptors to hook into operations\n * without modifying core code.\n */\nexport class GlobalInterceptors {\n /**\n * Get the global interceptors array (lazy-initialized)\n */\n private static get interceptors(): CollectionInterceptor[] {\n if (!globalThis.__smrtInterceptors) {\n globalThis.__smrtInterceptors = [];\n }\n return globalThis.__smrtInterceptors as CollectionInterceptor[];\n }\n\n /**\n * Register an interceptor\n *\n * @param interceptor - The interceptor to register\n * @example\n * ```typescript\n * GlobalInterceptors.register({\n * name: 'tenancy',\n * priority: 100,\n * beforeList(className, options) {\n * // Add tenant filtering\n * return { ...options, where: { ...options.where, tenantId: 'xxx' } };\n * }\n * });\n * ```\n */\n static register(interceptor: CollectionInterceptor): void {\n // Check for duplicate by name\n if (interceptor.name) {\n const existing = this.interceptors.findIndex(\n (i) => i.name === interceptor.name,\n );\n if (existing >= 0) {\n // Replace existing interceptor with same name\n this.interceptors[existing] = interceptor;\n this.sortByPriority();\n return;\n }\n }\n\n this.interceptors.push(interceptor);\n this.sortByPriority();\n }\n\n /**\n * Unregister an interceptor by reference or name\n *\n * @param interceptorOrName - The interceptor instance or name to remove\n * @returns true if removed, false if not found\n */\n static unregister(\n interceptorOrName: CollectionInterceptor | string,\n ): boolean {\n const idx =\n typeof interceptorOrName === 'string'\n ? this.interceptors.findIndex((i) => i.name === interceptorOrName)\n : this.interceptors.indexOf(interceptorOrName);\n\n if (idx >= 0) {\n this.interceptors.splice(idx, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Clear all interceptors (useful for testing)\n */\n static clear(): void {\n globalThis.__smrtInterceptors = [];\n }\n\n /**\n * Get all registered interceptors (readonly)\n */\n static getAll(): readonly CollectionInterceptor[] {\n return [...this.interceptors];\n }\n\n /**\n * Check if any interceptors are registered\n */\n static hasInterceptors(): boolean {\n return this.interceptors.length > 0;\n }\n\n /**\n * Sort interceptors by priority (higher priority first)\n */\n private static sortByPriority(): void {\n this.interceptors.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Execution methods - called by SmrtCollection and SmrtObject\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Execute beforeList interceptors\n * @internal Called by SmrtCollection.list()\n */\n static async executeBeforeList(\n className: string,\n options: ListOptions,\n context: InterceptorContext,\n ): Promise<ListOptions> {\n let result = options;\n\n for (const interceptor of this.interceptors) {\n if (interceptor.beforeList) {\n const modified = await interceptor.beforeList(\n className,\n result,\n context,\n );\n if (modified !== undefined && modified !== null) {\n result = modified;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute afterList interceptors\n * @internal Called by SmrtCollection.list()\n */\n static async executeAfterList<T extends SmrtObject>(\n className: string,\n results: T[],\n context: InterceptorContext,\n ): Promise<T[]> {\n let result = results;\n\n for (const interceptor of this.interceptors) {\n if (interceptor.afterList) {\n const modified = await interceptor.afterList(\n className,\n result,\n context,\n );\n if (modified !== undefined && modified !== null) {\n result = modified as T[];\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute beforeGet interceptors\n * @internal Called by SmrtCollection.get()\n */\n static async executeBeforeGet(\n className: string,\n filter: string | Record<string, unknown>,\n context: InterceptorContext,\n ): Promise<string | Record<string, unknown>> {\n let result = filter;\n\n for (const interceptor of this.interceptors) {\n if (interceptor.beforeGet) {\n const modified = await interceptor.beforeGet(\n className,\n result,\n context,\n );\n if (modified !== undefined && modified !== null) {\n result = modified;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute afterGet interceptors\n * @internal Called by SmrtCollection.get()\n */\n static async executeAfterGet<T extends SmrtObject>(\n className: string,\n instance: T | null,\n context: InterceptorContext,\n ): Promise<T | null> {\n let result = instance;\n\n for (const interceptor of this.interceptors) {\n if (interceptor.afterGet) {\n const modified = await interceptor.afterGet(className, result, context);\n if (modified !== undefined) {\n result = modified as T | null;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute beforeQuery interceptors\n * @internal Called by SmrtCollection.query()\n */\n static async executeBeforeQuery(\n className: string,\n options: QueryOptions,\n context: InterceptorContext,\n ): Promise<QueryInterceptResult> {\n let result: QueryInterceptResult = {\n sql: options.sql,\n params: options.params,\n };\n\n for (const interceptor of this.interceptors) {\n if (interceptor.beforeQuery) {\n const modified = await interceptor.beforeQuery(\n className,\n { ...options, ...result },\n context,\n );\n if (modified !== undefined && modified !== null) {\n result = modified;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute afterQuery interceptors\n * @internal Called by SmrtCollection.query()\n */\n static async executeAfterQuery<T extends SmrtObject>(\n className: string,\n results: T[],\n context: InterceptorContext,\n ): Promise<T[]> {\n let result = results;\n\n for (const interceptor of this.interceptors) {\n if (interceptor.afterQuery) {\n const modified = await interceptor.afterQuery(\n className,\n result,\n context,\n );\n if (modified !== undefined && modified !== null) {\n result = modified as T[];\n }\n }\n }\n\n return result;\n }\n\n /**\n * Execute beforeSave interceptors\n * @internal Called by SmrtObject.save()\n */\n static async executeBeforeSave(\n instance: SmrtObject,\n context: InterceptorContext,\n ): Promise<void> {\n for (const interceptor of this.interceptors) {\n if (interceptor.beforeSave) {\n await interceptor.beforeSave(instance, context);\n }\n }\n }\n\n /**\n * Execute afterSave interceptors\n * @internal Called by SmrtObject.save()\n */\n static async executeAfterSave(\n instance: SmrtObject,\n context: InterceptorContext,\n ): Promise<void> {\n for (const interceptor of this.interceptors) {\n if (interceptor.afterSave) {\n await interceptor.afterSave(instance, context);\n }\n }\n }\n\n /**\n * Execute beforeDelete interceptors\n * @internal Called by SmrtObject.delete()\n */\n static async executeBeforeDelete(\n instance: SmrtObject,\n context: InterceptorContext,\n ): Promise<void> {\n for (const interceptor of this.interceptors) {\n if (interceptor.beforeDelete) {\n await interceptor.beforeDelete(instance, context);\n }\n }\n }\n\n /**\n * Execute afterDelete interceptors\n * @internal Called by SmrtObject.delete()\n */\n static async executeAfterDelete(\n instance: SmrtObject,\n context: InterceptorContext,\n ): Promise<void> {\n for (const interceptor of this.interceptors) {\n if (interceptor.afterDelete) {\n await interceptor.afterDelete(instance, context);\n }\n }\n }\n}\n\n/**\n * Helper function to create an interceptor context\n * @internal\n */\nexport function createInterceptorContext(\n className: string,\n operation: InterceptorContext['operation'],\n collectionName?: string,\n metadata?: Record<string, unknown>,\n): InterceptorContext {\n return {\n className,\n collectionName,\n operation,\n timestamp: new Date(),\n metadata,\n };\n}\n"],"names":[],"mappings":"AAkQO,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAI9B,WAAmB,eAAwC;AACzD,QAAI,CAAC,WAAW,oBAAoB;AAClC,iBAAW,qBAAqB,CAAA;AAAA,IAClC;AACA,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,SAAS,aAA0C;AAExD,QAAI,YAAY,MAAM;AACpB,YAAM,WAAW,KAAK,aAAa;AAAA,QACjC,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAAA;AAEhC,UAAI,YAAY,GAAG;AAEjB,aAAK,aAAa,QAAQ,IAAI;AAC9B,aAAK,eAAA;AACL;AAAA,MACF;AAAA,IACF;AAEA,SAAK,aAAa,KAAK,WAAW;AAClC,SAAK,eAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WACL,mBACS;AACT,UAAM,MACJ,OAAO,sBAAsB,WACzB,KAAK,aAAa,UAAU,CAAC,MAAM,EAAE,SAAS,iBAAiB,IAC/D,KAAK,aAAa,QAAQ,iBAAiB;AAEjD,QAAI,OAAO,GAAG;AACZ,WAAK,aAAa,OAAO,KAAK,CAAC;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAc;AACnB,eAAW,qBAAqB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAA2C;AAChD,WAAO,CAAC,GAAG,KAAK,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAA2B;AAChC,WAAO,KAAK,aAAa,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iBAAuB;AACpC,SAAK,aAAa,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,kBACX,WACA,SACA,SACsB;AACtB,QAAI,SAAS;AAEb,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,YAAY;AAC1B,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,iBACX,WACA,SACA,SACc;AACd,QAAI,SAAS;AAEb,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,WAAW;AACzB,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,iBACX,WACA,QACA,SAC2C;AAC3C,QAAI,SAAS;AAEb,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,WAAW;AACzB,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,gBACX,WACA,UACA,SACmB;AACnB,QAAI,SAAS;AAEb,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,UAAU;AACxB,cAAM,WAAW,MAAM,YAAY,SAAS,WAAW,QAAQ,OAAO;AACtE,YAAI,aAAa,QAAW;AAC1B,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,mBACX,WACA,SACA,SAC+B;AAC/B,QAAI,SAA+B;AAAA,MACjC,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IAAA;AAGlB,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,aAAa;AAC3B,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA,EAAE,GAAG,SAAS,GAAG,OAAA;AAAA,UACjB;AAAA,QAAA;AAEF,YAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,kBACX,WACA,SACA,SACc;AACd,QAAI,SAAS;AAEb,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,YAAY;AAC1B,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,kBACX,UACA,SACe;AACf,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,YAAY;AAC1B,cAAM,YAAY,WAAW,UAAU,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,iBACX,UACA,SACe;AACf,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,WAAW;AACzB,cAAM,YAAY,UAAU,UAAU,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,oBACX,UACA,SACe;AACf,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,cAAc;AAC5B,cAAM,YAAY,aAAa,UAAU,OAAO;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,mBACX,UACA,SACe;AACf,eAAW,eAAe,KAAK,cAAc;AAC3C,UAAI,YAAY,aAAa;AAC3B,cAAM,YAAY,YAAY,UAAU,OAAO;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,yBACd,WACA,WACA,gBACA,UACoB;AACpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,+BAAe,KAAA;AAAA,IACf;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { SmrtCollection } from './collection';
|
|
2
|
+
import { SmrtObject } from './object';
|
|
3
|
+
/**
|
|
4
|
+
* Options passed to `attach` / `setLinks` — written into the created junction row.
|
|
5
|
+
*
|
|
6
|
+
* Common keys: `relationship`, `role`, `sortOrder`, `tenantId`.
|
|
7
|
+
* Subclass-specific keys (e.g. `placement`, `groupId` on EventParticipant) pass through.
|
|
8
|
+
* Keys must match actual camelCase column names on the junction model; unknown
|
|
9
|
+
* keys are rejected by `SmrtCollection.create`'s WHERE/field validation.
|
|
10
|
+
*/
|
|
11
|
+
export type JunctionAttachOptions = Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Options passed to `byLeft` / `byRight` / `detach` — additional WHERE filters
|
|
14
|
+
* narrowing the operation. Keys must match camelCase column names.
|
|
15
|
+
*/
|
|
16
|
+
export type JunctionFilterOptions = Record<string, unknown>;
|
|
17
|
+
export declare abstract class SmrtJunction<TItem extends SmrtObject> extends SmrtCollection<TItem> {
|
|
18
|
+
/**
|
|
19
|
+
* Internal marker used by `SmrtCollection.create` to detect that this
|
|
20
|
+
* subclass is a junction and apply a registration-presence guard. Static
|
|
21
|
+
* property is inherited by all subclasses via the constructor chain.
|
|
22
|
+
* Don't rename or remove without also updating the guard.
|
|
23
|
+
*/
|
|
24
|
+
static readonly _isJunctionBase: true;
|
|
25
|
+
/** Field name (camelCase) holding the "left" foreign key, e.g. `'contentId'`. */
|
|
26
|
+
protected abstract leftField: string;
|
|
27
|
+
/** Field name (camelCase) holding the "right" foreign key, e.g. `'assetId'`. */
|
|
28
|
+
protected abstract rightField: string;
|
|
29
|
+
/**
|
|
30
|
+
* Field name (camelCase) used to ORDER BY when calling `byLeft` / `byRight`.
|
|
31
|
+
* Defaults to `'sortOrder'`. Set to `null` to omit ORDER BY entirely.
|
|
32
|
+
*
|
|
33
|
+
* Independent from `positionField` — `sortField` is a *query* concern
|
|
34
|
+
* (how rows are ordered when read), while `positionField` is a *write*
|
|
35
|
+
* concern (what column `setLinks` auto-assigns to). Tables that order
|
|
36
|
+
* by a non-position field (e.g. `'createdAt'`) should set `sortField`
|
|
37
|
+
* accordingly and leave `positionField` set to `null` or its dedicated
|
|
38
|
+
* position column name.
|
|
39
|
+
*/
|
|
40
|
+
protected sortField: string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Field name (camelCase) that `setLinks` auto-assigns the array index
|
|
43
|
+
* to when the caller doesn't supply a value. Defaults to `'sortOrder'`.
|
|
44
|
+
* Set to `null` for tables without a dedicated position column (e.g.
|
|
45
|
+
* pure-key junctions, or tables ordered by timestamps).
|
|
46
|
+
*
|
|
47
|
+
* Writing the array index into a non-position field — like `createdAt`
|
|
48
|
+
* or `placement` — would corrupt data. Subclasses without a numeric
|
|
49
|
+
* position column MUST set this to `null`.
|
|
50
|
+
*/
|
|
51
|
+
protected positionField: string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Return junction rows where the left FK matches `leftId`, narrowed by
|
|
54
|
+
* optional additional WHERE filters. Ordered ASC by `sortField` if set.
|
|
55
|
+
*/
|
|
56
|
+
byLeft(leftId: string, opts?: JunctionFilterOptions): Promise<TItem[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Return junction rows where the right FK matches `rightId`, narrowed by
|
|
59
|
+
* optional additional WHERE filters. Ordered ASC by `sortField` if set.
|
|
60
|
+
*/
|
|
61
|
+
byRight(rightId: string, opts?: JunctionFilterOptions): Promise<TItem[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Create a new junction row linking `leftId` ↔ `rightId`.
|
|
64
|
+
*
|
|
65
|
+
* Goes through `SmrtCollection.create` which performs an upsert keyed on
|
|
66
|
+
* the model's `@smrt({ conflictColumns })`. Duplicates on the conflict key
|
|
67
|
+
* resolve to an UPDATE that rewrites every column — including the row's
|
|
68
|
+
* `id` and any timestamp columns — to the new instance's values. For most
|
|
69
|
+
* junctions that's fine: callers identify rows by (left, right, discriminator),
|
|
70
|
+
* not by junction-row-id, so id rewrites are invisible.
|
|
71
|
+
*
|
|
72
|
+
* If your junction table is externally addressable by id (e.g. its rows
|
|
73
|
+
* are exposed under `/api/v1/<table>/[id]`), override this method with a
|
|
74
|
+
* find-or-create check to preserve id stability across duplicate calls.
|
|
75
|
+
* See `ContentReferences.attach` for an example.
|
|
76
|
+
*
|
|
77
|
+
* @param opts - Extra fields to write into the row (e.g. `{ relationship, sortOrder, tenantId }`)
|
|
78
|
+
*/
|
|
79
|
+
attach(leftId: string, rightId: string, opts?: JunctionAttachOptions): Promise<TItem>;
|
|
80
|
+
/**
|
|
81
|
+
* Delete all junction rows matching `leftId` + `rightId` (+ optional filter `opts`).
|
|
82
|
+
*
|
|
83
|
+
* @param opts - Additional WHERE filters (e.g. `{ relationship: 'thumbnail' }`)
|
|
84
|
+
*/
|
|
85
|
+
detach(leftId: string, rightId: string, opts?: JunctionFilterOptions): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Replace the full set of right-side rows for a `leftId`, scoped by `opts`.
|
|
88
|
+
*
|
|
89
|
+
* Behavior:
|
|
90
|
+
* 1. Snapshots and deletes existing rows matching `{ leftField: leftId, ...opts }`.
|
|
91
|
+
* 2. Creates a new row for each `rightId`, spreading `opts` into the row data.
|
|
92
|
+
* 3. If `positionField` is set and `opts` doesn't specify it, assigns the array index.
|
|
93
|
+
*
|
|
94
|
+
* Not transactional — partial failure leaves the table in a mixed state.
|
|
95
|
+
* For atomic replaces, wrap the call in your own DB transaction.
|
|
96
|
+
*/
|
|
97
|
+
setLinks(leftId: string, rightIds: string[], opts?: JunctionAttachOptions): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=junction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"junction.d.ts","sourceRoot":"","sources":["../src/junction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAM5D,8BAAsB,YAAY,CAChC,KAAK,SAAS,UAAU,CACxB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAG,IAAI,CAAU;IAEhD,iFAAiF;IACjF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC,gFAAgF;IAChF,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAEtC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAe;IAEjD;;;;;;;;;OASG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAe;IAErD;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;IAYnB;;;OAGG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;IASnB;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,KAAK,CAAC;IAWjB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;;;;;OAUG;IACG,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC;CAwBjB"}
|