@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,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelRepository - Abstract Repository with Token System
|
|
3
|
+
*
|
|
4
|
+
* Base class for data access that works with the query system.
|
|
5
|
+
* Implementations (Postgres, SQLite, Memory) extend this.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - ModelRepository<T> is the abstract contract for CRUD operations
|
|
9
|
+
* - ModelRepository.of(Model) creates a DI token for injection
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Get a token for dependency injection
|
|
14
|
+
* const userRepoToken = ModelRepository.of(User);
|
|
15
|
+
*
|
|
16
|
+
* // Domain service depends on the token
|
|
17
|
+
* const UserService = defineService({
|
|
18
|
+
* inject: { users: ModelRepository.of(User) },
|
|
19
|
+
* factory: ({ users }) => ({
|
|
20
|
+
* async findByEmail(email: string) {
|
|
21
|
+
* return users.findOne(User.fields.email.eq(email));
|
|
22
|
+
* },
|
|
23
|
+
* }),
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { MODEL_STABLE_ID } from './define-model.js';
|
|
28
|
+
import { Repository, REPO_TOKEN } from './repository.js';
|
|
29
|
+
import { MODEL_REPO_MODEL, MODEL_REPO_CONTRACT } from './symbols.js';
|
|
30
|
+
// Re-export for convenience
|
|
31
|
+
export { MODEL_REPO_MODEL, MODEL_REPO_CONTRACT };
|
|
32
|
+
/**
|
|
33
|
+
* Abstract repository for model data access.
|
|
34
|
+
*
|
|
35
|
+
* Extends the generic Repository from core with model-specific operations
|
|
36
|
+
* like find, get, insert, update, delete, and query support.
|
|
37
|
+
*
|
|
38
|
+
* Implementations can be created for PostgreSQL, SQLite, in-memory, etc.
|
|
39
|
+
*
|
|
40
|
+
* @typeParam T - The entity type this repository manages
|
|
41
|
+
*/
|
|
42
|
+
export class ModelRepository extends Repository {
|
|
43
|
+
/**
|
|
44
|
+
* Check if any entity matches the condition.
|
|
45
|
+
*/
|
|
46
|
+
async exists(where) {
|
|
47
|
+
const count = await this.count(where);
|
|
48
|
+
return count > 0;
|
|
49
|
+
}
|
|
50
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
51
|
+
// Static Token Factory
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* Get a DI token for a model's repository.
|
|
55
|
+
*
|
|
56
|
+
* Tokens are memoized - same model always returns same token object.
|
|
57
|
+
* This enables object identity comparison for DI container lookups.
|
|
58
|
+
*
|
|
59
|
+
* If the model has a repository contract (via .withRepository()), the token
|
|
60
|
+
* type includes those custom methods.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const token = ModelRepository.of(User);
|
|
65
|
+
*
|
|
66
|
+
* // Same model = same token (object identity)
|
|
67
|
+
* ModelRepository.of(User) === ModelRepository.of(User) // true
|
|
68
|
+
*
|
|
69
|
+
* // Different models = different tokens
|
|
70
|
+
* ModelRepository.of(User) === ModelRepository.of(Post) // false
|
|
71
|
+
*
|
|
72
|
+
* // With custom contract
|
|
73
|
+
* const UserWithRepo = User.withRepository<{
|
|
74
|
+
* findByEmail(email: string): Promise<User | null>;
|
|
75
|
+
* }>();
|
|
76
|
+
* const token = ModelRepository.of(UserWithRepo);
|
|
77
|
+
* // token type includes findByEmail method
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
// biome-ignore lint/suspicious/noExplicitAny: Using any to avoid variance issues
|
|
81
|
+
static of(model) {
|
|
82
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic token creation
|
|
83
|
+
return getOrCreateToken(model);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// Token Registry (WeakMap for memoization)
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// biome-ignore lint/suspicious/noExplicitAny: Internal registry uses any
|
|
90
|
+
const tokenRegistry = new WeakMap();
|
|
91
|
+
// Secondary index by stable ID - two classes with the same stable ID (e.g. after HMR)
|
|
92
|
+
// resolve to the same token without any special-casing.
|
|
93
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamic token type
|
|
94
|
+
const tokenRegistryByStableId = new Map();
|
|
95
|
+
function getOrCreateToken(model) {
|
|
96
|
+
const stableId = model[MODEL_STABLE_ID];
|
|
97
|
+
if (stableId) {
|
|
98
|
+
const cached = tokenRegistryByStableId.get(stableId);
|
|
99
|
+
if (cached) {
|
|
100
|
+
// Fresh class ref with same stable ID - update token's model
|
|
101
|
+
// slot so reads see the current class's fields / metadata.
|
|
102
|
+
if (cached[MODEL_REPO_MODEL] !== model) {
|
|
103
|
+
Object.defineProperty(cached, MODEL_REPO_MODEL, {
|
|
104
|
+
value: model,
|
|
105
|
+
enumerable: false,
|
|
106
|
+
writable: true,
|
|
107
|
+
configurable: true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return cached;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
let token = tokenRegistry.get(model);
|
|
114
|
+
if (!token) {
|
|
115
|
+
const description = `ModelRepository<${model.name}>`;
|
|
116
|
+
// biome-ignore lint/suspicious/noExplicitAny: Token creation is dynamic
|
|
117
|
+
token = Object.create(null);
|
|
118
|
+
Object.defineProperties(token, {
|
|
119
|
+
[REPO_TOKEN]: { value: true, enumerable: false },
|
|
120
|
+
[MODEL_REPO_MODEL]: { value: model, enumerable: false, writable: true, configurable: true },
|
|
121
|
+
description: { value: description, enumerable: true },
|
|
122
|
+
toString: { value: () => description, enumerable: false },
|
|
123
|
+
});
|
|
124
|
+
// Intentionally NOT frozen: `MODEL_REPO_MODEL` must stay writable
|
|
125
|
+
// so a fresh class ref with the same stable ID can swap its
|
|
126
|
+
// internal model target without losing token identity.
|
|
127
|
+
tokenRegistry.set(model, token);
|
|
128
|
+
if (stableId)
|
|
129
|
+
tokenRegistryByStableId.set(stableId, token);
|
|
130
|
+
}
|
|
131
|
+
else if (stableId && !tokenRegistryByStableId.has(stableId)) {
|
|
132
|
+
tokenRegistryByStableId.set(stableId, token);
|
|
133
|
+
}
|
|
134
|
+
return token;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if a value is a ModelRepository token.
|
|
138
|
+
*/
|
|
139
|
+
export function isModelRepositoryToken(value) {
|
|
140
|
+
return (typeof value === 'object' &&
|
|
141
|
+
value !== null &&
|
|
142
|
+
REPO_TOKEN in value &&
|
|
143
|
+
value[REPO_TOKEN] === true &&
|
|
144
|
+
MODEL_REPO_MODEL in value);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=model.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.repository.js","sourceRoot":"","sources":["../../src/models/model.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,EAAa,eAAe,EAAuC,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAMrE,4BAA4B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AA8CjD;;;;;;;;;GASG;AACH,MAAM,OAAgB,eAAmB,SAAQ,UAAa;IA2D5D;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAgB;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAwLD,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAE5E;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,iFAAiF;IACjF,MAAM,CAAC,EAAE,CACP,KAAQ;QAER,qEAAqE;QACrE,OAAO,gBAAgB,CAAC,KAAK,CAAQ,CAAC;IACxC,CAAC;CACF;AAED,+EAA+E;AAC/E,2CAA2C;AAC3C,+EAA+E;AAE/E,yEAAyE;AACzE,MAAM,aAAa,GAAG,IAAI,OAAO,EAAuC,CAAC;AAEzE,sFAAsF;AACtF,wDAAwD;AACxD,iEAAiE;AACjE,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAqC,CAAC;AAE7E,SAAS,gBAAgB,CAAI,KAAe;IAC1C,MAAM,QAAQ,GAAI,KAA4C,CAAC,eAAe,CAAuB,CAAC;IAEtG,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC;YACX,6DAA6D;YAC7D,2DAA2D;YAC3D,IAAK,MAA6C,CAAC,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC/E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE;oBAC9C,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAiC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,mBAAmB,KAAK,CAAC,IAAI,GAAG,CAAC;QAErD,wEAAwE;QACxE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA8B,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAC7B,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;YAChD,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;YAC3F,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE;YACrD,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE;SAC1D,CAAC,CAAC;QAEH,kEAAkE;QAClE,4DAA4D;QAC5D,uDAAuD;QAEvD,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,QAAQ;YAAE,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,QAAQ,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,UAAU,IAAI,KAAK;QAClB,KAAa,CAAC,UAAU,CAAC,KAAK,IAAI;QACnC,gBAAgB,IAAI,KAAK,CAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Observable, ObservableInternals } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a standalone observable object with dirty tracking.
|
|
4
|
+
* Can be used independently or passed into models.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createObservable<T extends object>(data: T): Observable<T>;
|
|
7
|
+
/**
|
|
8
|
+
* Get the internals of an observable
|
|
9
|
+
*/
|
|
10
|
+
export declare function getObservableInternals<T extends object>(observable: Observable<T>): ObservableInternals;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a value is an observable
|
|
13
|
+
*/
|
|
14
|
+
export declare function isObservable<T extends object>(value: unknown): value is Observable<T>;
|
|
15
|
+
//# sourceMappingURL=observable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["../../src/models/observable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAoBlE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAkCzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GACxB,mBAAmB,CAErB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAErF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createTrackedProxy } from './proxy.js';
|
|
2
|
+
import { OBSERVABLE_META } from './symbols.js';
|
|
3
|
+
// Deep traverse to ensure all nested objects are proxied
|
|
4
|
+
function deepTraverse(obj, visited = new WeakSet()) {
|
|
5
|
+
if (obj === null || typeof obj !== 'object')
|
|
6
|
+
return;
|
|
7
|
+
if (visited.has(obj))
|
|
8
|
+
return;
|
|
9
|
+
visited.add(obj);
|
|
10
|
+
if (Array.isArray(obj)) {
|
|
11
|
+
for (let i = 0; i < obj.length; i++) {
|
|
12
|
+
deepTraverse(obj[i], visited);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
for (const key of Object.keys(obj)) {
|
|
17
|
+
deepTraverse(obj[key], visited);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a standalone observable object with dirty tracking.
|
|
23
|
+
* Can be used independently or passed into models.
|
|
24
|
+
*/
|
|
25
|
+
export function createObservable(data) {
|
|
26
|
+
const dirty = new Set();
|
|
27
|
+
// Create the root proxy
|
|
28
|
+
const proxy = createTrackedProxy(data, [], dirty);
|
|
29
|
+
// Traverse to ensure all nested objects are proxied upfront
|
|
30
|
+
deepTraverse(proxy);
|
|
31
|
+
const internals = {
|
|
32
|
+
dirty,
|
|
33
|
+
markClean() {
|
|
34
|
+
dirty.clear();
|
|
35
|
+
},
|
|
36
|
+
isDirty() {
|
|
37
|
+
return dirty.size > 0;
|
|
38
|
+
},
|
|
39
|
+
getDirtyPaths() {
|
|
40
|
+
return [...dirty];
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
// Attach internals to the underlying object
|
|
44
|
+
Object.defineProperty(data, OBSERVABLE_META, {
|
|
45
|
+
value: internals,
|
|
46
|
+
enumerable: false,
|
|
47
|
+
writable: false,
|
|
48
|
+
configurable: false,
|
|
49
|
+
});
|
|
50
|
+
return proxy;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the internals of an observable
|
|
54
|
+
*/
|
|
55
|
+
export function getObservableInternals(observable) {
|
|
56
|
+
return observable[OBSERVABLE_META];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a value is an observable
|
|
60
|
+
*/
|
|
61
|
+
export function isObservable(value) {
|
|
62
|
+
return value !== null && typeof value === 'object' && OBSERVABLE_META in value;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=observable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable.js","sourceRoot":"","sources":["../../src/models/observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,yDAAyD;AACzD,SAAS,YAAY,CAAC,GAAY,EAAE,UAAU,IAAI,OAAO,EAAU;IACjE,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAE7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,YAAY,CAAE,GAA+B,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAmB,IAAO;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,wBAAwB;IACxB,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAM,CAAC;IAEvD,4DAA4D;IAC5D,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAwB;QACrC,KAAK;QAEL,SAAS;YACP,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,OAAO;YACL,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,aAAa;YACX,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;IAEF,4CAA4C;IAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE;QAC3C,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,OAAO,KAAsB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAyB;IAEzB,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAmB,KAAc;IAC3D,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAI,KAAK,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProxyMeta } from './types.js';
|
|
2
|
+
export declare function createTrackedProxy(target: object, path: string[], dirtySet: Set<string>, parent?: ProxyMeta, keyInParent?: string): object;
|
|
3
|
+
export declare function getProxyMeta(proxy: object): ProxyMeta | undefined;
|
|
4
|
+
export declare function isTrackedProxy(obj: unknown): boolean;
|
|
5
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/models/proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoQ5C,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,MAAM,CAAC,EAAE,SAAS,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CA6MR;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjE;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { MODEL_INTERNALS, OBSERVABLE_META } from './symbols.js';
|
|
2
|
+
import { notifyWatchers } from './watch.js';
|
|
3
|
+
// Built-in objects with internal slots that break when methods are called with proxy as `this`
|
|
4
|
+
// These require binding to the original target, not the proxy
|
|
5
|
+
const BUILTIN_WITH_INTERNAL_SLOTS = new Set([
|
|
6
|
+
Map,
|
|
7
|
+
Set,
|
|
8
|
+
WeakMap,
|
|
9
|
+
WeakSet,
|
|
10
|
+
Date,
|
|
11
|
+
ArrayBuffer,
|
|
12
|
+
SharedArrayBuffer,
|
|
13
|
+
DataView,
|
|
14
|
+
Int8Array,
|
|
15
|
+
Uint8Array,
|
|
16
|
+
Uint8ClampedArray,
|
|
17
|
+
Int16Array,
|
|
18
|
+
Uint16Array,
|
|
19
|
+
Int32Array,
|
|
20
|
+
Uint32Array,
|
|
21
|
+
Float32Array,
|
|
22
|
+
Float64Array,
|
|
23
|
+
BigInt64Array,
|
|
24
|
+
BigUint64Array,
|
|
25
|
+
RegExp,
|
|
26
|
+
Promise,
|
|
27
|
+
]);
|
|
28
|
+
function hasInternalSlots(obj) {
|
|
29
|
+
for (const BuiltIn of BUILTIN_WITH_INTERNAL_SLOTS) {
|
|
30
|
+
if (obj instanceof BuiltIn)
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// Methods that mutate built-in objects - we need to track these
|
|
36
|
+
const MAP_MUTATORS = new Set(['set', 'delete', 'clear']);
|
|
37
|
+
const WEAKMAP_MUTATORS = new Set(['set', 'delete']);
|
|
38
|
+
const SET_MUTATORS = new Set(['add', 'delete', 'clear']);
|
|
39
|
+
const WEAKSET_MUTATORS = new Set(['add', 'delete']);
|
|
40
|
+
const DATE_MUTATORS = new Set([
|
|
41
|
+
'setDate',
|
|
42
|
+
'setFullYear',
|
|
43
|
+
'setHours',
|
|
44
|
+
'setMilliseconds',
|
|
45
|
+
'setMinutes',
|
|
46
|
+
'setMonth',
|
|
47
|
+
'setSeconds',
|
|
48
|
+
'setTime',
|
|
49
|
+
'setUTCDate',
|
|
50
|
+
'setUTCFullYear',
|
|
51
|
+
'setUTCHours',
|
|
52
|
+
'setUTCMilliseconds',
|
|
53
|
+
'setUTCMinutes',
|
|
54
|
+
'setUTCMonth',
|
|
55
|
+
'setUTCSeconds',
|
|
56
|
+
'setYear',
|
|
57
|
+
]);
|
|
58
|
+
const TYPED_ARRAY_MUTATORS = new Set(['fill', 'set', 'copyWithin', 'sort', 'reverse']);
|
|
59
|
+
const DATAVIEW_MUTATORS = new Set([
|
|
60
|
+
'setInt8',
|
|
61
|
+
'setUint8',
|
|
62
|
+
'setInt16',
|
|
63
|
+
'setUint16',
|
|
64
|
+
'setInt32',
|
|
65
|
+
'setUint32',
|
|
66
|
+
'setFloat32',
|
|
67
|
+
'setFloat64',
|
|
68
|
+
'setBigInt64',
|
|
69
|
+
'setBigUint64',
|
|
70
|
+
]);
|
|
71
|
+
function isTypedArray(obj) {
|
|
72
|
+
return (obj instanceof Int8Array ||
|
|
73
|
+
obj instanceof Uint8Array ||
|
|
74
|
+
obj instanceof Uint8ClampedArray ||
|
|
75
|
+
obj instanceof Int16Array ||
|
|
76
|
+
obj instanceof Uint16Array ||
|
|
77
|
+
obj instanceof Int32Array ||
|
|
78
|
+
obj instanceof Uint32Array ||
|
|
79
|
+
obj instanceof Float32Array ||
|
|
80
|
+
obj instanceof Float64Array ||
|
|
81
|
+
obj instanceof BigInt64Array ||
|
|
82
|
+
obj instanceof BigUint64Array);
|
|
83
|
+
}
|
|
84
|
+
function isMutatingMethod(obj, prop) {
|
|
85
|
+
if (typeof prop !== 'string')
|
|
86
|
+
return false;
|
|
87
|
+
if (obj instanceof Map)
|
|
88
|
+
return MAP_MUTATORS.has(prop);
|
|
89
|
+
if (obj instanceof WeakMap)
|
|
90
|
+
return WEAKMAP_MUTATORS.has(prop);
|
|
91
|
+
if (obj instanceof Set)
|
|
92
|
+
return SET_MUTATORS.has(prop);
|
|
93
|
+
if (obj instanceof WeakSet)
|
|
94
|
+
return WEAKSET_MUTATORS.has(prop);
|
|
95
|
+
if (obj instanceof Date)
|
|
96
|
+
return DATE_MUTATORS.has(prop);
|
|
97
|
+
if (obj instanceof DataView)
|
|
98
|
+
return DATAVIEW_MUTATORS.has(prop);
|
|
99
|
+
if (isTypedArray(obj))
|
|
100
|
+
return TYPED_ARRAY_MUTATORS.has(prop);
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// Symbol for proxy metadata
|
|
104
|
+
const PROXY_META = Symbol('proxy_meta');
|
|
105
|
+
// Node.js inspection symbol
|
|
106
|
+
const NODE_INSPECT = Symbol.for('nodejs.util.inspect.custom');
|
|
107
|
+
// Well-known symbols that should pass through directly to target
|
|
108
|
+
// These are used for introspection, iteration, type coercion, etc.
|
|
109
|
+
const PASSTHROUGH_SYMBOLS = new Set([
|
|
110
|
+
Symbol.toStringTag,
|
|
111
|
+
Symbol.iterator,
|
|
112
|
+
Symbol.asyncIterator,
|
|
113
|
+
Symbol.toPrimitive,
|
|
114
|
+
Symbol.hasInstance,
|
|
115
|
+
Symbol.isConcatSpreadable,
|
|
116
|
+
Symbol.species,
|
|
117
|
+
Symbol.unscopables,
|
|
118
|
+
Symbol.match,
|
|
119
|
+
Symbol.matchAll,
|
|
120
|
+
Symbol.replace,
|
|
121
|
+
Symbol.search,
|
|
122
|
+
Symbol.split,
|
|
123
|
+
Symbol.dispose,
|
|
124
|
+
Symbol.asyncDispose,
|
|
125
|
+
NODE_INSPECT,
|
|
126
|
+
]);
|
|
127
|
+
// WeakMap to track original object -> proxy mapping (handles circular refs)
|
|
128
|
+
const proxyCache = new WeakMap();
|
|
129
|
+
const metaCache = new WeakMap();
|
|
130
|
+
// Map root proxies to their dirty sets
|
|
131
|
+
const rootDirtySetMap = new WeakMap();
|
|
132
|
+
// Mark a container (like Map/Set/Date) and its parent paths as dirty
|
|
133
|
+
// Unlike markDirtyWithParents, this doesn't add a sub-key
|
|
134
|
+
function markContainerDirty(meta) {
|
|
135
|
+
const pathsWithDirtySets = collectPathsWithDirtySets(meta);
|
|
136
|
+
const modifiedDirtySets = new Set();
|
|
137
|
+
for (const { path, dirtySet } of pathsWithDirtySets) {
|
|
138
|
+
// Add the full path to this container
|
|
139
|
+
if (path.length > 0) {
|
|
140
|
+
dirtySet.add(path.join('.'));
|
|
141
|
+
modifiedDirtySets.add(dirtySet);
|
|
142
|
+
}
|
|
143
|
+
// Add parent paths
|
|
144
|
+
for (let i = path.length - 1; i > 0; i--) {
|
|
145
|
+
dirtySet.add(path.slice(0, i).join('.'));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const dirtySet of modifiedDirtySets) {
|
|
149
|
+
notifyWatchers(dirtySet);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function markDirtyWithParents(meta, key) {
|
|
153
|
+
// Collect all paths paired with their root's dirty set
|
|
154
|
+
const pathsWithDirtySets = collectPathsWithDirtySets(meta);
|
|
155
|
+
// Track which dirty sets were modified for notification
|
|
156
|
+
const modifiedDirtySets = new Set();
|
|
157
|
+
// Mark dirty only in the correct dirty set for each path
|
|
158
|
+
for (const { path: basePath, dirtySet } of pathsWithDirtySets) {
|
|
159
|
+
const fullPath = [...basePath, String(key)].join('.');
|
|
160
|
+
dirtySet.add(fullPath);
|
|
161
|
+
modifiedDirtySets.add(dirtySet);
|
|
162
|
+
// Also mark parent paths dirty
|
|
163
|
+
for (let i = basePath.length; i > 0; i--) {
|
|
164
|
+
dirtySet.add(basePath.slice(0, i).join('.'));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Notify watchers for each modified dirty set
|
|
168
|
+
for (const dirtySet of modifiedDirtySets) {
|
|
169
|
+
notifyWatchers(dirtySet);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function collectPathsWithDirtySets(meta) {
|
|
173
|
+
const results = [];
|
|
174
|
+
// Use path string to dedupe (same path + same dirtySet = skip)
|
|
175
|
+
const seenPathDirtySet = new Map();
|
|
176
|
+
function traverse(current, pathSuffix, pathStack) {
|
|
177
|
+
// If this proxy was originally a root (observable/model), include its dirty set
|
|
178
|
+
const ownDirtySet = rootDirtySetMap.get(current);
|
|
179
|
+
if (ownDirtySet) {
|
|
180
|
+
const pathStr = pathSuffix.join('.');
|
|
181
|
+
let seenPaths = seenPathDirtySet.get(ownDirtySet);
|
|
182
|
+
if (!seenPaths) {
|
|
183
|
+
seenPaths = new Set();
|
|
184
|
+
seenPathDirtySet.set(ownDirtySet, seenPaths);
|
|
185
|
+
}
|
|
186
|
+
if (!seenPaths.has(pathStr)) {
|
|
187
|
+
results.push({ path: pathSuffix, dirtySet: ownDirtySet });
|
|
188
|
+
seenPaths.add(pathStr);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// If no parents, we're done with this branch
|
|
192
|
+
if (current.parents.size === 0) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Continue traversing up to other roots via ALL parent paths
|
|
196
|
+
for (const parentRef of current.parents) {
|
|
197
|
+
const parent = parentRef.ref.deref();
|
|
198
|
+
if (!parent)
|
|
199
|
+
continue;
|
|
200
|
+
// Only skip if we'd create a cycle in THIS path
|
|
201
|
+
if (pathStack.includes(parent))
|
|
202
|
+
continue;
|
|
203
|
+
traverse(parent, [parentRef.key, ...pathSuffix], [...pathStack, parent]);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
traverse(meta, [], [meta]);
|
|
207
|
+
// If no paths found (truly orphan proxy), use all dirty sets on this meta
|
|
208
|
+
if (results.length === 0) {
|
|
209
|
+
for (const dirtySet of meta.dirtySets) {
|
|
210
|
+
results.push({ path: [], dirtySet });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return results;
|
|
214
|
+
}
|
|
215
|
+
function addParentRef(meta, parent, key) {
|
|
216
|
+
// Check if this exact parent+key combo already exists
|
|
217
|
+
for (const existing of meta.parents) {
|
|
218
|
+
if (existing.ref.deref() === parent && existing.key === key) {
|
|
219
|
+
return; // Already registered
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
meta.parents.add({ ref: new WeakRef(parent), key });
|
|
223
|
+
}
|
|
224
|
+
// Propagate dirty sets down the tree (for cross-model sharing)
|
|
225
|
+
function propagateDirtySets(meta, dirtySet) {
|
|
226
|
+
if (meta.dirtySets.has(dirtySet))
|
|
227
|
+
return;
|
|
228
|
+
meta.dirtySets.add(dirtySet);
|
|
229
|
+
// Propagate to all children
|
|
230
|
+
for (const childMeta of meta.children.values()) {
|
|
231
|
+
propagateDirtySets(childMeta, dirtySet);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
export function createTrackedProxy(target, path, dirtySet, parent, keyInParent) {
|
|
235
|
+
// Check cache first (handles circular refs and cross-model sharing)
|
|
236
|
+
const cached = proxyCache.get(target);
|
|
237
|
+
if (cached) {
|
|
238
|
+
const cachedMeta = metaCache.get(cached);
|
|
239
|
+
if (cachedMeta) {
|
|
240
|
+
// Add the new dirty set (for cross-model sharing)
|
|
241
|
+
propagateDirtySets(cachedMeta, dirtySet);
|
|
242
|
+
if (parent && keyInParent) {
|
|
243
|
+
addParentRef(cachedMeta, parent, keyInParent);
|
|
244
|
+
parent.children.set(keyInParent, cachedMeta);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return cached;
|
|
248
|
+
}
|
|
249
|
+
const meta = {
|
|
250
|
+
path,
|
|
251
|
+
dirtySets: new Set([dirtySet]),
|
|
252
|
+
parents: new Set(parent && keyInParent ? [{ ref: new WeakRef(parent), key: keyInParent }] : []),
|
|
253
|
+
children: new Map(),
|
|
254
|
+
target,
|
|
255
|
+
proxy: null, // Will be set below
|
|
256
|
+
};
|
|
257
|
+
// If this is a root (no parent), register its dirty set
|
|
258
|
+
if (!parent) {
|
|
259
|
+
rootDirtySetMap.set(meta, dirtySet);
|
|
260
|
+
}
|
|
261
|
+
const proxy = new Proxy(target, {
|
|
262
|
+
get(obj, prop, receiver) {
|
|
263
|
+
// Handle our internal symbols - return directly from target
|
|
264
|
+
if (prop === MODEL_INTERNALS ||
|
|
265
|
+
prop === OBSERVABLE_META ||
|
|
266
|
+
prop === PROXY_META) {
|
|
267
|
+
return Reflect.get(obj, prop);
|
|
268
|
+
}
|
|
269
|
+
// Pass through well-known symbols for native behavior
|
|
270
|
+
// (iteration, inspection, type coercion, etc.)
|
|
271
|
+
if (typeof prop === 'symbol' && PASSTHROUGH_SYMBOLS.has(prop)) {
|
|
272
|
+
const value = Reflect.get(obj, prop, obj);
|
|
273
|
+
// Don't bind dispose functions - they may be non-configurable and
|
|
274
|
+
// the proxy must return the exact value to satisfy proxy invariants
|
|
275
|
+
if (prop === Symbol.dispose || prop === Symbol.asyncDispose) {
|
|
276
|
+
return value;
|
|
277
|
+
}
|
|
278
|
+
// Bind other functions to target for proper behavior
|
|
279
|
+
if (typeof value === 'function') {
|
|
280
|
+
return value.bind(obj);
|
|
281
|
+
}
|
|
282
|
+
return value;
|
|
283
|
+
}
|
|
284
|
+
// Built-ins with internal slots need to bypass proxy for all property access
|
|
285
|
+
// (both methods and getters like .size check internal slots)
|
|
286
|
+
if (hasInternalSlots(obj)) {
|
|
287
|
+
const value = Reflect.get(obj, prop, obj); // Use obj as receiver, not proxy
|
|
288
|
+
if (typeof value === 'function') {
|
|
289
|
+
// Wrap mutating methods to track dirty
|
|
290
|
+
if (isMutatingMethod(obj, prop)) {
|
|
291
|
+
return function (...args) {
|
|
292
|
+
const result = value.apply(obj, args);
|
|
293
|
+
// Mark this built-in container and its parents as dirty
|
|
294
|
+
markContainerDirty(meta);
|
|
295
|
+
return result;
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
return value.bind(obj);
|
|
299
|
+
}
|
|
300
|
+
return value;
|
|
301
|
+
}
|
|
302
|
+
const value = Reflect.get(obj, prop, receiver);
|
|
303
|
+
// Bind functions to the proxy so `this.foo = x` triggers dirty tracking
|
|
304
|
+
if (typeof value === 'function') {
|
|
305
|
+
return value.bind(proxy);
|
|
306
|
+
}
|
|
307
|
+
// Return cached child proxy if exists
|
|
308
|
+
if (meta.children.has(prop)) {
|
|
309
|
+
const childMeta = meta.children.get(prop);
|
|
310
|
+
return childMeta.proxy;
|
|
311
|
+
}
|
|
312
|
+
// Wrap objects/arrays in proxies
|
|
313
|
+
if (value !== null && typeof value === 'object') {
|
|
314
|
+
// Check if value is already a proxy (from another model/observable)
|
|
315
|
+
const existingMeta = metaCache.get(value);
|
|
316
|
+
if (existingMeta) {
|
|
317
|
+
// Connect existing proxy to this tree
|
|
318
|
+
addParentRef(existingMeta, meta, String(prop));
|
|
319
|
+
meta.children.set(prop, existingMeta);
|
|
320
|
+
// Propagate our dirty sets to the existing proxy
|
|
321
|
+
for (const ds of meta.dirtySets) {
|
|
322
|
+
propagateDirtySets(existingMeta, ds);
|
|
323
|
+
}
|
|
324
|
+
return existingMeta.proxy;
|
|
325
|
+
}
|
|
326
|
+
const childProxy = createTrackedProxy(value, [...path, String(prop)], dirtySet, meta, String(prop));
|
|
327
|
+
const childMeta = metaCache.get(childProxy);
|
|
328
|
+
if (childMeta) {
|
|
329
|
+
meta.children.set(prop, childMeta);
|
|
330
|
+
}
|
|
331
|
+
return childProxy;
|
|
332
|
+
}
|
|
333
|
+
return value;
|
|
334
|
+
},
|
|
335
|
+
set(obj, prop, value, _receiver) {
|
|
336
|
+
const oldValue = Reflect.get(obj, prop, obj);
|
|
337
|
+
// Check if setting the same proxy reference back (no change)
|
|
338
|
+
const existingChild = meta.children.get(prop);
|
|
339
|
+
if (existingChild && existingChild.proxy === value) {
|
|
340
|
+
return true; // Same proxy, no change needed
|
|
341
|
+
}
|
|
342
|
+
// Clear old child tracking (for any value change, not just objects)
|
|
343
|
+
meta.children.delete(prop);
|
|
344
|
+
const result = Reflect.set(obj, prop, value, obj);
|
|
345
|
+
// Track dirty if value changed (including setting to undefined)
|
|
346
|
+
if (oldValue !== value) {
|
|
347
|
+
markDirtyWithParents(meta, prop);
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
350
|
+
},
|
|
351
|
+
deleteProperty(obj, prop) {
|
|
352
|
+
// Mark dirty BEFORE deleting so we can still traverse
|
|
353
|
+
markDirtyWithParents(meta, prop);
|
|
354
|
+
// Clean up child tracking
|
|
355
|
+
meta.children.delete(prop);
|
|
356
|
+
return Reflect.deleteProperty(obj, prop);
|
|
357
|
+
},
|
|
358
|
+
// Transparency traps - make proxy behave like native object
|
|
359
|
+
has(obj, prop) {
|
|
360
|
+
return Reflect.has(obj, prop);
|
|
361
|
+
},
|
|
362
|
+
ownKeys(obj) {
|
|
363
|
+
return Reflect.ownKeys(obj);
|
|
364
|
+
},
|
|
365
|
+
getOwnPropertyDescriptor(obj, prop) {
|
|
366
|
+
return Reflect.getOwnPropertyDescriptor(obj, prop);
|
|
367
|
+
},
|
|
368
|
+
getPrototypeOf(obj) {
|
|
369
|
+
return Reflect.getPrototypeOf(obj);
|
|
370
|
+
},
|
|
371
|
+
isExtensible(obj) {
|
|
372
|
+
return Reflect.isExtensible(obj);
|
|
373
|
+
},
|
|
374
|
+
preventExtensions(obj) {
|
|
375
|
+
return Reflect.preventExtensions(obj);
|
|
376
|
+
},
|
|
377
|
+
defineProperty(obj, prop, descriptor) {
|
|
378
|
+
const result = Reflect.defineProperty(obj, prop, descriptor);
|
|
379
|
+
// Don't mark internal symbols as dirty
|
|
380
|
+
if (result &&
|
|
381
|
+
'value' in descriptor &&
|
|
382
|
+
prop !== MODEL_INTERNALS &&
|
|
383
|
+
prop !== OBSERVABLE_META &&
|
|
384
|
+
prop !== Symbol.dispose &&
|
|
385
|
+
prop !== Symbol.asyncDispose) {
|
|
386
|
+
markDirtyWithParents(meta, prop);
|
|
387
|
+
}
|
|
388
|
+
return result;
|
|
389
|
+
},
|
|
390
|
+
setPrototypeOf(obj, proto) {
|
|
391
|
+
return Reflect.setPrototypeOf(obj, proto);
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
meta.proxy = proxy;
|
|
395
|
+
proxyCache.set(target, proxy);
|
|
396
|
+
metaCache.set(proxy, meta);
|
|
397
|
+
return proxy;
|
|
398
|
+
}
|
|
399
|
+
// Get proxy metadata (for debugging/testing)
|
|
400
|
+
export function getProxyMeta(proxy) {
|
|
401
|
+
return metaCache.get(proxy);
|
|
402
|
+
}
|
|
403
|
+
// Check if an object is already a tracked proxy
|
|
404
|
+
export function isTrackedProxy(obj) {
|
|
405
|
+
return obj !== null && typeof obj === 'object' && metaCache.has(obj);
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=proxy.js.map
|