@craft-ts/core 0.7.0-beta.13
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/package.json +58 -0
- package/src/index.d.ts +148 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +150 -0
- package/src/index.js.map +1 -0
- package/src/lib/after-recomputation.d.ts +327 -0
- package/src/lib/after-recomputation.d.ts.map +1 -0
- package/src/lib/after-recomputation.js +25 -0
- package/src/lib/after-recomputation.js.map +1 -0
- package/src/lib/app-checked-di.d.ts +82 -0
- package/src/lib/app-checked-di.d.ts.map +1 -0
- package/src/lib/app-checked-di.js +1 -0
- package/src/lib/app-checked-di.js.map +1 -0
- package/src/lib/async-process.d.ts +411 -0
- package/src/lib/async-process.d.ts.map +1 -0
- package/src/lib/async-process.js +702 -0
- package/src/lib/async-process.js.map +1 -0
- package/src/lib/branded-component/branded-component.d.ts +129 -0
- package/src/lib/branded-component/branded-component.d.ts.map +1 -0
- package/src/lib/branded-component/branded-component.js +7 -0
- package/src/lib/branded-component/branded-component.js.map +1 -0
- package/src/lib/browser-boundaries.d.ts +165 -0
- package/src/lib/browser-boundaries.d.ts.map +1 -0
- package/src/lib/browser-boundaries.js +550 -0
- package/src/lib/browser-boundaries.js.map +1 -0
- package/src/lib/client-di-requirement.d.ts +28 -0
- package/src/lib/client-di-requirement.d.ts.map +1 -0
- package/src/lib/client-di-requirement.js +11 -0
- package/src/lib/client-di-requirement.js.map +1 -0
- package/src/lib/client-function-middleware.d.ts +130 -0
- package/src/lib/client-function-middleware.d.ts.map +1 -0
- package/src/lib/client-function-middleware.js +144 -0
- package/src/lib/client-function-middleware.js.map +1 -0
- package/src/lib/component-monitoring.d.ts +7 -0
- package/src/lib/component-monitoring.d.ts.map +1 -0
- package/src/lib/component-monitoring.js +28 -0
- package/src/lib/component-monitoring.js.map +1 -0
- package/src/lib/component-register.d.ts +12 -0
- package/src/lib/component-register.d.ts.map +1 -0
- package/src/lib/component-register.js +13 -0
- package/src/lib/component-register.js.map +1 -0
- package/src/lib/computed-source.d.ts +303 -0
- package/src/lib/computed-source.d.ts.map +1 -0
- package/src/lib/computed-source.js +319 -0
- package/src/lib/computed-source.js.map +1 -0
- package/src/lib/correlation-id-plugin.d.ts +3 -0
- package/src/lib/correlation-id-plugin.d.ts.map +1 -0
- package/src/lib/correlation-id-plugin.js +73 -0
- package/src/lib/correlation-id-plugin.js.map +1 -0
- package/src/lib/correlation-id.d.ts +30 -0
- package/src/lib/correlation-id.d.ts.map +1 -0
- package/src/lib/correlation-id.js +86 -0
- package/src/lib/correlation-id.js.map +1 -0
- package/src/lib/craft-a11y.d.ts +22 -0
- package/src/lib/craft-a11y.d.ts.map +1 -0
- package/src/lib/craft-a11y.js +32 -0
- package/src/lib/craft-a11y.js.map +1 -0
- package/src/lib/craft-activated-route.d.ts +21 -0
- package/src/lib/craft-activated-route.d.ts.map +1 -0
- package/src/lib/craft-activated-route.js +20 -0
- package/src/lib/craft-activated-route.js.map +1 -0
- package/src/lib/craft-app-config.d.ts +91 -0
- package/src/lib/craft-app-config.d.ts.map +1 -0
- package/src/lib/craft-app-config.js +64 -0
- package/src/lib/craft-app-config.js.map +1 -0
- package/src/lib/craft-codec.d.ts +16 -0
- package/src/lib/craft-codec.d.ts.map +1 -0
- package/src/lib/craft-codec.js +1 -0
- package/src/lib/craft-codec.js.map +1 -0
- package/src/lib/craft-computed.d.ts +31 -0
- package/src/lib/craft-computed.d.ts.map +1 -0
- package/src/lib/craft-computed.js +81 -0
- package/src/lib/craft-computed.js.map +1 -0
- package/src/lib/craft-control-flow.d.ts +14 -0
- package/src/lib/craft-control-flow.d.ts.map +1 -0
- package/src/lib/craft-control-flow.js +18 -0
- package/src/lib/craft-control-flow.js.map +1 -0
- package/src/lib/craft-effect.d.ts +13 -0
- package/src/lib/craft-effect.d.ts.map +1 -0
- package/src/lib/craft-effect.js +93 -0
- package/src/lib/craft-effect.js.map +1 -0
- package/src/lib/craft-exception.d.ts +40 -0
- package/src/lib/craft-exception.d.ts.map +1 -0
- package/src/lib/craft-exception.js +16 -0
- package/src/lib/craft-exception.js.map +1 -0
- package/src/lib/craft-gen.d.ts +123 -0
- package/src/lib/craft-gen.d.ts.map +1 -0
- package/src/lib/craft-gen.js +90 -0
- package/src/lib/craft-gen.js.map +1 -0
- package/src/lib/craft-generator-runtime.d.ts +110 -0
- package/src/lib/craft-generator-runtime.d.ts.map +1 -0
- package/src/lib/craft-generator-runtime.js +191 -0
- package/src/lib/craft-generator-runtime.js.map +1 -0
- package/src/lib/craft-guard-runtime.d.ts +70 -0
- package/src/lib/craft-guard-runtime.d.ts.map +1 -0
- package/src/lib/craft-guard-runtime.js +195 -0
- package/src/lib/craft-guard-runtime.js.map +1 -0
- package/src/lib/craft-handshake.d.ts +35 -0
- package/src/lib/craft-handshake.d.ts.map +1 -0
- package/src/lib/craft-handshake.js +34 -0
- package/src/lib/craft-handshake.js.map +1 -0
- package/src/lib/craft-http-client.d.ts +236 -0
- package/src/lib/craft-http-client.d.ts.map +1 -0
- package/src/lib/craft-http-client.js +437 -0
- package/src/lib/craft-http-client.js.map +1 -0
- package/src/lib/craft-http-trace.d.ts +12 -0
- package/src/lib/craft-http-trace.d.ts.map +1 -0
- package/src/lib/craft-http-trace.js +28 -0
- package/src/lib/craft-http-trace.js.map +1 -0
- package/src/lib/craft-lazy.d.ts +42 -0
- package/src/lib/craft-lazy.d.ts.map +1 -0
- package/src/lib/craft-lazy.js +83 -0
- package/src/lib/craft-lazy.js.map +1 -0
- package/src/lib/craft-load-retry.d.ts +76 -0
- package/src/lib/craft-load-retry.d.ts.map +1 -0
- package/src/lib/craft-load-retry.js +160 -0
- package/src/lib/craft-load-retry.js.map +1 -0
- package/src/lib/craft-machine-history.d.ts +145 -0
- package/src/lib/craft-machine-history.d.ts.map +1 -0
- package/src/lib/craft-machine-history.js +276 -0
- package/src/lib/craft-machine-history.js.map +1 -0
- package/src/lib/craft-match.d.ts +49 -0
- package/src/lib/craft-match.d.ts.map +1 -0
- package/src/lib/craft-match.js +58 -0
- package/src/lib/craft-match.js.map +1 -0
- package/src/lib/craft-method.d.ts +28 -0
- package/src/lib/craft-method.d.ts.map +1 -0
- package/src/lib/craft-method.js +45 -0
- package/src/lib/craft-method.js.map +1 -0
- package/src/lib/craft-node-directive.d.ts +32 -0
- package/src/lib/craft-node-directive.d.ts.map +1 -0
- package/src/lib/craft-node-directive.js +22 -0
- package/src/lib/craft-node-directive.js.map +1 -0
- package/src/lib/craft-pending.d.ts +115 -0
- package/src/lib/craft-pending.d.ts.map +1 -0
- package/src/lib/craft-pending.js +187 -0
- package/src/lib/craft-pending.js.map +1 -0
- package/src/lib/craft-pipe.d.ts +63 -0
- package/src/lib/craft-pipe.d.ts.map +1 -0
- package/src/lib/craft-pipe.js +57 -0
- package/src/lib/craft-pipe.js.map +1 -0
- package/src/lib/craft-platform.d.ts +50 -0
- package/src/lib/craft-platform.d.ts.map +1 -0
- package/src/lib/craft-platform.js +175 -0
- package/src/lib/craft-platform.js.map +1 -0
- package/src/lib/craft-primitive-gen.d.ts +137 -0
- package/src/lib/craft-primitive-gen.d.ts.map +1 -0
- package/src/lib/craft-primitive-gen.js +76 -0
- package/src/lib/craft-primitive-gen.js.map +1 -0
- package/src/lib/craft-primitive-registry.d.ts +113 -0
- package/src/lib/craft-primitive-registry.d.ts.map +1 -0
- package/src/lib/craft-primitive-registry.js +159 -0
- package/src/lib/craft-primitive-registry.js.map +1 -0
- package/src/lib/craft-program-operators.d.ts +101 -0
- package/src/lib/craft-program-operators.d.ts.map +1 -0
- package/src/lib/craft-program-operators.js +116 -0
- package/src/lib/craft-program-operators.js.map +1 -0
- package/src/lib/craft-program-runtime.d.ts +80 -0
- package/src/lib/craft-program-runtime.d.ts.map +1 -0
- package/src/lib/craft-program-runtime.js +166 -0
- package/src/lib/craft-program-runtime.js.map +1 -0
- package/src/lib/craft-register-for-runtime.d.ts +39 -0
- package/src/lib/craft-register-for-runtime.d.ts.map +1 -0
- package/src/lib/craft-register-for-runtime.js +96 -0
- package/src/lib/craft-register-for-runtime.js.map +1 -0
- package/src/lib/craft-register-for.d.ts +57 -0
- package/src/lib/craft-register-for.d.ts.map +1 -0
- package/src/lib/craft-register-for.js +200 -0
- package/src/lib/craft-register-for.js.map +1 -0
- package/src/lib/craft-render-identity.d.ts +19 -0
- package/src/lib/craft-render-identity.d.ts.map +1 -0
- package/src/lib/craft-render-identity.js +23 -0
- package/src/lib/craft-render-identity.js.map +1 -0
- package/src/lib/craft-replay.d.ts +5 -0
- package/src/lib/craft-replay.d.ts.map +1 -0
- package/src/lib/craft-replay.js +28 -0
- package/src/lib/craft-replay.js.map +1 -0
- package/src/lib/craft-resolve.d.ts +39 -0
- package/src/lib/craft-resolve.d.ts.map +1 -0
- package/src/lib/craft-resolve.js +9 -0
- package/src/lib/craft-resolve.js.map +1 -0
- package/src/lib/craft-resource.d.ts +11 -0
- package/src/lib/craft-resource.d.ts.map +1 -0
- package/src/lib/craft-resource.js +264 -0
- package/src/lib/craft-resource.js.map +1 -0
- package/src/lib/craft-route-exceptions.d.ts +785 -0
- package/src/lib/craft-route-exceptions.d.ts.map +1 -0
- package/src/lib/craft-route-exceptions.js +86 -0
- package/src/lib/craft-route-exceptions.js.map +1 -0
- package/src/lib/craft-route-load-error.d.ts +1145 -0
- package/src/lib/craft-route-load-error.d.ts.map +1 -0
- package/src/lib/craft-route-load-error.js +173 -0
- package/src/lib/craft-route-load-error.js.map +1 -0
- package/src/lib/craft-route-meta.d.ts +52 -0
- package/src/lib/craft-route-meta.d.ts.map +1 -0
- package/src/lib/craft-route-meta.js +16 -0
- package/src/lib/craft-route-meta.js.map +1 -0
- package/src/lib/craft-route-target.d.ts +27 -0
- package/src/lib/craft-route-target.d.ts.map +1 -0
- package/src/lib/craft-route-target.js +22 -0
- package/src/lib/craft-route-target.js.map +1 -0
- package/src/lib/craft-router-outlet.d.ts +105 -0
- package/src/lib/craft-router-outlet.d.ts.map +1 -0
- package/src/lib/craft-router-outlet.js +735 -0
- package/src/lib/craft-router-outlet.js.map +1 -0
- package/src/lib/craft-router-tokens.d.ts +49 -0
- package/src/lib/craft-router-tokens.d.ts.map +1 -0
- package/src/lib/craft-router-tokens.js +15 -0
- package/src/lib/craft-router-tokens.js.map +1 -0
- package/src/lib/craft-router-trace.d.ts +18 -0
- package/src/lib/craft-router-trace.d.ts.map +1 -0
- package/src/lib/craft-router-trace.js +54 -0
- package/src/lib/craft-router-trace.js.map +1 -0
- package/src/lib/craft-router.d.ts +248 -0
- package/src/lib/craft-router.d.ts.map +1 -0
- package/src/lib/craft-router.js +559 -0
- package/src/lib/craft-router.js.map +1 -0
- package/src/lib/craft-routes.d.ts +755 -0
- package/src/lib/craft-routes.d.ts.map +1 -0
- package/src/lib/craft-routes.js +510 -0
- package/src/lib/craft-routes.js.map +1 -0
- package/src/lib/craft-service.d.ts +1034 -0
- package/src/lib/craft-service.d.ts.map +1 -0
- package/src/lib/craft-service.js +1072 -0
- package/src/lib/craft-service.js.map +1 -0
- package/src/lib/craft-service.shared.d.ts +35 -0
- package/src/lib/craft-service.shared.d.ts.map +1 -0
- package/src/lib/craft-service.shared.js +4 -0
- package/src/lib/craft-service.shared.js.map +1 -0
- package/src/lib/craft-settled.d.ts +171 -0
- package/src/lib/craft-settled.d.ts.map +1 -0
- package/src/lib/craft-settled.js +130 -0
- package/src/lib/craft-settled.js.map +1 -0
- package/src/lib/craft-ssr.d.ts +29 -0
- package/src/lib/craft-ssr.d.ts.map +1 -0
- package/src/lib/craft-ssr.js +27 -0
- package/src/lib/craft-ssr.js.map +1 -0
- package/src/lib/craft-state-machine-runtime.d.ts +88 -0
- package/src/lib/craft-state-machine-runtime.d.ts.map +1 -0
- package/src/lib/craft-state-machine-runtime.js +167 -0
- package/src/lib/craft-state-machine-runtime.js.map +1 -0
- package/src/lib/craft-state-machine.d.ts +233 -0
- package/src/lib/craft-state-machine.d.ts.map +1 -0
- package/src/lib/craft-state-machine.js +254 -0
- package/src/lib/craft-state-machine.js.map +1 -0
- package/src/lib/craft-target-runtime.d.ts +20 -0
- package/src/lib/craft-target-runtime.d.ts.map +1 -0
- package/src/lib/craft-target-runtime.js +42 -0
- package/src/lib/craft-target-runtime.js.map +1 -0
- package/src/lib/craft-transfer-snapshot.d.ts +19 -0
- package/src/lib/craft-transfer-snapshot.d.ts.map +1 -0
- package/src/lib/craft-transfer-snapshot.js +90 -0
- package/src/lib/craft-transfer-snapshot.js.map +1 -0
- package/src/lib/craft-unique.d.ts +7 -0
- package/src/lib/craft-unique.d.ts.map +1 -0
- package/src/lib/craft-unique.js +16 -0
- package/src/lib/craft-unique.js.map +1 -0
- package/src/lib/craft-until-settled.d.ts +99 -0
- package/src/lib/craft-until-settled.d.ts.map +1 -0
- package/src/lib/craft-until-settled.js +81 -0
- package/src/lib/craft-until-settled.js.map +1 -0
- package/src/lib/craft-use.d.ts +26 -0
- package/src/lib/craft-use.d.ts.map +1 -0
- package/src/lib/craft-use.js +37 -0
- package/src/lib/craft-use.js.map +1 -0
- package/src/lib/craft-view-transition.d.ts +102 -0
- package/src/lib/craft-view-transition.d.ts.map +1 -0
- package/src/lib/craft-view-transition.js +130 -0
- package/src/lib/craft-view-transition.js.map +1 -0
- package/src/lib/dom-event-hook.d.ts +30 -0
- package/src/lib/dom-event-hook.d.ts.map +1 -0
- package/src/lib/dom-event-hook.js +16 -0
- package/src/lib/dom-event-hook.js.map +1 -0
- package/src/lib/fn-wrapper.d.ts +13 -0
- package/src/lib/fn-wrapper.d.ts.map +1 -0
- package/src/lib/fn-wrapper.js +66 -0
- package/src/lib/fn-wrapper.js.map +1 -0
- package/src/lib/form/craft-field.d.ts +155 -0
- package/src/lib/form/craft-field.d.ts.map +1 -0
- package/src/lib/form/craft-field.directive.d.ts +70 -0
- package/src/lib/form/craft-field.directive.d.ts.map +1 -0
- package/src/lib/form/craft-field.directive.js +549 -0
- package/src/lib/form/craft-field.directive.js.map +1 -0
- package/src/lib/form/craft-field.js +586 -0
- package/src/lib/form/craft-field.js.map +1 -0
- package/src/lib/form/field-exception.d.ts +62 -0
- package/src/lib/form/field-exception.d.ts.map +1 -0
- package/src/lib/form/field-exception.js +37 -0
- package/src/lib/form/field-exception.js.map +1 -0
- package/src/lib/form/field-lens.d.ts +29 -0
- package/src/lib/form/field-lens.d.ts.map +1 -0
- package/src/lib/form/field-lens.js +32 -0
- package/src/lib/form/field-lens.js.map +1 -0
- package/src/lib/form/insert-form-attributes.d.ts +69 -0
- package/src/lib/form/insert-form-attributes.d.ts.map +1 -0
- package/src/lib/form/insert-form-attributes.js +163 -0
- package/src/lib/form/insert-form-attributes.js.map +1 -0
- package/src/lib/form/insert-form-internals.d.ts +110 -0
- package/src/lib/form/insert-form-internals.d.ts.map +1 -0
- package/src/lib/form/insert-form-internals.js +276 -0
- package/src/lib/form/insert-form-internals.js.map +1 -0
- package/src/lib/form/insert-form-schema.d.ts +10 -0
- package/src/lib/form/insert-form-schema.d.ts.map +1 -0
- package/src/lib/form/insert-form-schema.js +62 -0
- package/src/lib/form/insert-form-schema.js.map +1 -0
- package/src/lib/form/insert-form-submit.d.ts +79 -0
- package/src/lib/form/insert-form-submit.d.ts.map +1 -0
- package/src/lib/form/insert-form-submit.js +126 -0
- package/src/lib/form/insert-form-submit.js.map +1 -0
- package/src/lib/form/insert-form.d.ts +39 -0
- package/src/lib/form/insert-form.d.ts.map +1 -0
- package/src/lib/form/insert-form.js +255 -0
- package/src/lib/form/insert-form.js.map +1 -0
- package/src/lib/form/insert-select-form-tree.d.ts +33 -0
- package/src/lib/form/insert-select-form-tree.d.ts.map +1 -0
- package/src/lib/form/insert-select-form-tree.js +144 -0
- package/src/lib/form/insert-select-form-tree.js.map +1 -0
- package/src/lib/form/insert-sub-form-field.d.ts +17 -0
- package/src/lib/form/insert-sub-form-field.d.ts.map +1 -0
- package/src/lib/form/insert-sub-form-field.js +41 -0
- package/src/lib/form/insert-sub-form-field.js.map +1 -0
- package/src/lib/form/make-form-tree-insert.d.ts +22 -0
- package/src/lib/form/make-form-tree-insert.d.ts.map +1 -0
- package/src/lib/form/make-form-tree-insert.js +43 -0
- package/src/lib/form/make-form-tree-insert.js.map +1 -0
- package/src/lib/form/target-form-field.d.ts +11 -0
- package/src/lib/form/target-form-field.d.ts.map +1 -0
- package/src/lib/form/target-form-field.js +1 -0
- package/src/lib/form/target-form-field.js.map +1 -0
- package/src/lib/form/validator.d.ts +174 -0
- package/src/lib/form/validator.d.ts.map +1 -0
- package/src/lib/form/validator.js +465 -0
- package/src/lib/form/validator.js.map +1 -0
- package/src/lib/from-event-to-source$.d.ts +210 -0
- package/src/lib/from-event-to-source$.d.ts.map +1 -0
- package/src/lib/from-event-to-source$.js +29 -0
- package/src/lib/from-event-to-source$.js.map +1 -0
- package/src/lib/global-persister-handler.service.d.ts +10 -0
- package/src/lib/global-persister-handler.service.d.ts.map +1 -0
- package/src/lib/global-persister-handler.service.js +40 -0
- package/src/lib/global-persister-handler.service.js.map +1 -0
- package/src/lib/host/craft-compat.d.ts +242 -0
- package/src/lib/host/craft-compat.d.ts.map +1 -0
- package/src/lib/host/craft-compat.js +444 -0
- package/src/lib/host/craft-compat.js.map +1 -0
- package/src/lib/host/craft-dom.d.ts +16 -0
- package/src/lib/host/craft-dom.d.ts.map +1 -0
- package/src/lib/host/craft-dom.js +24 -0
- package/src/lib/host/craft-dom.js.map +1 -0
- package/src/lib/host/craft-http.d.ts +22 -0
- package/src/lib/host/craft-http.d.ts.map +1 -0
- package/src/lib/host/craft-http.js +80 -0
- package/src/lib/host/craft-http.js.map +1 -0
- package/src/lib/host/craft-injector-host.d.ts +3 -0
- package/src/lib/host/craft-injector-host.d.ts.map +1 -0
- package/src/lib/host/craft-injector-host.js +2 -0
- package/src/lib/host/craft-injector-host.js.map +1 -0
- package/src/lib/host/craft-injector.d.ts +40 -0
- package/src/lib/host/craft-injector.d.ts.map +1 -0
- package/src/lib/host/craft-injector.js +318 -0
- package/src/lib/host/craft-injector.js.map +1 -0
- package/src/lib/host/craft-linked-signal.d.ts +17 -0
- package/src/lib/host/craft-linked-signal.d.ts.map +1 -0
- package/src/lib/host/craft-linked-signal.js +86 -0
- package/src/lib/host/craft-linked-signal.js.map +1 -0
- package/src/lib/host/craft-router-runtime.d.ts +61 -0
- package/src/lib/host/craft-router-runtime.d.ts.map +1 -0
- package/src/lib/host/craft-router-runtime.js +456 -0
- package/src/lib/host/craft-router-runtime.js.map +1 -0
- package/src/lib/host/craft-router-types.d.ts +84 -0
- package/src/lib/host/craft-router-types.d.ts.map +1 -0
- package/src/lib/host/craft-router-types.js +35 -0
- package/src/lib/host/craft-router-types.js.map +1 -0
- package/src/lib/host/craft-signal.d.ts +45 -0
- package/src/lib/host/craft-signal.d.ts.map +1 -0
- package/src/lib/host/craft-signal.js +161 -0
- package/src/lib/host/craft-signal.js.map +1 -0
- package/src/lib/host/craft-test-bed.d.ts +63 -0
- package/src/lib/host/craft-test-bed.d.ts.map +1 -0
- package/src/lib/host/craft-test-bed.js +114 -0
- package/src/lib/host/craft-test-bed.js.map +1 -0
- package/src/lib/host-tag.d.ts +2 -0
- package/src/lib/host-tag.d.ts.map +1 -0
- package/src/lib/host-tag.js +2 -0
- package/src/lib/host-tag.js.map +1 -0
- package/src/lib/insert-entities.d.ts +131 -0
- package/src/lib/insert-entities.d.ts.map +1 -0
- package/src/lib/insert-entities.js +159 -0
- package/src/lib/insert-entities.js.map +1 -0
- package/src/lib/insert-noop-typing-anchor.d.ts +15 -0
- package/src/lib/insert-noop-typing-anchor.d.ts.map +1 -0
- package/src/lib/insert-noop-typing-anchor.js +16 -0
- package/src/lib/insert-noop-typing-anchor.js.map +1 -0
- package/src/lib/insert-pagination-placeholder-data.d.ts +122 -0
- package/src/lib/insert-pagination-placeholder-data.d.ts.map +1 -0
- package/src/lib/insert-pagination-placeholder-data.js +244 -0
- package/src/lib/insert-pagination-placeholder-data.js.map +1 -0
- package/src/lib/insert-react-on-mutation.d.ts +261 -0
- package/src/lib/insert-react-on-mutation.d.ts.map +1 -0
- package/src/lib/insert-react-on-mutation.js +227 -0
- package/src/lib/insert-react-on-mutation.js.map +1 -0
- package/src/lib/insert-select-resource.d.ts +31 -0
- package/src/lib/insert-select-resource.d.ts.map +1 -0
- package/src/lib/insert-select-resource.js +27 -0
- package/src/lib/insert-select-resource.js.map +1 -0
- package/src/lib/insert-select.d.ts +126 -0
- package/src/lib/insert-select.d.ts.map +1 -0
- package/src/lib/insert-select.js +535 -0
- package/src/lib/insert-select.js.map +1 -0
- package/src/lib/insert-storage-persister.d.ts +27 -0
- package/src/lib/insert-storage-persister.d.ts.map +1 -0
- package/src/lib/insert-storage-persister.js +65 -0
- package/src/lib/insert-storage-persister.js.map +1 -0
- package/src/lib/insert-typed-pipes.d.ts +64 -0
- package/src/lib/insert-typed-pipes.d.ts.map +1 -0
- package/src/lib/insert-typed-pipes.js +32 -0
- package/src/lib/insert-typed-pipes.js.map +1 -0
- package/src/lib/linked-source.d.ts +8 -0
- package/src/lib/linked-source.d.ts.map +1 -0
- package/src/lib/linked-source.js +24 -0
- package/src/lib/linked-source.js.map +1 -0
- package/src/lib/local-storage-persister.d.ts +4 -0
- package/src/lib/local-storage-persister.d.ts.map +1 -0
- package/src/lib/local-storage-persister.js +342 -0
- package/src/lib/local-storage-persister.js.map +1 -0
- package/src/lib/middleware-schema-shared.d.ts +67 -0
- package/src/lib/middleware-schema-shared.d.ts.map +1 -0
- package/src/lib/middleware-schema-shared.js +34 -0
- package/src/lib/middleware-schema-shared.js.map +1 -0
- package/src/lib/mock-http-request-for-route.d.ts +173 -0
- package/src/lib/mock-http-request-for-route.d.ts.map +1 -0
- package/src/lib/mock-http-request-for-route.js +127 -0
- package/src/lib/mock-http-request-for-route.js.map +1 -0
- package/src/lib/mutation.d.ts +332 -0
- package/src/lib/mutation.d.ts.map +1 -0
- package/src/lib/mutation.js +923 -0
- package/src/lib/mutation.js.map +1 -0
- package/src/lib/on$.d.ts +26 -0
- package/src/lib/on$.d.ts.map +1 -0
- package/src/lib/on$.js +19 -0
- package/src/lib/on$.js.map +1 -0
- package/src/lib/portable-server-function.d.ts +68 -0
- package/src/lib/portable-server-function.d.ts.map +1 -0
- package/src/lib/portable-server-function.js +97 -0
- package/src/lib/portable-server-function.js.map +1 -0
- package/src/lib/preserved-resource.d.ts +4 -0
- package/src/lib/preserved-resource.d.ts.map +1 -0
- package/src/lib/preserved-resource.js +60 -0
- package/src/lib/preserved-resource.js.map +1 -0
- package/src/lib/primitive-method-runtime-context.d.ts +28 -0
- package/src/lib/primitive-method-runtime-context.d.ts.map +1 -0
- package/src/lib/primitive-method-runtime-context.js +38 -0
- package/src/lib/primitive-method-runtime-context.js.map +1 -0
- package/src/lib/primitive-resource-runtime-context.d.ts +46 -0
- package/src/lib/primitive-resource-runtime-context.d.ts.map +1 -0
- package/src/lib/primitive-resource-runtime-context.js +102 -0
- package/src/lib/primitive-resource-runtime-context.js.map +1 -0
- package/src/lib/query-params.d.ts +216 -0
- package/src/lib/query-params.d.ts.map +1 -0
- package/src/lib/query-params.js +324 -0
- package/src/lib/query-params.js.map +1 -0
- package/src/lib/query.core.d.ts +214 -0
- package/src/lib/query.core.d.ts.map +1 -0
- package/src/lib/query.core.js +210 -0
- package/src/lib/query.core.js.map +1 -0
- package/src/lib/query.d.ts +324 -0
- package/src/lib/query.d.ts.map +1 -0
- package/src/lib/query.js +971 -0
- package/src/lib/query.js.map +1 -0
- package/src/lib/reactive-read.d.ts +162 -0
- package/src/lib/reactive-read.d.ts.map +1 -0
- package/src/lib/reactive-read.js +389 -0
- package/src/lib/reactive-read.js.map +1 -0
- package/src/lib/resource-by-id.d.ts +71 -0
- package/src/lib/resource-by-id.d.ts.map +1 -0
- package/src/lib/resource-by-id.js +294 -0
- package/src/lib/resource-by-id.js.map +1 -0
- package/src/lib/resource-exception.d.ts +30 -0
- package/src/lib/resource-exception.d.ts.map +1 -0
- package/src/lib/resource-exception.js +86 -0
- package/src/lib/resource-exception.js.map +1 -0
- package/src/lib/route-checked-di.d.ts +229 -0
- package/src/lib/route-checked-di.d.ts.map +1 -0
- package/src/lib/route-checked-di.js +1 -0
- package/src/lib/route-checked-di.js.map +1 -0
- package/src/lib/schema-validation.d.ts +89 -0
- package/src/lib/schema-validation.d.ts.map +1 -0
- package/src/lib/schema-validation.js +110 -0
- package/src/lib/schema-validation.js.map +1 -0
- package/src/lib/send-context-to-ai.d.ts +20 -0
- package/src/lib/send-context-to-ai.d.ts.map +1 -0
- package/src/lib/send-context-to-ai.js +18 -0
- package/src/lib/send-context-to-ai.js.map +1 -0
- package/src/lib/send-context-to-ai.tokens.d.ts +12 -0
- package/src/lib/send-context-to-ai.tokens.d.ts.map +1 -0
- package/src/lib/send-context-to-ai.tokens.js +1 -0
- package/src/lib/send-context-to-ai.tokens.js.map +1 -0
- package/src/lib/server-function-client.d.ts +102 -0
- package/src/lib/server-function-client.d.ts.map +1 -0
- package/src/lib/server-function-client.js +106 -0
- package/src/lib/server-function-client.js.map +1 -0
- package/src/lib/server-function-contract.d.ts +42 -0
- package/src/lib/server-function-contract.d.ts.map +1 -0
- package/src/lib/server-function-contract.js +23 -0
- package/src/lib/server-function-contract.js.map +1 -0
- package/src/lib/server-function-middleware.d.ts +222 -0
- package/src/lib/server-function-middleware.d.ts.map +1 -0
- package/src/lib/server-function-middleware.js +189 -0
- package/src/lib/server-function-middleware.js.map +1 -0
- package/src/lib/server-function.d.ts +114 -0
- package/src/lib/server-function.d.ts.map +1 -0
- package/src/lib/server-function.js +80 -0
- package/src/lib/server-function.js.map +1 -0
- package/src/lib/server-layer.d.ts +185 -0
- package/src/lib/server-layer.d.ts.map +1 -0
- package/src/lib/server-layer.js +121 -0
- package/src/lib/server-layer.js.map +1 -0
- package/src/lib/server.d.ts +83 -0
- package/src/lib/server.d.ts.map +1 -0
- package/src/lib/server.js +266 -0
- package/src/lib/server.js.map +1 -0
- package/src/lib/setup-craft-service-test.d.ts +90 -0
- package/src/lib/setup-craft-service-test.d.ts.map +1 -0
- package/src/lib/setup-craft-service-test.js +193 -0
- package/src/lib/setup-craft-service-test.js.map +1 -0
- package/src/lib/setup-craft-service-testing-by-register.d.ts +245 -0
- package/src/lib/setup-craft-service-testing-by-register.d.ts.map +1 -0
- package/src/lib/setup-craft-service-testing-by-register.js +316 -0
- package/src/lib/setup-craft-service-testing-by-register.js.map +1 -0
- package/src/lib/signal-proxy.d.ts +21 -0
- package/src/lib/signal-proxy.d.ts.map +1 -0
- package/src/lib/signal-proxy.js +79 -0
- package/src/lib/signal-proxy.js.map +1 -0
- package/src/lib/signal-source.d.ts +392 -0
- package/src/lib/signal-source.d.ts.map +1 -0
- package/src/lib/signal-source.js +433 -0
- package/src/lib/signal-source.js.map +1 -0
- package/src/lib/source$.d.ts +121 -0
- package/src/lib/source$.d.ts.map +1 -0
- package/src/lib/source$.js +171 -0
- package/src/lib/source$.js.map +1 -0
- package/src/lib/source-from-event.d.ts +350 -0
- package/src/lib/source-from-event.d.ts.map +1 -0
- package/src/lib/source-from-event.js +26 -0
- package/src/lib/source-from-event.js.map +1 -0
- package/src/lib/stacked-source.d.ts +6 -0
- package/src/lib/stacked-source.d.ts.map +1 -0
- package/src/lib/stacked-source.js +29 -0
- package/src/lib/stacked-source.js.map +1 -0
- package/src/lib/standard-schema.d.ts +43 -0
- package/src/lib/standard-schema.d.ts.map +1 -0
- package/src/lib/standard-schema.js +1 -0
- package/src/lib/standard-schema.js.map +1 -0
- package/src/lib/state-method-runtime-context.d.ts +13 -0
- package/src/lib/state-method-runtime-context.d.ts.map +1 -0
- package/src/lib/state-method-runtime-context.js +11 -0
- package/src/lib/state-method-runtime-context.js.map +1 -0
- package/src/lib/state.d.ts +158 -0
- package/src/lib/state.d.ts.map +1 -0
- package/src/lib/state.js +388 -0
- package/src/lib/state.js.map +1 -0
- package/src/lib/storage-persister.service.d.ts +25 -0
- package/src/lib/storage-persister.service.d.ts.map +1 -0
- package/src/lib/storage-persister.service.js +27 -0
- package/src/lib/storage-persister.service.js.map +1 -0
- package/src/lib/take-app-snapshot.d.ts +31 -0
- package/src/lib/take-app-snapshot.d.ts.map +1 -0
- package/src/lib/take-app-snapshot.js +93 -0
- package/src/lib/take-app-snapshot.js.map +1 -0
- package/src/lib/template-trace.d.ts +37 -0
- package/src/lib/template-trace.d.ts.map +1 -0
- package/src/lib/template-trace.js +37 -0
- package/src/lib/template-trace.js.map +1 -0
- package/src/lib/temporal-runtime.d.ts +146 -0
- package/src/lib/temporal-runtime.d.ts.map +1 -0
- package/src/lib/temporal-runtime.js +375 -0
- package/src/lib/temporal-runtime.js.map +1 -0
- package/src/lib/to-source.d.ts +335 -0
- package/src/lib/to-source.d.ts.map +1 -0
- package/src/lib/to-source.js +359 -0
- package/src/lib/to-source.js.map +1 -0
- package/src/lib/util/craft-resource-ref.d.ts +29 -0
- package/src/lib/util/craft-resource-ref.d.ts.map +1 -0
- package/src/lib/util/craft-resource-ref.js +1 -0
- package/src/lib/util/craft-resource-ref.js.map +1 -0
- package/src/lib/util/craft-resource-status.d.ts +17 -0
- package/src/lib/util/craft-resource-status.d.ts.map +1 -0
- package/src/lib/util/craft-resource-status.js +14 -0
- package/src/lib/util/craft-resource-status.js.map +1 -0
- package/src/lib/util/entities-util.d.ts +340 -0
- package/src/lib/util/entities-util.d.ts.map +1 -0
- package/src/lib/util/entities-util.js +136 -0
- package/src/lib/util/entities-util.js.map +1 -0
- package/src/lib/util/explicit-effect.d.ts +42 -0
- package/src/lib/util/explicit-effect.d.ts.map +1 -0
- package/src/lib/util/explicit-effect.js +37 -0
- package/src/lib/util/explicit-effect.js.map +1 -0
- package/src/lib/util/extract-signal-props-and-methods.d.ts +20 -0
- package/src/lib/util/extract-signal-props-and-methods.d.ts.map +1 -0
- package/src/lib/util/extract-signal-props-and-methods.js +1 -0
- package/src/lib/util/extract-signal-props-and-methods.js.map +1 -0
- package/src/lib/util/method-trigger-nonce.d.ts +45 -0
- package/src/lib/util/method-trigger-nonce.d.ts.map +1 -0
- package/src/lib/util/method-trigger-nonce.js +58 -0
- package/src/lib/util/method-trigger-nonce.js.map +1 -0
- package/src/lib/util/persister.type.d.ts +37 -0
- package/src/lib/util/persister.type.d.ts.map +1 -0
- package/src/lib/util/persister.type.js +1 -0
- package/src/lib/util/persister.type.js.map +1 -0
- package/src/lib/util/persister.util.d.ts +8 -0
- package/src/lib/util/persister.util.d.ts.map +1 -0
- package/src/lib/util/persister.util.js +71 -0
- package/src/lib/util/persister.util.js.map +1 -0
- package/src/lib/util/react-on-mutation-effect.d.ts +16 -0
- package/src/lib/util/react-on-mutation-effect.d.ts.map +1 -0
- package/src/lib/util/react-on-mutation-effect.js +148 -0
- package/src/lib/util/react-on-mutation-effect.js.map +1 -0
- package/src/lib/util/resource-by-id-changes-tracker.util.d.ts +27 -0
- package/src/lib/util/resource-by-id-changes-tracker.util.d.ts.map +1 -0
- package/src/lib/util/resource-by-id-changes-tracker.util.js +97 -0
- package/src/lib/util/resource-by-id-changes-tracker.util.js.map +1 -0
- package/src/lib/util/source.type.d.ts +6 -0
- package/src/lib/util/source.type.d.ts.map +1 -0
- package/src/lib/util/source.type.js +1 -0
- package/src/lib/util/source.type.js.map +1 -0
- package/src/lib/util/types/access-type-object-property-by-dotted-path.type.d.ts +4 -0
- package/src/lib/util/types/access-type-object-property-by-dotted-path.type.d.ts.map +1 -0
- package/src/lib/util/types/access-type-object-property-by-dotted-path.type.js +1 -0
- package/src/lib/util/types/access-type-object-property-by-dotted-path.type.js.map +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.d.ts +27 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.d.ts.map +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.js +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.js.map +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.d.ts +24 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.d.ts.map +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.js +1 -0
- package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.js.map +1 -0
- package/src/lib/util/types/brand.d.ts +7 -0
- package/src/lib/util/types/brand.d.ts.map +1 -0
- package/src/lib/util/types/brand.js +9 -0
- package/src/lib/util/types/brand.js.map +1 -0
- package/src/lib/util/types/object-deep-path-mapper.type.d.ts +13 -0
- package/src/lib/util/types/object-deep-path-mapper.type.d.ts.map +1 -0
- package/src/lib/util/types/object-deep-path-mapper.type.js +1 -0
- package/src/lib/util/types/object-deep-path-mapper.type.js.map +1 -0
- package/src/lib/util/types/resource-by-id-config.type.d.ts +115 -0
- package/src/lib/util/types/resource-by-id-config.type.d.ts.map +1 -0
- package/src/lib/util/types/resource-by-id-config.type.js +1 -0
- package/src/lib/util/types/resource-by-id-config.type.js.map +1 -0
- package/src/lib/util/types/resource-with-params-or-params-fn.type.d.ts +52 -0
- package/src/lib/util/types/resource-with-params-or-params-fn.type.d.ts.map +1 -0
- package/src/lib/util/types/resource-with-params-or-params-fn.type.js +1 -0
- package/src/lib/util/types/resource-with-params-or-params-fn.type.js.map +1 -0
- package/src/lib/util/types/shared.type.d.ts +66 -0
- package/src/lib/util/types/shared.type.d.ts.map +1 -0
- package/src/lib/util/types/shared.type.js +1 -0
- package/src/lib/util/types/shared.type.js.map +1 -0
- package/src/lib/util/types/util.d.ts +16 -0
- package/src/lib/util/types/util.d.ts.map +1 -0
- package/src/lib/util/types/util.js +60 -0
- package/src/lib/util/types/util.js.map +1 -0
- package/src/lib/util/types/util.type.d.ts +67 -0
- package/src/lib/util/types/util.type.d.ts.map +1 -0
- package/src/lib/util/types/util.type.js +5 -0
- package/src/lib/util/types/util.type.js.map +1 -0
- package/src/lib/util/update-state.util.d.ts +10 -0
- package/src/lib/util/update-state.util.d.ts.map +1 -0
- package/src/lib/util/update-state.util.js +31 -0
- package/src/lib/util/update-state.util.js.map +1 -0
- package/src/lib/util/util.d.ts +19 -0
- package/src/lib/util/util.d.ts.map +1 -0
- package/src/lib/util/util.js +50 -0
- package/src/lib/util/util.js.map +1 -0
- package/src/lib/util/util.type.d.ts +107 -0
- package/src/lib/util/util.type.d.ts.map +1 -0
- package/src/lib/util/util.type.js +9 -0
- package/src/lib/util/util.type.js.map +1 -0
- package/src/lib/yieldable.d.ts +94 -0
- package/src/lib/yieldable.d.ts.map +1 -0
- package/src/lib/yieldable.js +109 -0
- package/src/lib/yieldable.js.map +1 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { createEnvironmentInjector, Injector, runInInjectionContext, ɵINJECTOR_SCOPE, } from './host/craft-compat';
|
|
2
|
+
import { createExposedServiceValue, getRegisteredAppStartServices, getRegisteredServices, getServiceMetaData, runServiceAppStart, SERVICE_RUNTIME_OVERRIDES, } from './craft-service';
|
|
3
|
+
import { CRAFT_SERVICE_PROVIDER_BRAND } from './craft-service.shared';
|
|
4
|
+
import { ɵcraftInjectorFromHost } from './host/craft-injector-host';
|
|
5
|
+
function createMockPublicValue(implementation) {
|
|
6
|
+
return implementation === undefined
|
|
7
|
+
? {}
|
|
8
|
+
: createExposedServiceValue(implementation);
|
|
9
|
+
}
|
|
10
|
+
function getProviderOverrideMeta(value) {
|
|
11
|
+
if (typeof value !== 'object' ||
|
|
12
|
+
value === null ||
|
|
13
|
+
!(CRAFT_SERVICE_PROVIDER_BRAND in value)) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return Reflect.get(value, CRAFT_SERVICE_PROVIDER_BRAND);
|
|
17
|
+
}
|
|
18
|
+
function isProviderOverride(value) {
|
|
19
|
+
return getProviderOverrideMeta(value) !== undefined;
|
|
20
|
+
}
|
|
21
|
+
function assertProviderOverrideName(name, provider) {
|
|
22
|
+
const metaData = getProviderOverrideMeta(provider);
|
|
23
|
+
if (!metaData) {
|
|
24
|
+
throw new Error(`Expected a raw provider returned by provide${name}(...).`);
|
|
25
|
+
}
|
|
26
|
+
if (metaData.name !== name) {
|
|
27
|
+
throw new Error(`Register entry "${name}" does not match provider value for "${metaData.name}".`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function assertRootRuntimeEntry(rootName, rootScope, entry) {
|
|
31
|
+
if (rootScope === 'toProvide' || rootScope === 'manuallyProvidedAtRoot') {
|
|
32
|
+
if (!isProviderOverride(entry)) {
|
|
33
|
+
throw new Error(`setupTestingService requires a real provider for the SUT "${rootName}".`);
|
|
34
|
+
}
|
|
35
|
+
assertProviderOverrideName(rootName, entry);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (entry !== 'real') {
|
|
39
|
+
throw new Error(`setupTestingService requires "${rootName}" to be marked as "real".`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isRealRuntimeRegisterEntry(entry) {
|
|
43
|
+
return entry === 'real' || isProviderOverride(entry);
|
|
44
|
+
}
|
|
45
|
+
function isPrunedOrMockedRuntimeRegisterEntry(entry) {
|
|
46
|
+
return (entry === undefined ||
|
|
47
|
+
entry === 'notReached' ||
|
|
48
|
+
(entry !== 'real' && !isProviderOverride(entry)));
|
|
49
|
+
}
|
|
50
|
+
function createBoundaryOnlyRuntimeRegister(config, root) {
|
|
51
|
+
const toProvideRegister = config.toProvideRegister ?? {};
|
|
52
|
+
const boundaryRegister = config.boundaryRegister ?? {};
|
|
53
|
+
const register = {
|
|
54
|
+
...toProvideRegister,
|
|
55
|
+
};
|
|
56
|
+
assertBoundaryOnlyToProvideEntries(toProvideRegister);
|
|
57
|
+
if (root) {
|
|
58
|
+
if (root.scope === 'toProvide' || root.scope === 'manuallyProvidedAtRoot') {
|
|
59
|
+
if (toProvideRegister[root.name]) {
|
|
60
|
+
register[root.name] = toProvideRegister[root.name];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
register[root.name] = 'real';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
assertBoundaryOnlyRegisterEntries(boundaryRegister, toProvideRegister);
|
|
68
|
+
for (const [name, entry] of Object.entries(boundaryRegister)) {
|
|
69
|
+
if (entry === 'real' && toProvideRegister[name]) {
|
|
70
|
+
register[name] = toProvideRegister[name];
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
register[name] = entry;
|
|
74
|
+
}
|
|
75
|
+
for (const name of Object.keys(config.appStart ?? {})) {
|
|
76
|
+
register[name] ??= 'real';
|
|
77
|
+
}
|
|
78
|
+
return register;
|
|
79
|
+
}
|
|
80
|
+
function assertBoundaryOnlyToProvideEntries(toProvideRegister) {
|
|
81
|
+
for (const [name, entry] of Object.entries(toProvideRegister)) {
|
|
82
|
+
if (!isProviderOverride(entry)) {
|
|
83
|
+
throw new Error(`boundaryOnly toProvideRegister entry "${name}" must be a provider returned by provide${name}(...).`);
|
|
84
|
+
}
|
|
85
|
+
assertProviderOverrideName(name, entry);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function assertBoundaryOnlyRegisterEntries(boundaryRegister, toProvideRegister) {
|
|
89
|
+
const registeredServices = new Map(getRegisteredServices().map((reference) => {
|
|
90
|
+
const metaData = getServiceMetaData(reference);
|
|
91
|
+
return [metaData.name, metaData];
|
|
92
|
+
}));
|
|
93
|
+
for (const [name, entry] of Object.entries(boundaryRegister)) {
|
|
94
|
+
const metaData = registeredServices.get(name);
|
|
95
|
+
if (!metaData?.browserBoundary) {
|
|
96
|
+
throw new Error(`boundaryOnly boundaryRegister entry "${name}" is not a craftService configured with browserBoundary: true.`);
|
|
97
|
+
}
|
|
98
|
+
if (isProviderOverride(entry)) {
|
|
99
|
+
throw new Error(`boundaryOnly boundaryRegister entry "${name}" cannot be a provider. Use boundaryRegister.${name}: "real" with toProvideRegister.${name}.`);
|
|
100
|
+
}
|
|
101
|
+
if (entry === 'real' &&
|
|
102
|
+
(metaData.providedIn === 'toProvide' ||
|
|
103
|
+
metaData.providedIn === 'manuallyProvidedAtRoot') &&
|
|
104
|
+
!toProvideRegister[name]) {
|
|
105
|
+
throw new Error(`boundaryOnly requires toProvideRegister.${name} when boundaryRegister.${name} is "real".`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function createRegisterTestingContext(register, optionsProviders, root) {
|
|
110
|
+
const providers = [...(optionsProviders ?? [])];
|
|
111
|
+
const runtimeOverrides = new Map();
|
|
112
|
+
const mocks = {};
|
|
113
|
+
if (root) {
|
|
114
|
+
const rootEntry = register[root.name];
|
|
115
|
+
assertRootRuntimeEntry(root.name, root.scope, rootEntry);
|
|
116
|
+
}
|
|
117
|
+
for (const [name, entry] of Object.entries(register)) {
|
|
118
|
+
if (root && name === root.name) {
|
|
119
|
+
if (isProviderOverride(entry)) {
|
|
120
|
+
providers.push(entry);
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (entry === 'real' || entry === 'notReached') {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (isProviderOverride(entry)) {
|
|
128
|
+
assertProviderOverrideName(name, entry);
|
|
129
|
+
providers.push(entry);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const publicValue = createMockPublicValue(entry);
|
|
133
|
+
runtimeOverrides.set(name, {
|
|
134
|
+
kind: 'useValue',
|
|
135
|
+
value: publicValue,
|
|
136
|
+
});
|
|
137
|
+
mocks[name] = publicValue;
|
|
138
|
+
}
|
|
139
|
+
providers.push({
|
|
140
|
+
provide: SERVICE_RUNTIME_OVERRIDES,
|
|
141
|
+
useValue: runtimeOverrides,
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
providers,
|
|
145
|
+
mocks,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function createTestingInjector(providers) {
|
|
149
|
+
const environmentInjector = createEnvironmentInjector([
|
|
150
|
+
{ provide: ɵINJECTOR_SCOPE, useValue: 'root' },
|
|
151
|
+
...providers,
|
|
152
|
+
], Injector.NULL, 'CraftServiceTestingByRegister');
|
|
153
|
+
const injector = ɵcraftInjectorFromHost(environmentInjector);
|
|
154
|
+
return {
|
|
155
|
+
environmentInjector,
|
|
156
|
+
injector,
|
|
157
|
+
run(fn) {
|
|
158
|
+
return injector.run(() => runInInjectionContext(environmentInjector, fn));
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async function runConfiguredAppStartHooks(register, appStart, helperName, testingInjector) {
|
|
163
|
+
const appStartReferences = new Map(getRegisteredAppStartServices().map((reference) => {
|
|
164
|
+
const metaData = getServiceMetaData(reference);
|
|
165
|
+
return [metaData.name, reference];
|
|
166
|
+
}));
|
|
167
|
+
const missingDecisions = Array.from(appStartReferences)
|
|
168
|
+
.filter(([name]) => isRealRuntimeRegisterEntry(register[name]))
|
|
169
|
+
.filter(([name]) => appStart?.[name] === undefined)
|
|
170
|
+
.map(([name]) => name);
|
|
171
|
+
if (missingDecisions.length > 0) {
|
|
172
|
+
throw new Error(`${helperName} requires options.appStart decisions for: ${missingDecisions.join(', ')}.`);
|
|
173
|
+
}
|
|
174
|
+
if (!appStart) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
await testingInjector.run(async () => {
|
|
178
|
+
for (const [name, decision] of Object.entries(appStart)) {
|
|
179
|
+
if (decision !== 'run' && decision !== 'ignore') {
|
|
180
|
+
throw new Error(`Invalid appStart decision for "${name}". Expected "run" or "ignore".`);
|
|
181
|
+
}
|
|
182
|
+
const registerEntry = register[name];
|
|
183
|
+
if (isPrunedOrMockedRuntimeRegisterEntry(registerEntry)) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const reference = appStartReferences.get(name);
|
|
187
|
+
if (!reference) {
|
|
188
|
+
throw new Error(`Register entry "${name}" is not a craftService configured with appStart: true.`);
|
|
189
|
+
}
|
|
190
|
+
if (decision === 'ignore') {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const metaData = getServiceMetaData(reference);
|
|
194
|
+
const instance = metaData.inject();
|
|
195
|
+
await waitForAppStartResult(runServiceAppStart(reference, instance));
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async function waitForAppStartResult(result) {
|
|
200
|
+
if (isPromiseLike(result)) {
|
|
201
|
+
await result;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (isObservableLike(result)) {
|
|
205
|
+
await new Promise((resolve, reject) => {
|
|
206
|
+
// The completion callback may run synchronously during subscribe.
|
|
207
|
+
// eslint-disable-next-line prefer-const
|
|
208
|
+
let subscription;
|
|
209
|
+
const complete = () => {
|
|
210
|
+
if (subscription && typeof subscription === 'object') {
|
|
211
|
+
const unsubscribe = Reflect.get(subscription, 'unsubscribe');
|
|
212
|
+
if (typeof unsubscribe === 'function') {
|
|
213
|
+
Reflect.apply(unsubscribe, subscription, []);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
resolve();
|
|
217
|
+
};
|
|
218
|
+
subscription = result.subscribe({
|
|
219
|
+
error: reject,
|
|
220
|
+
complete,
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function isPromiseLike(value) {
|
|
226
|
+
return (typeof value === 'object' &&
|
|
227
|
+
value !== null &&
|
|
228
|
+
'then' in value &&
|
|
229
|
+
typeof value.then === 'function');
|
|
230
|
+
}
|
|
231
|
+
function isObservableLike(value) {
|
|
232
|
+
return (typeof value === 'object' &&
|
|
233
|
+
value !== null &&
|
|
234
|
+
'subscribe' in value &&
|
|
235
|
+
typeof value.subscribe === 'function');
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Sets up a crafted service from an explicit flat register derived from its full
|
|
239
|
+
* dependency graph.
|
|
240
|
+
*
|
|
241
|
+
* Each dependency must be present in the register and resolved as one of:
|
|
242
|
+
* - a real provider for `toProvide` / `manuallyProvidedAtRoot`
|
|
243
|
+
* - the literal `"real"` for non-provider scopes
|
|
244
|
+
* - a raw mock object
|
|
245
|
+
* - the literal `"notReached"` when the node is fully pruned by mocked ancestors
|
|
246
|
+
*
|
|
247
|
+
* The returned `sut` is the resolved root service. The returned `mocks` object
|
|
248
|
+
* only contains entries for dependencies that were actually mocked with raw
|
|
249
|
+
* objects.
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* ```ts
|
|
253
|
+
* const { sut, mocks } = await setupCraftServiceTestingByRegister(
|
|
254
|
+
* CounterConsumer,
|
|
255
|
+
* {
|
|
256
|
+
* CounterConsumer: provideCounterConsumer(),
|
|
257
|
+
* Counter: {
|
|
258
|
+
* $self: vi.fn(() => 41),
|
|
259
|
+
* increment: vi.fn(),
|
|
260
|
+
* },
|
|
261
|
+
* },
|
|
262
|
+
* );
|
|
263
|
+
*
|
|
264
|
+
* expect(sut.read()).toBe(41);
|
|
265
|
+
* expect(mocks.Counter.increment).toBeDefined();
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
async function setupCraftServiceTestingByRegisterImpl(target, register, ...[options]) {
|
|
269
|
+
const internalMetaData = getServiceMetaData(target);
|
|
270
|
+
const runtimeRegister = register;
|
|
271
|
+
const { providers, mocks } = createRegisterTestingContext(runtimeRegister, options?.providers, {
|
|
272
|
+
name: internalMetaData.name,
|
|
273
|
+
scope: internalMetaData.providedIn,
|
|
274
|
+
});
|
|
275
|
+
const testingInjector = createTestingInjector(providers);
|
|
276
|
+
const result = testingInjector.run(() => ({
|
|
277
|
+
sut: options?.bindings === undefined
|
|
278
|
+
? internalMetaData.inject()
|
|
279
|
+
: internalMetaData.inject(options.bindings),
|
|
280
|
+
mocks,
|
|
281
|
+
injector: testingInjector.injector,
|
|
282
|
+
}));
|
|
283
|
+
await runConfiguredAppStartHooks(runtimeRegister, options?.appStart, 'setupCraftServiceTestingByRegister', testingInjector);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
async function setupCraftServiceTestingByRegisterBoundaryOnly(target, config) {
|
|
287
|
+
const internalMetaData = getServiceMetaData(target);
|
|
288
|
+
const runtimeRegister = createBoundaryOnlyRuntimeRegister({
|
|
289
|
+
toProvideRegister: config.toProvideRegister,
|
|
290
|
+
boundaryRegister: config.boundaryRegister,
|
|
291
|
+
appStart: config.appStart,
|
|
292
|
+
}, {
|
|
293
|
+
name: internalMetaData.name,
|
|
294
|
+
scope: internalMetaData.providedIn,
|
|
295
|
+
});
|
|
296
|
+
const { providers, mocks } = createRegisterTestingContext(runtimeRegister, config.providers, {
|
|
297
|
+
name: internalMetaData.name,
|
|
298
|
+
scope: internalMetaData.providedIn,
|
|
299
|
+
});
|
|
300
|
+
const testingInjector = createTestingInjector(providers);
|
|
301
|
+
const result = testingInjector.run(() => ({
|
|
302
|
+
sut: config.bindings === undefined
|
|
303
|
+
? internalMetaData.inject()
|
|
304
|
+
: internalMetaData.inject(config.bindings),
|
|
305
|
+
mocks,
|
|
306
|
+
injector: testingInjector.injector,
|
|
307
|
+
}));
|
|
308
|
+
await runConfiguredAppStartHooks(runtimeRegister, config.appStart, 'setupCraftServiceTestingByRegister.boundaryOnly', testingInjector);
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
export const setupCraftServiceTestingByRegister = Object.assign(setupCraftServiceTestingByRegisterImpl, {
|
|
312
|
+
boundaryOnly: setupCraftServiceTestingByRegisterBoundaryOnly,
|
|
313
|
+
});
|
|
314
|
+
/** Backward-compatible alias for `setupCraftServiceTestingByRegister`. */
|
|
315
|
+
export const setupTestingService = setupCraftServiceTestingByRegister;
|
|
316
|
+
//# sourceMappingURL=setup-craft-service-testing-by-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-craft-service-testing-by-register.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/setup-craft-service-testing-by-register.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createEnvironmentInjector,\n type EnvironmentInjector,\n Injector,\n runInInjectionContext,\n type Signal,\n type WritableSignal,\n ɵINJECTOR_SCOPE,\n} from './host/craft-compat';\nimport {\n createExposedServiceValue,\n getRegisteredAppStartServices,\n getRegisteredServices,\n getServiceMetaData,\n runServiceAppStart,\n SERVICE_RUNTIME_OVERRIDES,\n} from './craft-service';\nimport { CRAFT_SERVICE_PROVIDER_BRAND } from './craft-service.shared';\nimport type {\n BrandedServiceProvider,\n CraftServiceProvider,\n GetServiceDependencies,\n GetMergedServiceDependencyNodeMap,\n GetServiceReferenceMeta,\n GetServiceReferenceOutput,\n GetServiceTrackingMetadata,\n ResolvedServiceOutput,\n ServiceBindings,\n ServiceMetaData,\n ServiceReference,\n ServiceTrackingMetadata,\n ServiceYieldRequest,\n} from './craft-service';\nimport type {\n CallableShell,\n ConcreteServiceScope,\n DependencyNodeScope,\n DependencyTreeChildren,\n MergeObjectUnion,\n RequirementScope,\n RootExposureKey,\n Simplify,\n} from './craft-service.shared';\nimport { ɵcraftInjectorFromHost } from './host/craft-injector-host';\nimport type { CraftInjector } from './host/craft-injector';\n\ntype RegisterRealEntry = 'real';\ntype RegisterNotReachedEntry = 'notReached';\ntype AppStartDecision = 'run' | 'ignore';\n\ntype TrackingYielded<Tracking> =\n Tracking extends ServiceTrackingMetadata<\n any,\n any,\n any,\n infer Yielded,\n any,\n any,\n any,\n any\n >\n ? Yielded\n : never;\n\ntype FlattenedDependencyOutputRecordsFromTracking<Tracking> = Simplify<\n MergeObjectUnion<\n Extract<\n TrackingYielded<Tracking>,\n ServiceYieldRequest<any, any, any>\n > extends infer Request\n ? Request extends ServiceYieldRequest<any, any, infer DependencyTracking>\n ?\n | DependencyOutputRecordFromTracking<DependencyTracking>\n | FlattenedDependencyOutputRecordsFromTracking<DependencyTracking>\n : never\n : never\n >\n>;\n\ntype DependencyOutputRecordFromTracking<Tracking> =\n Tracking extends ServiceTrackingMetadata<\n infer Name extends string,\n any,\n infer Output,\n any,\n any,\n any,\n any,\n any\n >\n ? {\n [Key in Name]: Output extends WritableSignal<infer Value>\n ? Signal<Value> & Omit<Output, 'set' | 'update' | 'asReadonly'>\n : Output;\n }\n : never;\n\ntype GetServiceDependenciesTree<Target extends ServiceReference> =\n Target extends ServiceMetaData<\n any,\n any,\n any,\n any,\n infer Dependencies,\n any,\n any,\n any,\n any,\n any,\n boolean\n >\n ? Dependencies\n : GetServiceDependencies<Target>;\n\ntype RootServiceName<Target extends ServiceReference> = Extract<\n GetServiceReferenceMeta<Target>['name'],\n string\n>;\n\ntype RootServiceScope<Target extends ServiceReference> = Extract<\n GetServiceReferenceMeta<Target>['providedIn'],\n ConcreteServiceScope\n>;\n\ntype RootNodeRecord<Target extends ServiceReference> = {\n [Name in RootServiceName<Target>]: GetServiceDependenciesTree<Target>;\n};\n\ntype RegisterNodeMap<Target extends ServiceReference> = Simplify<\n RootNodeRecord<Target> & GetMergedServiceDependencyNodeMap<Target>\n>;\n\ntype RootOutputRecord<Target extends ServiceReference> = {\n [Name in RootServiceName<Target>]: GetServiceReferenceOutput<Target>;\n};\n\ntype DependencyOutputMap<Target extends ServiceReference> = Simplify<\n RootOutputRecord<Target> &\n FlattenedDependencyOutputRecordsFromTracking<\n GetServiceTrackingMetadata<Target>\n >\n>;\n\ntype DependencyOutputForName<\n Target extends ServiceReference,\n Name extends string,\n> = Name extends keyof DependencyOutputMap<Target>\n ? DependencyOutputMap<Target>[Name]\n : never;\n\ntype DependencyNodeDerivedPropertiesUsed<Node> = Node extends {\n derivedPropertiesUsed: infer Used extends object;\n}\n ? Used\n : {};\n\ntype RequiredUsedMockImplementation<UsedProperties extends object> = Simplify<{\n [Key in Extract<keyof UsedProperties, string>]-?: Key extends RootExposureKey\n ? UsedProperties[Key] extends (...args: any[]) => any\n ? CallableShell<UsedProperties[Key]>\n : never\n : UsedProperties[Key] extends (...args: any[]) => any\n ? UsedProperties[Key]\n : Simplify<UsedProperties[Key]>;\n}>;\n\ntype MockImplementation<Output> = Simplify<\n (Output extends object\n ? Partial<{\n [Key in Extract<keyof Output, string>]: Output[Key];\n }>\n : {}) &\n (Output extends (...args: any[]) => any\n ? { $self?: CallableShell<Output> }\n : {})\n>;\n\ntype CompleteMockImplementation<Output> = Simplify<\n (Output extends object\n ? {\n [Key in Extract<keyof Output, string>]-?: Output[Key];\n }\n : {}) &\n (Output extends (...args: any[]) => any\n ? { $self: CallableShell<Output> }\n : {})\n>;\n\ntype DependencyNodeUsesWholeService<Node> = Node extends {\n usesWholeService: true;\n}\n ? true\n : false;\n\ntype PartialMockOutputWithUsedOverrides<\n Output,\n Used extends object,\n> = Output extends object\n ? Partial<{\n [Key in Extract<keyof Output, string>]: Key extends keyof Used\n ? Used[Key]\n : Output[Key];\n }>\n : {};\n\ntype MockImplementationForNode<\n Target extends ServiceReference,\n Name extends string,\n Node,\n> =\n DependencyNodeUsesWholeService<Node> extends true\n ? CompleteMockImplementation<DependencyOutputForName<Target, Name>>\n : Simplify<\n PartialMockOutputWithUsedOverrides<\n DependencyOutputForName<Target, Name>,\n DependencyNodeDerivedPropertiesUsed<Node>\n > &\n (DependencyOutputForName<Target, Name> extends (...args: any[]) => any\n ? { $self?: CallableShell<DependencyOutputForName<Target, Name>> }\n : {}) &\n RequiredUsedMockImplementation<\n DependencyNodeDerivedPropertiesUsed<Node>\n >\n >;\n\ntype ProviderOverrideForNode<Name extends string, Node> =\n DependencyNodeScope<Node> extends RequirementScope\n ? BrandedServiceProvider<\n Name,\n Extract<DependencyNodeScope<Node>, RequirementScope>\n >\n : never;\n\ntype OpenMarkerForScope<Scope> =\n Extract<Scope, RequirementScope> extends never ? RegisterRealEntry : never;\n\ntype OpenRegisterEntryForNode<Name extends string, Node> =\n | ProviderOverrideForNode<Name, Node>\n | OpenMarkerForScope<DependencyNodeScope<Node>>;\n\ntype RegisterEntryForNode<\n Target extends ServiceReference,\n Name extends string,\n Node,\n> =\n | OpenRegisterEntryForNode<Name, Node>\n | MockImplementationForNode<Target, Name, Node>\n | RegisterNotReachedEntry;\n\ntype RootRegisterEntry<\n Target extends ServiceReference,\n Name extends RootServiceName<Target>,\n> =\n RootServiceScope<Target> extends RequirementScope\n ? ProviderOverrideForNode<Name, GetServiceDependenciesTree<Target>>\n : RegisterRealEntry;\n\ntype RegisterShapeForTarget<Target extends ServiceReference> = Simplify<{\n [Name in Extract<\n keyof RegisterNodeMap<Target>,\n string\n >]: Name extends RootServiceName<Target>\n ? RootRegisterEntry<Target, Extract<Name, RootServiceName<Target>>>\n : RegisterEntryForNode<Target, Name, RegisterNodeMap<Target>[Name]>;\n}>;\n\ntype RegisterEntryKind<Entry> = Entry extends RegisterNotReachedEntry\n ? 'notReached'\n : Entry extends RegisterRealEntry\n ? 'real'\n : Entry extends BrandedServiceProvider<any, any>\n ? 'provider'\n : 'mock';\n\ntype EntryOpensBranch<Node, Entry> =\n DependencyNodeScope<Node> extends RequirementScope\n ? Entry extends BrandedServiceProvider<any, any>\n ? true\n : false\n : Entry extends RegisterRealEntry\n ? true\n : false;\n\ntype ReachableNamesForTree<Tree extends object, Register extends object> = {\n [Name in Extract<keyof Tree, string>]: ReachableNamesForNode<\n Name,\n Tree[Name],\n Register\n >;\n}[Extract<keyof Tree, string>];\n\ntype ReachableNamesForNode<\n Name extends string,\n Node,\n Register extends object,\n> =\n | Name\n | (EntryOpensBranch<\n Node,\n Name extends keyof Register ? Register[Name] : never\n > extends true\n ? ReachableNamesForTree<DependencyTreeChildren<Node>, Register>\n : never);\n\ntype ReachableRegisterNames<\n Target extends ServiceReference,\n Register extends object,\n> = ReachableNamesForNode<\n RootServiceName<Target>,\n GetServiceDependenciesTree<Target>,\n Register\n>;\n\ntype RegisterNames<Target extends ServiceReference> = Extract<\n keyof RegisterShapeForTarget<Target>,\n string\n>;\n\ntype DependencyNodeAppStart<Node> = Node extends {\n appStart: infer AppStart extends boolean;\n}\n ? true extends AppStart\n ? true\n : false\n : false;\n\ntype DependencyNodeBrowserBoundary<Node> = Node extends {\n browserBoundary: infer BrowserBoundary extends boolean;\n}\n ? true extends BrowserBoundary\n ? true\n : false\n : false;\n\ntype DependencyNodeRequiresProvider<Node> =\n DependencyNodeScope<Node> extends RequirementScope ? true : false;\n\ntype RealReachableAppStartNames<\n ReachableNames extends string,\n NodeMap extends object,\n Register extends object,\n> = Extract<\n {\n [Name in ReachableNames]: Name extends keyof NodeMap\n ? DependencyNodeAppStart<NodeMap[Name]> extends true\n ? Name extends keyof Register\n ? Name extends MockedRegisterKeys<Register>\n ? never\n : RegisterEntryKind<Register[Name]> extends 'notReached'\n ? never\n : Name\n : never\n : never\n : never;\n }[ReachableNames],\n string\n>;\n\ntype RealReachableServiceAppStartNames<\n Target extends ServiceReference,\n Register extends object,\n> = RealReachableAppStartNames<\n Extract<ReachableRegisterNames<Target, Register>, string>,\n RegisterNodeMap<Target>,\n Register\n>;\n\ntype AppStartDecisionRecord<Names extends string> = Simplify<{\n [Name in Names]-?: AppStartDecision;\n}>;\n\ntype ReachableNotReachedNames<\n Target extends ServiceReference,\n Register extends object,\n> = Extract<\n {\n [Name in Extract<\n ReachableRegisterNames<Target, Register>,\n string\n >]: Name extends keyof Register\n ? RegisterEntryKind<Register[Name]> extends 'notReached'\n ? Name\n : never\n : Name;\n }[Extract<ReachableRegisterNames<Target, Register>, string>],\n string\n>;\n\ntype UnreachableNonNotReachedNames<\n Target extends ServiceReference,\n Register extends object,\n> = Extract<\n {\n [Name in Exclude<\n RegisterNames<Target>,\n Extract<ReachableRegisterNames<Target, Register>, string>\n >]: Name extends keyof Register\n ? RegisterEntryKind<Register[Name]> extends 'notReached'\n ? never\n : Name\n : never;\n }[Exclude<\n RegisterNames<Target>,\n Extract<ReachableRegisterNames<Target, Register>, string>\n >],\n string\n>;\n\ntype ExtraRegisterKeys<\n Target extends ServiceReference,\n Register extends object,\n> = Exclude<Extract<keyof Register, string>, RegisterNames<Target>>;\n\ntype InvalidRootRegisterValue<\n Target extends ServiceReference,\n Register extends object,\n> =\n RootServiceName<Target> extends keyof Register\n ? Register[RootServiceName<Target>] extends RootRegisterEntry<\n Target,\n RootServiceName<Target>\n >\n ? never\n : RootServiceName<Target>\n : RootServiceName<Target>;\n\ntype AssertValidRegister<\n Target extends ServiceReference,\n Register extends object,\n> = [ExtraRegisterKeys<Target, Register>] extends [never]\n ? [InvalidRootRegisterValue<Target, Register>] extends [never]\n ? [ReachableNotReachedNames<Target, Register>] extends [never]\n ? [UnreachableNonNotReachedNames<Target, Register>] extends [never]\n ? {}\n : {\n ERROR_register_entries_must_be_notReached: UnreachableNonNotReachedNames<\n Target,\n Register\n >;\n }\n : {\n ERROR_register_entries_cannot_be_notReached: ReachableNotReachedNames<\n Target,\n Register\n >;\n }\n : {\n ERROR_invalid_root_register_value: InvalidRootRegisterValue<\n Target,\n Register\n >;\n }\n : {\n ERROR_invalid_register_keys: ExtraRegisterKeys<Target, Register>;\n };\n\ntype SetupTestingRegister<Target extends ServiceReference> =\n RegisterShapeForTarget<Target>;\n\ntype BoundaryOnlyToProvideRegisterShape<NodeMap extends object> = Simplify<\n Partial<{\n [Name in Extract<keyof NodeMap, string> as DependencyNodeRequiresProvider<\n NodeMap[Name]\n > extends true\n ? Name\n : never]: ProviderOverrideForNode<Name, NodeMap[Name]>;\n }>\n>;\n\ntype ServiceBoundaryOnlyToProvideRegisterShape<\n Target extends ServiceReference,\n> = BoundaryOnlyToProvideRegisterShape<RegisterNodeMap<Target>>;\n\ntype ServiceBoundaryOnlyBoundaryRegisterShape<Target extends ServiceReference> =\n Simplify<\n Partial<{\n [Name in Extract<\n keyof RegisterNodeMap<Target>,\n string\n > as DependencyNodeBrowserBoundary<\n RegisterNodeMap<Target>[Name]\n > extends true\n ? Name extends RootServiceName<Target>\n ? never\n : Name\n : never]:\n | RegisterRealEntry\n | MockImplementationForNode<Target, Name, RegisterNodeMap<Target>[Name]>\n | RegisterNotReachedEntry;\n }>\n >;\n\ntype BoundaryOnlyRegisterKeys<Register extends object> = Extract<\n keyof Register,\n string\n>;\n\ntype BoundaryOnlyEntryOpensBranch<\n Name extends string,\n Node,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n ForcedRealNames extends string,\n> = Name extends ForcedRealNames\n ? DependencyNodeRequiresProvider<Node> extends true\n ? Name extends keyof ToProvideRegister\n ? true\n : false\n : true\n : DependencyNodeBrowserBoundary<Node> extends true\n ? Name extends keyof BoundaryRegister\n ? RegisterEntryKind<BoundaryRegister[Name]> extends 'real'\n ? true\n : false\n : false\n : DependencyNodeRequiresProvider<Node> extends true\n ? Name extends keyof ToProvideRegister\n ? true\n : false\n : true;\n\ntype BoundaryOnlyReachableNamesForTree<\n Tree extends object,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n ForcedRealNames extends string,\n> = {\n [Name in Extract<keyof Tree, string>]: BoundaryOnlyReachableNamesForNode<\n Name,\n Tree[Name],\n BoundaryRegister,\n ToProvideRegister,\n ForcedRealNames\n >;\n}[Extract<keyof Tree, string>];\n\ntype BoundaryOnlyReachableNamesForNode<\n Name extends string,\n Node,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n ForcedRealNames extends string,\n> =\n | Name\n | (BoundaryOnlyEntryOpensBranch<\n Name,\n Node,\n BoundaryRegister,\n ToProvideRegister,\n ForcedRealNames\n > extends true\n ? BoundaryOnlyReachableNamesForTree<\n DependencyTreeChildren<Node>,\n BoundaryRegister,\n ToProvideRegister,\n ForcedRealNames\n >\n : never);\n\ntype ServiceBoundaryOnlyReachableNames<\n Target extends ServiceReference,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n> = BoundaryOnlyReachableNamesForNode<\n RootServiceName<Target>,\n GetServiceDependenciesTree<Target>,\n BoundaryRegister,\n ToProvideRegister,\n RootServiceName<Target>\n>;\n\ntype BoundaryOnlyReachableBoundaryNames<\n ReachableNames extends string,\n NodeMap extends object,\n ForcedRealNames extends string,\n> = Extract<\n {\n [Name in ReachableNames]: Name extends keyof NodeMap\n ? Name extends ForcedRealNames\n ? never\n : DependencyNodeBrowserBoundary<NodeMap[Name]> extends true\n ? Name\n : never\n : never;\n }[ReachableNames],\n string\n>;\n\ntype ServiceBoundaryOnlyReachableBoundaryNames<\n Target extends ServiceReference,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n> = BoundaryOnlyReachableBoundaryNames<\n Extract<\n ServiceBoundaryOnlyReachableNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >,\n string\n >,\n RegisterNodeMap<Target>,\n RootServiceName<Target>\n>;\n\ntype BoundaryOnlyProviderNameNeedsProvider<\n Name extends string,\n Node,\n BoundaryRegister extends object,\n ForcedRealNames extends string,\n> =\n DependencyNodeRequiresProvider<Node> extends true\n ? Name extends ForcedRealNames\n ? Name\n : DependencyNodeBrowserBoundary<Node> extends true\n ? Name extends keyof BoundaryRegister\n ? RegisterEntryKind<BoundaryRegister[Name]> extends 'real'\n ? Name\n : never\n : never\n : Name\n : never;\n\ntype BoundaryOnlyRequiredProviderNames<\n ReachableNames extends string,\n NodeMap extends object,\n BoundaryRegister extends object,\n ForcedRealNames extends string,\n> = Extract<\n {\n [Name in ReachableNames]: Name extends keyof NodeMap\n ? BoundaryOnlyProviderNameNeedsProvider<\n Name,\n NodeMap[Name],\n BoundaryRegister,\n ForcedRealNames\n >\n : never;\n }[ReachableNames],\n string\n>;\n\ntype ServiceBoundaryOnlyRequiredProviderNames<\n Target extends ServiceReference,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n> = BoundaryOnlyRequiredProviderNames<\n Extract<\n ServiceBoundaryOnlyReachableNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >,\n string\n >,\n RegisterNodeMap<Target>,\n BoundaryRegister,\n RootServiceName<Target>\n>;\n\ntype BoundaryOnlyRealReachableAppStartNames<\n ReachableNames extends string,\n NodeMap extends object,\n BoundaryRegister extends object,\n ForcedRealNames extends string,\n> = Extract<\n {\n [Name in ReachableNames]: Name extends keyof NodeMap\n ? DependencyNodeAppStart<NodeMap[Name]> extends true\n ? Name extends ForcedRealNames\n ? Name\n : DependencyNodeBrowserBoundary<NodeMap[Name]> extends true\n ? Name extends keyof BoundaryRegister\n ? RegisterEntryKind<BoundaryRegister[Name]> extends 'real'\n ? Name\n : never\n : never\n : Name\n : never\n : never;\n }[ReachableNames],\n string\n>;\n\ntype ServiceBoundaryOnlyRealReachableAppStartNames<\n Target extends ServiceReference,\n BoundaryRegister extends object,\n ToProvideRegister extends object,\n> = BoundaryOnlyRealReachableAppStartNames<\n Extract<\n ServiceBoundaryOnlyReachableNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >,\n string\n >,\n RegisterNodeMap<Target>,\n BoundaryRegister,\n RootServiceName<Target>\n>;\n\ntype BoundaryOnlyReachableNotReachedBoundaryNames<\n ReachableBoundaryNames extends string,\n BoundaryRegister extends object,\n> = Extract<\n {\n [Name in ReachableBoundaryNames]: Name extends keyof BoundaryRegister\n ? RegisterEntryKind<BoundaryRegister[Name]> extends 'notReached'\n ? Name\n : never\n : never;\n }[ReachableBoundaryNames],\n string\n>;\n\ntype BoundaryOnlyUnreachableNonNotReachedBoundaryNames<\n BoundaryNames extends string,\n ReachableBoundaryNames extends string,\n BoundaryRegister extends object,\n> = Extract<\n {\n [Name in Exclude<\n Extract<keyof BoundaryRegister, string>,\n ReachableBoundaryNames\n >]: Name extends BoundaryNames\n ? RegisterEntryKind<BoundaryRegister[Name]> extends 'notReached'\n ? never\n : Name\n : never;\n }[Exclude<Extract<keyof BoundaryRegister, string>, ReachableBoundaryNames>],\n string\n>;\n\ntype BoundaryOnlyExtraRegisterKeys<\n Register extends object,\n Shape extends object,\n> = Exclude<\n BoundaryOnlyRegisterKeys<Register>,\n BoundaryOnlyRegisterKeys<Shape>\n>;\n\ntype BoundaryOnlyRequiredRecord<\n Names extends string,\n Shape extends object,\n> = Simplify<{\n [Name in Names]-?: Name extends keyof Shape ? Shape[Name] : never;\n}>;\n\ntype AssertValidBoundaryOnlyToProvideRegister<\n ToProvideRegister extends object,\n ToProvideShape extends object,\n> = [BoundaryOnlyExtraRegisterKeys<ToProvideRegister, ToProvideShape>] extends [\n never,\n]\n ? {}\n : {\n ERROR_invalid_toProvideRegister_keys: BoundaryOnlyExtraRegisterKeys<\n ToProvideRegister,\n ToProvideShape\n >;\n };\n\ntype AssertValidBoundaryOnlyBoundaryRegister<\n BoundaryRegister extends object,\n BoundaryShape extends object,\n ReachableBoundaryNames extends string,\n> = [BoundaryOnlyExtraRegisterKeys<BoundaryRegister, BoundaryShape>] extends [\n never,\n]\n ? [\n BoundaryOnlyReachableNotReachedBoundaryNames<\n ReachableBoundaryNames,\n BoundaryRegister\n >,\n ] extends [never]\n ? [\n BoundaryOnlyUnreachableNonNotReachedBoundaryNames<\n BoundaryOnlyRegisterKeys<BoundaryShape>,\n ReachableBoundaryNames,\n BoundaryRegister\n >,\n ] extends [never]\n ? {}\n : {\n ERROR_boundary_entries_must_be_notReached: BoundaryOnlyUnreachableNonNotReachedBoundaryNames<\n BoundaryOnlyRegisterKeys<BoundaryShape>,\n ReachableBoundaryNames,\n BoundaryRegister\n >;\n }\n : {\n ERROR_boundary_entries_cannot_be_notReached: BoundaryOnlyReachableNotReachedBoundaryNames<\n ReachableBoundaryNames,\n BoundaryRegister\n >;\n }\n : {\n ERROR_invalid_boundaryRegister_keys: BoundaryOnlyExtraRegisterKeys<\n BoundaryRegister,\n BoundaryShape\n >;\n };\n\ntype PublicMockShape<Implementation> = Implementation extends object\n ? Omit<Implementation, RootExposureKey>\n : {};\n\ntype MockRootCallable<Implementation> =\n NonNullable<Implementation> extends {\n $self: infer Root extends (...args: any[]) => any;\n }\n ? Root\n : never;\n\ntype MockPublicValueFromImplementation<Implementation> = [\n Implementation,\n] extends [undefined]\n ? {}\n : [MockRootCallable<Implementation>] extends [never]\n ? PublicMockShape<NonNullable<Implementation>>\n : MockRootCallable<Implementation> &\n PublicMockShape<NonNullable<Implementation>>;\n\ntype MockedRegisterKeys<Register extends object> = Extract<\n {\n [Name in Extract<keyof Register, string>]: Register[Name] extends\n | RegisterRealEntry\n | RegisterNotReachedEntry\n | BrandedServiceProvider<any, any>\n ? never\n : Name;\n }[Extract<keyof Register, string>],\n string\n>;\n\ntype CreateRegisterMocks<Register extends object> = Simplify<{\n [Name in MockedRegisterKeys<Register>]: MockPublicValueFromImplementation<\n Register[Name]\n >;\n}>;\n\ntype BaseServiceTestingByRegisterOptions<\n Bindings extends ServiceBindings<any> | undefined,\n> = {\n bindings?: Bindings;\n providers?: CraftServiceProvider[];\n appStart?: Record<string, AppStartDecision>;\n};\n\ntype ServiceTestingByRegisterOptionsParameter<\n Target extends ServiceReference,\n Register extends object,\n Bindings extends ServiceBindings<Target> | undefined,\n> = [RealReachableServiceAppStartNames<Target, Register>] extends [never]\n ? [options?: BaseServiceTestingByRegisterOptions<Bindings>]\n : [\n options: BaseServiceTestingByRegisterOptions<Bindings> & {\n appStart: AppStartDecisionRecord<\n RealReachableServiceAppStartNames<Target, Register>\n >;\n },\n ];\n\ntype BoundaryOnlyToProvideConfig<\n ToProvideRegister extends object,\n ToProvideShape extends object,\n RequiredProviderNames extends string,\n> = [RequiredProviderNames] extends [never]\n ? {\n toProvideRegister?: ToProvideRegister &\n AssertValidBoundaryOnlyToProvideRegister<\n ToProvideRegister,\n ToProvideShape\n >;\n }\n : {\n toProvideRegister: ToProvideRegister &\n BoundaryOnlyRequiredRecord<RequiredProviderNames, ToProvideShape> &\n AssertValidBoundaryOnlyToProvideRegister<\n ToProvideRegister,\n ToProvideShape\n >;\n };\n\ntype BoundaryOnlyBoundaryConfig<\n BoundaryRegister extends object,\n BoundaryShape extends object,\n ReachableBoundaryNames extends string,\n> = [ReachableBoundaryNames] extends [never]\n ? {\n boundaryRegister?: BoundaryRegister &\n AssertValidBoundaryOnlyBoundaryRegister<\n BoundaryRegister,\n BoundaryShape,\n ReachableBoundaryNames\n >;\n }\n : {\n boundaryRegister: BoundaryRegister &\n BoundaryOnlyRequiredRecord<ReachableBoundaryNames, BoundaryShape> &\n AssertValidBoundaryOnlyBoundaryRegister<\n BoundaryRegister,\n BoundaryShape,\n ReachableBoundaryNames\n >;\n };\n\ntype BoundaryOnlyAppStartConfig<AppStartNames extends string> = [\n AppStartNames,\n] extends [never]\n ? {\n appStart?: Record<string, AppStartDecision>;\n }\n : {\n appStart: AppStartDecisionRecord<AppStartNames>;\n };\n\ntype BaseServiceBoundaryOnlyTestingOptions<\n Bindings extends ServiceBindings<any> | undefined,\n> = {\n bindings?: Bindings;\n providers?: CraftServiceProvider[];\n};\n\ntype ServiceBoundaryOnlyTestingConfig<\n Target extends ServiceReference,\n ToProvideRegister extends object,\n BoundaryRegister extends object,\n Bindings extends ServiceBindings<Target> | undefined,\n> = Simplify<\n BaseServiceBoundaryOnlyTestingOptions<Bindings> &\n BoundaryOnlyToProvideConfig<\n ToProvideRegister,\n ServiceBoundaryOnlyToProvideRegisterShape<Target>,\n ServiceBoundaryOnlyRequiredProviderNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >\n > &\n BoundaryOnlyBoundaryConfig<\n BoundaryRegister,\n ServiceBoundaryOnlyBoundaryRegisterShape<Target>,\n ServiceBoundaryOnlyReachableBoundaryNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >\n > &\n BoundaryOnlyAppStartConfig<\n ServiceBoundaryOnlyRealReachableAppStartNames<\n Target,\n BoundaryRegister,\n ToProvideRegister\n >\n >\n>;\n\ntype RuntimeRegisterEntry =\n | BrandedServiceProvider<string, RequirementScope>\n | Record<string, unknown>\n | RegisterRealEntry\n | RegisterNotReachedEntry;\n\nfunction createMockPublicValue(implementation: unknown): unknown {\n return implementation === undefined\n ? {}\n : createExposedServiceValue(implementation);\n}\n\nfunction getProviderOverrideMeta(\n value: unknown,\n): { name: string; scope: RequirementScope } | undefined {\n if (\n typeof value !== 'object' ||\n value === null ||\n !(CRAFT_SERVICE_PROVIDER_BRAND in value)\n ) {\n return undefined;\n }\n\n return Reflect.get(value, CRAFT_SERVICE_PROVIDER_BRAND) as\n | { name: string; scope: RequirementScope }\n | undefined;\n}\n\nfunction isProviderOverride(\n value: unknown,\n): value is BrandedServiceProvider<string, RequirementScope> {\n return getProviderOverrideMeta(value) !== undefined;\n}\n\nfunction assertProviderOverrideName(name: string, provider: unknown) {\n const metaData = getProviderOverrideMeta(provider);\n\n if (!metaData) {\n throw new Error(`Expected a raw provider returned by provide${name}(...).`);\n }\n\n if (metaData.name !== name) {\n throw new Error(\n `Register entry \"${name}\" does not match provider value for \"${metaData.name}\".`,\n );\n }\n}\n\nfunction assertRootRuntimeEntry(\n rootName: string,\n rootScope: string,\n entry: RuntimeRegisterEntry | undefined,\n) {\n if (rootScope === 'toProvide' || rootScope === 'manuallyProvidedAtRoot') {\n if (!isProviderOverride(entry)) {\n throw new Error(\n `setupTestingService requires a real provider for the SUT \"${rootName}\".`,\n );\n }\n\n assertProviderOverrideName(rootName, entry);\n return;\n }\n\n if (entry !== 'real') {\n throw new Error(\n `setupTestingService requires \"${rootName}\" to be marked as \"real\".`,\n );\n }\n}\n\nfunction isRealRuntimeRegisterEntry(entry: RuntimeRegisterEntry | undefined) {\n return entry === 'real' || isProviderOverride(entry);\n}\n\nfunction isPrunedOrMockedRuntimeRegisterEntry(\n entry: RuntimeRegisterEntry | undefined,\n) {\n return (\n entry === undefined ||\n entry === 'notReached' ||\n (entry !== 'real' && !isProviderOverride(entry))\n );\n}\n\ntype BoundaryOnlyRuntimeConfig = {\n toProvideRegister?: Record<string, RuntimeRegisterEntry>;\n boundaryRegister?: Record<string, RuntimeRegisterEntry>;\n appStart?: Record<string, AppStartDecision>;\n};\n\nfunction createBoundaryOnlyRuntimeRegister(\n config: BoundaryOnlyRuntimeConfig,\n root?: { name: string; scope: string },\n) {\n const toProvideRegister = config.toProvideRegister ?? {};\n const boundaryRegister = config.boundaryRegister ?? {};\n const register: Record<string, RuntimeRegisterEntry> = {\n ...toProvideRegister,\n };\n\n assertBoundaryOnlyToProvideEntries(toProvideRegister);\n\n if (root) {\n if (root.scope === 'toProvide' || root.scope === 'manuallyProvidedAtRoot') {\n if (toProvideRegister[root.name]) {\n register[root.name] = toProvideRegister[root.name];\n }\n } else {\n register[root.name] = 'real';\n }\n }\n\n assertBoundaryOnlyRegisterEntries(boundaryRegister, toProvideRegister);\n\n for (const [name, entry] of Object.entries(boundaryRegister)) {\n if (entry === 'real' && toProvideRegister[name]) {\n register[name] = toProvideRegister[name];\n continue;\n }\n\n register[name] = entry;\n }\n\n for (const name of Object.keys(config.appStart ?? {})) {\n register[name] ??= 'real';\n }\n\n return register;\n}\n\nfunction assertBoundaryOnlyToProvideEntries(\n toProvideRegister: Record<string, RuntimeRegisterEntry>,\n) {\n for (const [name, entry] of Object.entries(toProvideRegister)) {\n if (!isProviderOverride(entry)) {\n throw new Error(\n `boundaryOnly toProvideRegister entry \"${name}\" must be a provider returned by provide${name}(...).`,\n );\n }\n\n assertProviderOverrideName(name, entry);\n }\n}\n\nfunction assertBoundaryOnlyRegisterEntries(\n boundaryRegister: Record<string, RuntimeRegisterEntry>,\n toProvideRegister: Record<string, RuntimeRegisterEntry>,\n) {\n const registeredServices = new Map(\n getRegisteredServices().map((reference) => {\n const metaData = getServiceMetaData(reference);\n return [metaData.name, metaData] as const;\n }),\n );\n\n for (const [name, entry] of Object.entries(boundaryRegister)) {\n const metaData = registeredServices.get(name);\n\n if (!metaData?.browserBoundary) {\n throw new Error(\n `boundaryOnly boundaryRegister entry \"${name}\" is not a craftService configured with browserBoundary: true.`,\n );\n }\n\n if (isProviderOverride(entry)) {\n throw new Error(\n `boundaryOnly boundaryRegister entry \"${name}\" cannot be a provider. Use boundaryRegister.${name}: \"real\" with toProvideRegister.${name}.`,\n );\n }\n\n if (\n entry === 'real' &&\n (metaData.providedIn === 'toProvide' ||\n metaData.providedIn === 'manuallyProvidedAtRoot') &&\n !toProvideRegister[name]\n ) {\n throw new Error(\n `boundaryOnly requires toProvideRegister.${name} when boundaryRegister.${name} is \"real\".`,\n );\n }\n }\n}\n\nfunction createRegisterTestingContext(\n register: Record<string, RuntimeRegisterEntry>,\n optionsProviders: CraftServiceProvider[] | undefined,\n root?: { name: string; scope: string },\n) {\n const providers = [...(optionsProviders ?? [])];\n const runtimeOverrides = new Map<\n string,\n { kind: 'useValue'; value: unknown }\n >();\n const mocks: Record<string, unknown> = {};\n\n if (root) {\n const rootEntry = register[root.name];\n\n assertRootRuntimeEntry(root.name, root.scope, rootEntry);\n }\n\n for (const [name, entry] of Object.entries(register)) {\n if (root && name === root.name) {\n if (isProviderOverride(entry)) {\n providers.push(entry);\n }\n\n continue;\n }\n\n if (entry === 'real' || entry === 'notReached') {\n continue;\n }\n\n if (isProviderOverride(entry)) {\n assertProviderOverrideName(name, entry);\n providers.push(entry);\n continue;\n }\n\n const publicValue = createMockPublicValue(entry);\n\n runtimeOverrides.set(name, {\n kind: 'useValue',\n value: publicValue,\n });\n mocks[name] = publicValue;\n }\n\n providers.push({\n provide: SERVICE_RUNTIME_OVERRIDES,\n useValue: runtimeOverrides,\n });\n\n return {\n providers,\n mocks,\n };\n}\n\nfunction createTestingInjector(providers: CraftServiceProvider[]) {\n const environmentInjector = createEnvironmentInjector(\n [\n { provide: ɵINJECTOR_SCOPE, useValue: 'root' },\n ...providers,\n ],\n Injector.NULL as EnvironmentInjector,\n 'CraftServiceTestingByRegister',\n );\n const injector = ɵcraftInjectorFromHost(environmentInjector);\n\n return {\n environmentInjector,\n injector,\n run<T>(fn: () => T): T {\n return injector.run(() => runInInjectionContext(environmentInjector, fn));\n },\n };\n}\n\nasync function runConfiguredAppStartHooks(\n register: Record<string, RuntimeRegisterEntry>,\n appStart: Record<string, AppStartDecision> | undefined,\n helperName: string,\n testingInjector: ReturnType<typeof createTestingInjector>,\n) {\n const appStartReferences = new Map(\n getRegisteredAppStartServices().map((reference) => {\n const metaData = getServiceMetaData(reference);\n return [metaData.name, reference] as const;\n }),\n );\n const missingDecisions = Array.from(appStartReferences)\n .filter(([name]) => isRealRuntimeRegisterEntry(register[name]))\n .filter(([name]) => appStart?.[name] === undefined)\n .map(([name]) => name);\n\n if (missingDecisions.length > 0) {\n throw new Error(\n `${helperName} requires options.appStart decisions for: ${missingDecisions.join(\n ', ',\n )}.`,\n );\n }\n\n if (!appStart) {\n return;\n }\n\n await testingInjector.run(async () => {\n for (const [name, decision] of Object.entries(appStart)) {\n if (decision !== 'run' && decision !== 'ignore') {\n throw new Error(\n `Invalid appStart decision for \"${name}\". Expected \"run\" or \"ignore\".`,\n );\n }\n\n const registerEntry = register[name];\n\n if (isPrunedOrMockedRuntimeRegisterEntry(registerEntry)) {\n continue;\n }\n\n const reference = appStartReferences.get(name);\n\n if (!reference) {\n throw new Error(\n `Register entry \"${name}\" is not a craftService configured with appStart: true.`,\n );\n }\n\n if (decision === 'ignore') {\n continue;\n }\n\n const metaData = getServiceMetaData(reference);\n const instance = metaData.inject();\n await waitForAppStartResult(runServiceAppStart(reference, instance));\n }\n });\n}\n\nasync function waitForAppStartResult(result: unknown): Promise<void> {\n if (isPromiseLike(result)) {\n await result;\n return;\n }\n\n if (isObservableLike(result)) {\n await new Promise<void>((resolve, reject) => {\n // The completion callback may run synchronously during subscribe.\n // eslint-disable-next-line prefer-const\n let subscription: unknown;\n const complete = () => {\n if (subscription && typeof subscription === 'object') {\n const unsubscribe = Reflect.get(subscription, 'unsubscribe');\n if (typeof unsubscribe === 'function') {\n Reflect.apply(unsubscribe, subscription, []);\n }\n }\n\n resolve();\n };\n\n subscription = result.subscribe({\n error: reject,\n complete,\n });\n });\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nfunction isObservableLike(value: unknown): value is {\n subscribe: (observer: {\n error: (error: unknown) => void;\n complete: () => void;\n }) => unknown;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'subscribe' in value &&\n typeof value.subscribe === 'function'\n );\n}\n\n/**\n * Sets up a crafted service from an explicit flat register derived from its full\n * dependency graph.\n *\n * Each dependency must be present in the register and resolved as one of:\n * - a real provider for `toProvide` / `manuallyProvidedAtRoot`\n * - the literal `\"real\"` for non-provider scopes\n * - a raw mock object\n * - the literal `\"notReached\"` when the node is fully pruned by mocked ancestors\n *\n * The returned `sut` is the resolved root service. The returned `mocks` object\n * only contains entries for dependencies that were actually mocked with raw\n * objects.\n *\n * @example\n * ```ts\n * const { sut, mocks } = await setupCraftServiceTestingByRegister(\n * CounterConsumer,\n * {\n * CounterConsumer: provideCounterConsumer(),\n * Counter: {\n * $self: vi.fn(() => 41),\n * increment: vi.fn(),\n * },\n * },\n * );\n *\n * expect(sut.read()).toBe(41);\n * expect(mocks.Counter.increment).toBeDefined();\n * ```\n */\nasync function setupCraftServiceTestingByRegisterImpl<\n Target extends ServiceReference,\n const Register extends SetupTestingRegister<Target>,\n Bindings extends ServiceBindings<Target> | undefined = undefined,\n>(\n target: Target,\n register: Register & AssertValidRegister<Target, Register>,\n ...[options]: ServiceTestingByRegisterOptionsParameter<\n Target,\n Register,\n Bindings\n >\n): Promise<{\n sut: ResolvedServiceOutput<Target, Bindings>;\n mocks: CreateRegisterMocks<Register>;\n injector: CraftInjector;\n}> {\n const internalMetaData = getServiceMetaData(target);\n const runtimeRegister = register as Record<string, RuntimeRegisterEntry>;\n const { providers, mocks } = createRegisterTestingContext(\n runtimeRegister,\n options?.providers,\n {\n name: internalMetaData.name,\n scope: internalMetaData.providedIn,\n },\n );\n\n const testingInjector = createTestingInjector(providers);\n const result = testingInjector.run(() => ({\n sut:\n options?.bindings === undefined\n ? internalMetaData.inject()\n : internalMetaData.inject(options.bindings),\n mocks,\n injector: testingInjector.injector,\n })) as {\n sut: ResolvedServiceOutput<Target, Bindings>;\n mocks: CreateRegisterMocks<Register>;\n injector: CraftInjector;\n };\n\n await runConfiguredAppStartHooks(\n runtimeRegister,\n options?.appStart,\n 'setupCraftServiceTestingByRegister',\n testingInjector,\n );\n\n return result;\n}\n\nasync function setupCraftServiceTestingByRegisterBoundaryOnly<\n Target extends ServiceReference,\n const ToProvideRegister extends object = {},\n const BoundaryRegister extends object = {},\n Bindings extends ServiceBindings<Target> | undefined = undefined,\n>(\n target: Target,\n config: ServiceBoundaryOnlyTestingConfig<\n Target,\n ToProvideRegister,\n BoundaryRegister,\n Bindings\n > & {\n toProvideRegister?: ToProvideRegister;\n boundaryRegister?: BoundaryRegister;\n },\n): Promise<{\n sut: ResolvedServiceOutput<Target, Bindings>;\n mocks: CreateRegisterMocks<BoundaryRegister>;\n injector: CraftInjector;\n}> {\n const internalMetaData = getServiceMetaData(target);\n const runtimeRegister = createBoundaryOnlyRuntimeRegister(\n {\n toProvideRegister: config.toProvideRegister as\n | Record<string, RuntimeRegisterEntry>\n | undefined,\n boundaryRegister: config.boundaryRegister as\n | Record<string, RuntimeRegisterEntry>\n | undefined,\n appStart: config.appStart,\n },\n {\n name: internalMetaData.name,\n scope: internalMetaData.providedIn,\n },\n );\n const { providers, mocks } = createRegisterTestingContext(\n runtimeRegister,\n config.providers,\n {\n name: internalMetaData.name,\n scope: internalMetaData.providedIn,\n },\n );\n\n const testingInjector = createTestingInjector(providers);\n const result = testingInjector.run(() => ({\n sut:\n config.bindings === undefined\n ? internalMetaData.inject()\n : internalMetaData.inject(config.bindings),\n mocks,\n injector: testingInjector.injector,\n })) as {\n sut: ResolvedServiceOutput<Target, Bindings>;\n mocks: CreateRegisterMocks<BoundaryRegister>;\n injector: CraftInjector;\n };\n\n await runConfiguredAppStartHooks(\n runtimeRegister,\n config.appStart,\n 'setupCraftServiceTestingByRegister.boundaryOnly',\n testingInjector,\n );\n\n return result;\n}\n\nexport const setupCraftServiceTestingByRegister = Object.assign(\n setupCraftServiceTestingByRegisterImpl,\n {\n boundaryOnly: setupCraftServiceTestingByRegisterBoundaryOnly,\n },\n);\n\n/** Backward-compatible alias for `setupCraftServiceTestingByRegister`. */\nexport const setupTestingService = setupCraftServiceTestingByRegister;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Signal } from './host/craft-compat';
|
|
2
|
+
import { MergeObject } from './util/types/util.type';
|
|
3
|
+
type AnyRecord = Record<PropertyKey, unknown>;
|
|
4
|
+
export type SignalWrapperParams<T extends object> = {
|
|
5
|
+
readonly [K in keyof T]: T[K] extends Signal<infer U> ? Signal<U> : Signal<T[K]>;
|
|
6
|
+
};
|
|
7
|
+
export type SignalProxy<T extends object, Public extends boolean = false> = MergeObject<{
|
|
8
|
+
readonly [K in keyof T]: T[K] extends Signal<infer U> ? Signal<U> : Signal<T[K]>;
|
|
9
|
+
}, Public extends true ? {
|
|
10
|
+
/** Readonly access to the whole object as a Signal<T> */
|
|
11
|
+
readonly $raw: Signal<T>;
|
|
12
|
+
/** Replace the whole object */
|
|
13
|
+
$set(next: SignalWrapperParams<T>): void;
|
|
14
|
+
/** Update the object with partial values */
|
|
15
|
+
$patch(partial: Partial<SignalWrapperParams<T>>): void;
|
|
16
|
+
/** Get the raw property (Signal or plain value) from the current object */
|
|
17
|
+
$ref<K extends keyof T>(key: K): T[K];
|
|
18
|
+
} : {}>;
|
|
19
|
+
export declare function createSignalProxy<T extends AnyRecord>(src: T | Signal<T>): SignalProxy<T, true>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=signal-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-proxy.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/signal-proxy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAA8B,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,KAAK,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI;IAClD,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACjD,MAAM,CAAC,CAAC,CAAC,GACT,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,CACrB,CAAC,SAAS,MAAM,EAChB,MAAM,SAAS,OAAO,GAAG,KAAK,IAC5B,WAAW,CACb;IAEE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACjD,MAAM,CAAC,CAAC,CAAC,GACT,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACjB,EACD,MAAM,SAAS,IAAI,GACf;IACE,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzB,+BAA+B;IAC/B,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEzC,4CAA4C;IAC5C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEvD,2EAA2E;IAC3E,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;CACvC,GACD,EAAE,CACP,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,SAAS,EACnD,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GACjB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAkFtB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// signal-proxy.ts
|
|
2
|
+
// Purpose: Signal proxy that exposes read signals per property + write helpers for the underlying source signal.
|
|
3
|
+
import { signal, computed, isSignal } from './host/craft-compat';
|
|
4
|
+
export function createSignalProxy(src) {
|
|
5
|
+
const state = isSignal(src) ? src : signal(src);
|
|
6
|
+
// Cache property computed signals for referential stability
|
|
7
|
+
const cache = new Map();
|
|
8
|
+
const api = {
|
|
9
|
+
$raw: state,
|
|
10
|
+
$set(next) {
|
|
11
|
+
// Replace whole object
|
|
12
|
+
if (state.set) {
|
|
13
|
+
state.set(next);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
state(next);
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
$patch(partial) {
|
|
20
|
+
// Merge partial with current state
|
|
21
|
+
const current = state();
|
|
22
|
+
const updated = { ...current, ...partial };
|
|
23
|
+
if (state.set) {
|
|
24
|
+
state.set(updated);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
state(updated);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
$ref(key) {
|
|
31
|
+
return state()[key];
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const handler = {
|
|
35
|
+
get(_target, prop) {
|
|
36
|
+
// Expose write API and $raw directly
|
|
37
|
+
if (prop in api)
|
|
38
|
+
return api[prop];
|
|
39
|
+
if (prop === 'toJSON' ||
|
|
40
|
+
prop === 'valueOf' ||
|
|
41
|
+
prop === Symbol.toStringTag) {
|
|
42
|
+
return state()[prop];
|
|
43
|
+
}
|
|
44
|
+
if (cache.has(prop))
|
|
45
|
+
return cache.get(prop);
|
|
46
|
+
// Computed read signal for property, unwrapping nested signals
|
|
47
|
+
const s = computed(() => {
|
|
48
|
+
const current = state()[prop];
|
|
49
|
+
return isSignal(current) ? current() : current;
|
|
50
|
+
});
|
|
51
|
+
cache.set(prop, s);
|
|
52
|
+
return s;
|
|
53
|
+
},
|
|
54
|
+
ownKeys() {
|
|
55
|
+
return Reflect.ownKeys(state());
|
|
56
|
+
},
|
|
57
|
+
has(_t, prop) {
|
|
58
|
+
return prop in api || prop in state();
|
|
59
|
+
},
|
|
60
|
+
getOwnPropertyDescriptor(_t, prop) {
|
|
61
|
+
if (prop in api) {
|
|
62
|
+
return {
|
|
63
|
+
configurable: true,
|
|
64
|
+
enumerable: false,
|
|
65
|
+
writable: false,
|
|
66
|
+
value: api[prop],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
configurable: true,
|
|
71
|
+
enumerable: true,
|
|
72
|
+
writable: false,
|
|
73
|
+
value: this.get?.({}, prop),
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
return new Proxy({}, handler);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=signal-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-proxy.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/signal-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["// signal-proxy.ts\n// Purpose: Signal proxy that exposes read signals per property + write helpers for the underlying source signal.\n\nimport { Signal, signal, computed, isSignal } from './host/craft-compat';\nimport { MergeObject } from './util/types/util.type';\n\ntype AnyRecord = Record<PropertyKey, unknown>;\n\nexport type SignalWrapperParams<T extends object> = {\n readonly [K in keyof T]: T[K] extends Signal<infer U>\n ? Signal<U>\n : Signal<T[K]>;\n};\n\nexport type SignalProxy<\n T extends object,\n Public extends boolean = false\n> = MergeObject<\n {\n // For each property, you read it as a Signal of its final value (signals unwrapped).\n readonly [K in keyof T]: T[K] extends Signal<infer U>\n ? Signal<U>\n : Signal<T[K]>;\n },\n Public extends true\n ? {\n /** Readonly access to the whole object as a Signal<T> */\n readonly $raw: Signal<T>;\n\n /** Replace the whole object */\n $set(next: SignalWrapperParams<T>): void;\n\n /** Update the object with partial values */\n $patch(partial: Partial<SignalWrapperParams<T>>): void;\n\n /** Get the raw property (Signal or plain value) from the current object */\n $ref<K extends keyof T>(key: K): T[K];\n }\n : {}\n>;\n\nexport function createSignalProxy<T extends AnyRecord>(\n src: T | Signal<T>\n): SignalProxy<T, true> {\n const state: Signal<T> = isSignal(src) ? src : signal(src as T);\n\n // Cache property computed signals for referential stability\n const cache = new Map<PropertyKey, Signal<unknown>>();\n\n const api = {\n $raw: state,\n $set(next: T) {\n // Replace whole object\n if ((state as any).set) {\n (state as any).set(next);\n } else {\n (state as any)(next);\n }\n },\n $patch(partial: Partial<T>) {\n // Merge partial with current state\n const current = state();\n const updated = { ...current, ...partial };\n if ((state as any).set) {\n (state as any).set(updated);\n } else {\n (state as any)(updated);\n }\n },\n $ref<K extends keyof T>(key: K): T[K] {\n return (state() as any)[key];\n },\n };\n\n const handler: ProxyHandler<object> = {\n get(_target, prop: PropertyKey) {\n // Expose write API and $raw directly\n if (prop in api) return (api as any)[prop];\n\n if (\n prop === 'toJSON' ||\n prop === 'valueOf' ||\n prop === Symbol.toStringTag\n ) {\n return (state() as any)[prop];\n }\n\n if (cache.has(prop)) return cache.get(prop);\n\n // Computed read signal for property, unwrapping nested signals\n const s = computed(() => {\n const current = (state() as any)[prop];\n return isSignal(current) ? current() : current;\n });\n\n cache.set(prop, s);\n return s;\n },\n\n ownKeys() {\n return Reflect.ownKeys(state() as object);\n },\n has(_t, prop) {\n return prop in api || prop in (state() as object);\n },\n\n getOwnPropertyDescriptor(_t, prop) {\n if (prop in api) {\n return {\n configurable: true,\n enumerable: false,\n writable: false,\n value: (api as any)[prop],\n };\n }\n return {\n configurable: true,\n enumerable: true,\n writable: false,\n value: (this as any).get?.({}, prop),\n };\n },\n };\n\n return new Proxy({}, handler) as SignalProxy<T, true>;\n}\n"]}
|