@justscale/core 0.1.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/LICENSE +21 -0
- package/README.md +261 -0
- package/bin/just.js +34 -0
- package/dist/app.d.ts +56 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +182 -0
- package/dist/app.js.map +1 -0
- package/dist/builder/build-context.d.ts +8 -0
- package/dist/builder/build-context.d.ts.map +1 -0
- package/dist/builder/build-context.js +4 -0
- package/dist/builder/build-context.js.map +1 -0
- package/dist/builder/builder.d.ts +60 -0
- package/dist/builder/builder.d.ts.map +1 -0
- package/dist/builder/builder.js +72 -0
- package/dist/builder/builder.js.map +1 -0
- package/dist/builder/create-builder.d.ts +36 -0
- package/dist/builder/create-builder.d.ts.map +1 -0
- package/dist/builder/create-builder.js +66 -0
- package/dist/builder/create-builder.js.map +1 -0
- package/dist/builder/execute.d.ts +37 -0
- package/dist/builder/execute.d.ts.map +1 -0
- package/dist/builder/execute.js +62 -0
- package/dist/builder/execute.js.map +1 -0
- package/dist/builder/feature-builder.d.ts +147 -0
- package/dist/builder/feature-builder.d.ts.map +1 -0
- package/dist/builder/feature-builder.js +138 -0
- package/dist/builder/feature-builder.js.map +1 -0
- package/dist/builder/index.d.ts +35 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +37 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/plugin.d.ts +90 -0
- package/dist/builder/plugin.d.ts.map +1 -0
- package/dist/builder/plugin.js +101 -0
- package/dist/builder/plugin.js.map +1 -0
- package/dist/builder/plugins/query.d.ts +31 -0
- package/dist/builder/plugins/query.d.ts.map +1 -0
- package/dist/builder/plugins/query.js +42 -0
- package/dist/builder/plugins/query.js.map +1 -0
- package/dist/builder/plugins/validation.d.ts +12 -0
- package/dist/builder/plugins/validation.d.ts.map +1 -0
- package/dist/builder/plugins/validation.js +12 -0
- package/dist/builder/plugins/validation.js.map +1 -0
- package/dist/builder/sort.d.ts +27 -0
- package/dist/builder/sort.d.ts.map +1 -0
- package/dist/builder/sort.js +210 -0
- package/dist/builder/sort.js.map +1 -0
- package/dist/builder/stop.d.ts +24 -0
- package/dist/builder/stop.d.ts.map +1 -0
- package/dist/builder/stop.js +27 -0
- package/dist/builder/stop.js.map +1 -0
- package/dist/builder/test/permits-type-spike.d.ts +8 -0
- package/dist/builder/test/permits-type-spike.d.ts.map +1 -0
- package/dist/builder/test/permits-type-spike.js +117 -0
- package/dist/builder/test/permits-type-spike.js.map +1 -0
- package/dist/builder/types.d.ts +678 -0
- package/dist/builder/types.d.ts.map +1 -0
- package/dist/builder/types.js +98 -0
- package/dist/builder/types.js.map +1 -0
- package/dist/builder/validation.d.ts +101 -0
- package/dist/builder/validation.d.ts.map +1 -0
- package/dist/builder/validation.js +335 -0
- package/dist/builder/validation.js.map +1 -0
- package/dist/cli/adapter.d.ts +23 -0
- package/dist/cli/adapter.d.ts.map +1 -0
- package/dist/cli/adapter.js +26 -0
- package/dist/cli/adapter.js.map +1 -0
- package/dist/cli/args.d.ts +150 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +172 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/assemble.d.ts +20 -0
- package/dist/cli/assemble.d.ts.map +1 -0
- package/dist/cli/assemble.js +55 -0
- package/dist/cli/assemble.js.map +1 -0
- package/dist/cli/bin/main.d.ts +26 -0
- package/dist/cli/bin/main.d.ts.map +1 -0
- package/dist/cli/bin/main.js +475 -0
- package/dist/cli/bin/main.js.map +1 -0
- package/dist/cli/build/migrations-plugin.d.ts +21 -0
- package/dist/cli/build/migrations-plugin.d.ts.map +1 -0
- package/dist/cli/build/migrations-plugin.js +41 -0
- package/dist/cli/build/migrations-plugin.js.map +1 -0
- package/dist/cli/build/process-plugin.d.ts +29 -0
- package/dist/cli/build/process-plugin.d.ts.map +1 -0
- package/dist/cli/build/process-plugin.js +66 -0
- package/dist/cli/build/process-plugin.js.map +1 -0
- package/dist/cli/builder/create-cli-builder.d.ts +42 -0
- package/dist/cli/builder/create-cli-builder.d.ts.map +1 -0
- package/dist/cli/builder/create-cli-builder.js +104 -0
- package/dist/cli/builder/create-cli-builder.js.map +1 -0
- package/dist/cli/builder/index.d.ts +8 -0
- package/dist/cli/builder/index.d.ts.map +1 -0
- package/dist/cli/builder/index.js +7 -0
- package/dist/cli/builder/index.js.map +1 -0
- package/dist/cli/builder/types.d.ts +113 -0
- package/dist/cli/builder/types.d.ts.map +1 -0
- package/dist/cli/builder/types.js +7 -0
- package/dist/cli/builder/types.js.map +1 -0
- package/dist/cli/cluster.d.ts +8 -0
- package/dist/cli/cluster.d.ts.map +1 -0
- package/dist/cli/cluster.js +145 -0
- package/dist/cli/cluster.js.map +1 -0
- package/dist/cli/current-app.d.ts +36 -0
- package/dist/cli/current-app.d.ts.map +1 -0
- package/dist/cli/current-app.js +21 -0
- package/dist/cli/current-app.js.map +1 -0
- package/dist/cli/define-app.d.ts +35 -0
- package/dist/cli/define-app.d.ts.map +1 -0
- package/dist/cli/define-app.js +79 -0
- package/dist/cli/define-app.js.map +1 -0
- package/dist/cli/define-main.d.ts +33 -0
- package/dist/cli/define-main.d.ts.map +1 -0
- package/dist/cli/define-main.js +67 -0
- package/dist/cli/define-main.js.map +1 -0
- package/dist/cli/define-project.d.ts +93 -0
- package/dist/cli/define-project.d.ts.map +1 -0
- package/dist/cli/define-project.js +85 -0
- package/dist/cli/define-project.js.map +1 -0
- package/dist/cli/dev-server.d.ts +20 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +131 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/discovery.d.ts +29 -0
- package/dist/cli/discovery.d.ts.map +1 -0
- package/dist/cli/discovery.js +142 -0
- package/dist/cli/discovery.js.map +1 -0
- package/dist/cli/factory.d.ts +43 -0
- package/dist/cli/factory.d.ts.map +1 -0
- package/dist/cli/factory.js +52 -0
- package/dist/cli/factory.js.map +1 -0
- package/dist/cli/generators/ai.d.ts +3 -0
- package/dist/cli/generators/ai.d.ts.map +1 -0
- package/dist/cli/generators/ai.js +65 -0
- package/dist/cli/generators/ai.js.map +1 -0
- package/dist/cli/generators/ci.d.ts +5 -0
- package/dist/cli/generators/ci.d.ts.map +1 -0
- package/dist/cli/generators/ci.js +102 -0
- package/dist/cli/generators/ci.js.map +1 -0
- package/dist/cli/generators/detect.d.ts +15 -0
- package/dist/cli/generators/detect.d.ts.map +1 -0
- package/dist/cli/generators/detect.js +75 -0
- package/dist/cli/generators/detect.js.map +1 -0
- package/dist/cli/generators/ide.d.ts +3 -0
- package/dist/cli/generators/ide.d.ts.map +1 -0
- package/dist/cli/generators/ide.js +179 -0
- package/dist/cli/generators/ide.js.map +1 -0
- package/dist/cli/generators/index.d.ts +5 -0
- package/dist/cli/generators/index.d.ts.map +1 -0
- package/dist/cli/generators/index.js +5 -0
- package/dist/cli/generators/index.js.map +1 -0
- package/dist/cli/index.d.ts +81 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +88 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/io.d.ts +131 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +373 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/mcp/server.d.ts +23 -0
- package/dist/cli/mcp/server.d.ts.map +1 -0
- package/dist/cli/mcp/server.js +148 -0
- package/dist/cli/mcp/server.js.map +1 -0
- package/dist/cli/parser.d.ts +106 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +520 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/runner.d.ts +75 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +422 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/service.d.ts +61 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +95 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/types.d.ts +47 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +20 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/wizard.d.ts +11 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +2 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/cli/workspace-controller.d.ts +36 -0
- package/dist/cli/workspace-controller.d.ts.map +1 -0
- package/dist/cli/workspace-controller.js +896 -0
- package/dist/cli/workspace-controller.js.map +1 -0
- package/dist/cluster/client.d.ts +101 -0
- package/dist/cluster/client.d.ts.map +1 -0
- package/dist/cluster/client.js +256 -0
- package/dist/cluster/client.js.map +1 -0
- package/dist/cluster/cluster.d.ts +82 -0
- package/dist/cluster/cluster.d.ts.map +1 -0
- package/dist/cluster/cluster.js +27 -0
- package/dist/cluster/cluster.js.map +1 -0
- package/dist/cluster/coordinator/cluster-node.model.d.ts +14 -0
- package/dist/cluster/coordinator/cluster-node.model.d.ts.map +1 -0
- package/dist/cluster/coordinator/cluster-node.model.js +15 -0
- package/dist/cluster/coordinator/cluster-node.model.js.map +1 -0
- package/dist/cluster/coordinator/cluster-signals.d.ts +45 -0
- package/dist/cluster/coordinator/cluster-signals.d.ts.map +1 -0
- package/dist/cluster/coordinator/cluster-signals.js +24 -0
- package/dist/cluster/coordinator/cluster-signals.js.map +1 -0
- package/dist/cluster/coordinator/coordinator.process.d.ts +21 -0
- package/dist/cluster/coordinator/coordinator.process.d.ts.map +1 -0
- package/dist/cluster/coordinator/coordinator.process.js +221 -0
- package/dist/cluster/coordinator/coordinator.process.js.map +1 -0
- package/dist/cluster/coordinator/index.d.ts +13 -0
- package/dist/cluster/coordinator/index.d.ts.map +1 -0
- package/dist/cluster/coordinator/index.js +13 -0
- package/dist/cluster/coordinator/index.js.map +1 -0
- package/dist/cluster/coordinator/node-lifecycle.d.ts +31 -0
- package/dist/cluster/coordinator/node-lifecycle.d.ts.map +1 -0
- package/dist/cluster/coordinator/node-lifecycle.js +178 -0
- package/dist/cluster/coordinator/node-lifecycle.js.map +1 -0
- package/dist/cluster/index.d.ts +45 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +57 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/cluster/protocol.d.ts +204 -0
- package/dist/cluster/protocol.d.ts.map +1 -0
- package/dist/cluster/protocol.js +274 -0
- package/dist/cluster/protocol.js.map +1 -0
- package/dist/cluster/scheduled-task/builder.d.ts +24 -0
- package/dist/cluster/scheduled-task/builder.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/builder.js +63 -0
- package/dist/cluster/scheduled-task/builder.js.map +1 -0
- package/dist/cluster/scheduled-task/factory.d.ts +76 -0
- package/dist/cluster/scheduled-task/factory.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/factory.js +64 -0
- package/dist/cluster/scheduled-task/factory.js.map +1 -0
- package/dist/cluster/scheduled-task/index.d.ts +43 -0
- package/dist/cluster/scheduled-task/index.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/index.js +45 -0
- package/dist/cluster/scheduled-task/index.js.map +1 -0
- package/dist/cluster/scheduled-task/transport.d.ts +12 -0
- package/dist/cluster/scheduled-task/transport.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/transport.js +146 -0
- package/dist/cluster/scheduled-task/transport.js.map +1 -0
- package/dist/cluster/scheduled-task/types.d.ts +89 -0
- package/dist/cluster/scheduled-task/types.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/types.js +7 -0
- package/dist/cluster/scheduled-task/types.js.map +1 -0
- package/dist/cluster/server.d.ts +87 -0
- package/dist/cluster/server.d.ts.map +1 -0
- package/dist/cluster/server.js +290 -0
- package/dist/cluster/server.js.map +1 -0
- package/dist/cluster/transport.d.ts +86 -0
- package/dist/cluster/transport.d.ts.map +1 -0
- package/dist/cluster/transport.js +138 -0
- package/dist/cluster/transport.js.map +1 -0
- package/dist/core/container-hooks.d.ts +22 -0
- package/dist/core/container-hooks.d.ts.map +1 -0
- package/dist/core/container-hooks.js +29 -0
- package/dist/core/container-hooks.js.map +1 -0
- package/dist/core/container-reflection.d.ts +71 -0
- package/dist/core/container-reflection.d.ts.map +1 -0
- package/dist/core/container-reflection.js +60 -0
- package/dist/core/container-reflection.js.map +1 -0
- package/dist/core/context.d.ts +146 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +155 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/contribution.d.ts +152 -0
- package/dist/core/contribution.d.ts.map +1 -0
- package/dist/core/contribution.js +213 -0
- package/dist/core/contribution.js.map +1 -0
- package/dist/core/controller.contextual.d.ts +193 -0
- package/dist/core/controller.contextual.d.ts.map +1 -0
- package/dist/core/controller.contextual.js +459 -0
- package/dist/core/controller.contextual.js.map +1 -0
- package/dist/core/controller.d.ts +510 -0
- package/dist/core/controller.d.ts.map +1 -0
- package/dist/core/controller.js +411 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/controller.procedure.d.ts +147 -0
- package/dist/core/controller.procedure.d.ts.map +1 -0
- package/dist/core/controller.procedure.js +115 -0
- package/dist/core/controller.procedure.js.map +1 -0
- package/dist/core/disposable.d.ts +126 -0
- package/dist/core/disposable.d.ts.map +1 -0
- package/dist/core/disposable.js +179 -0
- package/dist/core/disposable.js.map +1 -0
- package/dist/core/hmr.d.ts +83 -0
- package/dist/core/hmr.d.ts.map +1 -0
- package/dist/core/hmr.js +211 -0
- package/dist/core/hmr.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +25 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/internal/routes.d.ts +26 -0
- package/dist/core/internal/routes.d.ts.map +1 -0
- package/dist/core/internal/routes.js +48 -0
- package/dist/core/internal/routes.js.map +1 -0
- package/dist/core/lifecycle-impl.d.ts +45 -0
- package/dist/core/lifecycle-impl.d.ts.map +1 -0
- package/dist/core/lifecycle-impl.js +102 -0
- package/dist/core/lifecycle-impl.js.map +1 -0
- package/dist/core/lifecycle.d.ts +86 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +38 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/logger.d.ts +282 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +368 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware.d.ts +108 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +60 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/openapi-methods.d.ts +61 -0
- package/dist/core/openapi-methods.d.ts.map +1 -0
- package/dist/core/openapi-methods.js +53 -0
- package/dist/core/openapi-methods.js.map +1 -0
- package/dist/core/plugin.d.ts +209 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +36 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/scope-bridge.d.ts +19 -0
- package/dist/core/scope-bridge.d.ts.map +1 -0
- package/dist/core/scope-bridge.js +34 -0
- package/dist/core/scope-bridge.js.map +1 -0
- package/dist/core/service.d.ts +429 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +875 -0
- package/dist/core/service.js.map +1 -0
- package/dist/features/channel/backend.d.ts +98 -0
- package/dist/features/channel/backend.d.ts.map +1 -0
- package/dist/features/channel/backend.js +75 -0
- package/dist/features/channel/backend.js.map +1 -0
- package/dist/features/channel/channel.d.ts +18 -0
- package/dist/features/channel/channel.d.ts.map +1 -0
- package/dist/features/channel/channel.js +219 -0
- package/dist/features/channel/channel.js.map +1 -0
- package/dist/features/channel/channels.d.ts +87 -0
- package/dist/features/channel/channels.d.ts.map +1 -0
- package/dist/features/channel/channels.js +252 -0
- package/dist/features/channel/channels.js.map +1 -0
- package/dist/features/channel/feature.d.ts +40 -0
- package/dist/features/channel/feature.d.ts.map +1 -0
- package/dist/features/channel/feature.js +44 -0
- package/dist/features/channel/feature.js.map +1 -0
- package/dist/features/channel/index.d.ts +41 -0
- package/dist/features/channel/index.d.ts.map +1 -0
- package/dist/features/channel/index.js +41 -0
- package/dist/features/channel/index.js.map +1 -0
- package/dist/features/channel/types.d.ts +165 -0
- package/dist/features/channel/types.d.ts.map +1 -0
- package/dist/features/channel/types.js +10 -0
- package/dist/features/channel/types.js.map +1 -0
- package/dist/features/config/cli/config-controller.d.ts +77 -0
- package/dist/features/config/cli/config-controller.d.ts.map +1 -0
- package/dist/features/config/cli/config-controller.js +209 -0
- package/dist/features/config/cli/config-controller.js.map +1 -0
- package/dist/features/config/cli/index.d.ts +9 -0
- package/dist/features/config/cli/index.d.ts.map +1 -0
- package/dist/features/config/cli/index.js +9 -0
- package/dist/features/config/cli/index.js.map +1 -0
- package/dist/features/config/cli/profile-controller.d.ts +87 -0
- package/dist/features/config/cli/profile-controller.d.ts.map +1 -0
- package/dist/features/config/cli/profile-controller.js +223 -0
- package/dist/features/config/cli/profile-controller.js.map +1 -0
- package/dist/features/config/cli/utils.d.ts +14 -0
- package/dist/features/config/cli/utils.d.ts.map +1 -0
- package/dist/features/config/cli/utils.js +29 -0
- package/dist/features/config/cli/utils.js.map +1 -0
- package/dist/features/config/config-of.d.ts +36 -0
- package/dist/features/config/config-of.d.ts.map +1 -0
- package/dist/features/config/config-of.js +36 -0
- package/dist/features/config/config-of.js.map +1 -0
- package/dist/features/config/config-service.d.ts +54 -0
- package/dist/features/config/config-service.d.ts.map +1 -0
- package/dist/features/config/config-service.js +184 -0
- package/dist/features/config/config-service.js.map +1 -0
- package/dist/features/config/create-config.d.ts +21 -0
- package/dist/features/config/create-config.d.ts.map +1 -0
- package/dist/features/config/create-config.js +16 -0
- package/dist/features/config/create-config.js.map +1 -0
- package/dist/features/config/define-config-partial.d.ts +13 -0
- package/dist/features/config/define-config-partial.d.ts.map +1 -0
- package/dist/features/config/define-config-partial.js +19 -0
- package/dist/features/config/define-config-partial.js.map +1 -0
- package/dist/features/config/env-service.d.ts +54 -0
- package/dist/features/config/env-service.d.ts.map +1 -0
- package/dist/features/config/env-service.js +115 -0
- package/dist/features/config/env-service.js.map +1 -0
- package/dist/features/config/file-watcher.d.ts +13 -0
- package/dist/features/config/file-watcher.d.ts.map +1 -0
- package/dist/features/config/file-watcher.js +98 -0
- package/dist/features/config/file-watcher.js.map +1 -0
- package/dist/features/config/index.d.ts +21 -0
- package/dist/features/config/index.d.ts.map +1 -0
- package/dist/features/config/index.js +24 -0
- package/dist/features/config/index.js.map +1 -0
- package/dist/features/config/profile-service.d.ts +59 -0
- package/dist/features/config/profile-service.d.ts.map +1 -0
- package/dist/features/config/profile-service.js +114 -0
- package/dist/features/config/profile-service.js.map +1 -0
- package/dist/features/config/types.d.ts +38 -0
- package/dist/features/config/types.d.ts.map +1 -0
- package/dist/features/config/types.js +17 -0
- package/dist/features/config/types.js.map +1 -0
- package/dist/features/contract/contract.d.ts +264 -0
- package/dist/features/contract/contract.d.ts.map +1 -0
- package/dist/features/contract/contract.js +183 -0
- package/dist/features/contract/contract.js.map +1 -0
- package/dist/features/contract/index.d.ts +2 -0
- package/dist/features/contract/index.d.ts.map +1 -0
- package/dist/features/contract/index.js +2 -0
- package/dist/features/contract/index.js.map +1 -0
- package/dist/features/env/contribute.d.ts +70 -0
- package/dist/features/env/contribute.d.ts.map +1 -0
- package/dist/features/env/contribute.js +195 -0
- package/dist/features/env/contribute.js.map +1 -0
- package/dist/features/environment/create-environment.d.ts +58 -0
- package/dist/features/environment/create-environment.d.ts.map +1 -0
- package/dist/features/environment/create-environment.js +22 -0
- package/dist/features/environment/create-environment.js.map +1 -0
- package/dist/features/environment/index.d.ts +12 -0
- package/dist/features/environment/index.d.ts.map +1 -0
- package/dist/features/environment/index.js +10 -0
- package/dist/features/environment/index.js.map +1 -0
- package/dist/features/environment/load.d.ts +59 -0
- package/dist/features/environment/load.d.ts.map +1 -0
- package/dist/features/environment/load.js +117 -0
- package/dist/features/environment/load.js.map +1 -0
- package/dist/features/environment/types.d.ts +165 -0
- package/dist/features/environment/types.d.ts.map +1 -0
- package/dist/features/environment/types.js +18 -0
- package/dist/features/environment/types.js.map +1 -0
- package/dist/features/feature-flags/create-feature-flag-provider.d.ts +21 -0
- package/dist/features/feature-flags/create-feature-flag-provider.d.ts.map +1 -0
- package/dist/features/feature-flags/create-feature-flag-provider.js +16 -0
- package/dist/features/feature-flags/create-feature-flag-provider.js.map +1 -0
- package/dist/features/feature-flags/define-feature-flag-partial.d.ts +20 -0
- package/dist/features/feature-flags/define-feature-flag-partial.d.ts.map +1 -0
- package/dist/features/feature-flags/define-feature-flag-partial.js +26 -0
- package/dist/features/feature-flags/define-feature-flag-partial.js.map +1 -0
- package/dist/features/feature-flags/feature-flag-of.d.ts +16 -0
- package/dist/features/feature-flags/feature-flag-of.d.ts.map +1 -0
- package/dist/features/feature-flags/feature-flag-of.js +16 -0
- package/dist/features/feature-flags/feature-flag-of.js.map +1 -0
- package/dist/features/feature-flags/feature-flag-service.d.ts +22 -0
- package/dist/features/feature-flags/feature-flag-service.d.ts.map +1 -0
- package/dist/features/feature-flags/feature-flag-service.js +112 -0
- package/dist/features/feature-flags/feature-flag-service.js.map +1 -0
- package/dist/features/feature-flags/index.d.ts +15 -0
- package/dist/features/feature-flags/index.d.ts.map +1 -0
- package/dist/features/feature-flags/index.js +12 -0
- package/dist/features/feature-flags/index.js.map +1 -0
- package/dist/features/feature-flags/types.d.ts +30 -0
- package/dist/features/feature-flags/types.d.ts.map +1 -0
- package/dist/features/feature-flags/types.js +8 -0
- package/dist/features/feature-flags/types.js.map +1 -0
- package/dist/features/index.d.ts +6 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +7 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/lock/index.d.ts +4 -0
- package/dist/features/lock/index.d.ts.map +1 -0
- package/dist/features/lock/index.js +4 -0
- package/dist/features/lock/index.js.map +1 -0
- package/dist/features/lock/lock-service.d.ts +74 -0
- package/dist/features/lock/lock-service.d.ts.map +1 -0
- package/dist/features/lock/lock-service.js +210 -0
- package/dist/features/lock/lock-service.js.map +1 -0
- package/dist/features/lock/memory.d.ts +60 -0
- package/dist/features/lock/memory.d.ts.map +1 -0
- package/dist/features/lock/memory.js +194 -0
- package/dist/features/lock/memory.js.map +1 -0
- package/dist/features/lock/types.d.ts +151 -0
- package/dist/features/lock/types.d.ts.map +1 -0
- package/dist/features/lock/types.js +17 -0
- package/dist/features/lock/types.js.map +1 -0
- package/dist/features/memory/index.d.ts +18 -0
- package/dist/features/memory/index.d.ts.map +1 -0
- package/dist/features/memory/index.js +18 -0
- package/dist/features/memory/index.js.map +1 -0
- package/dist/features/memory/lock-feature.d.ts +21 -0
- package/dist/features/memory/lock-feature.d.ts.map +1 -0
- package/dist/features/memory/lock-feature.js +24 -0
- package/dist/features/memory/lock-feature.js.map +1 -0
- package/dist/features/secrets/create-secret-provider.d.ts +31 -0
- package/dist/features/secrets/create-secret-provider.d.ts.map +1 -0
- package/dist/features/secrets/create-secret-provider.js +26 -0
- package/dist/features/secrets/create-secret-provider.js.map +1 -0
- package/dist/features/secrets/define-secret-partial.d.ts +16 -0
- package/dist/features/secrets/define-secret-partial.d.ts.map +1 -0
- package/dist/features/secrets/define-secret-partial.js +26 -0
- package/dist/features/secrets/define-secret-partial.js.map +1 -0
- package/dist/features/secrets/index.d.ts +17 -0
- package/dist/features/secrets/index.d.ts.map +1 -0
- package/dist/features/secrets/index.js +14 -0
- package/dist/features/secrets/index.js.map +1 -0
- package/dist/features/secrets/secret-of.d.ts +19 -0
- package/dist/features/secrets/secret-of.d.ts.map +1 -0
- package/dist/features/secrets/secret-of.js +21 -0
- package/dist/features/secrets/secret-of.js.map +1 -0
- package/dist/features/secrets/secret-service.d.ts +21 -0
- package/dist/features/secrets/secret-service.d.ts.map +1 -0
- package/dist/features/secrets/secret-service.js +28 -0
- package/dist/features/secrets/secret-service.js.map +1 -0
- package/dist/features/secrets/types.d.ts +30 -0
- package/dist/features/secrets/types.d.ts.map +1 -0
- package/dist/features/secrets/types.js +8 -0
- package/dist/features/secrets/types.js.map +1 -0
- package/dist/features/vault/env-var-vault.d.ts +24 -0
- package/dist/features/vault/env-var-vault.d.ts.map +1 -0
- package/dist/features/vault/env-var-vault.js +43 -0
- package/dist/features/vault/env-var-vault.js.map +1 -0
- package/dist/features/vault/hardcoded-vault.d.ts +34 -0
- package/dist/features/vault/hardcoded-vault.d.ts.map +1 -0
- package/dist/features/vault/hardcoded-vault.js +46 -0
- package/dist/features/vault/hardcoded-vault.js.map +1 -0
- package/dist/features/vault/hashicorp-vault.d.ts +32 -0
- package/dist/features/vault/hashicorp-vault.d.ts.map +1 -0
- package/dist/features/vault/hashicorp-vault.js +69 -0
- package/dist/features/vault/hashicorp-vault.js.map +1 -0
- package/dist/features/vault/index.d.ts +13 -0
- package/dist/features/vault/index.d.ts.map +1 -0
- package/dist/features/vault/index.js +12 -0
- package/dist/features/vault/index.js.map +1 -0
- package/dist/features/vault/kubernetes-vault.d.ts +27 -0
- package/dist/features/vault/kubernetes-vault.d.ts.map +1 -0
- package/dist/features/vault/kubernetes-vault.js +51 -0
- package/dist/features/vault/kubernetes-vault.js.map +1 -0
- package/dist/features/vault/types.d.ts +41 -0
- package/dist/features/vault/types.d.ts.map +1 -0
- package/dist/features/vault/types.js +21 -0
- package/dist/features/vault/types.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/justscale.d.ts +63 -0
- package/dist/justscale.d.ts.map +1 -0
- package/dist/justscale.js +501 -0
- package/dist/justscale.js.map +1 -0
- package/dist/kernel/adapter.d.ts +9 -0
- package/dist/kernel/adapter.d.ts.map +1 -0
- package/dist/kernel/adapter.js +2 -0
- package/dist/kernel/adapter.js.map +1 -0
- package/dist/kernel/kernel.d.ts +15 -0
- package/dist/kernel/kernel.d.ts.map +1 -0
- package/dist/kernel/kernel.js +134 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/models/access.d.ts +26 -0
- package/dist/models/access.d.ts.map +1 -0
- package/dist/models/access.js +126 -0
- package/dist/models/access.js.map +1 -0
- package/dist/models/apply-types-config.d.ts +52 -0
- package/dist/models/apply-types-config.d.ts.map +1 -0
- package/dist/models/apply-types-config.js +47 -0
- package/dist/models/apply-types-config.js.map +1 -0
- package/dist/models/define-model.d.ts +249 -0
- package/dist/models/define-model.d.ts.map +1 -0
- package/dist/models/define-model.js +388 -0
- package/dist/models/define-model.js.map +1 -0
- package/dist/models/field.d.ts +309 -0
- package/dist/models/field.d.ts.map +1 -0
- package/dist/models/field.js +312 -0
- package/dist/models/field.js.map +1 -0
- package/dist/models/in-memory/condition-evaluator.d.ts +53 -0
- package/dist/models/in-memory/condition-evaluator.d.ts.map +1 -0
- package/dist/models/in-memory/condition-evaluator.js +593 -0
- package/dist/models/in-memory/condition-evaluator.js.map +1 -0
- package/dist/models/in-memory/in-memory-model.d.ts +89 -0
- package/dist/models/in-memory/in-memory-model.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-model.js +101 -0
- package/dist/models/in-memory/in-memory-model.js.map +1 -0
- package/dist/models/in-memory/in-memory-repository.d.ts +208 -0
- package/dist/models/in-memory/in-memory-repository.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-repository.js +618 -0
- package/dist/models/in-memory/in-memory-repository.js.map +1 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.d.ts +92 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.js +395 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.js.map +1 -0
- package/dist/models/in-memory/index.d.ts +35 -0
- package/dist/models/in-memory/index.d.ts.map +1 -0
- package/dist/models/in-memory/index.js +36 -0
- package/dist/models/in-memory/index.js.map +1 -0
- package/dist/models/index.d.ts +52 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +86 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/model-name-registry.d.ts +16 -0
- package/dist/models/model-name-registry.d.ts.map +1 -0
- package/dist/models/model-name-registry.js +19 -0
- package/dist/models/model-name-registry.js.map +1 -0
- package/dist/models/model.d.ts +15 -0
- package/dist/models/model.d.ts.map +1 -0
- package/dist/models/model.js +114 -0
- package/dist/models/model.js.map +1 -0
- package/dist/models/model.repository.d.ts +318 -0
- package/dist/models/model.repository.d.ts.map +1 -0
- package/dist/models/model.repository.js +146 -0
- package/dist/models/model.repository.js.map +1 -0
- package/dist/models/observable.d.ts +15 -0
- package/dist/models/observable.d.ts.map +1 -0
- package/dist/models/observable.js +64 -0
- package/dist/models/observable.js.map +1 -0
- package/dist/models/proxy.d.ts +5 -0
- package/dist/models/proxy.d.ts.map +1 -0
- package/dist/models/proxy.js +407 -0
- package/dist/models/proxy.js.map +1 -0
- package/dist/models/query.d.ts +574 -0
- package/dist/models/query.d.ts.map +1 -0
- package/dist/models/query.js +701 -0
- package/dist/models/query.js.map +1 -0
- package/dist/models/reference/reference.d.ts +229 -0
- package/dist/models/reference/reference.d.ts.map +1 -0
- package/dist/models/reference/reference.js +331 -0
- package/dist/models/reference/reference.js.map +1 -0
- package/dist/models/reference/transient-ref.d.ts +123 -0
- package/dist/models/reference/transient-ref.d.ts.map +1 -0
- package/dist/models/reference/transient-ref.js +152 -0
- package/dist/models/reference/transient-ref.js.map +1 -0
- package/dist/models/repository.d.ts +53 -0
- package/dist/models/repository.d.ts.map +1 -0
- package/dist/models/repository.js +37 -0
- package/dist/models/repository.js.map +1 -0
- package/dist/models/scheduled-task/index.d.ts +13 -0
- package/dist/models/scheduled-task/index.d.ts.map +1 -0
- package/dist/models/scheduled-task/index.js +12 -0
- package/dist/models/scheduled-task/index.js.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.d.ts +73 -0
- package/dist/models/scheduled-task/scheduled-task.d.ts.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.js +95 -0
- package/dist/models/scheduled-task/scheduled-task.js.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.repository.d.ts +150 -0
- package/dist/models/scheduled-task/scheduled-task.repository.d.ts.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.repository.js +40 -0
- package/dist/models/scheduled-task/scheduled-task.repository.js.map +1 -0
- package/dist/models/stream.d.ts +139 -0
- package/dist/models/stream.d.ts.map +1 -0
- package/dist/models/stream.js +153 -0
- package/dist/models/stream.js.map +1 -0
- package/dist/models/symbols.d.ts +73 -0
- package/dist/models/symbols.d.ts.map +1 -0
- package/dist/models/symbols.js +97 -0
- package/dist/models/symbols.js.map +1 -0
- package/dist/models/types.d.ts +291 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +50 -0
- package/dist/models/types.js.map +1 -0
- package/dist/models/watch.d.ts +27 -0
- package/dist/models/watch.d.ts.map +1 -0
- package/dist/models/watch.js +124 -0
- package/dist/models/watch.js.map +1 -0
- package/dist/models/zod-ref.d.ts +46 -0
- package/dist/models/zod-ref.d.ts.map +1 -0
- package/dist/models/zod-ref.js +31 -0
- package/dist/models/zod-ref.js.map +1 -0
- package/dist/process/builtin-serializers.d.ts +19 -0
- package/dist/process/builtin-serializers.d.ts.map +1 -0
- package/dist/process/builtin-serializers.js +213 -0
- package/dist/process/builtin-serializers.js.map +1 -0
- package/dist/process/cluster-plugin.d.ts +129 -0
- package/dist/process/cluster-plugin.d.ts.map +1 -0
- package/dist/process/cluster-plugin.js +175 -0
- package/dist/process/cluster-plugin.js.map +1 -0
- package/dist/process/createProcess.d.ts +67 -0
- package/dist/process/createProcess.d.ts.map +1 -0
- package/dist/process/createProcess.js +111 -0
- package/dist/process/createProcess.js.map +1 -0
- package/dist/process/define-signals.d.ts +113 -0
- package/dist/process/define-signals.d.ts.map +1 -0
- package/dist/process/define-signals.js +222 -0
- package/dist/process/define-signals.js.map +1 -0
- package/dist/process/delay-controller.d.ts +35 -0
- package/dist/process/delay-controller.d.ts.map +1 -0
- package/dist/process/delay-controller.js +55 -0
- package/dist/process/delay-controller.js.map +1 -0
- package/dist/process/index.d.ts +38 -0
- package/dist/process/index.d.ts.map +1 -0
- package/dist/process/index.js +47 -0
- package/dist/process/index.js.map +1 -0
- package/dist/process/primitives.d.ts +393 -0
- package/dist/process/primitives.d.ts.map +1 -0
- package/dist/process/primitives.js +325 -0
- package/dist/process/primitives.js.map +1 -0
- package/dist/process/serialization.d.ts +58 -0
- package/dist/process/serialization.d.ts.map +1 -0
- package/dist/process/serialization.js +220 -0
- package/dist/process/serialization.js.map +1 -0
- package/dist/process/stream-utils.d.ts +123 -0
- package/dist/process/stream-utils.d.ts.map +1 -0
- package/dist/process/stream-utils.js +247 -0
- package/dist/process/stream-utils.js.map +1 -0
- package/dist/process/testing/clock.d.ts +115 -0
- package/dist/process/testing/clock.d.ts.map +1 -0
- package/dist/process/testing/clock.js +166 -0
- package/dist/process/testing/clock.js.map +1 -0
- package/dist/process/testing/index.d.ts +9 -0
- package/dist/process/testing/index.d.ts.map +1 -0
- package/dist/process/testing/index.js +9 -0
- package/dist/process/testing/index.js.map +1 -0
- package/dist/process/testing.d.ts +50 -0
- package/dist/process/testing.d.ts.map +1 -0
- package/dist/process/testing.js +59 -0
- package/dist/process/testing.js.map +1 -0
- package/dist/process/types.d.ts +540 -0
- package/dist/process/types.d.ts.map +1 -0
- package/dist/process/types.js +21 -0
- package/dist/process/types.js.map +1 -0
- package/dist/queue/index.d.ts +2 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +2 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +34 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +108 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/runtime/process/compiled.d.ts +56 -0
- package/dist/runtime/process/compiled.d.ts.map +1 -0
- package/dist/runtime/process/compiled.js +221 -0
- package/dist/runtime/process/compiled.js.map +1 -0
- package/dist/runtime/process/executor.d.ts +279 -0
- package/dist/runtime/process/executor.d.ts.map +1 -0
- package/dist/runtime/process/executor.js +1941 -0
- package/dist/runtime/process/executor.js.map +1 -0
- package/dist/runtime/process/factory.d.ts +72 -0
- package/dist/runtime/process/factory.d.ts.map +1 -0
- package/dist/runtime/process/factory.js +78 -0
- package/dist/runtime/process/factory.js.map +1 -0
- package/dist/runtime/process/freeze.d.ts +5 -0
- package/dist/runtime/process/freeze.d.ts.map +1 -0
- package/dist/runtime/process/freeze.js +94 -0
- package/dist/runtime/process/freeze.js.map +1 -0
- package/dist/runtime/process/scheduled-task-timer.d.ts +52 -0
- package/dist/runtime/process/scheduled-task-timer.d.ts.map +1 -0
- package/dist/runtime/process/scheduled-task-timer.js +104 -0
- package/dist/runtime/process/scheduled-task-timer.js.map +1 -0
- package/dist/runtime/process/signal-bus.d.ts +186 -0
- package/dist/runtime/process/signal-bus.d.ts.map +1 -0
- package/dist/runtime/process/signal-bus.js +256 -0
- package/dist/runtime/process/signal-bus.js.map +1 -0
- package/dist/runtime/process/state-serializer.d.ts +30 -0
- package/dist/runtime/process/state-serializer.d.ts.map +1 -0
- package/dist/runtime/process/state-serializer.js +244 -0
- package/dist/runtime/process/state-serializer.js.map +1 -0
- package/dist/runtime/process/storage.d.ts +96 -0
- package/dist/runtime/process/storage.d.ts.map +1 -0
- package/dist/runtime/process/storage.js +165 -0
- package/dist/runtime/process/storage.js.map +1 -0
- package/dist/runtime/process/timer-scheduler.d.ts +115 -0
- package/dist/runtime/process/timer-scheduler.d.ts.map +1 -0
- package/dist/runtime/process/timer-scheduler.js +192 -0
- package/dist/runtime/process/timer-scheduler.js.map +1 -0
- package/dist/runtime/process/trace.d.ts +17 -0
- package/dist/runtime/process/trace.d.ts.map +1 -0
- package/dist/runtime/process/trace.js +26 -0
- package/dist/runtime/process/trace.js.map +1 -0
- package/dist/runtime/protobuf/encoding/index.d.ts +26 -0
- package/dist/runtime/protobuf/encoding/index.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/index.js +30 -0
- package/dist/runtime/protobuf/encoding/index.js.map +1 -0
- package/dist/runtime/protobuf/encoding/reader.d.ts +182 -0
- package/dist/runtime/protobuf/encoding/reader.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/reader.js +353 -0
- package/dist/runtime/protobuf/encoding/reader.js.map +1 -0
- package/dist/runtime/protobuf/encoding/varint.d.ts +67 -0
- package/dist/runtime/protobuf/encoding/varint.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/varint.js +117 -0
- package/dist/runtime/protobuf/encoding/varint.js.map +1 -0
- package/dist/runtime/protobuf/encoding/wire-types.d.ts +62 -0
- package/dist/runtime/protobuf/encoding/wire-types.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/wire-types.js +103 -0
- package/dist/runtime/protobuf/encoding/wire-types.js.map +1 -0
- package/dist/runtime/protobuf/encoding/writer.d.ts +147 -0
- package/dist/runtime/protobuf/encoding/writer.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/writer.js +214 -0
- package/dist/runtime/protobuf/encoding/writer.js.map +1 -0
- package/dist/runtime/protobuf/index.d.ts +3 -0
- package/dist/runtime/protobuf/index.d.ts.map +1 -0
- package/dist/runtime/protobuf/index.js +3 -0
- package/dist/runtime/protobuf/index.js.map +1 -0
- package/dist/runtime/protobuf/serialized.d.ts +48 -0
- package/dist/runtime/protobuf/serialized.d.ts.map +1 -0
- package/dist/runtime/protobuf/serialized.js +517 -0
- package/dist/runtime/protobuf/serialized.js.map +1 -0
- package/package.json +209 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Definition
|
|
3
|
+
*
|
|
4
|
+
* Creates typed model classes with field schemas.
|
|
5
|
+
*/
|
|
6
|
+
import { type FieldBuilder, type FieldDef, type Decimal } from './field.js';
|
|
7
|
+
import { Reference, References } from './reference/reference.js';
|
|
8
|
+
import { MODEL_METHODS, MODEL_REPO_CONTRACT, PERSISTENT, MODEL_INJECT, MODEL_SERVICE } from './symbols.js';
|
|
9
|
+
import type { Persistent } from './types.js';
|
|
10
|
+
import type { ServiceToken, ResolvedDeps } from '../core/service.js';
|
|
11
|
+
import type { GuardDef } from '../core/middleware.js';
|
|
12
|
+
export { MODEL_METHODS, MODEL_INJECT, MODEL_SERVICE };
|
|
13
|
+
import { StringFieldExpr, NumberFieldExpr, BigIntFieldExpr, DecimalFieldExpr, BooleanFieldExpr, TimestampFieldExpr, RefFieldExpr, RefsFieldExpr, ArrayFieldExpr, JsonFieldExpr, ObjectFieldExpr } from './query.js';
|
|
14
|
+
/** Symbol.for() so separate module realms see the same symbol */
|
|
15
|
+
export declare const MODEL_DEF: unique symbol;
|
|
16
|
+
/**
|
|
17
|
+
* Stable identity key for a model class. Two classes produced by separate imports
|
|
18
|
+
* of the same source (e.g. after HMR cache-busting) share the same stable ID, so
|
|
19
|
+
* `ModelRepository.of(model)` resolves to the same token without special wiring.
|
|
20
|
+
*/
|
|
21
|
+
export declare const MODEL_STABLE_ID: unique symbol;
|
|
22
|
+
export declare const MODEL_FIELDS: unique symbol;
|
|
23
|
+
export declare const MODEL_NAME: unique symbol;
|
|
24
|
+
export declare const MODEL_DATA: unique symbol;
|
|
25
|
+
export declare const MODEL_DEFAULTS: unique symbol;
|
|
26
|
+
/** Forces TypeScript to expand/simplify a type in .d.ts output */
|
|
27
|
+
type Simplify<T> = {
|
|
28
|
+
[K in keyof T]: T[K];
|
|
29
|
+
} & {};
|
|
30
|
+
export type FieldDefs = Record<string, FieldBuilder<unknown> | FieldDef>;
|
|
31
|
+
/** Unwrap HasDefault<T> → T, pass-through for other types */
|
|
32
|
+
type UnwrapDefault<T> = T extends {
|
|
33
|
+
readonly __hasDefault: infer U;
|
|
34
|
+
} ? U : T;
|
|
35
|
+
export type InferModelType<F extends FieldDefs> = Simplify<{
|
|
36
|
+
[K in keyof F]: F[K] extends FieldBuilder<infer T> ? UnwrapDefault<T> : F[K] extends FieldDef<infer T> ? UnwrapDefault<T> : never;
|
|
37
|
+
}>;
|
|
38
|
+
/** Extract keys of fields that have defaults */
|
|
39
|
+
export type InferDefaultKeys<F extends FieldDefs> = {
|
|
40
|
+
[K in keyof F]: F[K] extends FieldBuilder<infer T> ? T extends {
|
|
41
|
+
readonly __hasDefault: unknown;
|
|
42
|
+
} ? K : never : F[K] extends FieldDef<infer T> ? T extends {
|
|
43
|
+
readonly __hasDefault: unknown;
|
|
44
|
+
} ? K : never : never;
|
|
45
|
+
}[keyof F];
|
|
46
|
+
/**
|
|
47
|
+
* Partial type for model constructor input.
|
|
48
|
+
* Ref fields accept both Reference<R> and Persistent<R> (the setter handles both).
|
|
49
|
+
*/
|
|
50
|
+
export type DeepPartial<T> = {
|
|
51
|
+
[K in keyof T]?: [NonNullable<T[K]>] extends [Decimal] ? string | (undefined extends T[K] ? undefined : never) : T[K] extends Reference<any> ? T[K] | (Persistent<any> & {
|
|
52
|
+
readonly [PERSISTENT]: true;
|
|
53
|
+
}) : T[K] extends References<any> ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
54
|
+
};
|
|
55
|
+
export type MethodDefs = Record<string, (this: any, ...args: any[]) => any>;
|
|
56
|
+
export type InferMethods<T, M extends MethodDefs> = {
|
|
57
|
+
[K in keyof M]: M[K] extends (this: unknown, ...args: infer A) => infer R ? (this: T, ...args: A) => R : never;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Maps a field's TypeScript type to its corresponding field expression type.
|
|
61
|
+
* For nested objects, recursively creates field expressions for nested access.
|
|
62
|
+
*/
|
|
63
|
+
type ValueToFieldExpr<T> = [
|
|
64
|
+
NonNullable<T>
|
|
65
|
+
] extends [Reference<infer R>] ? RefFieldExpr<R> : [NonNullable<T>] extends [References<infer R>] ? RefsFieldExpr<R> : [
|
|
66
|
+
NonNullable<T>
|
|
67
|
+
] extends [Decimal] ? DecimalFieldExpr : [NonNullable<T>] extends [string] ? StringFieldExpr : [NonNullable<T>] extends [number] ? NumberFieldExpr : [NonNullable<T>] extends [bigint] ? BigIntFieldExpr : [NonNullable<T>] extends [boolean] ? BooleanFieldExpr : [NonNullable<T>] extends [Date] ? TimestampFieldExpr : [NonNullable<T>] extends [(infer E)[]] ? ArrayFieldExpr<E> : [NonNullable<T>] extends [Record<string, unknown>] ? ObjectFieldExpr<NonNullable<T>> & NestedFieldExprs<NonNullable<T>> : JsonFieldExpr;
|
|
68
|
+
/**
|
|
69
|
+
* Creates field expressions for nested object properties.
|
|
70
|
+
* This enables type-safe access like `User.fields.settings.theme.eq('dark')`.
|
|
71
|
+
*/
|
|
72
|
+
type NestedFieldExprs<T> = T extends Record<string, unknown> ? {
|
|
73
|
+
readonly [K in keyof T]: ValueToFieldExpr<T[K]>;
|
|
74
|
+
} : {};
|
|
75
|
+
type FieldExprsFromData<T> = {
|
|
76
|
+
readonly [K in keyof T]: ValueToFieldExpr<T[K]>;
|
|
77
|
+
};
|
|
78
|
+
export type RepositoryContract<T = unknown> = Record<string, (...args: any[]) => Promise<any>>;
|
|
79
|
+
/**
|
|
80
|
+
* Abstract base class that all models extend.
|
|
81
|
+
* The class itself represents the transient (unpersisted) form.
|
|
82
|
+
* Use Persistent<T> for the persisted form with id, createdAt, etc.
|
|
83
|
+
*
|
|
84
|
+
* Models are Disposable by default to support `using` declarations
|
|
85
|
+
* in durable processes (for rehydration marking).
|
|
86
|
+
*/
|
|
87
|
+
export declare abstract class BaseModel<T, N extends string = string, D extends string = never> implements Disposable {
|
|
88
|
+
readonly [MODEL_DATA]: T;
|
|
89
|
+
readonly [MODEL_NAME]: N;
|
|
90
|
+
readonly [MODEL_DEFAULTS]: D;
|
|
91
|
+
constructor(data: DeepPartial<T>);
|
|
92
|
+
/** No-op dispose - models use `using` for process rehydration marking, not cleanup */
|
|
93
|
+
[Symbol.dispose](): void;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A model class created by defineModel().
|
|
97
|
+
*
|
|
98
|
+
* TInject carries the resolved inject deps type - instances include these
|
|
99
|
+
* properties via prototype chain (the model service).
|
|
100
|
+
*/
|
|
101
|
+
export interface Model<T, N extends string = string, C extends RepositoryContract<T> = {}, D extends string = never, TInject extends Record<string, unknown> = {}> {
|
|
102
|
+
readonly [MODEL_DEF]: true;
|
|
103
|
+
readonly [MODEL_DATA]: T;
|
|
104
|
+
readonly [MODEL_NAME]: N;
|
|
105
|
+
readonly [MODEL_DEFAULTS]: D;
|
|
106
|
+
readonly [MODEL_FIELDS]: Record<string, FieldDef>;
|
|
107
|
+
readonly [MODEL_REPO_CONTRACT]?: C;
|
|
108
|
+
readonly [MODEL_INJECT]?: Record<string, ServiceToken>;
|
|
109
|
+
readonly fields: FieldExprsFromData<T>;
|
|
110
|
+
new (data: DeepPartial<T>): BaseModel<T, N, D> & T & Readonly<TInject>;
|
|
111
|
+
/**
|
|
112
|
+
* Reference accessor - polymorphic over `this` so subclass body additions
|
|
113
|
+
* flow through. `Cart.ref`${id}`` returns `Reference<Cart>` (including any
|
|
114
|
+
* getters/methods declared on the `Cart` class). For validation at HTTP/CLI
|
|
115
|
+
* boundaries, use `z.ref(Cart)` instead of the ref as a Zod schema.
|
|
116
|
+
*/
|
|
117
|
+
ref<I>(this: new (data: DeepPartial<T>) => I, idOrEntity: string | object): Reference<I>;
|
|
118
|
+
ref<I>(this: new (data: DeepPartial<T>) => I, strings: TemplateStringsArray, ...values: unknown[]): Reference<I>;
|
|
119
|
+
refs<I>(this: new (data: DeepPartial<T>) => I, ...ids: string[]): References<I>;
|
|
120
|
+
/**
|
|
121
|
+
* Create a transient model instance with inject deps available via prototype.
|
|
122
|
+
* Prefer this over `new Model(data)` when the model has inject deps.
|
|
123
|
+
*/
|
|
124
|
+
create(data: Omit<DeepPartial<T>, keyof TInject>): BaseModel<T, N, D> & T & Readonly<TInject>;
|
|
125
|
+
withRepository<Contract extends RepositoryContract<T>>(): Model<T, N, Contract, D, TInject>;
|
|
126
|
+
/**
|
|
127
|
+
* Override this model with additional fields.
|
|
128
|
+
* Returns a new model class with merged fields. Inherits the ref accessor (same cache).
|
|
129
|
+
* Use for extending framework models: `class AppUser extends User.override({ fields: {...} }) {}`
|
|
130
|
+
*/
|
|
131
|
+
override<TNew extends FieldDefs>(config: {
|
|
132
|
+
name?: string;
|
|
133
|
+
fields: TNew;
|
|
134
|
+
inject?: Record<string, ServiceToken>;
|
|
135
|
+
}): Model<T & InferModelType<TNew>, string, {}, D | (InferDefaultKeys<TNew> & string)>;
|
|
136
|
+
}
|
|
137
|
+
export type ModelClass<T, N extends string = string, C extends RepositoryContract<T> = {}> = Model<T, N, C, string, any>;
|
|
138
|
+
export type ModelConstructor<T, N extends string = string, C extends RepositoryContract<T> = {}> = Model<T, N, C, string, any>;
|
|
139
|
+
/**
|
|
140
|
+
* Extract the data type from a Model class.
|
|
141
|
+
*
|
|
142
|
+
* Use this to get clean type references that TypeScript preserves in .d.ts output:
|
|
143
|
+
* - `ModelData<typeof User>` shows as `ModelData<typeof User>` in hovers
|
|
144
|
+
* - Instead of `{ readonly email: string; readonly name: string; ... }`
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* class User extends defineModel({
|
|
149
|
+
* email: field.string(),
|
|
150
|
+
* name: field.string(),
|
|
151
|
+
* }) {}
|
|
152
|
+
*
|
|
153
|
+
* type UserData = ModelData<typeof User>
|
|
154
|
+
* // { readonly email: string; readonly name: string }
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export type ModelData<M> = M extends {
|
|
158
|
+
readonly [MODEL_DATA]: infer T;
|
|
159
|
+
} ? T : never;
|
|
160
|
+
/**
|
|
161
|
+
* Extract the model name from a Model class.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* class User extends defineModel({ ... }) {}
|
|
166
|
+
* type Name = ModelName<typeof User> // "User"
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export type ModelName<M> = M extends {
|
|
170
|
+
readonly [MODEL_NAME]: infer N extends string;
|
|
171
|
+
} ? N : never;
|
|
172
|
+
/**
|
|
173
|
+
* Type guard for any Model class.
|
|
174
|
+
* Use this when you need to accept any model without caring about its specific type.
|
|
175
|
+
*/
|
|
176
|
+
export type AnyModel = Model<unknown, string, RepositoryContract<unknown>, string>;
|
|
177
|
+
/** Register a model class for inject wiring (called by createInMemoryModel/createPgModel) */
|
|
178
|
+
export declare function registerModelForInjection(model: AnyModel): void;
|
|
179
|
+
/** Get all models that need inject wiring */
|
|
180
|
+
export declare function getModelsWithInject(): ReadonlySet<AnyModel>;
|
|
181
|
+
/** A map of action names to guard definitions */
|
|
182
|
+
export type PermissionRecord = Record<string, GuardDef | readonly GuardDef[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Stamp each permission's `.name` with its key as a string literal.
|
|
185
|
+
*
|
|
186
|
+
* `permit(X).always()` returns a def whose `name` is typed as `string` (the
|
|
187
|
+
* actual name is set at runtime by defineModel from the permissions record
|
|
188
|
+
* key). This type-level pass narrows `name` to the key literal so permission-
|
|
189
|
+
* scoped `.returns()` can build a proper discriminated union.
|
|
190
|
+
*/
|
|
191
|
+
export type StampPermissionNames<P extends PermissionRecord> = {
|
|
192
|
+
readonly [K in keyof P & string]: P[K] extends readonly (infer E)[] ? readonly (E & {
|
|
193
|
+
readonly name: K;
|
|
194
|
+
})[] : P[K] & {
|
|
195
|
+
readonly name: K;
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
/** Factory function that receives field expressions and returns a permissions map */
|
|
199
|
+
export type PermissionsFactory<F extends FieldDefs, P extends PermissionRecord> = (fields: FieldExprsFromData<InferModelType<F>>) => P;
|
|
200
|
+
/**
|
|
201
|
+
* A single field's access rule.
|
|
202
|
+
* - GuardDef or GuardDef[]: short form, same for see + set
|
|
203
|
+
* - []: nobody (fully hidden, not editable)
|
|
204
|
+
* - { see?, set? }: split form for different read/write
|
|
205
|
+
*/
|
|
206
|
+
export type FieldAccessRule = GuardDef | readonly GuardDef[] | readonly [] | {
|
|
207
|
+
see?: GuardDef | readonly GuardDef[] | readonly [];
|
|
208
|
+
set?: GuardDef | readonly GuardDef[] | readonly [];
|
|
209
|
+
};
|
|
210
|
+
/** The resolved access rules stored on a model - field name to rule */
|
|
211
|
+
export type AccessRulesRecord = Record<string, FieldAccessRule>;
|
|
212
|
+
/** Factory function that receives permission defs and returns field access rules */
|
|
213
|
+
export type AccessFactory<F extends FieldDefs, P extends PermissionRecord> = (permissions: P) => Partial<Record<keyof InferModelType<F>, FieldAccessRule>>;
|
|
214
|
+
export declare function defineModel<const F extends FieldDefs, const D extends Record<string, ServiceToken>, const P extends PermissionRecord>(config: {
|
|
215
|
+
name?: string;
|
|
216
|
+
fields: F;
|
|
217
|
+
inject: D;
|
|
218
|
+
permissions: PermissionsFactory<F, P>;
|
|
219
|
+
access?: AccessFactory<F, P>;
|
|
220
|
+
}): Model<InferModelType<F>, string, {}, InferDefaultKeys<F> & string, ResolvedDeps<D>> & {
|
|
221
|
+
readonly can: StampPermissionNames<P>;
|
|
222
|
+
};
|
|
223
|
+
export declare function defineModel<const F extends FieldDefs, const D extends Record<string, ServiceToken>>(config: {
|
|
224
|
+
name?: string;
|
|
225
|
+
fields: F;
|
|
226
|
+
inject: D;
|
|
227
|
+
}): Model<InferModelType<F>, string, {}, InferDefaultKeys<F> & string, ResolvedDeps<D>>;
|
|
228
|
+
export declare function defineModel<const F extends FieldDefs, const P extends PermissionRecord>(config: {
|
|
229
|
+
name?: string;
|
|
230
|
+
fields: F;
|
|
231
|
+
permissions: PermissionsFactory<F, P>;
|
|
232
|
+
access?: AccessFactory<F, P>;
|
|
233
|
+
}): Model<InferModelType<F>, string, {}, InferDefaultKeys<F> & string> & {
|
|
234
|
+
readonly can: StampPermissionNames<P>;
|
|
235
|
+
};
|
|
236
|
+
export declare function defineModel<const F extends FieldDefs>(config: {
|
|
237
|
+
name?: string;
|
|
238
|
+
fields: F;
|
|
239
|
+
}): Model<InferModelType<F>, string, {}, InferDefaultKeys<F> & string>;
|
|
240
|
+
export declare function defineModel<const F extends FieldDefs>(fields: F): Model<InferModelType<F>, string, {}, InferDefaultKeys<F> & string>;
|
|
241
|
+
export declare function isModelClass(value: unknown): value is Model<unknown>;
|
|
242
|
+
export declare function getModelFields(model: {
|
|
243
|
+
[MODEL_FIELDS]: Record<string, FieldDef>;
|
|
244
|
+
}): Record<string, FieldDef>;
|
|
245
|
+
export declare function getModelName(model: {
|
|
246
|
+
[MODEL_NAME]: string;
|
|
247
|
+
}): string;
|
|
248
|
+
export type ModelInstance<M> = M extends Model<infer T> ? T : never;
|
|
249
|
+
//# sourceMappingURL=define-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-model.d.ts","sourceRoot":"","sources":["../../src/models/define-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Definition
|
|
3
|
+
*
|
|
4
|
+
* Creates typed model classes with field schemas.
|
|
5
|
+
*/
|
|
6
|
+
import { FIELD_DEF } from './field.js';
|
|
7
|
+
import { Reference, References, isReference, isReferences } from './reference/reference.js';
|
|
8
|
+
import { FIELD_STORAGE, MODEL_METHODS, MODEL_REPO_CONTRACT, PERSISTENT, ADAPTER_KEY, HYDRATE, MODEL_INJECT, MODEL_SERVICE, ACCESS_RULES, PERMISSION_DEFS } from './symbols.js';
|
|
9
|
+
import { isPersistent } from './types.js';
|
|
10
|
+
export { MODEL_METHODS, MODEL_INJECT, MODEL_SERVICE };
|
|
11
|
+
import { createFieldExpr, } from './query.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Symbols
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/** Symbol.for() so separate module realms see the same symbol */
|
|
16
|
+
export const MODEL_DEF = Symbol.for('@justscale/core/models:modelDef');
|
|
17
|
+
/**
|
|
18
|
+
* Stable identity key for a model class. Two classes produced by separate imports
|
|
19
|
+
* of the same source (e.g. after HMR cache-busting) share the same stable ID, so
|
|
20
|
+
* `ModelRepository.of(model)` resolves to the same token without special wiring.
|
|
21
|
+
*/
|
|
22
|
+
export const MODEL_STABLE_ID = Symbol.for('@justscale/core/models:modelStableId');
|
|
23
|
+
export const MODEL_FIELDS = Symbol('models:modelFields');
|
|
24
|
+
export const MODEL_NAME = Symbol('models:modelName');
|
|
25
|
+
export const MODEL_DATA = Symbol('models:modelData');
|
|
26
|
+
export const MODEL_DEFAULTS = Symbol('models:modelDefaults');
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Ref accessor factory
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Create the `Model.ref` callable. References are memoized by ID using
|
|
32
|
+
* WeakRef so identical IDs round-trip to the same Reference instance (as long
|
|
33
|
+
* as it hasn't been garbage collected).
|
|
34
|
+
*
|
|
35
|
+
* @internal used by defineModel to populate `static ref`
|
|
36
|
+
*/
|
|
37
|
+
function createRefAccessor() {
|
|
38
|
+
const refCache = new Map();
|
|
39
|
+
const getOrCreateRef = (id) => {
|
|
40
|
+
const cached = refCache.get(id);
|
|
41
|
+
if (cached) {
|
|
42
|
+
const ref = cached.deref();
|
|
43
|
+
if (ref)
|
|
44
|
+
return ref;
|
|
45
|
+
refCache.delete(id);
|
|
46
|
+
}
|
|
47
|
+
const ref = new Reference(id, callable.__modelName);
|
|
48
|
+
refCache.set(id, new WeakRef(ref));
|
|
49
|
+
return ref;
|
|
50
|
+
};
|
|
51
|
+
const callable = function (idOrStringsOrEntity, ...values) {
|
|
52
|
+
if (typeof idOrStringsOrEntity === 'object' && 'raw' in idOrStringsOrEntity) {
|
|
53
|
+
const id = String.raw({ raw: idOrStringsOrEntity }, ...values);
|
|
54
|
+
return getOrCreateRef(id);
|
|
55
|
+
}
|
|
56
|
+
if (isReference(idOrStringsOrEntity)) {
|
|
57
|
+
const ref = getOrCreateRef(idOrStringsOrEntity.identifier);
|
|
58
|
+
if (idOrStringsOrEntity.isLoaded) {
|
|
59
|
+
ref[HYDRATE](idOrStringsOrEntity.value);
|
|
60
|
+
}
|
|
61
|
+
return ref;
|
|
62
|
+
}
|
|
63
|
+
if (typeof idOrStringsOrEntity === 'object' && idOrStringsOrEntity !== null) {
|
|
64
|
+
const key = idOrStringsOrEntity[ADAPTER_KEY];
|
|
65
|
+
if (key !== undefined) {
|
|
66
|
+
const ref = getOrCreateRef(key);
|
|
67
|
+
ref[HYDRATE](idOrStringsOrEntity);
|
|
68
|
+
return ref;
|
|
69
|
+
}
|
|
70
|
+
throw new Error('Cannot create Reference from object without adapter key. Is this a persistent entity?');
|
|
71
|
+
}
|
|
72
|
+
return getOrCreateRef(idOrStringsOrEntity);
|
|
73
|
+
};
|
|
74
|
+
return callable;
|
|
75
|
+
}
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// BaseModel - The base class all models extend
|
|
78
|
+
// ============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Abstract base class that all models extend.
|
|
81
|
+
* The class itself represents the transient (unpersisted) form.
|
|
82
|
+
* Use Persistent<T> for the persisted form with id, createdAt, etc.
|
|
83
|
+
*
|
|
84
|
+
* Models are Disposable by default to support `using` declarations
|
|
85
|
+
* in durable processes (for rehydration marking).
|
|
86
|
+
*/
|
|
87
|
+
export class BaseModel {
|
|
88
|
+
constructor(data) {
|
|
89
|
+
Object.defineProperty(this, FIELD_STORAGE, {
|
|
90
|
+
value: {},
|
|
91
|
+
enumerable: false,
|
|
92
|
+
writable: false,
|
|
93
|
+
});
|
|
94
|
+
for (const [key, value] of Object.entries(data)) {
|
|
95
|
+
this[key] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** No-op dispose - models use `using` for process rehydration marking, not cleanup */
|
|
99
|
+
[Symbol.dispose]() { }
|
|
100
|
+
}
|
|
101
|
+
// ============================================================================
|
|
102
|
+
// Global model registry - models with inject, for Container.wireModelPrototypes
|
|
103
|
+
// ============================================================================
|
|
104
|
+
const modelsWithInject = new Set();
|
|
105
|
+
/** Register a model class for inject wiring (called by createInMemoryModel/createPgModel) */
|
|
106
|
+
export function registerModelForInjection(model) {
|
|
107
|
+
if (MODEL_INJECT in model) {
|
|
108
|
+
modelsWithInject.add(model);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Get all models that need inject wiring */
|
|
112
|
+
export function getModelsWithInject() {
|
|
113
|
+
return modelsWithInject;
|
|
114
|
+
}
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// defineModel - Creates a model class
|
|
117
|
+
// ============================================================================
|
|
118
|
+
/**
|
|
119
|
+
* Define a model class.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* // Fields-only form
|
|
124
|
+
* class User extends defineModel({
|
|
125
|
+
* email: field.string().max(255),
|
|
126
|
+
* name: field.string().optional(),
|
|
127
|
+
* }) {}
|
|
128
|
+
*
|
|
129
|
+
* // Config form with inject - model instances gain DI services via prototype
|
|
130
|
+
* class Order extends defineModel({
|
|
131
|
+
* fields: {
|
|
132
|
+
* amount: field.decimal(10, 2),
|
|
133
|
+
* status: field.enum('Status', ['pending', 'paid']),
|
|
134
|
+
* },
|
|
135
|
+
* inject: {
|
|
136
|
+
* payments: PaymentService,
|
|
137
|
+
* },
|
|
138
|
+
* }) {}
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Shared helpers - used by defineModel and Model.override()
|
|
143
|
+
// ============================================================================
|
|
144
|
+
/** Build FieldDefs into resolved FieldDef records */
|
|
145
|
+
function buildFieldDefs(fields) {
|
|
146
|
+
const builtFields = {};
|
|
147
|
+
for (const [key, fieldOrBuilder] of Object.entries(fields)) {
|
|
148
|
+
if (FIELD_DEF in fieldOrBuilder) {
|
|
149
|
+
builtFields[key] = fieldOrBuilder;
|
|
150
|
+
}
|
|
151
|
+
else if ('build' in fieldOrBuilder && typeof fieldOrBuilder.build === 'function') {
|
|
152
|
+
builtFields[key] = fieldOrBuilder.build();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw new Error(`Invalid field definition for "${key}" in model`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return builtFields;
|
|
159
|
+
}
|
|
160
|
+
/** Create field expressions from built field definitions */
|
|
161
|
+
function buildFieldExprs(builtFields) {
|
|
162
|
+
const fieldExprs = {};
|
|
163
|
+
for (const [key, fieldDef] of Object.entries(builtFields)) {
|
|
164
|
+
fieldExprs[key] = createFieldExpr(key, fieldDef);
|
|
165
|
+
}
|
|
166
|
+
return fieldExprs;
|
|
167
|
+
}
|
|
168
|
+
/** Add ref field getters/setters to a prototype (only for NEW fields, not inherited) */
|
|
169
|
+
function defineRefGetters(proto, builtFields) {
|
|
170
|
+
for (const [fieldName, fieldDef] of Object.entries(builtFields)) {
|
|
171
|
+
if (fieldDef.type === 'ref') {
|
|
172
|
+
Object.defineProperty(proto, fieldName, {
|
|
173
|
+
get() {
|
|
174
|
+
return this[FIELD_STORAGE][fieldName];
|
|
175
|
+
},
|
|
176
|
+
set(value) {
|
|
177
|
+
if (isReference(value)) {
|
|
178
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
179
|
+
}
|
|
180
|
+
else if (typeof value === 'string') {
|
|
181
|
+
throw new Error(`Cannot assign string to ref field "${fieldName}". Use Model.ref\`id\` instead.`);
|
|
182
|
+
}
|
|
183
|
+
else if (isPersistent(value)) {
|
|
184
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
185
|
+
}
|
|
186
|
+
else if (value === null || value === undefined) {
|
|
187
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
throw new Error(`Invalid value for ref field "${fieldName}".`);
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
enumerable: true,
|
|
194
|
+
configurable: true,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else if (fieldDef.type === 'refs') {
|
|
198
|
+
Object.defineProperty(proto, fieldName, {
|
|
199
|
+
get() {
|
|
200
|
+
return this[FIELD_STORAGE][fieldName];
|
|
201
|
+
},
|
|
202
|
+
set(value) {
|
|
203
|
+
if (isReferences(value)) {
|
|
204
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
205
|
+
}
|
|
206
|
+
else if (Array.isArray(value)) {
|
|
207
|
+
if (value.length === 0) {
|
|
208
|
+
this[FIELD_STORAGE][fieldName] = new References([]);
|
|
209
|
+
}
|
|
210
|
+
else if (typeof value[0] === 'string') {
|
|
211
|
+
throw new Error(`Cannot assign string array to refs field "${fieldName}". Use Model.refs(...ids) instead.`);
|
|
212
|
+
}
|
|
213
|
+
else if (isPersistent(value[0])) {
|
|
214
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else if (value === null || value === undefined) {
|
|
218
|
+
this[FIELD_STORAGE][fieldName] = value;
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
enumerable: true,
|
|
222
|
+
configurable: true,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Implementation
|
|
228
|
+
// biome-ignore lint/suspicious/noExplicitAny: implementation must accept all overload forms
|
|
229
|
+
export function defineModel(fieldsOrConfig) {
|
|
230
|
+
// Detect config form: has a `fields` property whose value is NOT a FieldBuilder/FieldDef
|
|
231
|
+
// (a FieldBuilder has `build`, a FieldDef has FIELD_DEF - if `fields` is one of those,
|
|
232
|
+
// the user named a field "fields", which is the fields-only form)
|
|
233
|
+
const configCandidate = fieldsOrConfig;
|
|
234
|
+
const fieldsValue = configCandidate.fields;
|
|
235
|
+
const isConfig = fieldsValue !== undefined
|
|
236
|
+
&& typeof fieldsValue === 'object'
|
|
237
|
+
&& fieldsValue !== null
|
|
238
|
+
&& !(FIELD_DEF in fieldsValue)
|
|
239
|
+
&& !('build' in fieldsValue);
|
|
240
|
+
const fields = isConfig
|
|
241
|
+
? fieldsValue
|
|
242
|
+
: fieldsOrConfig;
|
|
243
|
+
const inject = isConfig
|
|
244
|
+
? configCandidate.inject
|
|
245
|
+
: undefined;
|
|
246
|
+
const permissionsFactory = isConfig ? configCandidate.permissions : undefined;
|
|
247
|
+
const accessFactory = isConfig ? configCandidate.access : undefined;
|
|
248
|
+
const explicitName = isConfig
|
|
249
|
+
? configCandidate.name
|
|
250
|
+
: undefined;
|
|
251
|
+
const builtFields = buildFieldDefs(fields);
|
|
252
|
+
const fieldExprs = buildFieldExprs(builtFields);
|
|
253
|
+
// Create dual-purpose ref accessor (callable + Zod schema)
|
|
254
|
+
const refAccessor = createRefAccessor();
|
|
255
|
+
// The model class - extends BaseModel and adds static properties
|
|
256
|
+
class ModelImpl extends BaseModel {
|
|
257
|
+
static [MODEL_DEF] = true;
|
|
258
|
+
static [MODEL_FIELDS] = builtFields;
|
|
259
|
+
static fields = fieldExprs;
|
|
260
|
+
static ref = refAccessor;
|
|
261
|
+
static get [MODEL_NAME]() {
|
|
262
|
+
return explicitName ?? this.name;
|
|
263
|
+
}
|
|
264
|
+
static get [MODEL_STABLE_ID]() {
|
|
265
|
+
return `model:${explicitName ?? this.name}`;
|
|
266
|
+
}
|
|
267
|
+
static refs(...ids) {
|
|
268
|
+
return new References(ids);
|
|
269
|
+
}
|
|
270
|
+
static withRepository() {
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
static create(data) {
|
|
274
|
+
const service = this[MODEL_SERVICE];
|
|
275
|
+
const proto = service ?? this.prototype;
|
|
276
|
+
const instance = Object.create(proto);
|
|
277
|
+
Object.defineProperty(instance, FIELD_STORAGE, { value: {}, enumerable: false, writable: false });
|
|
278
|
+
for (const [key, value] of Object.entries(data)) {
|
|
279
|
+
instance[key] = value;
|
|
280
|
+
}
|
|
281
|
+
return instance;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Override this model with additional fields.
|
|
285
|
+
* Returns a new model class that inherits all parent fields + adds new ones.
|
|
286
|
+
* The ref accessor is inherited (same cache, same identity).
|
|
287
|
+
*/
|
|
288
|
+
static override(overrideConfig) {
|
|
289
|
+
const newBuiltFields = buildFieldDefs(overrideConfig.fields);
|
|
290
|
+
const mergedFields = { ...this[MODEL_FIELDS], ...newBuiltFields };
|
|
291
|
+
const mergedFieldExprs = buildFieldExprs(mergedFields);
|
|
292
|
+
const overrideName = overrideConfig.name;
|
|
293
|
+
const ParentClass = this;
|
|
294
|
+
class OverrideModelImpl extends ParentClass {
|
|
295
|
+
static [MODEL_DEF] = true;
|
|
296
|
+
static [MODEL_FIELDS] = mergedFields;
|
|
297
|
+
static fields = mergedFieldExprs;
|
|
298
|
+
// ref is INHERITED from parent - same accessor, same cache
|
|
299
|
+
static get [MODEL_NAME]() {
|
|
300
|
+
return overrideName ?? this.name;
|
|
301
|
+
}
|
|
302
|
+
static get [MODEL_STABLE_ID]() {
|
|
303
|
+
return `model:${overrideName ?? this.name}`;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Add getters/setters for NEW fields only (parent's are inherited via prototype chain)
|
|
307
|
+
defineRefGetters(OverrideModelImpl.prototype, newBuiltFields);
|
|
308
|
+
// Merge inject configs
|
|
309
|
+
if (overrideConfig.inject) {
|
|
310
|
+
const parentInject = ParentClass[MODEL_INJECT] ?? {};
|
|
311
|
+
Object.defineProperty(OverrideModelImpl, MODEL_INJECT, {
|
|
312
|
+
value: { ...parentInject, ...overrideConfig.inject },
|
|
313
|
+
enumerable: false,
|
|
314
|
+
configurable: true,
|
|
315
|
+
writable: false,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
return OverrideModelImpl;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Store inject config on the model class (if provided)
|
|
322
|
+
if (inject) {
|
|
323
|
+
Object.defineProperty(ModelImpl, MODEL_INJECT, {
|
|
324
|
+
value: inject,
|
|
325
|
+
enumerable: false,
|
|
326
|
+
configurable: true,
|
|
327
|
+
writable: false,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
// Call permissions factory with field expressions and attach result as `can`
|
|
331
|
+
if (permissionsFactory) {
|
|
332
|
+
const permissionDefs = permissionsFactory(fieldExprs);
|
|
333
|
+
// Stamp each permission def with its action name (the key from the permissions record)
|
|
334
|
+
for (const [actionName, def] of Object.entries(permissionDefs)) {
|
|
335
|
+
if (Array.isArray(def)) {
|
|
336
|
+
for (const d of def) {
|
|
337
|
+
if (d && typeof d === 'object')
|
|
338
|
+
d.name = actionName;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else if (def && typeof def === 'object') {
|
|
342
|
+
def.name = actionName;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
Object.defineProperty(ModelImpl, 'can', {
|
|
346
|
+
value: permissionDefs,
|
|
347
|
+
enumerable: true,
|
|
348
|
+
configurable: false,
|
|
349
|
+
writable: false,
|
|
350
|
+
});
|
|
351
|
+
// Store the raw permission defs for access rule evaluation
|
|
352
|
+
Object.defineProperty(ModelImpl, PERMISSION_DEFS, {
|
|
353
|
+
value: permissionDefs,
|
|
354
|
+
enumerable: false,
|
|
355
|
+
configurable: false,
|
|
356
|
+
writable: false,
|
|
357
|
+
});
|
|
358
|
+
// Call access factory with permission defs and store result
|
|
359
|
+
if (accessFactory) {
|
|
360
|
+
const accessRules = accessFactory(permissionDefs);
|
|
361
|
+
Object.defineProperty(ModelImpl, ACCESS_RULES, {
|
|
362
|
+
value: accessRules,
|
|
363
|
+
enumerable: false,
|
|
364
|
+
configurable: false,
|
|
365
|
+
writable: false,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Add ref/refs field getters/setters
|
|
370
|
+
defineRefGetters(ModelImpl.prototype, builtFields);
|
|
371
|
+
return ModelImpl;
|
|
372
|
+
}
|
|
373
|
+
// ============================================================================
|
|
374
|
+
// Type Guards & Helpers
|
|
375
|
+
// ============================================================================
|
|
376
|
+
export function isModelClass(value) {
|
|
377
|
+
return (value !== null &&
|
|
378
|
+
typeof value === 'function' &&
|
|
379
|
+
MODEL_DEF in value &&
|
|
380
|
+
value[MODEL_DEF] === true);
|
|
381
|
+
}
|
|
382
|
+
export function getModelFields(model) {
|
|
383
|
+
return model[MODEL_FIELDS];
|
|
384
|
+
}
|
|
385
|
+
export function getModelName(model) {
|
|
386
|
+
return model[MODEL_NAME];
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=define-model.js.map
|