@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,72 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
const logger = createLogger({ level: "info" });
|
|
3
|
+
class SmrtMCPServer {
|
|
4
|
+
options;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.options = {
|
|
7
|
+
name: "smrt-auto-generated",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
tools: [],
|
|
10
|
+
handlers: {},
|
|
11
|
+
...options
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Add a tool to the server
|
|
16
|
+
*/
|
|
17
|
+
addTool(tool, handler) {
|
|
18
|
+
this.options.tools.push(tool);
|
|
19
|
+
this.options.handlers[tool.name] = handler;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get all available tools
|
|
23
|
+
*/
|
|
24
|
+
getTools() {
|
|
25
|
+
return this.options.tools;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute a tool
|
|
29
|
+
*/
|
|
30
|
+
async executeTool(name, params) {
|
|
31
|
+
const handler = this.options.handlers[name];
|
|
32
|
+
if (!handler) {
|
|
33
|
+
throw new Error(`Tool '${name}' not found`);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return await handler(params);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`Tool execution failed: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get server info
|
|
45
|
+
*/
|
|
46
|
+
getServerInfo() {
|
|
47
|
+
return {
|
|
48
|
+
name: this.options.name,
|
|
49
|
+
version: this.options.version,
|
|
50
|
+
toolCount: this.options.tools.length
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Start the MCP server (basic implementation)
|
|
55
|
+
*/
|
|
56
|
+
async start() {
|
|
57
|
+
logger.info(
|
|
58
|
+
`[smrt-mcp] Server '${this.options.name}' started with ${this.options.tools.length} tools`
|
|
59
|
+
);
|
|
60
|
+
logger.debug(
|
|
61
|
+
`[smrt-mcp] Available tools: ${this.options.tools.map((t) => t.name).join(", ")}`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function createMCPServer(options) {
|
|
66
|
+
return new SmrtMCPServer(options);
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
SmrtMCPServer,
|
|
70
|
+
createMCPServer
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sources":["../../src/runtime/mcp.ts"],"sourcesContent":["/**\n * Runtime MCP server implementation for SMRT auto-generated services\n */\n\nimport { createLogger } from '@happyvertical/logger';\n\nconst logger = createLogger({ level: 'info' });\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: any;\n}\n\nexport interface MCPServerOptions {\n name?: string;\n version?: string;\n tools?: MCPTool[];\n handlers?: Record<string, (params: any) => Promise<any>>;\n}\n\nexport class SmrtMCPServer {\n private options: Required<MCPServerOptions>;\n\n constructor(options: MCPServerOptions = {}) {\n this.options = {\n name: 'smrt-auto-generated',\n version: '1.0.0',\n tools: [],\n handlers: {},\n ...options,\n };\n }\n\n /**\n * Add a tool to the server\n */\n addTool(tool: MCPTool, handler: (params: any) => Promise<any>): void {\n this.options.tools.push(tool);\n this.options.handlers[tool.name] = handler;\n }\n\n /**\n * Get all available tools\n */\n getTools(): MCPTool[] {\n return this.options.tools;\n }\n\n /**\n * Execute a tool\n */\n async executeTool(name: string, params: any): Promise<any> {\n const handler = this.options.handlers[name];\n if (!handler) {\n throw new Error(`Tool '${name}' not found`);\n }\n\n try {\n return await handler(params);\n } catch (error) {\n throw new Error(\n `Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Get server info\n */\n getServerInfo() {\n return {\n name: this.options.name,\n version: this.options.version,\n toolCount: this.options.tools.length,\n };\n }\n\n /**\n * Start the MCP server (basic implementation)\n */\n async start(): Promise<void> {\n logger.info(\n `[smrt-mcp] Server '${this.options.name}' started with ${this.options.tools.length} tools`,\n );\n logger.debug(\n `[smrt-mcp] Available tools: ${this.options.tools.map((t) => t.name).join(', ')}`,\n );\n }\n}\n\n/**\n * Create a new SMRT MCP server instance\n */\nexport function createMCPServer(options?: MCPServerOptions): SmrtMCPServer {\n return new SmrtMCPServer(options);\n}\n"],"names":[],"mappings":";AAMA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAetC,MAAM,cAAc;AAAA,EACjB;AAAA,EAER,YAAY,UAA4B,IAAI;AAC1C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO,CAAA;AAAA,MACP,UAAU,CAAA;AAAA,MACV,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAe,SAA8C;AACnE,SAAK,QAAQ,MAAM,KAAK,IAAI;AAC5B,SAAK,QAAQ,SAAS,KAAK,IAAI,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAsB;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc,QAA2B;AACzD,UAAM,UAAU,KAAK,QAAQ,SAAS,IAAI;AAC1C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,SAAS,IAAI,aAAa;AAAA,IAC5C;AAEA,QAAI;AACF,aAAO,MAAM,QAAQ,MAAM;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAAA;AAAA,IAEtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,KAAK,QAAQ,MAAM;AAAA,IAAA;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO;AAAA,MACL,sBAAsB,KAAK,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,MAAM,MAAM;AAAA,IAAA;AAEpF,WAAO;AAAA,MACL,+BAA+B,KAAK,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAAA;AAAA,EAEnF;AACF;AAKO,SAAS,gBAAgB,SAA2C;AACzE,SAAO,IAAI,cAAc,OAAO;AAClC;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { SmrtRequest, SmrtServerOptions } from './types';
|
|
2
|
+
export declare class SmrtServer {
|
|
3
|
+
private options;
|
|
4
|
+
private routes;
|
|
5
|
+
constructor(options?: SmrtServerOptions);
|
|
6
|
+
/**
|
|
7
|
+
* Add a route handler
|
|
8
|
+
*/
|
|
9
|
+
addRoute(method: string, path: string, handler: (req: SmrtRequest) => Promise<Response>): void;
|
|
10
|
+
/**
|
|
11
|
+
* Add GET route handler (RouteApp compatibility)
|
|
12
|
+
*/
|
|
13
|
+
get(path: string, handler: (req: any, res: any) => void): void;
|
|
14
|
+
/**
|
|
15
|
+
* Add POST route handler (RouteApp compatibility)
|
|
16
|
+
*/
|
|
17
|
+
post(path: string, handler: (req: any, res: any) => void): void;
|
|
18
|
+
/**
|
|
19
|
+
* Add PUT route handler (RouteApp compatibility)
|
|
20
|
+
*/
|
|
21
|
+
put(path: string, handler: (req: any, res: any) => void): void;
|
|
22
|
+
/**
|
|
23
|
+
* Add DELETE route handler (RouteApp compatibility)
|
|
24
|
+
*/
|
|
25
|
+
delete(path: string, handler: (req: any, res: any) => void): void;
|
|
26
|
+
/**
|
|
27
|
+
* Convert Express-style handler to SMRT handler
|
|
28
|
+
*/
|
|
29
|
+
private addExpressStyleRoute;
|
|
30
|
+
/**
|
|
31
|
+
* Start the server
|
|
32
|
+
*/
|
|
33
|
+
start(): Promise<{
|
|
34
|
+
server: any;
|
|
35
|
+
url: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Dispatch a request in-process and return the Response, without binding a
|
|
39
|
+
* socket. Supported public entry point for embedding the router and for
|
|
40
|
+
* tests that exercise routing/auth/CORS without spawning an HTTP server.
|
|
41
|
+
*/
|
|
42
|
+
dispatch(request: Request): Promise<Response>;
|
|
43
|
+
/**
|
|
44
|
+
* Convert stream to string
|
|
45
|
+
*/
|
|
46
|
+
private streamToString;
|
|
47
|
+
/**
|
|
48
|
+
* Convert Node.js IncomingMessage to Web Request
|
|
49
|
+
*/
|
|
50
|
+
private nodeRequestToWebRequest;
|
|
51
|
+
/**
|
|
52
|
+
* Convert Web Response to Node.js ServerResponse
|
|
53
|
+
*/
|
|
54
|
+
private webResponseToNodeResponse;
|
|
55
|
+
/**
|
|
56
|
+
* Handle incoming requests
|
|
57
|
+
*/
|
|
58
|
+
private handleRequest;
|
|
59
|
+
/**
|
|
60
|
+
* Parse incoming request into SmrtRequest format
|
|
61
|
+
*/
|
|
62
|
+
private parseRequest;
|
|
63
|
+
/**
|
|
64
|
+
* Find route handler with parameter extraction
|
|
65
|
+
*/
|
|
66
|
+
private findRouteHandler;
|
|
67
|
+
/**
|
|
68
|
+
* Match route path with parameters (e.g., /users/:id)
|
|
69
|
+
*/
|
|
70
|
+
private matchRoute;
|
|
71
|
+
/**
|
|
72
|
+
* Handle authentication
|
|
73
|
+
*/
|
|
74
|
+
private authenticate;
|
|
75
|
+
/**
|
|
76
|
+
* Create CORS preflight response
|
|
77
|
+
*/
|
|
78
|
+
private createCorsResponse;
|
|
79
|
+
/**
|
|
80
|
+
* Add CORS headers to response
|
|
81
|
+
*/
|
|
82
|
+
private addCorsHeaders;
|
|
83
|
+
/**
|
|
84
|
+
* Get CORS headers
|
|
85
|
+
*/
|
|
86
|
+
private getCorsHeaders;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a new SMRT server instance
|
|
90
|
+
*/
|
|
91
|
+
export declare function createSmrtServer(options?: SmrtServerOptions): SmrtServer;
|
|
92
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAgB9D,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CACF;gBAEA,OAAO,GAAE,iBAAsB;IAU3C;;OAEG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC;IAMlD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI/D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIjE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBpD;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInD;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,uBAAuB;IAyBrC;;OAEG;YACW,yBAAyB;IAwBvC;;OAEG;YACW,aAAa;IA8C3B;;OAEG;YACW,YAAY;IA8D1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,UAAU;IA8BlB;;OAEG;YACW,YAAY;IA+B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { createLogger } from "@happyvertical/logger";
|
|
3
|
+
const logger = createLogger({ level: "info" });
|
|
4
|
+
class BadRequestError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "BadRequestError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class SmrtServer {
|
|
11
|
+
options;
|
|
12
|
+
routes = /* @__PURE__ */ new Map();
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.options = {
|
|
15
|
+
port: 3e3,
|
|
16
|
+
hostname: "localhost",
|
|
17
|
+
basePath: "/api/v1",
|
|
18
|
+
cors: true,
|
|
19
|
+
...options
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Add a route handler
|
|
24
|
+
*/
|
|
25
|
+
addRoute(method, path, handler) {
|
|
26
|
+
const key = `${method.toUpperCase()} ${path}`;
|
|
27
|
+
this.routes.set(key, handler);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Add GET route handler (RouteApp compatibility)
|
|
31
|
+
*/
|
|
32
|
+
get(path, handler) {
|
|
33
|
+
this.addExpressStyleRoute("GET", path, handler);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add POST route handler (RouteApp compatibility)
|
|
37
|
+
*/
|
|
38
|
+
post(path, handler) {
|
|
39
|
+
this.addExpressStyleRoute("POST", path, handler);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Add PUT route handler (RouteApp compatibility)
|
|
43
|
+
*/
|
|
44
|
+
put(path, handler) {
|
|
45
|
+
this.addExpressStyleRoute("PUT", path, handler);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Add DELETE route handler (RouteApp compatibility)
|
|
49
|
+
*/
|
|
50
|
+
delete(path, handler) {
|
|
51
|
+
this.addExpressStyleRoute("DELETE", path, handler);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Convert Express-style handler to SMRT handler
|
|
55
|
+
*/
|
|
56
|
+
addExpressStyleRoute(method, path, handler) {
|
|
57
|
+
const smrtHandler = async (req) => {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
let settled = false;
|
|
60
|
+
const settle = (response) => {
|
|
61
|
+
if (settled) return;
|
|
62
|
+
settled = true;
|
|
63
|
+
resolve(response);
|
|
64
|
+
};
|
|
65
|
+
const fail = (error) => {
|
|
66
|
+
if (settled) return;
|
|
67
|
+
settled = true;
|
|
68
|
+
reject(error);
|
|
69
|
+
};
|
|
70
|
+
const res = {
|
|
71
|
+
status: (code) => {
|
|
72
|
+
res.statusCode = code;
|
|
73
|
+
return res;
|
|
74
|
+
},
|
|
75
|
+
json: (data) => {
|
|
76
|
+
settle(
|
|
77
|
+
new Response(JSON.stringify(data), {
|
|
78
|
+
status: res.statusCode || 200,
|
|
79
|
+
headers: {
|
|
80
|
+
"Content-Type": "application/json",
|
|
81
|
+
...res.headers
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
send: (data) => {
|
|
87
|
+
const body = typeof data === "string" ? data : JSON.stringify(data);
|
|
88
|
+
settle(
|
|
89
|
+
new Response(body, {
|
|
90
|
+
status: res.statusCode || 200,
|
|
91
|
+
headers: {
|
|
92
|
+
"Content-Type": typeof data === "string" ? "text/plain" : "application/json",
|
|
93
|
+
...res.headers
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
);
|
|
97
|
+
},
|
|
98
|
+
end: (data) => {
|
|
99
|
+
settle(
|
|
100
|
+
new Response(data || "", {
|
|
101
|
+
status: res.statusCode || 200,
|
|
102
|
+
headers: res.headers
|
|
103
|
+
})
|
|
104
|
+
);
|
|
105
|
+
},
|
|
106
|
+
setHeader: (key, value) => {
|
|
107
|
+
if (!res.headers) res.headers = {};
|
|
108
|
+
res.headers[key] = value;
|
|
109
|
+
return res;
|
|
110
|
+
},
|
|
111
|
+
statusCode: 200,
|
|
112
|
+
headers: {}
|
|
113
|
+
};
|
|
114
|
+
Promise.resolve().then(() => handler(req, res)).then(() => {
|
|
115
|
+
if (!settled) {
|
|
116
|
+
settle(
|
|
117
|
+
new Response("Internal Server Error", {
|
|
118
|
+
status: 500
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}).catch((error) => fail(error));
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
this.addRoute(method, path, smrtHandler);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Start the server
|
|
129
|
+
*/
|
|
130
|
+
async start() {
|
|
131
|
+
const server = http.createServer(async (req, res) => {
|
|
132
|
+
try {
|
|
133
|
+
const request = await this.nodeRequestToWebRequest(req);
|
|
134
|
+
const response = await this.handleRequest(request);
|
|
135
|
+
await this.webResponseToNodeResponse(response, res);
|
|
136
|
+
} catch (_error) {
|
|
137
|
+
res.statusCode = 500;
|
|
138
|
+
res.end("Internal Server Error");
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
server.listen(this.options.port, this.options.hostname);
|
|
142
|
+
const url = `http://${this.options.hostname}:${this.options.port}`;
|
|
143
|
+
logger.info(`[smrt] Server started at ${url}`);
|
|
144
|
+
return { server, url };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Dispatch a request in-process and return the Response, without binding a
|
|
148
|
+
* socket. Supported public entry point for embedding the router and for
|
|
149
|
+
* tests that exercise routing/auth/CORS without spawning an HTTP server.
|
|
150
|
+
*/
|
|
151
|
+
async dispatch(request) {
|
|
152
|
+
return this.handleRequest(request);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Convert stream to string
|
|
156
|
+
*/
|
|
157
|
+
async streamToString(stream) {
|
|
158
|
+
const chunks = [];
|
|
159
|
+
for await (const chunk of stream) {
|
|
160
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
161
|
+
}
|
|
162
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Convert Node.js IncomingMessage to Web Request
|
|
166
|
+
*/
|
|
167
|
+
async nodeRequestToWebRequest(req) {
|
|
168
|
+
const url = `http://${this.options.hostname}:${this.options.port}${req.url}`;
|
|
169
|
+
const method = req.method || "GET";
|
|
170
|
+
const headers = new Headers();
|
|
171
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
172
|
+
if (value) {
|
|
173
|
+
headers.set(key, Array.isArray(value) ? value[0] : value);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
let body;
|
|
177
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
178
|
+
body = await this.streamToString(req);
|
|
179
|
+
}
|
|
180
|
+
return new Request(url, {
|
|
181
|
+
method,
|
|
182
|
+
headers,
|
|
183
|
+
body
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Convert Web Response to Node.js ServerResponse
|
|
188
|
+
*/
|
|
189
|
+
async webResponseToNodeResponse(webResponse, res) {
|
|
190
|
+
res.statusCode = webResponse.status;
|
|
191
|
+
webResponse.headers.forEach((value, key) => {
|
|
192
|
+
res.setHeader(key, value);
|
|
193
|
+
});
|
|
194
|
+
if (webResponse.body) {
|
|
195
|
+
const reader = webResponse.body.getReader();
|
|
196
|
+
while (true) {
|
|
197
|
+
const { done, value } = await reader.read();
|
|
198
|
+
if (done) break;
|
|
199
|
+
res.write(value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
res.end();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Handle incoming requests
|
|
206
|
+
*/
|
|
207
|
+
async handleRequest(request) {
|
|
208
|
+
try {
|
|
209
|
+
if (this.options.cors && request.method === "OPTIONS") {
|
|
210
|
+
return this.createCorsResponse();
|
|
211
|
+
}
|
|
212
|
+
const smrtRequest = await this.parseRequest(request);
|
|
213
|
+
if (this.options.auth) {
|
|
214
|
+
const authResult = await this.authenticate(smrtRequest);
|
|
215
|
+
if (!authResult) {
|
|
216
|
+
return new Response("Unauthorized", { status: 401 });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const routeKey = `${request.method} ${smrtRequest.url}`;
|
|
220
|
+
const handler = this.findRouteHandler(routeKey);
|
|
221
|
+
if (!handler) {
|
|
222
|
+
return new Response("Not Found", { status: 404 });
|
|
223
|
+
}
|
|
224
|
+
const response = await handler(smrtRequest);
|
|
225
|
+
if (this.options.cors) {
|
|
226
|
+
this.addCorsHeaders(response);
|
|
227
|
+
}
|
|
228
|
+
return response;
|
|
229
|
+
} catch (error) {
|
|
230
|
+
if (error instanceof BadRequestError) {
|
|
231
|
+
return new Response(error.message, { status: 400 });
|
|
232
|
+
}
|
|
233
|
+
logger.error("[smrt] Request error", { error });
|
|
234
|
+
return new Response("Internal Server Error", { status: 500 });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Parse incoming request into SmrtRequest format
|
|
239
|
+
*/
|
|
240
|
+
async parseRequest(request) {
|
|
241
|
+
const url = new URL(request.url);
|
|
242
|
+
const pathname = url.pathname;
|
|
243
|
+
const routePath = pathname.startsWith(this.options.basePath) ? pathname.slice(this.options.basePath.length) : pathname;
|
|
244
|
+
const query = {};
|
|
245
|
+
url.searchParams.forEach((value, key) => {
|
|
246
|
+
query[key] = value;
|
|
247
|
+
});
|
|
248
|
+
let body;
|
|
249
|
+
if (request.body && (request.method === "POST" || request.method === "PUT" || request.method === "PATCH")) {
|
|
250
|
+
const contentType = request.headers.get("content-type") || "";
|
|
251
|
+
const rawBody = await request.text();
|
|
252
|
+
if (rawBody.trim() === "") ;
|
|
253
|
+
else if (contentType.includes("application/json")) {
|
|
254
|
+
try {
|
|
255
|
+
body = JSON.parse(rawBody);
|
|
256
|
+
} catch (error) {
|
|
257
|
+
throw new BadRequestError(
|
|
258
|
+
`Invalid JSON request body: ${error instanceof Error ? error.message : String(error)}`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
body = rawBody;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const headers = {};
|
|
266
|
+
request.headers.forEach((value, key) => {
|
|
267
|
+
headers[key] = value;
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
params: {},
|
|
271
|
+
// Will be populated by route matching
|
|
272
|
+
query,
|
|
273
|
+
body,
|
|
274
|
+
headers,
|
|
275
|
+
method: request.method,
|
|
276
|
+
url: routePath,
|
|
277
|
+
json: async () => body
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Find route handler with parameter extraction
|
|
282
|
+
*/
|
|
283
|
+
findRouteHandler(routeKey) {
|
|
284
|
+
if (this.routes.has(routeKey)) {
|
|
285
|
+
return this.routes.get(routeKey);
|
|
286
|
+
}
|
|
287
|
+
const [method, path] = routeKey.split(" ", 2);
|
|
288
|
+
for (const [key, handler] of this.routes.entries()) {
|
|
289
|
+
const [routeMethod, routePath] = key.split(" ", 2);
|
|
290
|
+
if (method === routeMethod) {
|
|
291
|
+
const params = this.matchRoute(path, routePath);
|
|
292
|
+
if (params !== null) {
|
|
293
|
+
return async (req) => {
|
|
294
|
+
req.params = params;
|
|
295
|
+
return handler(req);
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return void 0;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Match route path with parameters (e.g., /users/:id)
|
|
304
|
+
*/
|
|
305
|
+
matchRoute(requestPath, routePath) {
|
|
306
|
+
const requestSegments = requestPath.split("/").filter((s) => s);
|
|
307
|
+
const routeSegments = routePath.split("/").filter((s) => s);
|
|
308
|
+
if (requestSegments.length !== routeSegments.length) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
const params = {};
|
|
312
|
+
for (let i = 0; i < routeSegments.length; i++) {
|
|
313
|
+
const routeSegment = routeSegments[i];
|
|
314
|
+
const requestSegment = requestSegments[i];
|
|
315
|
+
if (routeSegment.startsWith(":")) {
|
|
316
|
+
const paramName = routeSegment.slice(1);
|
|
317
|
+
params[paramName] = requestSegment;
|
|
318
|
+
} else if (routeSegment !== requestSegment) {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return params;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handle authentication
|
|
326
|
+
*/
|
|
327
|
+
async authenticate(request) {
|
|
328
|
+
if (!this.options.auth) return true;
|
|
329
|
+
const authHeader = request.headers.authorization;
|
|
330
|
+
if (!authHeader) return false;
|
|
331
|
+
switch (this.options.auth.type) {
|
|
332
|
+
case "bearer": {
|
|
333
|
+
const token = authHeader.replace("Bearer ", "");
|
|
334
|
+
return this.options.auth.verify ? await this.options.auth.verify(token) : true;
|
|
335
|
+
}
|
|
336
|
+
case "basic": {
|
|
337
|
+
const credentials = authHeader.replace("Basic ", "");
|
|
338
|
+
return this.options.auth.verify ? await this.options.auth.verify(credentials) : true;
|
|
339
|
+
}
|
|
340
|
+
case "custom":
|
|
341
|
+
return this.options.auth.verify ? await this.options.auth.verify(authHeader) : true;
|
|
342
|
+
default:
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Create CORS preflight response
|
|
348
|
+
*/
|
|
349
|
+
createCorsResponse() {
|
|
350
|
+
return new Response(null, {
|
|
351
|
+
status: 204,
|
|
352
|
+
headers: this.getCorsHeaders()
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Add CORS headers to response
|
|
357
|
+
*/
|
|
358
|
+
addCorsHeaders(response) {
|
|
359
|
+
const corsHeaders = this.getCorsHeaders();
|
|
360
|
+
Object.entries(corsHeaders).forEach(([key, value]) => {
|
|
361
|
+
response.headers.set(key, value);
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get CORS headers
|
|
366
|
+
*/
|
|
367
|
+
getCorsHeaders() {
|
|
368
|
+
const corsConfig = this.options.cors;
|
|
369
|
+
if (typeof corsConfig === "boolean") {
|
|
370
|
+
return {
|
|
371
|
+
"Access-Control-Allow-Origin": "*",
|
|
372
|
+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
|
|
373
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization"
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
"Access-Control-Allow-Origin": Array.isArray(corsConfig.origin) ? corsConfig.origin.join(", ") : corsConfig.origin || "*",
|
|
378
|
+
"Access-Control-Allow-Methods": corsConfig.methods?.join(", ") || "GET, POST, PUT, DELETE, OPTIONS",
|
|
379
|
+
"Access-Control-Allow-Headers": corsConfig.headers?.join(", ") || "Content-Type, Authorization"
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function createSmrtServer(options) {
|
|
384
|
+
return new SmrtServer(options);
|
|
385
|
+
}
|
|
386
|
+
export {
|
|
387
|
+
SmrtServer,
|
|
388
|
+
createSmrtServer
|
|
389
|
+
};
|
|
390
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../../src/runtime/server.ts"],"sourcesContent":["/**\n * Runtime server implementation for SMRT auto-generated services\n */\n\nimport http from 'node:http';\nimport { createLogger } from '@happyvertical/logger';\nimport type { SmrtRequest, SmrtServerOptions } from './types';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Signals a malformed client request (e.g. invalid JSON body) so that\n * {@link SmrtServer.handleRequest} can answer 400 instead of a generic 500\n * (#1378). Internal to this module.\n */\nclass BadRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BadRequestError';\n }\n}\n\nexport class SmrtServer {\n private options: Required<SmrtServerOptions>;\n private routes: Map<string, (req: SmrtRequest) => Promise<Response>> =\n new Map();\n\n constructor(options: SmrtServerOptions = {}) {\n this.options = {\n port: 3000,\n hostname: 'localhost',\n basePath: '/api/v1',\n cors: true,\n ...options,\n } as Required<SmrtServerOptions>;\n }\n\n /**\n * Add a route handler\n */\n addRoute(\n method: string,\n path: string,\n handler: (req: SmrtRequest) => Promise<Response>,\n ) {\n const key = `${method.toUpperCase()} ${path}`;\n this.routes.set(key, handler);\n }\n\n /**\n * Add GET route handler (RouteApp compatibility)\n */\n get(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('GET', path, handler);\n }\n\n /**\n * Add POST route handler (RouteApp compatibility)\n */\n post(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('POST', path, handler);\n }\n\n /**\n * Add PUT route handler (RouteApp compatibility)\n */\n put(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('PUT', path, handler);\n }\n\n /**\n * Add DELETE route handler (RouteApp compatibility)\n */\n delete(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('DELETE', path, handler);\n }\n\n /**\n * Convert Express-style handler to SMRT handler\n */\n private addExpressStyleRoute(\n method: string,\n path: string,\n handler: (req: any, res: any) => void,\n ) {\n const smrtHandler = async (req: SmrtRequest): Promise<Response> => {\n return new Promise((resolve, reject) => {\n // Tracks whether the handler ever produced a response. A handler that\n // returns/resolves without calling json/send/end would otherwise leave\n // this promise pending forever (server hang) — we 500 instead (#1378).\n let settled = false;\n const settle = (response: Response) => {\n if (settled) return;\n settled = true;\n resolve(response);\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n reject(error);\n };\n // Create Express-style response object\n const res = {\n status: (code: number) => {\n res.statusCode = code;\n return res;\n },\n json: (data: any) => {\n settle(\n new Response(JSON.stringify(data), {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type': 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n send: (data: any) => {\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n settle(\n new Response(body, {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type':\n typeof data === 'string'\n ? 'text/plain'\n : 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n end: (data?: any) => {\n settle(\n new Response(data || '', {\n status: res.statusCode || 200,\n headers: res.headers,\n }),\n );\n },\n setHeader: (key: string, value: string) => {\n if (!res.headers) res.headers = {};\n res.headers[key] = value;\n return res;\n },\n statusCode: 200,\n headers: {} as Record<string, string>,\n };\n\n // Await the handler so async rejections propagate. Express-style\n // handlers signal completion via res.json/send/end; a sync throw or an\n // async rejection is surfaced as 500 by handleRequest. Promise.resolve\n // wraps both sync and async handlers uniformly (#1378).\n Promise.resolve()\n .then(() => handler(req, res))\n .then(() => {\n // Handler completed without producing a response (never called\n // json/send/end). Resolve a 500 rather than hanging forever.\n if (!settled) {\n settle(\n new Response('Internal Server Error', {\n status: 500,\n }),\n );\n }\n })\n .catch((error) => fail(error));\n });\n };\n\n this.addRoute(method, path, smrtHandler);\n }\n\n /**\n * Start the server\n */\n async start(): Promise<{ server: any; url: string }> {\n const server = http.createServer(async (req, res) => {\n try {\n const request = await this.nodeRequestToWebRequest(req);\n const response = await this.handleRequest(request);\n await this.webResponseToNodeResponse(response, res);\n } catch (_error) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n }\n });\n\n server.listen(this.options.port, this.options.hostname);\n\n const url = `http://${this.options.hostname}:${this.options.port}`;\n logger.info(`[smrt] Server started at ${url}`);\n\n return { server, url };\n }\n\n /**\n * Dispatch a request in-process and return the Response, without binding a\n * socket. Supported public entry point for embedding the router and for\n * tests that exercise routing/auth/CORS without spawning an HTTP server.\n */\n async dispatch(request: Request): Promise<Response> {\n return this.handleRequest(request);\n }\n\n /**\n * Convert stream to string\n */\n private async streamToString(stream: http.IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n /**\n * Convert Node.js IncomingMessage to Web Request\n */\n private async nodeRequestToWebRequest(\n req: http.IncomingMessage,\n ): Promise<Request> {\n const url = `http://${this.options.hostname}:${this.options.port}${req.url}`;\n const method = req.method || 'GET';\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n headers.set(key, Array.isArray(value) ? value[0] : value);\n }\n }\n\n let body: string | undefined;\n if (method !== 'GET' && method !== 'HEAD') {\n body = await this.streamToString(req);\n }\n\n return new Request(url, {\n method,\n headers,\n body,\n });\n }\n\n /**\n * Convert Web Response to Node.js ServerResponse\n */\n private async webResponseToNodeResponse(\n webResponse: Response,\n res: http.ServerResponse,\n ): Promise<void> {\n res.statusCode = webResponse.status;\n\n // Set headers\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Send body\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n\n res.end();\n }\n\n /**\n * Handle incoming requests\n */\n private async handleRequest(request: Request): Promise<Response> {\n try {\n // Handle CORS\n if (this.options.cors && request.method === 'OPTIONS') {\n return this.createCorsResponse();\n }\n\n // Parse request\n const smrtRequest = await this.parseRequest(request);\n\n // Check authentication\n if (this.options.auth) {\n const authResult = await this.authenticate(smrtRequest);\n if (!authResult) {\n return new Response('Unauthorized', { status: 401 });\n }\n }\n\n // Find matching route\n const routeKey = `${request.method} ${smrtRequest.url}`;\n const handler = this.findRouteHandler(routeKey);\n\n if (!handler) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Execute handler\n const response = await handler(smrtRequest);\n\n // Add CORS headers if needed\n if (this.options.cors) {\n this.addCorsHeaders(response);\n }\n\n return response;\n } catch (error) {\n // A malformed request (e.g. invalid JSON body) is the client's fault →\n // 400, not 500 (#1378).\n if (error instanceof BadRequestError) {\n return new Response(error.message, { status: 400 });\n }\n logger.error('[smrt] Request error', { error });\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n\n /**\n * Parse incoming request into SmrtRequest format\n */\n private async parseRequest(request: Request): Promise<SmrtRequest> {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Remove base path\n const routePath = pathname.startsWith(this.options.basePath)\n ? pathname.slice(this.options.basePath.length)\n : pathname;\n\n // Parse query parameters\n const query: Record<string, any> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n // Parse body if present. `request.body` is a stream and stays truthy even\n // for an empty body, so reading text first lets us treat an empty body as\n // \"no body\" (undefined) and surface only genuinely malformed JSON as a 400\n // rather than letting request.json() throw a generic 500 (#1378).\n let body: any;\n if (\n request.body &&\n (request.method === 'POST' ||\n request.method === 'PUT' ||\n request.method === 'PATCH')\n ) {\n const contentType = request.headers.get('content-type') || '';\n const rawBody = await request.text();\n if (rawBody.trim() === '') {\n // Empty body → no body. Leave `body` undefined.\n } else if (contentType.includes('application/json')) {\n try {\n body = JSON.parse(rawBody);\n } catch (error) {\n throw new BadRequestError(\n `Invalid JSON request body: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n } else {\n body = rawBody;\n }\n }\n\n // Extract headers\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n params: {}, // Will be populated by route matching\n query,\n body,\n headers,\n method: request.method,\n url: routePath,\n json: async () => body,\n };\n }\n\n /**\n * Find route handler with parameter extraction\n */\n private findRouteHandler(\n routeKey: string,\n ): ((req: SmrtRequest) => Promise<Response>) | undefined {\n // First try exact match\n if (this.routes.has(routeKey)) {\n return this.routes.get(routeKey);\n }\n\n // Try parameter matching\n const [method, path] = routeKey.split(' ', 2);\n\n for (const [key, handler] of this.routes.entries()) {\n const [routeMethod, routePath] = key.split(' ', 2);\n\n if (method === routeMethod) {\n const params = this.matchRoute(path, routePath);\n if (params !== null) {\n // Return wrapped handler that injects params\n return async (req: SmrtRequest) => {\n req.params = params;\n return handler(req);\n };\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Match route path with parameters (e.g., /users/:id)\n */\n private matchRoute(\n requestPath: string,\n routePath: string,\n ): Record<string, string> | null {\n const requestSegments = requestPath.split('/').filter((s) => s);\n const routeSegments = routePath.split('/').filter((s) => s);\n\n if (requestSegments.length !== routeSegments.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < routeSegments.length; i++) {\n const routeSegment = routeSegments[i];\n const requestSegment = requestSegments[i];\n\n if (routeSegment.startsWith(':')) {\n // Parameter segment\n const paramName = routeSegment.slice(1);\n params[paramName] = requestSegment;\n } else if (routeSegment !== requestSegment) {\n // Literal segment mismatch\n return null;\n }\n }\n\n return params;\n }\n\n /**\n * Handle authentication\n */\n private async authenticate(request: SmrtRequest): Promise<boolean> {\n if (!this.options.auth) return true;\n\n const authHeader = request.headers.authorization;\n if (!authHeader) return false;\n\n switch (this.options.auth.type) {\n case 'bearer': {\n const token = authHeader.replace('Bearer ', '');\n return this.options.auth.verify\n ? await this.options.auth.verify(token)\n : true;\n }\n\n case 'basic': {\n const credentials = authHeader.replace('Basic ', '');\n return this.options.auth.verify\n ? await this.options.auth.verify(credentials)\n : true;\n }\n\n case 'custom':\n return this.options.auth.verify\n ? await this.options.auth.verify(authHeader)\n : true;\n\n default:\n return false;\n }\n }\n\n /**\n * Create CORS preflight response\n */\n private createCorsResponse(): Response {\n return new Response(null, {\n status: 204,\n headers: this.getCorsHeaders(),\n });\n }\n\n /**\n * Add CORS headers to response\n */\n private addCorsHeaders(response: Response): void {\n const corsHeaders = this.getCorsHeaders();\n Object.entries(corsHeaders).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n }\n\n /**\n * Get CORS headers\n */\n private getCorsHeaders(): Record<string, string> {\n const corsConfig = this.options.cors;\n\n if (typeof corsConfig === 'boolean') {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n };\n }\n\n return {\n 'Access-Control-Allow-Origin': Array.isArray(corsConfig.origin)\n ? corsConfig.origin.join(', ')\n : corsConfig.origin || '*',\n 'Access-Control-Allow-Methods':\n corsConfig.methods?.join(', ') || 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers':\n corsConfig.headers?.join(', ') || 'Content-Type, Authorization',\n };\n }\n}\n\n/**\n * Create a new SMRT server instance\n */\nexport function createSmrtServer(options?: SmrtServerOptions): SmrtServer {\n return new SmrtServer(options);\n}\n"],"names":[],"mappings":";;AAQA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAO7C,MAAM,wBAAwB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,WAAW;AAAA,EACd;AAAA,EACA,6BACF,IAAA;AAAA,EAEN,YAAY,UAA6B,IAAI;AAC3C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,QACA,MACA,SACA;AACA,UAAM,MAAM,GAAG,OAAO,YAAA,CAAa,IAAI,IAAI;AAC3C,SAAK,OAAO,IAAI,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc,SAA6C;AAC7D,SAAK,qBAAqB,OAAO,MAAM,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,MAAc,SAA6C;AAC9D,SAAK,qBAAqB,QAAQ,MAAM,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc,SAA6C;AAC7D,SAAK,qBAAqB,OAAO,MAAM,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAc,SAA6C;AAChE,SAAK,qBAAqB,UAAU,MAAM,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,QACA,MACA,SACA;AACA,UAAM,cAAc,OAAO,QAAwC;AACjE,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAItC,YAAI,UAAU;AACd,cAAM,SAAS,CAAC,aAAuB;AACrC,cAAI,QAAS;AACb,oBAAU;AACV,kBAAQ,QAAQ;AAAA,QAClB;AACA,cAAM,OAAO,CAAC,UAAmB;AAC/B,cAAI,QAAS;AACb,oBAAU;AACV,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,MAAM;AAAA,UACV,QAAQ,CAAC,SAAiB;AACxB,gBAAI,aAAa;AACjB,mBAAO;AAAA,UACT;AAAA,UACA,MAAM,CAAC,SAAc;AACnB;AAAA,cACE,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,gBACjC,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,GAAG,IAAI;AAAA,gBAAA;AAAA,cACT,CACD;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,MAAM,CAAC,SAAc;AACnB,kBAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI;AAClE;AAAA,cACE,IAAI,SAAS,MAAM;AAAA,gBACjB,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS;AAAA,kBACP,gBACE,OAAO,SAAS,WACZ,eACA;AAAA,kBACN,GAAG,IAAI;AAAA,gBAAA;AAAA,cACT,CACD;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,KAAK,CAAC,SAAe;AACnB;AAAA,cACE,IAAI,SAAS,QAAQ,IAAI;AAAA,gBACvB,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS,IAAI;AAAA,cAAA,CACd;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,WAAW,CAAC,KAAa,UAAkB;AACzC,gBAAI,CAAC,IAAI,QAAS,KAAI,UAAU,CAAA;AAChC,gBAAI,QAAQ,GAAG,IAAI;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ,SAAS,CAAA;AAAA,QAAC;AAOZ,gBAAQ,UACL,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,EAC5B,KAAK,MAAM;AAGV,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,IAAI,SAAS,yBAAyB;AAAA,gBACpC,QAAQ;AAAA,cAAA,CACT;AAAA,YAAA;AAAA,UAEL;AAAA,QACF,CAAC,EACA,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,SAAK,SAAS,QAAQ,MAAM,WAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAA+C;AACnD,UAAM,SAAS,KAAK,aAAa,OAAO,KAAK,QAAQ;AACnD,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,wBAAwB,GAAG;AACtD,cAAM,WAAW,MAAM,KAAK,cAAc,OAAO;AACjD,cAAM,KAAK,0BAA0B,UAAU,GAAG;AAAA,MACpD,SAAS,QAAQ;AACf,YAAI,aAAa;AACjB,YAAI,IAAI,uBAAuB;AAAA,MACjC;AAAA,IACF,CAAC;AAED,WAAO,OAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAEtD,UAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAI;AAChE,WAAO,KAAK,4BAA4B,GAAG,EAAE;AAE7C,WAAO,EAAE,QAAQ,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,SAAqC;AAClD,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,QAA+C;AAC1E,UAAM,SAAmB,CAAA;AACzB,qBAAiB,SAAS,QAAQ;AAChC,aAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,IACjE;AACA,WAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBACZ,KACkB;AAClB,UAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG;AAC1E,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,UAAU,IAAI,QAAA;AAEpB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,UAAI,OAAO;AACT,gBAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,aAAO,MAAM,KAAK,eAAe,GAAG;AAAA,IACtC;AAEA,WAAO,IAAI,QAAQ,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BACZ,aACA,KACe;AACf,QAAI,aAAa,YAAY;AAG7B,gBAAY,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC1C,UAAI,UAAU,KAAK,KAAK;AAAA,IAC1B,CAAC;AAGD,QAAI,YAAY,MAAM;AACpB,YAAM,SAAS,YAAY,KAAK,UAAA;AAChC,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,YAAI,KAAM;AACV,YAAI,MAAM,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,IAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAAqC;AAC/D,QAAI;AAEF,UAAI,KAAK,QAAQ,QAAQ,QAAQ,WAAW,WAAW;AACrD,eAAO,KAAK,mBAAA;AAAA,MACd;AAGA,YAAM,cAAc,MAAM,KAAK,aAAa,OAAO;AAGnD,UAAI,KAAK,QAAQ,MAAM;AACrB,cAAM,aAAa,MAAM,KAAK,aAAa,WAAW;AACtD,YAAI,CAAC,YAAY;AACf,iBAAO,IAAI,SAAS,gBAAgB,EAAE,QAAQ,KAAK;AAAA,QACrD;AAAA,MACF;AAGA,YAAM,WAAW,GAAG,QAAQ,MAAM,IAAI,YAAY,GAAG;AACrD,YAAM,UAAU,KAAK,iBAAiB,QAAQ;AAE9C,UAAI,CAAC,SAAS;AACZ,eAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK;AAAA,MAClD;AAGA,YAAM,WAAW,MAAM,QAAQ,WAAW;AAG1C,UAAI,KAAK,QAAQ,MAAM;AACrB,aAAK,eAAe,QAAQ;AAAA,MAC9B;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAGd,UAAI,iBAAiB,iBAAiB;AACpC,eAAO,IAAI,SAAS,MAAM,SAAS,EAAE,QAAQ,KAAK;AAAA,MACpD;AACA,aAAO,MAAM,wBAAwB,EAAE,MAAA,CAAO;AAC9C,aAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,KAAK;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAwC;AACjE,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAAW,IAAI;AAGrB,UAAM,YAAY,SAAS,WAAW,KAAK,QAAQ,QAAQ,IACvD,SAAS,MAAM,KAAK,QAAQ,SAAS,MAAM,IAC3C;AAGJ,UAAM,QAA6B,CAAA;AACnC,QAAI,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACvC,YAAM,GAAG,IAAI;AAAA,IACf,CAAC;AAMD,QAAI;AACJ,QACE,QAAQ,SACP,QAAQ,WAAW,UAClB,QAAQ,WAAW,SACnB,QAAQ,WAAW,UACrB;AACA,YAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,KAAK;AAC3D,YAAM,UAAU,MAAM,QAAQ,KAAA;AAC9B,UAAI,QAAQ,KAAA,MAAW,GAAI;AAAA,eAEhB,YAAY,SAAS,kBAAkB,GAAG;AACnD,YAAI;AACF,iBAAO,KAAK,MAAM,OAAO;AAAA,QAC3B,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,8BACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,UAAkC,CAAA;AACxC,YAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACtC,cAAQ,GAAG,IAAI;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACL,QAAQ,CAAA;AAAA;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,KAAK;AAAA,MACL,MAAM,YAAY;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,UACuD;AAEvD,QAAI,KAAK,OAAO,IAAI,QAAQ,GAAG;AAC7B,aAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,IACjC;AAGA,UAAM,CAAC,QAAQ,IAAI,IAAI,SAAS,MAAM,KAAK,CAAC;AAE5C,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,WAAW;AAClD,YAAM,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,KAAK,CAAC;AAEjD,UAAI,WAAW,aAAa;AAC1B,cAAM,SAAS,KAAK,WAAW,MAAM,SAAS;AAC9C,YAAI,WAAW,MAAM;AAEnB,iBAAO,OAAO,QAAqB;AACjC,gBAAI,SAAS;AACb,mBAAO,QAAQ,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WACN,aACA,WAC+B;AAC/B,UAAM,kBAAkB,YAAY,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9D,UAAM,gBAAgB,UAAU,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC;AAE1D,QAAI,gBAAgB,WAAW,cAAc,QAAQ;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,SAAiC,CAAA;AAEvC,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAM,eAAe,cAAc,CAAC;AACpC,YAAM,iBAAiB,gBAAgB,CAAC;AAExC,UAAI,aAAa,WAAW,GAAG,GAAG;AAEhC,cAAM,YAAY,aAAa,MAAM,CAAC;AACtC,eAAO,SAAS,IAAI;AAAA,MACtB,WAAW,iBAAiB,gBAAgB;AAE1C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAwC;AACjE,QAAI,CAAC,KAAK,QAAQ,KAAM,QAAO;AAE/B,UAAM,aAAa,QAAQ,QAAQ;AACnC,QAAI,CAAC,WAAY,QAAO;AAExB,YAAQ,KAAK,QAAQ,KAAK,MAAA;AAAA,MACxB,KAAK,UAAU;AACb,cAAM,QAAQ,WAAW,QAAQ,WAAW,EAAE;AAC9C,eAAO,KAAK,QAAQ,KAAK,SACrB,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK,IACpC;AAAA,MACN;AAAA,MAEA,KAAK,SAAS;AACZ,cAAM,cAAc,WAAW,QAAQ,UAAU,EAAE;AACnD,eAAO,KAAK,QAAQ,KAAK,SACrB,MAAM,KAAK,QAAQ,KAAK,OAAO,WAAW,IAC1C;AAAA,MACN;AAAA,MAEA,KAAK;AACH,eAAO,KAAK,QAAQ,KAAK,SACrB,MAAM,KAAK,QAAQ,KAAK,OAAO,UAAU,IACzC;AAAA,MAEN;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA+B;AACrC,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,SAAS,KAAK,eAAA;AAAA,IAAe,CAC9B;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,UAA0B;AAC/C,UAAM,cAAc,KAAK,eAAA;AACzB,WAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACpD,eAAS,QAAQ,IAAI,KAAK,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAyC;AAC/C,UAAM,aAAa,KAAK,QAAQ;AAEhC,QAAI,OAAO,eAAe,WAAW;AACnC,aAAO;AAAA,QACL,+BAA+B;AAAA,QAC/B,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,MAAA;AAAA,IAEpC;AAEA,WAAO;AAAA,MACL,+BAA+B,MAAM,QAAQ,WAAW,MAAM,IAC1D,WAAW,OAAO,KAAK,IAAI,IAC3B,WAAW,UAAU;AAAA,MACzB,gCACE,WAAW,SAAS,KAAK,IAAI,KAAK;AAAA,MACpC,gCACE,WAAW,SAAS,KAAK,IAAI,KAAK;AAAA,IAAA;AAAA,EAExC;AACF;AAKO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,IAAI,WAAW,OAAO;AAC/B;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime type definitions for SMRT services
|
|
3
|
+
*/
|
|
4
|
+
export interface SmrtServerOptions {
|
|
5
|
+
port?: number;
|
|
6
|
+
hostname?: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
cors?: boolean | {
|
|
9
|
+
origin?: string | string[];
|
|
10
|
+
methods?: string[];
|
|
11
|
+
headers?: string[];
|
|
12
|
+
};
|
|
13
|
+
auth?: {
|
|
14
|
+
type: 'bearer' | 'basic' | 'custom';
|
|
15
|
+
verify?: (token: string) => Promise<boolean | any>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface SmrtClientOptions {
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
basePath?: string;
|
|
21
|
+
auth?: {
|
|
22
|
+
type: 'bearer' | 'basic';
|
|
23
|
+
token?: string;
|
|
24
|
+
username?: string;
|
|
25
|
+
password?: string;
|
|
26
|
+
};
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
}
|
|
29
|
+
export interface SmrtRequest {
|
|
30
|
+
params: Record<string, string>;
|
|
31
|
+
query: Record<string, any>;
|
|
32
|
+
body?: any;
|
|
33
|
+
headers: Record<string, string>;
|
|
34
|
+
method: string;
|
|
35
|
+
url: string;
|
|
36
|
+
json(): Promise<any>;
|
|
37
|
+
}
|
|
38
|
+
export interface SmrtResponse {
|
|
39
|
+
json(data: any, init?: ResponseInit): Response;
|
|
40
|
+
status(code: number): SmrtResponse;
|
|
41
|
+
send(data?: any): Response;
|
|
42
|
+
}
|
|
43
|
+
export interface CollectionInterface {
|
|
44
|
+
list(options?: {
|
|
45
|
+
where?: Record<string, any>;
|
|
46
|
+
orderBy?: string | string[];
|
|
47
|
+
limit?: number;
|
|
48
|
+
offset?: number;
|
|
49
|
+
}): Promise<any[]>;
|
|
50
|
+
get(id: string): Promise<any | null>;
|
|
51
|
+
create(data: any): Promise<any>;
|
|
52
|
+
update(id: string, data: any): Promise<any | null>;
|
|
53
|
+
delete(id: string): Promise<boolean>;
|
|
54
|
+
count(options?: {
|
|
55
|
+
where?: Record<string, any>;
|
|
56
|
+
}): Promise<number>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EACD,OAAO,GACP;QACE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACN,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;KACpD,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEnD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE"}
|