@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,875 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Injection System
|
|
3
|
+
*
|
|
4
|
+
* Uses TypeScript's type system to ensure all dependencies are provided at compile time.
|
|
5
|
+
*/
|
|
6
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
7
|
+
if (value !== null && value !== void 0) {
|
|
8
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
9
|
+
var dispose, inner;
|
|
10
|
+
if (async) {
|
|
11
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
12
|
+
dispose = value[Symbol.asyncDispose];
|
|
13
|
+
}
|
|
14
|
+
if (dispose === void 0) {
|
|
15
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
16
|
+
dispose = value[Symbol.dispose];
|
|
17
|
+
if (async) inner = dispose;
|
|
18
|
+
}
|
|
19
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
20
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
21
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
22
|
+
}
|
|
23
|
+
else if (async) {
|
|
24
|
+
env.stack.push({ async: true });
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
29
|
+
return function (env) {
|
|
30
|
+
function fail(e) {
|
|
31
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
32
|
+
env.hasError = true;
|
|
33
|
+
}
|
|
34
|
+
var r, s = 0;
|
|
35
|
+
function next() {
|
|
36
|
+
while (r = env.stack.pop()) {
|
|
37
|
+
try {
|
|
38
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
39
|
+
if (r.dispose) {
|
|
40
|
+
var result = r.dispose.call(r.value);
|
|
41
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
42
|
+
}
|
|
43
|
+
else s |= 1;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
fail(e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
50
|
+
if (env.hasError) throw env.error;
|
|
51
|
+
}
|
|
52
|
+
return next();
|
|
53
|
+
};
|
|
54
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
55
|
+
var e = new Error(message);
|
|
56
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
57
|
+
});
|
|
58
|
+
import { ConsoleLoggerFactory, isLoggerToken, } from './logger.js';
|
|
59
|
+
import { isLifecycleToken, } from './lifecycle.js';
|
|
60
|
+
import { pushScope } from './disposable.js';
|
|
61
|
+
import { __wrapHmrStateForSave } from './hmr.js';
|
|
62
|
+
import { getModelsWithInject } from '../models/define-model.js';
|
|
63
|
+
import { MODEL_INJECT, MODEL_SERVICE } from '../models/symbols.js';
|
|
64
|
+
// ============================================================================
|
|
65
|
+
// Abstract Class Definition
|
|
66
|
+
// ============================================================================
|
|
67
|
+
/**
|
|
68
|
+
* Define an abstract class for use as a DI token.
|
|
69
|
+
*
|
|
70
|
+
* Use `abstract class MyAbstract extends defineAbstract<MyInterface>() {}`
|
|
71
|
+
* to create a clean abstract class that serves as a DI token.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // Define the interface
|
|
76
|
+
* interface ProcessStorage {
|
|
77
|
+
* save(state: ProcessState): Promise<void>
|
|
78
|
+
* load(instanceId: string): Promise<ProcessState | null>
|
|
79
|
+
* }
|
|
80
|
+
*
|
|
81
|
+
* // Create abstract class as DI token
|
|
82
|
+
* export abstract class AbstractProcessStorage extends defineAbstract<ProcessStorage>() {}
|
|
83
|
+
*
|
|
84
|
+
* // Implementation uses defineService with provides
|
|
85
|
+
* export class InMemoryProcessStorage extends defineService({
|
|
86
|
+
* inject: {},
|
|
87
|
+
* provides: [AbstractProcessStorage],
|
|
88
|
+
* factory: () => ({ ... })
|
|
89
|
+
* }) {}
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function defineAbstract(name) {
|
|
93
|
+
function AbstractImpl() {
|
|
94
|
+
// Only throw if instantiated directly, not via a subclass extending this
|
|
95
|
+
// new.target is the constructor that was directly invoked with 'new'
|
|
96
|
+
if (new.target === AbstractImpl) {
|
|
97
|
+
throw new Error(`${name ?? 'Abstract class'} cannot be instantiated directly. Use container.resolve() instead.`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (name) {
|
|
101
|
+
Object.defineProperty(AbstractImpl, 'name', { value: name, configurable: true });
|
|
102
|
+
}
|
|
103
|
+
return AbstractImpl;
|
|
104
|
+
}
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Service Definition
|
|
107
|
+
// ============================================================================
|
|
108
|
+
/** Symbol for provides metadata */
|
|
109
|
+
export const SERVICE_PROVIDES = Symbol('justscale:serviceProvides');
|
|
110
|
+
/** Symbol for unique ServiceDef ID (legacy counter-based) */
|
|
111
|
+
export const SERVICE_ID = Symbol('justscale:serviceId');
|
|
112
|
+
/** Symbol for stable service ID (file path + export name, injected by compiler) */
|
|
113
|
+
export const SERVICE_STABLE_ID = Symbol('justscale:serviceStableId');
|
|
114
|
+
/** @internal Symbol key for dev-time extension surface on Container. */
|
|
115
|
+
export const CONTAINER_DEV = Symbol('justscale:containerDev');
|
|
116
|
+
const SERVICE_ID_COUNTER = Symbol.for('justscale:serviceIdCounter');
|
|
117
|
+
const _global = globalThis;
|
|
118
|
+
_global[SERVICE_ID_COUNTER] = _global[SERVICE_ID_COUNTER] ?? 0;
|
|
119
|
+
/** Get next unique ID (global) */
|
|
120
|
+
function nextServiceId() {
|
|
121
|
+
return ++_global[SERVICE_ID_COUNTER];
|
|
122
|
+
}
|
|
123
|
+
/** Read the SERVICE_PROVIDES tokens from a service definition. */
|
|
124
|
+
export function getServiceProvides(obj) {
|
|
125
|
+
return obj?.[SERVICE_PROVIDES];
|
|
126
|
+
}
|
|
127
|
+
/** Read the SERVICE_ID counter value from a service definition. */
|
|
128
|
+
export function getServiceIdValue(obj) {
|
|
129
|
+
return obj?.[SERVICE_ID];
|
|
130
|
+
}
|
|
131
|
+
/** Read the SERVICE_STABLE_ID from a service definition. */
|
|
132
|
+
export function getServiceStableId(obj) {
|
|
133
|
+
return obj?.[SERVICE_STABLE_ID];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the stable service ID from a token, if available.
|
|
137
|
+
* Returns the compiler-injected ID or falls back to a generated one.
|
|
138
|
+
*/
|
|
139
|
+
export function getServiceId(token) {
|
|
140
|
+
const stableId = getServiceStableId(token);
|
|
141
|
+
if (stableId) {
|
|
142
|
+
return stableId;
|
|
143
|
+
}
|
|
144
|
+
const counterId = getServiceIdValue(token);
|
|
145
|
+
const name = typeof token === 'function' ? token.name : 'Service';
|
|
146
|
+
if (counterId !== undefined) {
|
|
147
|
+
return `${name}#${counterId}`;
|
|
148
|
+
}
|
|
149
|
+
return name || 'Anonymous';
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Define a service class.
|
|
153
|
+
*
|
|
154
|
+
* Use `class MyService extends defineService({...}) {}` pattern
|
|
155
|
+
* to preserve type names in .d.ts output. This prevents TypeScript
|
|
156
|
+
* from inlining the full service type everywhere it's referenced.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* // The class name "UserService" is preserved in .d.ts
|
|
161
|
+
* export class UserService extends defineService({
|
|
162
|
+
* inject: { users: UserRepository },
|
|
163
|
+
* factory: ({ users }) => ({
|
|
164
|
+
* register: async (email, password) => {...},
|
|
165
|
+
* findById: async (id) => {...},
|
|
166
|
+
* })
|
|
167
|
+
* }) {}
|
|
168
|
+
*
|
|
169
|
+
* container.register(UserService)
|
|
170
|
+
* const users = container.resolve(UserService)
|
|
171
|
+
*
|
|
172
|
+
* // Auto-bind to abstract class
|
|
173
|
+
* export class InMemoryStorage extends defineService({
|
|
174
|
+
* inject: {},
|
|
175
|
+
* provides: [AbstractStorage], // Auto-binds!
|
|
176
|
+
* factory: () => ({ ... })
|
|
177
|
+
* }) {}
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
export function defineService(config) {
|
|
181
|
+
const id = nextServiceId();
|
|
182
|
+
// Create a class-like object that TypeScript treats as extendable
|
|
183
|
+
// The constructor is never called - it's purely for type-level extends
|
|
184
|
+
function ServiceImpl() {
|
|
185
|
+
throw new Error('Service classes should not be instantiated directly. Use container.resolve() instead.');
|
|
186
|
+
}
|
|
187
|
+
// Attach static properties for DI resolution
|
|
188
|
+
ServiceImpl.deps = config.inject;
|
|
189
|
+
ServiceImpl.factory = config.factory;
|
|
190
|
+
ServiceImpl[SERVICE_ID] = id;
|
|
191
|
+
// Set SERVICE_PROVIDES if provided
|
|
192
|
+
if (config.provides && config.provides.length > 0) {
|
|
193
|
+
ServiceImpl[SERVICE_PROVIDES] = config.provides;
|
|
194
|
+
}
|
|
195
|
+
// Set stable service ID if provided (compiler-injected in dev mode)
|
|
196
|
+
if (config.__serviceId) {
|
|
197
|
+
ServiceImpl[SERVICE_STABLE_ID] = config.__serviceId;
|
|
198
|
+
}
|
|
199
|
+
return ServiceImpl;
|
|
200
|
+
}
|
|
201
|
+
// ============================================================================
|
|
202
|
+
// Container
|
|
203
|
+
// ============================================================================
|
|
204
|
+
/**
|
|
205
|
+
* Get a human-readable name for a service token.
|
|
206
|
+
*/
|
|
207
|
+
function getTokenName(token) {
|
|
208
|
+
if (typeof token === 'function') {
|
|
209
|
+
return token.name || 'Anonymous';
|
|
210
|
+
}
|
|
211
|
+
// ServiceDef - try to find a meaningful name
|
|
212
|
+
return 'Service';
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Thrown when `Container.resolve` detects a cycle in the dependency graph
|
|
216
|
+
* (e.g. A injects B and B injects A). The message lists the cycle in the
|
|
217
|
+
* order it was walked: `"Circular dependency: A -> B -> A"`.
|
|
218
|
+
*
|
|
219
|
+
* Without this, a direct cycle would recurse into `resolveInternal`
|
|
220
|
+
* synchronously until the engine throws `RangeError: Maximum call stack
|
|
221
|
+
* size exceeded`, which gives no information about *which* services are
|
|
222
|
+
* involved.
|
|
223
|
+
*/
|
|
224
|
+
export class CircularDependencyError extends Error {
|
|
225
|
+
path;
|
|
226
|
+
constructor(path) {
|
|
227
|
+
super(`Circular dependency: ${path.join(' -> ')}`);
|
|
228
|
+
this.path = path;
|
|
229
|
+
this.name = 'CircularDependencyError';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
export class Container {
|
|
233
|
+
instances = new Map();
|
|
234
|
+
factories = new Map();
|
|
235
|
+
/** Map from SERVICE_ID to the registered ServiceDef */
|
|
236
|
+
factoriesById = new Map();
|
|
237
|
+
/** Map from stable service ID to token (for HMR lookup) */
|
|
238
|
+
tokensByStableId = new Map();
|
|
239
|
+
/** Resolved deps for each service (for HMR method patching) */
|
|
240
|
+
resolvedDeps = new Map();
|
|
241
|
+
/** HMR state registry (keyed by service ID, holds state between reloads) */
|
|
242
|
+
hmrStateRegistry = new Map();
|
|
243
|
+
/**
|
|
244
|
+
* Backing boxes for function-type service instances. Values stored
|
|
245
|
+
* here are the MUTABLE `{ current }` cells that the public proxy
|
|
246
|
+
* delegates to via its `apply` / `get` / `set` traps. Key is the
|
|
247
|
+
* proxy reference that we handed to callers; mutating
|
|
248
|
+
* `box.current` transparently re-routes every future call.
|
|
249
|
+
*
|
|
250
|
+
* Present only for function-type instances - object instances don't
|
|
251
|
+
* need indirection because we can mutate them in place via
|
|
252
|
+
* `Object.assign`.
|
|
253
|
+
*/
|
|
254
|
+
indirectionBoxes = new WeakMap();
|
|
255
|
+
/** Map of in-flight resolution promises to prevent duplicate instantiation during concurrent resolution */
|
|
256
|
+
pending = new Map();
|
|
257
|
+
/**
|
|
258
|
+
* Tokens currently being constructed (between entering resolveInternal
|
|
259
|
+
* and the factory returning). Used to detect A->B->A cycles that the
|
|
260
|
+
* `pending` map alone would not catch, because `pending` is populated
|
|
261
|
+
* *after* the recursive dep walk - a synchronous cycle never hits it.
|
|
262
|
+
* Tracked as an ordered list so we can report the full path on error.
|
|
263
|
+
*/
|
|
264
|
+
resolving = [];
|
|
265
|
+
/**
|
|
266
|
+
* Current resolution context stack.
|
|
267
|
+
* Tracks which service is being resolved for contextual Logger creation.
|
|
268
|
+
*/
|
|
269
|
+
resolutionStack = [];
|
|
270
|
+
/**
|
|
271
|
+
* Logger factory for creating contextual loggers.
|
|
272
|
+
* Can be replaced to use a custom logger implementation.
|
|
273
|
+
*/
|
|
274
|
+
loggerFactory = new ConsoleLoggerFactory();
|
|
275
|
+
/**
|
|
276
|
+
* Lifecycle instance for hook registration.
|
|
277
|
+
* Set by the cluster builder during compile.
|
|
278
|
+
*/
|
|
279
|
+
lifecycle = null;
|
|
280
|
+
/**
|
|
281
|
+
* Set the lifecycle instance (called by cluster builder during compile).
|
|
282
|
+
* This wires up the Lifecycle built-in token.
|
|
283
|
+
*/
|
|
284
|
+
setLifecycle(lifecycle) {
|
|
285
|
+
this.lifecycle = lifecycle;
|
|
286
|
+
}
|
|
287
|
+
/** Register a service class (no deps, instantiated with new) */
|
|
288
|
+
registerClass(token) {
|
|
289
|
+
this.instances.set(token, new token());
|
|
290
|
+
return this;
|
|
291
|
+
}
|
|
292
|
+
/** Register a service definition (ServiceDef or Service class) */
|
|
293
|
+
register(def) {
|
|
294
|
+
this.factories.set(def, def);
|
|
295
|
+
// Also register by ID for cross-module lookup
|
|
296
|
+
const id = getServiceIdValue(def);
|
|
297
|
+
if (id !== undefined) {
|
|
298
|
+
this.factoriesById.set(id, def);
|
|
299
|
+
}
|
|
300
|
+
return this;
|
|
301
|
+
}
|
|
302
|
+
/** Register a service definition under a specific token (e.g., abstract class) */
|
|
303
|
+
registerFor(token, def) {
|
|
304
|
+
this.factories.set(token, def);
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
/** Register an already-created instance */
|
|
308
|
+
registerInstance(token, instance) {
|
|
309
|
+
this.instances.set(token, instance);
|
|
310
|
+
return this;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Symbol-keyed "dev extensions" - bundles all the extension-point
|
|
314
|
+
* methods dev tooling needs into one non-polluting surface.
|
|
315
|
+
* Consumers (e.g. `@justscale/hmr`) do:
|
|
316
|
+
*
|
|
317
|
+
* import { CONTAINER_DEV } from '@justscale/core';
|
|
318
|
+
* const dev = container[CONTAINER_DEV];
|
|
319
|
+
* dev.replaceInstance(token, newFactory);
|
|
320
|
+
*
|
|
321
|
+
* Nothing on the public `Container` shape mentions HMR or replace
|
|
322
|
+
* semantics - those live behind the symbol so they don't show up in
|
|
323
|
+
* normal autocomplete.
|
|
324
|
+
*/
|
|
325
|
+
get [CONTAINER_DEV]() {
|
|
326
|
+
return {
|
|
327
|
+
hasServiceDef: (token) => this.factories.has(token),
|
|
328
|
+
registerStableId: (stableId, token) => {
|
|
329
|
+
this.tokensByStableId.set(stableId, token);
|
|
330
|
+
},
|
|
331
|
+
replaceInstance: (token, newFactory) => this.replaceInstanceImpl(token, newFactory),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* If a factory returned a function (rather than an object with
|
|
336
|
+
* methods), wrap it in a Proxy that delegates through a mutable box.
|
|
337
|
+
* `replaceInstance` can then re-point the box at a new function, and
|
|
338
|
+
* every consumer holding the proxy invokes the new behaviour.
|
|
339
|
+
*
|
|
340
|
+
* For object instances this is a no-op - they get mutated in place
|
|
341
|
+
* via `Object.assign` instead, so no indirection is needed.
|
|
342
|
+
*
|
|
343
|
+
* Cost at call time is one `Proxy.apply` trap per invocation, which
|
|
344
|
+
* is noise for typical service workloads. In the hypothetical case
|
|
345
|
+
* where a hot inner loop invokes a function-type service millions of
|
|
346
|
+
* times, the overhead would matter; we accept it for the benefit of
|
|
347
|
+
* uniform replace-in-place semantics.
|
|
348
|
+
*/
|
|
349
|
+
wrapIfFunction(instance) {
|
|
350
|
+
if (typeof instance !== 'function')
|
|
351
|
+
return instance;
|
|
352
|
+
const box = { current: instance };
|
|
353
|
+
const proxy = new Proxy(instance, {
|
|
354
|
+
apply(_t, thisArg, args) {
|
|
355
|
+
return box.current.apply(thisArg, args);
|
|
356
|
+
},
|
|
357
|
+
get(_t, prop, receiver) {
|
|
358
|
+
return Reflect.get(box.current, prop, receiver);
|
|
359
|
+
},
|
|
360
|
+
set(_t, prop, value, receiver) {
|
|
361
|
+
return Reflect.set(box.current, prop, value, receiver);
|
|
362
|
+
},
|
|
363
|
+
has(_t, prop) {
|
|
364
|
+
return Reflect.has(box.current, prop);
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
this.indirectionBoxes.set(proxy, box);
|
|
368
|
+
return proxy;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Replace the runtime behavior backing an already-resolved token
|
|
372
|
+
* without changing the outward reference that consumers hold.
|
|
373
|
+
*
|
|
374
|
+
* Runs `newFactory(cachedDeps, resolver)` → new instance. Then:
|
|
375
|
+
*
|
|
376
|
+
* - **Object instances:** delete keys that disappeared, `Object.assign`
|
|
377
|
+
* remaining keys on top. Handler closures over the old instance see
|
|
378
|
+
* the new methods on their next call.
|
|
379
|
+
*
|
|
380
|
+
* - **Function instances:** look up the indirection box stored at
|
|
381
|
+
* resolve time, update its `current` pointer. The proxy exposed to
|
|
382
|
+
* callers delegates `apply`/get/set through the box, so existing
|
|
383
|
+
* references keep working and invoke the new code.
|
|
384
|
+
*
|
|
385
|
+
* Accessible via `container[CONTAINER_DEV].replaceInstance(...)` -
|
|
386
|
+
* not on the public shape, to keep tooling-only capabilities out of
|
|
387
|
+
* everyday autocomplete.
|
|
388
|
+
*
|
|
389
|
+
* Singletons the factory created at construction time (Maps, sockets)
|
|
390
|
+
* are NOT preserved - register `lifecycle.register('hotReload')` to
|
|
391
|
+
* capture and re-inject such state across replacements.
|
|
392
|
+
*/
|
|
393
|
+
async replaceInstanceImpl(token, newFactory) {
|
|
394
|
+
const oldInstance = this.instances.get(token);
|
|
395
|
+
const deps = this.resolvedDeps.get(token);
|
|
396
|
+
if (oldInstance === undefined || !deps) {
|
|
397
|
+
// Either never instantiated or never resolved. A future resolve
|
|
398
|
+
// will pick up whatever factory is current on the class.
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
const resolver = Object.assign((t) => this.resolve(t), {
|
|
402
|
+
registerInstance: (t, instance) => {
|
|
403
|
+
this.registerInstance(t, instance);
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
const newInstance = await newFactory(deps, resolver);
|
|
407
|
+
// Function-type: update the indirection box behind the proxy.
|
|
408
|
+
const box = typeof oldInstance === 'object' && oldInstance !== null
|
|
409
|
+
? this.indirectionBoxes.get(oldInstance)
|
|
410
|
+
: typeof oldInstance === 'function'
|
|
411
|
+
? this.indirectionBoxes.get(oldInstance)
|
|
412
|
+
: undefined;
|
|
413
|
+
if (box !== undefined) {
|
|
414
|
+
if (typeof newInstance !== 'function') {
|
|
415
|
+
// Shape flipped from function → non-function. Can't swap in
|
|
416
|
+
// place - reset would break callers that hold the proxy.
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
box.current = newInstance;
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
// Object-type: key-level merge.
|
|
423
|
+
if (newInstance === null ||
|
|
424
|
+
typeof newInstance !== 'object' ||
|
|
425
|
+
typeof oldInstance !== 'object' ||
|
|
426
|
+
oldInstance === null) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
for (const key of Object.keys(oldInstance)) {
|
|
430
|
+
if (!(key in newInstance)) {
|
|
431
|
+
delete oldInstance[key];
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
Object.assign(oldInstance, newInstance);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Set a custom logger factory.
|
|
438
|
+
* Use this to replace ConsoleLogger with your own implementation.
|
|
439
|
+
*
|
|
440
|
+
* @example
|
|
441
|
+
* ```typescript
|
|
442
|
+
* container.setLoggerFactory({
|
|
443
|
+
* create: (context) => new PinoLogger(context),
|
|
444
|
+
* });
|
|
445
|
+
* ```
|
|
446
|
+
*/
|
|
447
|
+
setLoggerFactory(factory) {
|
|
448
|
+
this.loggerFactory = factory;
|
|
449
|
+
return this;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Create a logger with the current resolution context.
|
|
453
|
+
* Called internally when Logger is requested as a dependency.
|
|
454
|
+
*/
|
|
455
|
+
createLogger(context) {
|
|
456
|
+
const ctx = context ?? this.resolutionStack[this.resolutionStack.length - 1] ?? 'app';
|
|
457
|
+
return this.loggerFactory.create(ctx);
|
|
458
|
+
}
|
|
459
|
+
/** Find a ServiceDef for a token (handles various lookup strategies) */
|
|
460
|
+
findServiceDef(token) {
|
|
461
|
+
// Try direct lookup
|
|
462
|
+
let def = this.factories.get(token);
|
|
463
|
+
// If not found by object identity, try by SERVICE_ID
|
|
464
|
+
if (!def) {
|
|
465
|
+
const tokenId = getServiceIdValue(token);
|
|
466
|
+
if (tokenId !== undefined) {
|
|
467
|
+
def = this.factoriesById.get(tokenId);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// If still not found and token is a ServiceDef, try to match by deps structure
|
|
471
|
+
if (!def && typeof token === 'object' && token !== null && 'deps' in token && 'factory' in token) {
|
|
472
|
+
const tokenDeps = token.deps;
|
|
473
|
+
const tokenKeys = Object.keys(tokenDeps).sort().join(',');
|
|
474
|
+
for (const [key, value] of this.factories.entries()) {
|
|
475
|
+
if (key === token)
|
|
476
|
+
continue; // Already checked
|
|
477
|
+
if (typeof key !== 'object' || key === null || !('deps' in key))
|
|
478
|
+
continue;
|
|
479
|
+
const keyDeps = key.deps;
|
|
480
|
+
const keyKeys = Object.keys(keyDeps).sort().join(',');
|
|
481
|
+
// Match if same dep keys and dep values match by name (handles different module instances)
|
|
482
|
+
if (tokenKeys === keyKeys) {
|
|
483
|
+
const depsMatch = Object.keys(tokenDeps).every(k => {
|
|
484
|
+
const a = tokenDeps[k];
|
|
485
|
+
const b = keyDeps[k];
|
|
486
|
+
// Compare by identity first
|
|
487
|
+
if (a === b)
|
|
488
|
+
return true;
|
|
489
|
+
// If both are functions (classes), compare by name
|
|
490
|
+
if (typeof a === 'function' && typeof b === 'function') {
|
|
491
|
+
return a.name === b.name;
|
|
492
|
+
}
|
|
493
|
+
return false;
|
|
494
|
+
});
|
|
495
|
+
if (depsMatch) {
|
|
496
|
+
def = value;
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return def;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Resolve a service (always async to support async factories).
|
|
506
|
+
*
|
|
507
|
+
* RepositoryToken overload: `ModelRepository.of(User)` returns the
|
|
508
|
+
* repository instance type, not the entity type. TypeScript picks
|
|
509
|
+
* overloads in order, so this runs for any RepositoryToken first;
|
|
510
|
+
* everything else falls through to the generic signature.
|
|
511
|
+
*/
|
|
512
|
+
/**
|
|
513
|
+
* Synchronously return an already-instantiated service, or undefined if
|
|
514
|
+
* it hasn't been resolved yet. Does NOT trigger instantiation.
|
|
515
|
+
*
|
|
516
|
+
* Use sparingly — meant for hot paths that need to check current state
|
|
517
|
+
* (e.g. process executor lookup) without paying the cost of an async
|
|
518
|
+
* resolve. Most code should use `resolve(token)` and await it.
|
|
519
|
+
*/
|
|
520
|
+
tryGetInstance(token) {
|
|
521
|
+
return this.instances.get(token);
|
|
522
|
+
}
|
|
523
|
+
async resolve(token) {
|
|
524
|
+
// Special case: Logger is NOT a singleton - each injection gets its own instance
|
|
525
|
+
if (isLoggerToken(token)) {
|
|
526
|
+
return this.createLogger();
|
|
527
|
+
}
|
|
528
|
+
// Special case: Lifecycle is a built-in singleton
|
|
529
|
+
if (isLifecycleToken(token)) {
|
|
530
|
+
if (!this.lifecycle) {
|
|
531
|
+
throw new Error('Lifecycle not initialized - are you using createClusterBuilder()? ' +
|
|
532
|
+
'Make sure to call .build() and use the cluster, not raw Container.');
|
|
533
|
+
}
|
|
534
|
+
return this.lifecycle;
|
|
535
|
+
}
|
|
536
|
+
// Explicit `registerInstance(token, value)` wins over every other
|
|
537
|
+
// resolution path. Needed for sub-app bridges: when a sub-app
|
|
538
|
+
// `.requires(Config.of(X))`, the compose path registers a
|
|
539
|
+
// scope-switched value against the token object itself; without
|
|
540
|
+
// this check, the resolvable-token branch below would run its own
|
|
541
|
+
// `resolve(container)` and look up a partial symbol the sub-app
|
|
542
|
+
// scope doesn't have, returning undefined.
|
|
543
|
+
if (this.instances.has(token)) {
|
|
544
|
+
return this.instances.get(token);
|
|
545
|
+
}
|
|
546
|
+
// Resolvable tokens: ConfigToken / SecretToken / FeatureFlagToken.
|
|
547
|
+
// These carry their own resolve(container) function and read from
|
|
548
|
+
// instances keyed by a partial symbol.
|
|
549
|
+
const tokenAny = token;
|
|
550
|
+
if (tokenAny &&
|
|
551
|
+
typeof tokenAny === 'object' &&
|
|
552
|
+
typeof tokenAny.resolve === 'function' &&
|
|
553
|
+
typeof tokenAny.key === 'symbol' &&
|
|
554
|
+
!('factory' in tokenAny)) {
|
|
555
|
+
return tokenAny.resolve({
|
|
556
|
+
get: (key) => this.instances.get(key),
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
// Check if resolution is already in progress (prevents duplicate instantiation during concurrent resolution)
|
|
560
|
+
if (this.pending.has(token)) {
|
|
561
|
+
return this.pending.get(token);
|
|
562
|
+
}
|
|
563
|
+
// Also check if the underlying def is being resolved under a different token
|
|
564
|
+
const def = this.findServiceDef(token);
|
|
565
|
+
if (def && def !== token && this.pending.has(def)) {
|
|
566
|
+
return this.pending.get(def);
|
|
567
|
+
}
|
|
568
|
+
// Create and track the resolution promise
|
|
569
|
+
const resolutionPromise = this.resolveInternal(token);
|
|
570
|
+
this.pending.set(token, resolutionPromise);
|
|
571
|
+
// Also track under the def if different from token
|
|
572
|
+
if (def && def !== token) {
|
|
573
|
+
this.pending.set(def, resolutionPromise);
|
|
574
|
+
}
|
|
575
|
+
try {
|
|
576
|
+
const instance = await resolutionPromise;
|
|
577
|
+
return instance;
|
|
578
|
+
}
|
|
579
|
+
finally {
|
|
580
|
+
this.pending.delete(token);
|
|
581
|
+
if (def && def !== token) {
|
|
582
|
+
this.pending.delete(def);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
/** Internal resolution logic */
|
|
587
|
+
async resolveInternal(token) {
|
|
588
|
+
const def = this.findServiceDef(token);
|
|
589
|
+
if (def) {
|
|
590
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
591
|
+
try {
|
|
592
|
+
// Check if this def was already instantiated under a different token
|
|
593
|
+
// This happens when bindService maps multiple tokens to the same service
|
|
594
|
+
if (def !== token && this.instances.has(def)) {
|
|
595
|
+
const instance = this.instances.get(def);
|
|
596
|
+
// Cache under this token too for faster future lookups
|
|
597
|
+
this.instances.set(token, instance);
|
|
598
|
+
return instance;
|
|
599
|
+
}
|
|
600
|
+
// Cycle detection: if the def (or the token) is already being
|
|
601
|
+
// resolved further up the stack, we have a circular dependency.
|
|
602
|
+
// Throw a readable error listing the path instead of recursing
|
|
603
|
+
// until the engine throws a generic RangeError.
|
|
604
|
+
const cycleHit = this.resolving.indexOf(def) !== -1
|
|
605
|
+
? def
|
|
606
|
+
: this.resolving.indexOf(token) !== -1
|
|
607
|
+
? token
|
|
608
|
+
: undefined;
|
|
609
|
+
if (cycleHit !== undefined) {
|
|
610
|
+
const startIdx = this.resolving.indexOf(cycleHit);
|
|
611
|
+
const path = this.resolving
|
|
612
|
+
.slice(startIdx)
|
|
613
|
+
.map((t) => getTokenName(t));
|
|
614
|
+
path.push(getTokenName(cycleHit));
|
|
615
|
+
throw new CircularDependencyError(path);
|
|
616
|
+
}
|
|
617
|
+
// Push context for Logger injection (auto-pops when block exits)
|
|
618
|
+
const _ = __addDisposableResource(env_1, pushScope(this.resolutionStack, getTokenName(token)), false);
|
|
619
|
+
this.resolving.push(def);
|
|
620
|
+
try {
|
|
621
|
+
const resolvedDeps = {};
|
|
622
|
+
if (def.deps == null) {
|
|
623
|
+
const stack = this.resolutionStack.length ? this.resolutionStack.join(' -> ') : '(empty)';
|
|
624
|
+
throw new TypeError(`Service '${getTokenName(token)}' has no deps defined. ` +
|
|
625
|
+
`Resolution stack: ${stack}. ` +
|
|
626
|
+
'Ensure the service was created with defineService and has an \'inject\' field.');
|
|
627
|
+
}
|
|
628
|
+
for (const [key, depToken] of Object.entries(def.deps)) {
|
|
629
|
+
resolvedDeps[key] = await this.resolve(depToken);
|
|
630
|
+
}
|
|
631
|
+
// Set lifecycle service context for hotReload handler registration
|
|
632
|
+
const serviceId = getServiceId(token);
|
|
633
|
+
if (this.lifecycle) {
|
|
634
|
+
this.lifecycle.setServiceContext(serviceId);
|
|
635
|
+
}
|
|
636
|
+
// Pass a resolver function so factories can resolve additional dependencies
|
|
637
|
+
const resolver = Object.assign((t) => this.resolve(t), { registerInstance: (t, instance) => { this.registerInstance(t, instance); } });
|
|
638
|
+
try {
|
|
639
|
+
const rawInstance = await def.factory(resolvedDeps, resolver);
|
|
640
|
+
const instance = this.wrapIfFunction(rawInstance);
|
|
641
|
+
// Cache under both the lookup token and the def itself
|
|
642
|
+
this.instances.set(token, instance);
|
|
643
|
+
if (def !== token) {
|
|
644
|
+
this.instances.set(def, instance);
|
|
645
|
+
}
|
|
646
|
+
// Store resolved deps for HMR method patching
|
|
647
|
+
this.resolvedDeps.set(token, resolvedDeps);
|
|
648
|
+
// Register token by stable ID for HMR lookup
|
|
649
|
+
this.tokensByStableId.set(serviceId, token);
|
|
650
|
+
return instance;
|
|
651
|
+
}
|
|
652
|
+
finally {
|
|
653
|
+
// Clear service context after factory completes
|
|
654
|
+
if (this.lifecycle) {
|
|
655
|
+
this.lifecycle.setServiceContext(null);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
finally {
|
|
660
|
+
// Pop the resolving stack regardless of success or failure.
|
|
661
|
+
const idx = this.resolving.lastIndexOf(def);
|
|
662
|
+
if (idx !== -1)
|
|
663
|
+
this.resolving.splice(idx, 1);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
catch (e_1) {
|
|
667
|
+
env_1.error = e_1;
|
|
668
|
+
env_1.hasError = true;
|
|
669
|
+
}
|
|
670
|
+
finally {
|
|
671
|
+
__disposeResources(env_1);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
// Is it a ServiceLike (e.g., ProcessDefinition)? Check for deps+factory
|
|
675
|
+
// Note: ProcessDefinition is callable (typeof === 'function') but has deps/factory
|
|
676
|
+
const tokenAny = token;
|
|
677
|
+
if (tokenAny && 'deps' in tokenAny && 'factory' in tokenAny) {
|
|
678
|
+
const serviceLike = token;
|
|
679
|
+
// Resolve dependencies
|
|
680
|
+
const resolvedDeps = {};
|
|
681
|
+
for (const [key, depToken] of Object.entries(serviceLike.deps)) {
|
|
682
|
+
resolvedDeps[key] = await this.resolve(depToken);
|
|
683
|
+
}
|
|
684
|
+
// Call factory (may not use deps for compiled processes)
|
|
685
|
+
const instance = serviceLike.factory(resolvedDeps);
|
|
686
|
+
this.instances.set(token, instance);
|
|
687
|
+
return instance;
|
|
688
|
+
}
|
|
689
|
+
// Is it a class? Try to instantiate it
|
|
690
|
+
if (typeof token === 'function') {
|
|
691
|
+
const instance = new token();
|
|
692
|
+
this.instances.set(token, instance);
|
|
693
|
+
return instance;
|
|
694
|
+
}
|
|
695
|
+
// Better error message for debugging
|
|
696
|
+
const t = token;
|
|
697
|
+
let tokenDesc;
|
|
698
|
+
if (typeof t === 'function') {
|
|
699
|
+
tokenDesc = t.name || 'Anonymous';
|
|
700
|
+
}
|
|
701
|
+
else if (typeof t === 'symbol') {
|
|
702
|
+
tokenDesc = t.description ?? String(t);
|
|
703
|
+
}
|
|
704
|
+
else if (typeof t === 'object' && t !== null && 'deps' in t) {
|
|
705
|
+
const deps = t.deps;
|
|
706
|
+
const depList = Object.entries(deps)
|
|
707
|
+
.map(([k, v]) => `${k}: ${getTokenName(v)}`)
|
|
708
|
+
.join(', ');
|
|
709
|
+
tokenDesc = `ServiceDef { deps: ${depList} }`;
|
|
710
|
+
}
|
|
711
|
+
else {
|
|
712
|
+
tokenDesc = String(t);
|
|
713
|
+
}
|
|
714
|
+
throw new Error(`Unable to resolve service: ${tokenDesc}`);
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Resolve all registered services.
|
|
718
|
+
* Ensures services that provide side effects (hooks, listeners, seeders, etc.)
|
|
719
|
+
* are instantiated even if they aren't dependencies of any controller.
|
|
720
|
+
*/
|
|
721
|
+
async resolveAll() {
|
|
722
|
+
for (const token of this.factories.keys()) {
|
|
723
|
+
await this.resolve(token);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
// ==========================================================================
|
|
727
|
+
// Model Prototype Wiring (model DI injection)
|
|
728
|
+
// ==========================================================================
|
|
729
|
+
/**
|
|
730
|
+
* Wire model prototypes for models with `inject`.
|
|
731
|
+
*
|
|
732
|
+
* For each registered model that has inject deps, resolves those deps
|
|
733
|
+
* from the container and creates a "model service" - an object that sits
|
|
734
|
+
* in the prototype chain between instances and ModelClass.prototype.
|
|
735
|
+
*
|
|
736
|
+
* Prototype chain after wiring:
|
|
737
|
+
* instance (own props: field data)
|
|
738
|
+
* → modelService (inject deps, non-enumerable)
|
|
739
|
+
* → ModelClass.prototype (class methods)
|
|
740
|
+
* → BaseModel.prototype
|
|
741
|
+
*
|
|
742
|
+
* Call this AFTER resolveAll() - all inject deps must be resolved first.
|
|
743
|
+
*/
|
|
744
|
+
async wireModelPrototypes() {
|
|
745
|
+
for (const model of getModelsWithInject()) {
|
|
746
|
+
const injectConfig = model[MODEL_INJECT];
|
|
747
|
+
if (!injectConfig)
|
|
748
|
+
continue;
|
|
749
|
+
// Create the model service: sits between instances and class prototype
|
|
750
|
+
const service = Object.create(model.prototype);
|
|
751
|
+
// Resolve inject deps and attach as non-enumerable properties
|
|
752
|
+
for (const [key, depToken] of Object.entries(injectConfig)) {
|
|
753
|
+
const resolved = await this.resolve(depToken);
|
|
754
|
+
Object.defineProperty(service, key, {
|
|
755
|
+
value: resolved,
|
|
756
|
+
enumerable: false,
|
|
757
|
+
configurable: true,
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
// Store the model service on the model class
|
|
761
|
+
Object.defineProperty(model, MODEL_SERVICE, {
|
|
762
|
+
value: service,
|
|
763
|
+
enumerable: false,
|
|
764
|
+
configurable: true,
|
|
765
|
+
writable: true,
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
// ==========================================================================
|
|
770
|
+
// Hot Reload Support (dev mode only)
|
|
771
|
+
// ==========================================================================
|
|
772
|
+
/**
|
|
773
|
+
* Get a token by its stable service ID.
|
|
774
|
+
* Used by HMR runtime to find the service to reload.
|
|
775
|
+
*/
|
|
776
|
+
getTokenByStableId(serviceId) {
|
|
777
|
+
return this.tokensByStableId.get(serviceId);
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Hot reload a service. Two modes:
|
|
781
|
+
*
|
|
782
|
+
* 1. Method patch: Only method bodies changed
|
|
783
|
+
* - Re-run factory with same deps
|
|
784
|
+
* - Extract changed methods, patch in-place
|
|
785
|
+
* - Instance object stays the same, state preserved
|
|
786
|
+
*
|
|
787
|
+
* 2. Full reload: Structure changed
|
|
788
|
+
* - Run hotReload hook to collect state
|
|
789
|
+
* - Store state in registry for factory wrapper to inject
|
|
790
|
+
* - Create new instance (module will be re-imported)
|
|
791
|
+
*
|
|
792
|
+
* @param serviceId - The stable service ID
|
|
793
|
+
* @param mode - 'method-patch' or 'full-reload'
|
|
794
|
+
* @param changedMethods - List of changed method names (for method-patch mode)
|
|
795
|
+
*/
|
|
796
|
+
async hotReload(serviceId, mode, changedMethods) {
|
|
797
|
+
const token = this.tokensByStableId.get(serviceId);
|
|
798
|
+
if (!token) {
|
|
799
|
+
console.warn(`[HotReload] Service not found: ${serviceId}`);
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
const oldInstance = this.instances.get(token);
|
|
803
|
+
if (!oldInstance) {
|
|
804
|
+
console.log(`[HotReload] Service not instantiated yet: ${serviceId}`);
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
807
|
+
if (mode === 'method-patch' && changedMethods && changedMethods.length > 0) {
|
|
808
|
+
// Method patch: re-run factory with same deps, extract changed methods
|
|
809
|
+
const deps = this.resolvedDeps.get(token);
|
|
810
|
+
const def = this.findServiceDef(token);
|
|
811
|
+
if (!def || !deps) {
|
|
812
|
+
console.warn(`[HotReload] Cannot method-patch ${serviceId}: missing deps or def`);
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
try {
|
|
816
|
+
// Re-run factory with same deps to get new methods
|
|
817
|
+
const resolver = Object.assign((t) => this.resolve(t), { registerInstance: (t, instance) => { this.registerInstance(t, instance); } });
|
|
818
|
+
const newMethods = await def.factory(deps, resolver);
|
|
819
|
+
// Patch only changed methods
|
|
820
|
+
for (const method of changedMethods) {
|
|
821
|
+
if (method in newMethods) {
|
|
822
|
+
oldInstance[method] = newMethods[method];
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
console.log(`[HotReload] ${serviceId} patched: ${changedMethods.join(', ')}`);
|
|
826
|
+
}
|
|
827
|
+
catch (err) {
|
|
828
|
+
console.error(`[HotReload] ${serviceId} patch failed:`, err);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
else {
|
|
832
|
+
// Full reload: collect state, store for factory wrapper to inject
|
|
833
|
+
if (this.lifecycle) {
|
|
834
|
+
const rawState = await this.lifecycle.runHotReload(serviceId);
|
|
835
|
+
if (rawState !== undefined) {
|
|
836
|
+
const state = __wrapHmrStateForSave(serviceId, rawState);
|
|
837
|
+
this.hmrStateRegistry.set(serviceId, state);
|
|
838
|
+
console.log(`[HotReload] ${serviceId} state saved for reload`);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// Clear cached instance - new one will be created when module re-imports
|
|
842
|
+
this.instances.delete(token);
|
|
843
|
+
this.resolvedDeps.delete(token);
|
|
844
|
+
console.log(`[HotReload] ${serviceId} cleared for full reload`);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Get HMR state for a service during factory execution.
|
|
849
|
+
* Called by compiler-generated code: __getHmrState(serviceId)
|
|
850
|
+
*
|
|
851
|
+
* @param serviceId - The stable service ID
|
|
852
|
+
* @returns The saved state, or undefined if none
|
|
853
|
+
*/
|
|
854
|
+
getHmrState(serviceId) {
|
|
855
|
+
const state = this.hmrStateRegistry.get(serviceId);
|
|
856
|
+
// Clear after retrieval - state is consumed
|
|
857
|
+
this.hmrStateRegistry.delete(serviceId);
|
|
858
|
+
return state;
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Check if a service has HMR state waiting to be injected.
|
|
862
|
+
*/
|
|
863
|
+
hasHmrState(serviceId) {
|
|
864
|
+
return this.hmrStateRegistry.has(serviceId);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
// Re-export Logger and observability utilities
|
|
868
|
+
export { Logger, ConsoleLogger, ConsoleLoggerFactory,
|
|
869
|
+
// Context utilities
|
|
870
|
+
getContext, captureContext, runWithContext, withContext,
|
|
871
|
+
// Scope management (for request lifecycle)
|
|
872
|
+
runInScope, runInScopeAsync,
|
|
873
|
+
// Instrumentation registration
|
|
874
|
+
registerInstrumentation, unregisterInstrumentation, getInstrumentations, } from './logger.js';
|
|
875
|
+
//# sourceMappingURL=service.js.map
|