@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
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { classnameToTablename, pluralize, toSnakeCase } from './utils/naming.js';
|
|
2
|
+
export { classnameToTablename, pluralize, toSnakeCase };
|
|
3
|
+
/**
|
|
4
|
+
* Converts a snake_case string to camelCase
|
|
5
|
+
*
|
|
6
|
+
* @param str - String in snake_case format
|
|
7
|
+
* @returns String in camelCase format
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* toCamelCase('meetings_url'); // 'meetingsUrl'
|
|
11
|
+
* toCamelCase('created_at'); // 'createdAt'
|
|
12
|
+
* toCamelCase('id'); // 'id'
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function toCamelCase(str: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Converts all keys in an object from camelCase to snake_case
|
|
18
|
+
*
|
|
19
|
+
* @param obj - Object with camelCase keys
|
|
20
|
+
* @returns Object with snake_case keys
|
|
21
|
+
*/
|
|
22
|
+
export declare function keysToSnakeCase(obj: Record<string, any>): Record<string, any>;
|
|
23
|
+
/**
|
|
24
|
+
* Converts all keys in an object from snake_case to camelCase
|
|
25
|
+
*
|
|
26
|
+
* @param obj - Object with snake_case keys
|
|
27
|
+
* @returns Object with camelCase keys
|
|
28
|
+
*/
|
|
29
|
+
export declare function keysToCamelCase(obj: Record<string, any>): Record<string, any>;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a field name indicates a date field based on naming conventions
|
|
32
|
+
*
|
|
33
|
+
* Recognizes common date field patterns like '_at', '_date', and 'date'.
|
|
34
|
+
* Used for automatic type inference during schema generation.
|
|
35
|
+
*
|
|
36
|
+
* @param key - Field name to check
|
|
37
|
+
* @returns Boolean indicating if the field is likely a date field
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* isDateField('created_at'); // true
|
|
41
|
+
* isDateField('updated_date'); // true
|
|
42
|
+
* isDateField('name'); // false
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function isDateField(key: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Converts a date string to a Date object
|
|
48
|
+
*
|
|
49
|
+
* @param date - Date as string or Date object
|
|
50
|
+
* @returns Date object
|
|
51
|
+
*/
|
|
52
|
+
export declare function dateAsString(date: Date | string): Date;
|
|
53
|
+
/**
|
|
54
|
+
* Converts a Date object to an ISO string
|
|
55
|
+
*
|
|
56
|
+
* @param date - Date as Date object or string
|
|
57
|
+
* @returns ISO date string or the original string
|
|
58
|
+
*/
|
|
59
|
+
export declare function dateAsObject(date: Date | string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Extracts field definitions from a class constructor
|
|
62
|
+
*
|
|
63
|
+
* Uses ObjectRegistry cached fields from AST manifest exclusively.
|
|
64
|
+
* No runtime introspection fallback - classes must be decorated with @smrt()
|
|
65
|
+
* for schema generation to work.
|
|
66
|
+
*
|
|
67
|
+
* @param ClassType - Class constructor to extract fields from
|
|
68
|
+
* @param values - Optional values to set for the fields
|
|
69
|
+
* @returns Object containing field definitions with names, types, and values
|
|
70
|
+
* @throws {Error} If the class is not registered in ObjectRegistry
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* @smrt()
|
|
74
|
+
* class Product extends SmrtObject {
|
|
75
|
+
* name: string = '';
|
|
76
|
+
* price: number = 0.0;
|
|
77
|
+
* }
|
|
78
|
+
*
|
|
79
|
+
* const fields = await fieldsFromClass(Product);
|
|
80
|
+
* console.log(fields.name.type); // 'TEXT'
|
|
81
|
+
* console.log(fields.price.type); // 'REAL'
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function fieldsFromClass(ClassType: new (...args: any[]) => any, values?: Record<string, any>): Promise<Record<string, any>>;
|
|
85
|
+
/**
|
|
86
|
+
* Returns the old (incorrect) pluralized table name for migration purposes.
|
|
87
|
+
*
|
|
88
|
+
* This function replicates the previous buggy behavior where 'y' → 'ies'
|
|
89
|
+
* transformation was applied AFTER adding 's', resulting in incorrect
|
|
90
|
+
* pluralization (e.g., 'currency' → 'currencys' instead of 'currencies').
|
|
91
|
+
*
|
|
92
|
+
* Use this to generate migration SQL that renames old tables to new names.
|
|
93
|
+
*
|
|
94
|
+
* @param className - Name of the class
|
|
95
|
+
* @returns The incorrectly pluralized table name (old behavior)
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Generate migration for a class
|
|
99
|
+
* const oldName = legacyClassnameToTablename('Currency'); // 'currencys'
|
|
100
|
+
* const newName = classnameToTablename('Currency'); // 'currencies'
|
|
101
|
+
* console.log(`ALTER TABLE ${oldName} RENAME TO ${newName};`);
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function legacyClassnameToTablename(className: string): string;
|
|
105
|
+
/**
|
|
106
|
+
* Generates migration SQL for renaming tables from old to new naming convention.
|
|
107
|
+
*
|
|
108
|
+
* Returns an array of SQL statements to rename tables that were affected
|
|
109
|
+
* by the pluralization bug (Issue #839).
|
|
110
|
+
*
|
|
111
|
+
* @param classNames - Array of class names to check for migration
|
|
112
|
+
* @returns Array of SQL RENAME statements (empty if no changes needed)
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const migrations = generateTableRenameMigrations([
|
|
116
|
+
* 'Currency',
|
|
117
|
+
* 'JournalEntry',
|
|
118
|
+
* 'Product' // Not affected
|
|
119
|
+
* ]);
|
|
120
|
+
* // Returns:
|
|
121
|
+
* // [
|
|
122
|
+
* // 'ALTER TABLE currencys RENAME TO currencies;',
|
|
123
|
+
* // 'ALTER TABLE journal_entrys RENAME TO journal_entries;'
|
|
124
|
+
* // ]
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function generateTableRenameMigrations(classNames: string[]): string[];
|
|
128
|
+
/**
|
|
129
|
+
* Generates a table name from a class constructor
|
|
130
|
+
*
|
|
131
|
+
* Checks for SMRT_TABLE_NAME static property first (set by @smrt() decorator),
|
|
132
|
+
* which survives code minification. Falls back to deriving from ClassType.name
|
|
133
|
+
* for backward compatibility.
|
|
134
|
+
*
|
|
135
|
+
* @param ClassType - Class constructor or function
|
|
136
|
+
* @returns Pluralized snake_case table name
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* // With @smrt() decorator (recommended)
|
|
140
|
+
* @smrt()
|
|
141
|
+
* class Product extends SmrtObject { }
|
|
142
|
+
* tableNameFromClass(Product); // "products" (captured before minification)
|
|
143
|
+
*
|
|
144
|
+
* // Without decorator (fallback)
|
|
145
|
+
* class Category extends SmrtObject { }
|
|
146
|
+
* tableNameFromClass(Category); // "categories" (derived from runtime name)
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export declare function tableNameFromClass(ClassType: Function | (new (...args: any[]) => any)): any;
|
|
150
|
+
/**
|
|
151
|
+
* Formats data for JavaScript by converting date strings to Date objects
|
|
152
|
+
* and snake_case column names to camelCase properties
|
|
153
|
+
*
|
|
154
|
+
* @param data - Object with data to format (snake_case column names from DB)
|
|
155
|
+
* @param fields - Optional field definitions to determine types (from fieldsFromClass)
|
|
156
|
+
* @returns Object with properly typed values and camelCase property names for JavaScript
|
|
157
|
+
*/
|
|
158
|
+
export declare function formatDataJs(data: Record<string, any>, fields?: Record<string, {
|
|
159
|
+
type?: string;
|
|
160
|
+
}>): Record<string, any>;
|
|
161
|
+
/**
|
|
162
|
+
* Type guard to check if a value is a Field instance
|
|
163
|
+
*
|
|
164
|
+
* @deprecated Field helpers have been removed. This function always returns false.
|
|
165
|
+
* @param value - Value to check
|
|
166
|
+
* @returns Always false (Field class no longer exists)
|
|
167
|
+
*/
|
|
168
|
+
export declare function isFieldInstance(value: any): value is never;
|
|
169
|
+
/**
|
|
170
|
+
* Formats data for SQL by converting Date objects to ISO strings
|
|
171
|
+
* and camelCase property names to snake_case column names
|
|
172
|
+
*
|
|
173
|
+
* @param data - Object with data to format (camelCase property names from JavaScript)
|
|
174
|
+
* @returns Object with properly formatted values and snake_case column names for SQL
|
|
175
|
+
*/
|
|
176
|
+
export declare function formatDataSql(data: Record<string, any>): Record<string, any>;
|
|
177
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,WAItC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,QAK/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,UAK/C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAgC7B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa5E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAEhC,SAAS,EAAE,QAAQ,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,OAepD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,uBAkH3C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBActD"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
import { ObjectRegistry } from "./registry.js";
|
|
3
|
+
import { toSnakeCase, classnameToTablename, pluralize } from "./utils/naming.js";
|
|
4
|
+
const logger = createLogger({
|
|
5
|
+
level: process.env.DEBUG_STI ? "debug" : "info"
|
|
6
|
+
});
|
|
7
|
+
function toCamelCase(str) {
|
|
8
|
+
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
9
|
+
}
|
|
10
|
+
function keysToSnakeCase(obj) {
|
|
11
|
+
const result = {};
|
|
12
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
13
|
+
result[toSnakeCase(key)] = value;
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
function keysToCamelCase(obj) {
|
|
18
|
+
const result = {};
|
|
19
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
20
|
+
result[toCamelCase(key)] = value;
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
function isDateField(key) {
|
|
25
|
+
return key.endsWith("_date") || key.endsWith("_at") || key === "date";
|
|
26
|
+
}
|
|
27
|
+
function dateAsString(date) {
|
|
28
|
+
if (typeof date === "string") {
|
|
29
|
+
return new Date(date);
|
|
30
|
+
}
|
|
31
|
+
return date;
|
|
32
|
+
}
|
|
33
|
+
function dateAsObject(date) {
|
|
34
|
+
if (date instanceof Date) {
|
|
35
|
+
return date.toISOString();
|
|
36
|
+
}
|
|
37
|
+
return date;
|
|
38
|
+
}
|
|
39
|
+
async function fieldsFromClass(ClassType, values) {
|
|
40
|
+
const className = ObjectRegistry.getClassByConstructor(ClassType)?.name || ClassType.name;
|
|
41
|
+
const cachedFields = await ObjectRegistry.getAllFields(className);
|
|
42
|
+
if (cachedFields.size === 0) {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
const fields = {};
|
|
46
|
+
for (const [key, field] of cachedFields.entries()) {
|
|
47
|
+
const meta = { ...field._meta || {} };
|
|
48
|
+
delete meta.__smrtSystemField;
|
|
49
|
+
fields[key] = {
|
|
50
|
+
name: key,
|
|
51
|
+
type: field.type || "TEXT",
|
|
52
|
+
_meta: meta,
|
|
53
|
+
...values && key in values ? { value: values[key] } : {}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return fields;
|
|
57
|
+
}
|
|
58
|
+
function legacyClassnameToTablename(className) {
|
|
59
|
+
return className.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/([^s])$/, "$1s").replace(/y$/, "ies");
|
|
60
|
+
}
|
|
61
|
+
function generateTableRenameMigrations(classNames) {
|
|
62
|
+
const migrations = [];
|
|
63
|
+
for (const className of classNames) {
|
|
64
|
+
const oldName = legacyClassnameToTablename(className);
|
|
65
|
+
const newName = classnameToTablename(className);
|
|
66
|
+
if (oldName !== newName) {
|
|
67
|
+
migrations.push(`ALTER TABLE ${oldName} RENAME TO ${newName};`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return migrations;
|
|
71
|
+
}
|
|
72
|
+
function tableNameFromClass(ClassType) {
|
|
73
|
+
if ("SMRT_TABLE_NAME" in ClassType) {
|
|
74
|
+
return ClassType.SMRT_TABLE_NAME;
|
|
75
|
+
}
|
|
76
|
+
const snakeCase = ClassType.name.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
77
|
+
return pluralize(snakeCase);
|
|
78
|
+
}
|
|
79
|
+
function formatDataJs(data, fields) {
|
|
80
|
+
const normalizedData = {};
|
|
81
|
+
if (process.env.DEBUG_STI) {
|
|
82
|
+
logger.debug("[formatDataJs] Input data", {
|
|
83
|
+
hasMetaData: !!data._meta_data,
|
|
84
|
+
metaType: data._meta_type,
|
|
85
|
+
keys: Object.keys(data)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
let mergedData = data;
|
|
89
|
+
if (data._meta_data) {
|
|
90
|
+
const metaData = typeof data._meta_data === "string" ? JSON.parse(data._meta_data) : data._meta_data;
|
|
91
|
+
if (process.env.DEBUG_STI) {
|
|
92
|
+
logger.debug("[formatDataJs] Merging _meta_data", {
|
|
93
|
+
metaDataKeys: Object.keys(metaData),
|
|
94
|
+
metaData
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
mergedData = { ...data, ...metaData };
|
|
98
|
+
if (process.env.DEBUG_STI) {
|
|
99
|
+
logger.debug("[formatDataJs] After merge, data keys", {
|
|
100
|
+
keys: Object.keys(mergedData)
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const [key, value] of Object.entries(mergedData)) {
|
|
105
|
+
const camelKey = key.startsWith("_") ? key : toCamelCase(key);
|
|
106
|
+
let outputKey = camelKey;
|
|
107
|
+
if (fields && key in fields && !(camelKey in fields)) {
|
|
108
|
+
outputKey = key;
|
|
109
|
+
}
|
|
110
|
+
const fieldDef = fields?.[outputKey] ?? fields?.[camelKey] ?? fields?.[key];
|
|
111
|
+
const fieldType = fieldDef?.type?.toLowerCase();
|
|
112
|
+
if (value instanceof Date) {
|
|
113
|
+
normalizedData[outputKey] = value;
|
|
114
|
+
} else if (typeof value === "string") {
|
|
115
|
+
const isDate = fieldType === "datetime" || isDateField(key);
|
|
116
|
+
if (isDate) {
|
|
117
|
+
const parsedDate = value.trim() ? new Date(value) : null;
|
|
118
|
+
normalizedData[outputKey] = parsedDate && !Number.isNaN(parsedDate.getTime()) ? parsedDate : value;
|
|
119
|
+
} else if (fieldType === "json") {
|
|
120
|
+
try {
|
|
121
|
+
normalizedData[outputKey] = JSON.parse(value);
|
|
122
|
+
} catch {
|
|
123
|
+
normalizedData[outputKey] = value;
|
|
124
|
+
}
|
|
125
|
+
} else if (fieldType === "integer") {
|
|
126
|
+
const parsed = Number.parseInt(value, 10);
|
|
127
|
+
normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;
|
|
128
|
+
} else if (fieldType === "real" || fieldType === "decimal") {
|
|
129
|
+
const parsed = Number.parseFloat(value);
|
|
130
|
+
normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;
|
|
131
|
+
} else {
|
|
132
|
+
normalizedData[outputKey] = value;
|
|
133
|
+
}
|
|
134
|
+
} else if (typeof value === "number") {
|
|
135
|
+
if (fieldType === "boolean") {
|
|
136
|
+
normalizedData[outputKey] = value === 1;
|
|
137
|
+
} else {
|
|
138
|
+
normalizedData[outputKey] = value;
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
normalizedData[outputKey] = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (process.env.DEBUG_STI) {
|
|
145
|
+
logger.debug("[formatDataJs] Output normalizedData", {
|
|
146
|
+
keys: Object.keys(normalizedData),
|
|
147
|
+
metaType: normalizedData._meta_type
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return normalizedData;
|
|
151
|
+
}
|
|
152
|
+
function isFieldInstance(value) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
function formatDataSql(data) {
|
|
156
|
+
const normalizedData = {};
|
|
157
|
+
for (const [key, value] of Object.entries(data)) {
|
|
158
|
+
const snakeKey = toSnakeCase(key);
|
|
159
|
+
if (value instanceof Date) {
|
|
160
|
+
normalizedData[snakeKey] = value.toISOString();
|
|
161
|
+
} else {
|
|
162
|
+
normalizedData[snakeKey] = value;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return normalizedData;
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
classnameToTablename,
|
|
169
|
+
dateAsObject,
|
|
170
|
+
dateAsString,
|
|
171
|
+
fieldsFromClass,
|
|
172
|
+
formatDataJs,
|
|
173
|
+
formatDataSql,
|
|
174
|
+
generateTableRenameMigrations,
|
|
175
|
+
isDateField,
|
|
176
|
+
isFieldInstance,
|
|
177
|
+
keysToCamelCase,
|
|
178
|
+
keysToSnakeCase,
|
|
179
|
+
legacyClassnameToTablename,
|
|
180
|
+
pluralize,
|
|
181
|
+
tableNameFromClass,
|
|
182
|
+
toCamelCase,
|
|
183
|
+
toSnakeCase
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import { createLogger } from '@happyvertical/logger';\nimport { ObjectRegistry } from './registry';\nimport {\n classnameToTablename,\n pluralize,\n toSnakeCase,\n} from './utils/naming.js';\n\n// formatDataJs' debug traces are gated by DEBUG_STI, so the level must allow\n// debug when it's set (a fixed 'info' would filter them out and break the flag).\nconst logger = createLogger({\n level: process.env.DEBUG_STI ? 'debug' : 'info',\n});\n\nexport { classnameToTablename, pluralize, toSnakeCase };\n\n/**\n * Converts a snake_case string to camelCase\n *\n * @param str - String in snake_case format\n * @returns String in camelCase format\n * @example\n * ```typescript\n * toCamelCase('meetings_url'); // 'meetingsUrl'\n * toCamelCase('created_at'); // 'createdAt'\n * toCamelCase('id'); // 'id'\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Converts all keys in an object from camelCase to snake_case\n *\n * @param obj - Object with camelCase keys\n * @returns Object with snake_case keys\n */\nexport function keysToSnakeCase(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[toSnakeCase(key)] = value;\n }\n return result;\n}\n\n/**\n * Converts all keys in an object from snake_case to camelCase\n *\n * @param obj - Object with snake_case keys\n * @returns Object with camelCase keys\n */\nexport function keysToCamelCase(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[toCamelCase(key)] = value;\n }\n return result;\n}\n\n/**\n * Checks if a field name indicates a date field based on naming conventions\n *\n * Recognizes common date field patterns like '_at', '_date', and 'date'.\n * Used for automatic type inference during schema generation.\n *\n * @param key - Field name to check\n * @returns Boolean indicating if the field is likely a date field\n * @example\n * ```typescript\n * isDateField('created_at'); // true\n * isDateField('updated_date'); // true\n * isDateField('name'); // false\n * ```\n */\nexport function isDateField(key: string) {\n // Fallback pattern matching when schema is not available\n // Primary date detection should use schema field types\n return key.endsWith('_date') || key.endsWith('_at') || key === 'date';\n}\n\n/**\n * Converts a date string to a Date object\n *\n * @param date - Date as string or Date object\n * @returns Date object\n */\nexport function dateAsString(date: Date | string) {\n if (typeof date === 'string') {\n return new Date(date);\n }\n return date;\n}\n\n/**\n * Converts a Date object to an ISO string\n *\n * @param date - Date as Date object or string\n * @returns ISO date string or the original string\n */\nexport function dateAsObject(date: Date | string) {\n if (date instanceof Date) {\n return date.toISOString();\n }\n return date;\n}\n\n/**\n * Extracts field definitions from a class constructor\n *\n * Uses ObjectRegistry cached fields from AST manifest exclusively.\n * No runtime introspection fallback - classes must be decorated with @smrt()\n * for schema generation to work.\n *\n * @param ClassType - Class constructor to extract fields from\n * @param values - Optional values to set for the fields\n * @returns Object containing field definitions with names, types, and values\n * @throws {Error} If the class is not registered in ObjectRegistry\n * @example\n * ```typescript\n * @smrt()\n * class Product extends SmrtObject {\n * name: string = '';\n * price: number = 0.0;\n * }\n *\n * const fields = await fieldsFromClass(Product);\n * console.log(fields.name.type); // 'TEXT'\n * console.log(fields.price.type); // 'REAL'\n * ```\n */\nexport async function fieldsFromClass(\n ClassType: new (...args: any[]) => any,\n values?: Record<string, any>,\n) {\n const className =\n ObjectRegistry.getClassByConstructor(ClassType as any)?.name ||\n ClassType.name;\n // NEW: Use getAllFields() to include inherited fields from parent classes\n const cachedFields = await ObjectRegistry.getAllFields(className);\n\n // Phase 2: AST manifest only - no runtime introspection fallback\n if (cachedFields.size === 0) {\n // Return empty fields for unregistered classes (for backward compatibility)\n // generateSchema() will throw if it needs field definitions\n return {};\n }\n\n // Use cached field definitions from AST manifest\n const fields: Record<string, any> = {};\n\n // Add/override with fields from cached registry\n for (const [key, field] of cachedFields.entries()) {\n const meta = { ...(field._meta || {}) };\n delete meta.__smrtSystemField;\n\n fields[key] = {\n name: key,\n type: field.type || 'TEXT',\n _meta: meta,\n ...(values && key in values ? { value: values[key] } : {}),\n };\n }\n\n return fields;\n}\n\n// NOTE: generateSchema moved to schema/utils.ts\n// to prevent bundling Node.js-only code (SchemaGenerator with node:crypto) in browser builds.\n// Import from './schema/utils' in Node.js code that needs schema generation.\n\n/**\n * Returns the old (incorrect) pluralized table name for migration purposes.\n *\n * This function replicates the previous buggy behavior where 'y' → 'ies'\n * transformation was applied AFTER adding 's', resulting in incorrect\n * pluralization (e.g., 'currency' → 'currencys' instead of 'currencies').\n *\n * Use this to generate migration SQL that renames old tables to new names.\n *\n * @param className - Name of the class\n * @returns The incorrectly pluralized table name (old behavior)\n * @example\n * ```typescript\n * // Generate migration for a class\n * const oldName = legacyClassnameToTablename('Currency'); // 'currencys'\n * const newName = classnameToTablename('Currency'); // 'currencies'\n * console.log(`ALTER TABLE ${oldName} RENAME TO ${newName};`);\n * ```\n */\nexport function legacyClassnameToTablename(className: string): string {\n return className\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/([^s])$/, '$1s')\n .replace(/y$/, 'ies'); // This runs AFTER 's' is added, so it's a no-op for 'y' words\n}\n\n/**\n * Generates migration SQL for renaming tables from old to new naming convention.\n *\n * Returns an array of SQL statements to rename tables that were affected\n * by the pluralization bug (Issue #839).\n *\n * @param classNames - Array of class names to check for migration\n * @returns Array of SQL RENAME statements (empty if no changes needed)\n * @example\n * ```typescript\n * const migrations = generateTableRenameMigrations([\n * 'Currency',\n * 'JournalEntry',\n * 'Product' // Not affected\n * ]);\n * // Returns:\n * // [\n * // 'ALTER TABLE currencys RENAME TO currencies;',\n * // 'ALTER TABLE journal_entrys RENAME TO journal_entries;'\n * // ]\n * ```\n */\nexport function generateTableRenameMigrations(classNames: string[]): string[] {\n const migrations: string[] = [];\n\n for (const className of classNames) {\n const oldName = legacyClassnameToTablename(className);\n const newName = classnameToTablename(className);\n\n if (oldName !== newName) {\n migrations.push(`ALTER TABLE ${oldName} RENAME TO ${newName};`);\n }\n }\n\n return migrations;\n}\n\n/**\n * Generates a table name from a class constructor\n *\n * Checks for SMRT_TABLE_NAME static property first (set by @smrt() decorator),\n * which survives code minification. Falls back to deriving from ClassType.name\n * for backward compatibility.\n *\n * @param ClassType - Class constructor or function\n * @returns Pluralized snake_case table name\n * @example\n * ```typescript\n * // With @smrt() decorator (recommended)\n * @smrt()\n * class Product extends SmrtObject { }\n * tableNameFromClass(Product); // \"products\" (captured before minification)\n *\n * // Without decorator (fallback)\n * class Category extends SmrtObject { }\n * tableNameFromClass(Category); // \"categories\" (derived from runtime name)\n * ```\n */\nexport function tableNameFromClass(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n ClassType: Function | (new (...args: any[]) => any),\n) {\n // Check for SMRT_TABLE_NAME property set by @smrt() decorator (survives minification)\n if ('SMRT_TABLE_NAME' in ClassType) {\n return (ClassType as any).SMRT_TABLE_NAME;\n }\n\n // Fallback: derive from class name (breaks with minification)\n const snakeCase = ClassType.name\n // Insert underscore between lower & upper case letters\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n // Convert to lowercase\n .toLowerCase();\n\n return pluralize(snakeCase);\n}\n\n/**\n * Formats data for JavaScript by converting date strings to Date objects\n * and snake_case column names to camelCase properties\n *\n * @param data - Object with data to format (snake_case column names from DB)\n * @param fields - Optional field definitions to determine types (from fieldsFromClass)\n * @returns Object with properly typed values and camelCase property names for JavaScript\n */\nexport function formatDataJs(\n data: Record<string, any>,\n fields?: Record<string, { type?: string }>,\n) {\n const normalizedData: Record<string, any> = {};\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Input data', {\n hasMetaData: !!data._meta_data,\n metaType: data._meta_type,\n keys: Object.keys(data),\n });\n }\n\n // STI: If _meta_data exists, merge it into a FRESH object first so meta\n // fields are available during formatting. This must never mutate the caller's\n // `data` argument — `formatDataJs` is a public export and external callers may\n // pass shared objects that would otherwise get silent field injection (#1378).\n let mergedData: Record<string, any> = data;\n if (data._meta_data) {\n const metaData =\n typeof data._meta_data === 'string'\n ? JSON.parse(data._meta_data)\n : data._meta_data;\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Merging _meta_data', {\n metaDataKeys: Object.keys(metaData),\n metaData,\n });\n }\n\n // Merge meta fields into a copy (will be formatted below). Spreading\n // `metaData` last preserves the original precedence of Object.assign.\n mergedData = { ...data, ...metaData };\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] After merge, data keys', {\n keys: Object.keys(mergedData),\n });\n }\n }\n\n for (const [key, value] of Object.entries(mergedData)) {\n // Preserve keys with leading underscore (e.g., _meta_type, _meta_data)\n // These are special STI/framework fields that should not be camelCased\n const camelKey = key.startsWith('_') ? key : toCamelCase(key);\n\n // Determine the actual output key based on what's in fields\n // If the original key (snake_case) is in fields, use it; otherwise use camelCase\n // This supports both conventions (e.g., publish_date vs publishDate)\n let outputKey = camelKey;\n if (fields && key in fields && !(camelKey in fields)) {\n // Original key exists in fields but camelCase doesn't - use original (snake_case)\n outputKey = key;\n }\n\n // Get field type from fields, trying both key variants\n const fieldDef = fields?.[outputKey] ?? fields?.[camelKey] ?? fields?.[key];\n const fieldType = fieldDef?.type?.toLowerCase();\n\n if (value instanceof Date) {\n normalizedData[outputKey] = value;\n } else if (typeof value === 'string') {\n // Use field definitions if available, otherwise fall back to name patterns\n const isDate = fieldType === 'datetime' || isDateField(key);\n\n if (isDate) {\n const parsedDate = value.trim() ? new Date(value) : null;\n normalizedData[outputKey] =\n parsedDate && !Number.isNaN(parsedDate.getTime())\n ? parsedDate\n : value;\n } else if (fieldType === 'json') {\n // Parse JSON strings back to objects\n try {\n normalizedData[outputKey] = JSON.parse(value);\n } catch {\n // Keep as string if parsing fails\n normalizedData[outputKey] = value;\n }\n } else if (fieldType === 'integer') {\n // Convert string numbers to integers for INTEGER fields\n // SQLite may return \"2.0\" as a string in some cases\n const parsed = Number.parseInt(value, 10);\n normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;\n } else if (fieldType === 'real' || fieldType === 'decimal') {\n // Convert string numbers to floats for REAL/DECIMAL fields\n const parsed = Number.parseFloat(value);\n normalizedData[outputKey] = Number.isNaN(parsed) ? value : parsed;\n } else {\n normalizedData[outputKey] = value;\n }\n } else if (typeof value === 'number') {\n if (fieldType === 'boolean') {\n // Convert SQLite integers (0/1) to booleans for boolean fields\n normalizedData[outputKey] = value === 1;\n } else {\n // Pass through numeric values as-is\n // Note: In JavaScript, 2.0 === 2 so no conversion needed\n // Non-integers in INTEGER fields (e.g., 2.9) are kept to surface data issues\n normalizedData[outputKey] = value;\n }\n } else {\n normalizedData[outputKey] = value;\n }\n }\n\n if (process.env.DEBUG_STI) {\n logger.debug('[formatDataJs] Output normalizedData', {\n keys: Object.keys(normalizedData),\n metaType: normalizedData._meta_type,\n });\n }\n\n return normalizedData;\n}\n\n/**\n * Type guard to check if a value is a Field instance\n *\n * @deprecated Field helpers have been removed. This function always returns false.\n * @param value - Value to check\n * @returns Always false (Field class no longer exists)\n */\nexport function isFieldInstance(value: any): value is never {\n return false;\n}\n\n/**\n * Formats data for SQL by converting Date objects to ISO strings\n * and camelCase property names to snake_case column names\n *\n * @param data - Object with data to format (camelCase property names from JavaScript)\n * @returns Object with properly formatted values and snake_case column names for SQL\n */\nexport function formatDataSql(data: Record<string, any>) {\n const normalizedData: Record<string, any> = {};\n for (const [key, value] of Object.entries(data)) {\n // Convert camelCase to snake_case for SQL\n const snakeKey = toSnakeCase(key);\n\n // Field helpers removed - no need to extract values (deprecated code removed)\n if (value instanceof Date) {\n normalizedData[snakeKey] = value.toISOString(); // Postgres accepts ISO format with timezone\n } else {\n normalizedData[snakeKey] = value;\n }\n }\n return normalizedData;\n}\n"],"names":[],"mappings":";;;AAUA,MAAM,SAAS,aAAa;AAAA,EAC1B,OAAO,QAAQ,IAAI,YAAY,UAAU;AAC3C,CAAC;AAgBM,SAAS,YAAY,KAAqB;AAC/C,SAAO,IAAI,QAAQ,aAAa,CAAC,GAAG,WAAW,OAAO,aAAa;AACrE;AAQO,SAAS,gBAAgB,KAA+C;AAC7E,QAAM,SAA8B,CAAA;AACpC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,WAAO,YAAY,GAAG,CAAC,IAAI;AAAA,EAC7B;AACA,SAAO;AACT;AAQO,SAAS,gBAAgB,KAA+C;AAC7E,QAAM,SAA8B,CAAA;AACpC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,WAAO,YAAY,GAAG,CAAC,IAAI;AAAA,EAC7B;AACA,SAAO;AACT;AAiBO,SAAS,YAAY,KAAa;AAGvC,SAAO,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,KAAK,QAAQ;AACjE;AAQO,SAAS,aAAa,MAAqB;AAChD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAQO,SAAS,aAAa,MAAqB;AAChD,MAAI,gBAAgB,MAAM;AACxB,WAAO,KAAK,YAAA;AAAA,EACd;AACA,SAAO;AACT;AA0BA,eAAsB,gBACpB,WACA,QACA;AACA,QAAM,YACJ,eAAe,sBAAsB,SAAgB,GAAG,QACxD,UAAU;AAEZ,QAAM,eAAe,MAAM,eAAe,aAAa,SAAS;AAGhE,MAAI,aAAa,SAAS,GAAG;AAG3B,WAAO,CAAA;AAAA,EACT;AAGA,QAAM,SAA8B,CAAA;AAGpC,aAAW,CAAC,KAAK,KAAK,KAAK,aAAa,WAAW;AACjD,UAAM,OAAO,EAAE,GAAI,MAAM,SAAS,CAAA,EAAC;AACnC,WAAO,KAAK;AAEZ,WAAO,GAAG,IAAI;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO;AAAA,MACP,GAAI,UAAU,OAAO,SAAS,EAAE,OAAO,OAAO,GAAG,MAAM,CAAA;AAAA,IAAC;AAAA,EAE5D;AAEA,SAAO;AACT;AAyBO,SAAS,2BAA2B,WAA2B;AACpE,SAAO,UACJ,QAAQ,mBAAmB,OAAO,EAClC,YAAA,EACA,QAAQ,WAAW,KAAK,EACxB,QAAQ,MAAM,KAAK;AACxB;AAwBO,SAAS,8BAA8B,YAAgC;AAC5E,QAAM,aAAuB,CAAA;AAE7B,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,2BAA2B,SAAS;AACpD,UAAM,UAAU,qBAAqB,SAAS;AAE9C,QAAI,YAAY,SAAS;AACvB,iBAAW,KAAK,eAAe,OAAO,cAAc,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;AAuBO,SAAS,mBAEd,WACA;AAEA,MAAI,qBAAqB,WAAW;AAClC,WAAQ,UAAkB;AAAA,EAC5B;AAGA,QAAM,YAAY,UAAU,KAEzB,QAAQ,mBAAmB,OAAO,EAElC,YAAA;AAEH,SAAO,UAAU,SAAS;AAC5B;AAUO,SAAS,aACd,MACA,QACA;AACA,QAAM,iBAAsC,CAAA;AAE5C,MAAI,QAAQ,IAAI,WAAW;AACzB,WAAO,MAAM,6BAA6B;AAAA,MACxC,aAAa,CAAC,CAAC,KAAK;AAAA,MACpB,UAAU,KAAK;AAAA,MACf,MAAM,OAAO,KAAK,IAAI;AAAA,IAAA,CACvB;AAAA,EACH;AAMA,MAAI,aAAkC;AACtC,MAAI,KAAK,YAAY;AACnB,UAAM,WACJ,OAAO,KAAK,eAAe,WACvB,KAAK,MAAM,KAAK,UAAU,IAC1B,KAAK;AAEX,QAAI,QAAQ,IAAI,WAAW;AACzB,aAAO,MAAM,qCAAqC;AAAA,QAChD,cAAc,OAAO,KAAK,QAAQ;AAAA,QAClC;AAAA,MAAA,CACD;AAAA,IACH;AAIA,iBAAa,EAAE,GAAG,MAAM,GAAG,SAAA;AAE3B,QAAI,QAAQ,IAAI,WAAW;AACzB,aAAO,MAAM,yCAAyC;AAAA,QACpD,MAAM,OAAO,KAAK,UAAU;AAAA,MAAA,CAC7B;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAGrD,UAAM,WAAW,IAAI,WAAW,GAAG,IAAI,MAAM,YAAY,GAAG;AAK5D,QAAI,YAAY;AAChB,QAAI,UAAU,OAAO,UAAU,EAAE,YAAY,SAAS;AAEpD,kBAAY;AAAA,IACd;AAGA,UAAM,WAAW,SAAS,SAAS,KAAK,SAAS,QAAQ,KAAK,SAAS,GAAG;AAC1E,UAAM,YAAY,UAAU,MAAM,YAAA;AAElC,QAAI,iBAAiB,MAAM;AACzB,qBAAe,SAAS,IAAI;AAAA,IAC9B,WAAW,OAAO,UAAU,UAAU;AAEpC,YAAM,SAAS,cAAc,cAAc,YAAY,GAAG;AAE1D,UAAI,QAAQ;AACV,cAAM,aAAa,MAAM,KAAA,IAAS,IAAI,KAAK,KAAK,IAAI;AACpD,uBAAe,SAAS,IACtB,cAAc,CAAC,OAAO,MAAM,WAAW,QAAA,CAAS,IAC5C,aACA;AAAA,MACR,WAAW,cAAc,QAAQ;AAE/B,YAAI;AACF,yBAAe,SAAS,IAAI,KAAK,MAAM,KAAK;AAAA,QAC9C,QAAQ;AAEN,yBAAe,SAAS,IAAI;AAAA,QAC9B;AAAA,MACF,WAAW,cAAc,WAAW;AAGlC,cAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,uBAAe,SAAS,IAAI,OAAO,MAAM,MAAM,IAAI,QAAQ;AAAA,MAC7D,WAAW,cAAc,UAAU,cAAc,WAAW;AAE1D,cAAM,SAAS,OAAO,WAAW,KAAK;AACtC,uBAAe,SAAS,IAAI,OAAO,MAAM,MAAM,IAAI,QAAQ;AAAA,MAC7D,OAAO;AACL,uBAAe,SAAS,IAAI;AAAA,MAC9B;AAAA,IACF,WAAW,OAAO,UAAU,UAAU;AACpC,UAAI,cAAc,WAAW;AAE3B,uBAAe,SAAS,IAAI,UAAU;AAAA,MACxC,OAAO;AAIL,uBAAe,SAAS,IAAI;AAAA,MAC9B;AAAA,IACF,OAAO;AACL,qBAAe,SAAS,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,WAAW;AACzB,WAAO,MAAM,wCAAwC;AAAA,MACnD,MAAM,OAAO,KAAK,cAAc;AAAA,MAChC,UAAU,eAAe;AAAA,IAAA,CAC1B;AAAA,EACH;AAEA,SAAO;AACT;AASO,SAAS,gBAAgB,OAA4B;AAC1D,SAAO;AACT;AASO,SAAS,cAAc,MAA2B;AACvD,QAAM,iBAAsC,CAAA;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAE/C,UAAM,WAAW,YAAY,GAAG;AAGhC,QAAI,iBAAiB,MAAM;AACzB,qBAAe,QAAQ,IAAI,MAAM,YAAA;AAAA,IACnC,OAAO;AACL,qBAAe,QAAQ,IAAI;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import a module that exists in both source (`.ts`) and compiled (`.js`)
|
|
3
|
+
* form, deterministically.
|
|
4
|
+
*
|
|
5
|
+
* # Why this exists
|
|
6
|
+
*
|
|
7
|
+
* The Vite plugin needs to load sibling modules (scanner, schema generator)
|
|
8
|
+
* at runtime. Those siblings ship in two shapes:
|
|
9
|
+
*
|
|
10
|
+
* src/scanner/index.ts (workspace dev, tsx-driven)
|
|
11
|
+
* dist/vite-plugin/../scanner.js (published tarball, plain Node ESM)
|
|
12
|
+
*
|
|
13
|
+
* The previous implementation picked a branch by sniffing
|
|
14
|
+
* `import.meta.url.endsWith('.ts')` and then issued a relative dynamic
|
|
15
|
+
* `import()`. That decision rode on top of tsx's ESM loader, whose
|
|
16
|
+
* interception of `@happyvertical/smrt-core/vite-plugin` varies with tsx
|
|
17
|
+
* version, Node version, pnpm symlink state, and Node's internal resolver
|
|
18
|
+
* cache (first-import wins). As a result, the branch was non-deterministic
|
|
19
|
+
* at publish time and could pick the `.ts` source even though `dist/`
|
|
20
|
+
* existed — then fail inside that source on an inner `.js→.ts` hop. Seen
|
|
21
|
+
* on PR 1131, Release A, Release B, and PR 1141, each time losing the
|
|
22
|
+
* publish for 12–13 downstream domain packages.
|
|
23
|
+
*
|
|
24
|
+
* # How this is deterministic
|
|
25
|
+
*
|
|
26
|
+
* We don't ask tsx anything. We check `<packageRoot>/dist/vite-plugin/<dist>`
|
|
27
|
+
* directly with `fs.existsSync`. If dist is on disk we load it via an
|
|
28
|
+
* absolute `file://` URL — Node's loader doesn't consult tsx for that.
|
|
29
|
+
* If dist is absent (fresh clone, pre-first-build) we fall back to the
|
|
30
|
+
* source path via a plain relative `import()`; at that point tsx is the
|
|
31
|
+
* only way to load `.ts` anyway, so there's no choice to make.
|
|
32
|
+
*
|
|
33
|
+
* # Dev-mode caveat
|
|
34
|
+
*
|
|
35
|
+
* When `dist/` exists, this helper always loads dist — even if a core
|
|
36
|
+
* developer just edited source. That's a deliberate trade: in any
|
|
37
|
+
* meaningful dev loop you have `pnpm build:watch` keeping dist fresh, and
|
|
38
|
+
* the determinism at publish time is worth far more than a hot-reload
|
|
39
|
+
* convenience for the handful of times anyone edits
|
|
40
|
+
* `packages/core/src/scanner/*.ts` directly.
|
|
41
|
+
*
|
|
42
|
+
* @see https://github.com/happyvertical/smrt/issues/1139
|
|
43
|
+
*/
|
|
44
|
+
export interface ImportBuildAwareOptions {
|
|
45
|
+
/**
|
|
46
|
+
* Relative path to the `.ts` source entry, expressed from the
|
|
47
|
+
* `vite-plugin/` directory (e.g. `'../scanner/index.ts'`). Used only
|
|
48
|
+
* when the corresponding dist file is absent.
|
|
49
|
+
*/
|
|
50
|
+
source: string;
|
|
51
|
+
/**
|
|
52
|
+
* Relative path to the compiled `.js` entry, expressed from the
|
|
53
|
+
* `vite-plugin/` directory (e.g. `'../scanner.js'`). Resolved to an
|
|
54
|
+
* absolute path against `<packageRoot>/dist/vite-plugin/` — independent
|
|
55
|
+
* of where the caller physically lives on disk.
|
|
56
|
+
*/
|
|
57
|
+
dist: string;
|
|
58
|
+
/**
|
|
59
|
+
* Override for the caller's `import.meta.url`. Tests use this to
|
|
60
|
+
* simulate being loaded from different locations without physically
|
|
61
|
+
* relocating the source file. Defaults to this module's URL, which is
|
|
62
|
+
* equivalent to the caller in the normal production path (both sit in
|
|
63
|
+
* `vite-plugin/`).
|
|
64
|
+
*/
|
|
65
|
+
callerUrl?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare function importBuildAwareModule<T>({ source, dist, callerUrl, }: ImportBuildAwareOptions): Promise<T>;
|
|
68
|
+
//# sourceMappingURL=import-build-aware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-build-aware.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/import-build-aware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAsDH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,MAAM,EACN,IAAI,EACJ,SAA2B,GAC5B,EAAE,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BtC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { dirname, resolve, extname } from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
const require$1 = createRequire(import.meta.url);
|
|
6
|
+
const TS_SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".mts", ".tsx"]);
|
|
7
|
+
async function importSourceFallback(sourceAbs, packageRoot) {
|
|
8
|
+
const ext = extname(sourceAbs);
|
|
9
|
+
if (!TS_SOURCE_EXTENSIONS.has(ext)) {
|
|
10
|
+
return await import(
|
|
11
|
+
/* @vite-ignore */
|
|
12
|
+
pathToFileURL(sourceAbs).href
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
let unregister;
|
|
16
|
+
try {
|
|
17
|
+
const tsxApiPath = require$1.resolve("tsx/esm/api");
|
|
18
|
+
const { register } = await import(
|
|
19
|
+
/* @vite-ignore */
|
|
20
|
+
pathToFileURL(tsxApiPath).href
|
|
21
|
+
);
|
|
22
|
+
const workspaceTsconfigPath = resolve(
|
|
23
|
+
packageRoot,
|
|
24
|
+
"..",
|
|
25
|
+
"..",
|
|
26
|
+
"tsconfig.package-build.json"
|
|
27
|
+
);
|
|
28
|
+
unregister = register(
|
|
29
|
+
existsSync(workspaceTsconfigPath) ? { tsconfig: workspaceTsconfigPath } : void 0
|
|
30
|
+
);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`[smrt] Failed to register tsx source fallback for ${sourceAbs}. Ensure "tsx" is installed or keep dist artifacts available before invoking the SMRT Vite plugin.`,
|
|
34
|
+
{ cause: error }
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
return await import(
|
|
39
|
+
/* @vite-ignore */
|
|
40
|
+
pathToFileURL(sourceAbs).href
|
|
41
|
+
);
|
|
42
|
+
} finally {
|
|
43
|
+
await unregister?.();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function importBuildAwareModule({
|
|
47
|
+
source,
|
|
48
|
+
dist,
|
|
49
|
+
callerUrl = import.meta.url
|
|
50
|
+
}) {
|
|
51
|
+
const thisFile = fileURLToPath(callerUrl);
|
|
52
|
+
const thisDir = dirname(thisFile);
|
|
53
|
+
const packageRoot = resolve(thisDir, "..", "..");
|
|
54
|
+
const distAbs = resolve(packageRoot, "dist", "vite-plugin", dist);
|
|
55
|
+
if (existsSync(distAbs)) {
|
|
56
|
+
return await import(
|
|
57
|
+
/* @vite-ignore */
|
|
58
|
+
pathToFileURL(distAbs).href
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
const sourceAbs = resolve(packageRoot, "src", "vite-plugin", source);
|
|
62
|
+
if (!existsSync(sourceAbs)) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`[smrt] Build-aware import fallback could not find source module ${sourceAbs} after dist module ${distAbs} was unavailable.`
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
return importSourceFallback(sourceAbs, packageRoot);
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
importBuildAwareModule
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=import-build-aware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-build-aware.js","sources":["../../src/vite-plugin/import-build-aware.ts"],"sourcesContent":["/**\n * Import a module that exists in both source (`.ts`) and compiled (`.js`)\n * form, deterministically.\n *\n * # Why this exists\n *\n * The Vite plugin needs to load sibling modules (scanner, schema generator)\n * at runtime. Those siblings ship in two shapes:\n *\n * src/scanner/index.ts (workspace dev, tsx-driven)\n * dist/vite-plugin/../scanner.js (published tarball, plain Node ESM)\n *\n * The previous implementation picked a branch by sniffing\n * `import.meta.url.endsWith('.ts')` and then issued a relative dynamic\n * `import()`. That decision rode on top of tsx's ESM loader, whose\n * interception of `@happyvertical/smrt-core/vite-plugin` varies with tsx\n * version, Node version, pnpm symlink state, and Node's internal resolver\n * cache (first-import wins). As a result, the branch was non-deterministic\n * at publish time and could pick the `.ts` source even though `dist/`\n * existed — then fail inside that source on an inner `.js→.ts` hop. Seen\n * on PR 1131, Release A, Release B, and PR 1141, each time losing the\n * publish for 12–13 downstream domain packages.\n *\n * # How this is deterministic\n *\n * We don't ask tsx anything. We check `<packageRoot>/dist/vite-plugin/<dist>`\n * directly with `fs.existsSync`. If dist is on disk we load it via an\n * absolute `file://` URL — Node's loader doesn't consult tsx for that.\n * If dist is absent (fresh clone, pre-first-build) we fall back to the\n * source path via a plain relative `import()`; at that point tsx is the\n * only way to load `.ts` anyway, so there's no choice to make.\n *\n * # Dev-mode caveat\n *\n * When `dist/` exists, this helper always loads dist — even if a core\n * developer just edited source. That's a deliberate trade: in any\n * meaningful dev loop you have `pnpm build:watch` keeping dist fresh, and\n * the determinism at publish time is worth far more than a hot-reload\n * convenience for the handful of times anyone edits\n * `packages/core/src/scanner/*.ts` directly.\n *\n * @see https://github.com/happyvertical/smrt/issues/1139\n */\n\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, resolve as resolvePath } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nconst require = createRequire(import.meta.url);\nconst TS_SOURCE_EXTENSIONS = new Set(['.ts', '.mts', '.tsx']);\n\nasync function importSourceFallback<T>(\n sourceAbs: string,\n packageRoot: string,\n): Promise<T> {\n const ext = extname(sourceAbs);\n if (!TS_SOURCE_EXTENSIONS.has(ext)) {\n return (await import(\n /* @vite-ignore */ pathToFileURL(sourceAbs).href\n )) as T;\n }\n\n let unregister: (() => Promise<void>) | undefined;\n try {\n const tsxApiPath = require.resolve('tsx/esm/api');\n const { register } = await import(\n /* @vite-ignore */ pathToFileURL(tsxApiPath).href\n );\n const workspaceTsconfigPath = resolvePath(\n packageRoot,\n '..',\n '..',\n 'tsconfig.package-build.json',\n );\n unregister = register(\n existsSync(workspaceTsconfigPath)\n ? { tsconfig: workspaceTsconfigPath }\n : undefined,\n );\n } catch (error) {\n throw new Error(\n `[smrt] Failed to register tsx source fallback for ${sourceAbs}. Ensure \"tsx\" is installed or keep dist artifacts available before invoking the SMRT Vite plugin.`,\n { cause: error },\n );\n }\n\n try {\n return (await import(\n /* @vite-ignore */ pathToFileURL(sourceAbs).href\n )) as T;\n } finally {\n await unregister?.();\n }\n}\n\nexport interface ImportBuildAwareOptions {\n /**\n * Relative path to the `.ts` source entry, expressed from the\n * `vite-plugin/` directory (e.g. `'../scanner/index.ts'`). Used only\n * when the corresponding dist file is absent.\n */\n source: string;\n /**\n * Relative path to the compiled `.js` entry, expressed from the\n * `vite-plugin/` directory (e.g. `'../scanner.js'`). Resolved to an\n * absolute path against `<packageRoot>/dist/vite-plugin/` — independent\n * of where the caller physically lives on disk.\n */\n dist: string;\n /**\n * Override for the caller's `import.meta.url`. Tests use this to\n * simulate being loaded from different locations without physically\n * relocating the source file. Defaults to this module's URL, which is\n * equivalent to the caller in the normal production path (both sit in\n * `vite-plugin/`).\n */\n callerUrl?: string;\n}\n\nexport async function importBuildAwareModule<T>({\n source,\n dist,\n callerUrl = import.meta.url,\n}: ImportBuildAwareOptions): Promise<T> {\n const thisFile = fileURLToPath(callerUrl);\n const thisDir = dirname(thisFile);\n\n // Walk up two levels: `src/vite-plugin/` and `dist/vite-plugin/` both\n // sit at package-root + 2 segments, so the same math works regardless\n // of which copy of the plugin the consumer loaded.\n const packageRoot = resolvePath(thisDir, '..', '..');\n const distAbs = resolvePath(packageRoot, 'dist', 'vite-plugin', dist);\n\n if (existsSync(distAbs)) {\n // Absolute `file://` URL bypasses tsx's specifier resolver entirely\n // — Node's native loader handles it. Deterministic regardless of\n // whether tsx, pnpm, or Node's resolver cache are in play.\n return (await import(/* @vite-ignore */ pathToFileURL(distAbs).href)) as T;\n }\n\n // Dist missing → fresh clone before first build or a publish-time rebuild\n // window. Source paths are defined relative to `src/vite-plugin/`, not to\n // whichever copy of this helper happens to be loaded, so always anchor the\n // fallback under the source tree explicitly.\n const sourceAbs = resolvePath(packageRoot, 'src', 'vite-plugin', source);\n if (!existsSync(sourceAbs)) {\n throw new Error(\n `[smrt] Build-aware import fallback could not find source module ${sourceAbs} after dist module ${distAbs} was unavailable.`,\n );\n }\n\n return importSourceFallback<T>(sourceAbs, packageRoot);\n}\n"],"names":["require","resolvePath"],"mappings":";;;;AAiDA,MAAMA,YAAU,cAAc,YAAY,GAAG;AAC7C,MAAM,uBAAuB,oBAAI,IAAI,CAAC,OAAO,QAAQ,MAAM,CAAC;AAE5D,eAAe,qBACb,WACA,aACY;AACZ,QAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,CAAC,qBAAqB,IAAI,GAAG,GAAG;AAClC,WAAQ,MAAM;AAAA;AAAA,MACO,cAAc,SAAS,EAAE;AAAA;AAAA,EAEhD;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,aAAaA,UAAQ,QAAQ,aAAa;AAChD,UAAM,EAAE,SAAA,IAAa,MAAM;AAAA;AAAA,MACN,cAAc,UAAU,EAAE;AAAA;AAE/C,UAAM,wBAAwBC;AAAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,iBAAa;AAAA,MACX,WAAW,qBAAqB,IAC5B,EAAE,UAAU,0BACZ;AAAA,IAAA;AAAA,EAER,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,qDAAqD,SAAS;AAAA,MAC9D,EAAE,OAAO,MAAA;AAAA,IAAM;AAAA,EAEnB;AAEA,MAAI;AACF,WAAQ,MAAM;AAAA;AAAA,MACO,cAAc,SAAS,EAAE;AAAA;AAAA,EAEhD,UAAA;AACE,UAAM,aAAA;AAAA,EACR;AACF;AA0BA,eAAsB,uBAA0B;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY,YAAY;AAC1B,GAAwC;AACtC,QAAM,WAAW,cAAc,SAAS;AACxC,QAAM,UAAU,QAAQ,QAAQ;AAKhC,QAAM,cAAcA,QAAY,SAAS,MAAM,IAAI;AACnD,QAAM,UAAUA,QAAY,aAAa,QAAQ,eAAe,IAAI;AAEpE,MAAI,WAAW,OAAO,GAAG;AAIvB,WAAQ,MAAM;AAAA;AAAA,MAA0B,cAAc,OAAO,EAAE;AAAA;AAAA,EACjE;AAMA,QAAM,YAAYA,QAAY,aAAa,OAAO,eAAe,MAAM;AACvE,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,mEAAmE,SAAS,sBAAsB,OAAO;AAAA,IAAA;AAAA,EAE7G;AAEA,SAAO,qBAAwB,WAAW,WAAW;AACvD;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DomainKnowledgeConfig } from '@happyvertical/smrt-types';
|
|
2
|
+
import { Plugin } from 'vite';
|
|
3
|
+
export type { CliApiCoherenceViolation, SvelteKitOptions, } from './sveltekit-generator.js';
|
|
4
|
+
export { findCliApiCoherenceViolations, generateSvelteKitRoutes, methodNameToKebab, resolveApiActionSet, validateCliIncludeAgainstApi, } from './sveltekit-generator.js';
|
|
5
|
+
export interface SmrtPluginOptions {
|
|
6
|
+
/** Glob patterns for SMRT source files */
|
|
7
|
+
include?: string[];
|
|
8
|
+
/** Patterns to exclude */
|
|
9
|
+
exclude?: string[];
|
|
10
|
+
/** Output directory for generated files */
|
|
11
|
+
outDir?: string;
|
|
12
|
+
/** Enable hot module replacement */
|
|
13
|
+
hmr?: boolean;
|
|
14
|
+
/** Watch for file changes */
|
|
15
|
+
watch?: boolean;
|
|
16
|
+
/** Generate types */
|
|
17
|
+
generateTypes?: boolean;
|
|
18
|
+
/** Custom base classes to scan for */
|
|
19
|
+
baseClasses?: string[];
|
|
20
|
+
/** Follow import chains to detect inheritance (e.g., Event extends SmrtObject) */
|
|
21
|
+
followImports?: boolean;
|
|
22
|
+
/** Directory to write TypeScript declarations (relative to project root) */
|
|
23
|
+
typeDeclarationsPath?: string;
|
|
24
|
+
/** Plugin execution mode - controls Node.js vs browser compatibility */
|
|
25
|
+
mode?: 'server' | 'client' | 'auto';
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated OXC scanner is now the only scanner. This option is ignored.
|
|
28
|
+
*/
|
|
29
|
+
experimentalFastScanner?: boolean;
|
|
30
|
+
/** SvelteKit route auto-generation options */
|
|
31
|
+
svelteKit?: {
|
|
32
|
+
/** Enable SvelteKit route generation (default: false) */
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
/** Output directory for generated routes (default: 'src/routes/api') */
|
|
35
|
+
routesDir?: string;
|
|
36
|
+
/** Directory containing SMRT objects (default: 'src/lib/objects') */
|
|
37
|
+
objectsDir?: string;
|
|
38
|
+
/** Directory for configuration file (default: 'src/lib/server') */
|
|
39
|
+
configPath?: string;
|
|
40
|
+
/** Configuration file name (default: 'smrt.ts') */
|
|
41
|
+
configFileName?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Apply kebab-case to custom-method URL segments (e.g. `discoverFromUrl`
|
|
44
|
+
* becomes `/discover-from-url`). Opt-in for one minor; default flips in
|
|
45
|
+
* the next major. An explicit `api.routes[name].path` always wins.
|
|
46
|
+
*/
|
|
47
|
+
kebabRoutes?: boolean;
|
|
48
|
+
};
|
|
49
|
+
/** Domain-scoped agent/developer knowledge artifact generation. */
|
|
50
|
+
knowledge?: DomainKnowledgeConfig | false;
|
|
51
|
+
/**
|
|
52
|
+
* Validate that every method in `cli.include` is exposed via the API
|
|
53
|
+
* (so HTTP-based CLI consumers can actually reach them). Default: true.
|
|
54
|
+
* Per-class opt-out via `cli: { skipApiCheck: true }`.
|
|
55
|
+
*/
|
|
56
|
+
validateCliApiCoherence?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function smrtPlugin(options?: SmrtPluginOptions): Plugin;
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAelD,YAAY,EACV,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE;QACV,yDAAyD;QACzD,OAAO,EAAE,OAAO,CAAC;QACjB,wEAAwE;QACxE,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,qEAAqE;QACrE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mEAAmE;QACnE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mDAAmD;QACnD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;WAIG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,mEAAmE;IACnE,SAAS,CAAC,EAAE,qBAAqB,GAAG,KAAK,CAAC;IAC1C;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAsBD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA+1BlE"}
|