@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,229 @@
|
|
|
1
|
+
import type { Simplify, UnionToTuple } from './craft-service.shared';
|
|
2
|
+
import type { MissingProvidersFromDepsMap } from './branded-component/branded-component';
|
|
3
|
+
import type { NamedBrandedServiceProvider } from './craft-service';
|
|
4
|
+
import type { AppConfigProvidedDependencyValuesKey, AppConfigProvidedServiceNamesKey } from './craft-app-config';
|
|
5
|
+
/**
|
|
6
|
+
* `RouteCheckedDI` is a per-route DI validation primitive meant to be used as
|
|
7
|
+
* an alternative to `AppCheckedDI` when route volume makes the global check
|
|
8
|
+
* brittle (TS2589).
|
|
9
|
+
*
|
|
10
|
+
* Where `AppCheckedDI` iterates over every route to build a global proof, this
|
|
11
|
+
* type performs a **local** check: given a component dependency contract and
|
|
12
|
+
* the set of provider names (and optionally provided value types) reachable
|
|
13
|
+
* from this route's ancestors, it returns either `true` or the list of error
|
|
14
|
+
* messages. Functional components expose that contract through
|
|
15
|
+
* `ComponentDepsOf<typeof MyComponent>`; decorated Angular components can
|
|
16
|
+
* still pass their legacy generated `GenDeps_*` alias.
|
|
17
|
+
*
|
|
18
|
+
* Recommended placement (used by the type-stress generator): the check lives
|
|
19
|
+
* **in the route file** — i.e. alongside the `craftRoutes(...)` call that
|
|
20
|
+
* wires the component to a path — rather than in the component file. This
|
|
21
|
+
* keeps components pure and groups all DI validation for a feature in one
|
|
22
|
+
* place.
|
|
23
|
+
*
|
|
24
|
+
* Typical use (chained at generation time):
|
|
25
|
+
*
|
|
26
|
+
* // app.config.ts
|
|
27
|
+
* export const appConfig = craftAppConfig({ providers: [...] });
|
|
28
|
+
* export type AppProvidedNames = AppProvidedServiceNamesOf<typeof appConfig>;
|
|
29
|
+
* export type AppProvidedValues = AppProvidedDependencyValuesOf<typeof appConfig>;
|
|
30
|
+
*
|
|
31
|
+
* // feature-x.routes.ts
|
|
32
|
+
* import type { GenDeps_FeatureXCompYComponent } from './FeatureXCompYComponent';
|
|
33
|
+
* import type { AppProvidedNames, AppProvidedValues } from '../../../app.config';
|
|
34
|
+
*
|
|
35
|
+
* export const { featureXRoutes } = craftRoutes('featureX', [
|
|
36
|
+
* { path: 'item-0', providers: [provideFeatureXRouteService()],
|
|
37
|
+
* loadComponent: () => import('./FeatureXCompYComponent').then(m => m.FeatureXCompYComponent),
|
|
38
|
+
* componentDeps: {} as GenDeps_FeatureXCompYComponent },
|
|
39
|
+
* ]);
|
|
40
|
+
*
|
|
41
|
+
* export type FeatureXRouteProvidedNames = AppProvidedNames | 'FeatureXRouteService';
|
|
42
|
+
* export type FeatureXRouteProvidedValues = AppProvidedValues;
|
|
43
|
+
*
|
|
44
|
+
* // Cascade DI check — name union derived from GenDeps.provided so it stays
|
|
45
|
+
* // in sync with @Component.providers (via the `brand-angular-deps-match`
|
|
46
|
+
* // ESLint rule).
|
|
47
|
+
* type FeatureXCompYComponentProvidedNames =
|
|
48
|
+
* | FeatureXRouteProvidedNames
|
|
49
|
+
* | Extract<keyof GenDeps_FeatureXCompYComponent['provided'], string>;
|
|
50
|
+
* type _Check = RouteCheckedDI<
|
|
51
|
+
* GenDeps_FeatureXCompYComponent,
|
|
52
|
+
* FeatureXCompYComponentProvidedNames,
|
|
53
|
+
* FeatureXRouteProvidedValues,
|
|
54
|
+
* 'FeatureXCompYComponent'
|
|
55
|
+
* >;
|
|
56
|
+
* type _CanRun = CanRun<_Check>;
|
|
57
|
+
*
|
|
58
|
+
* Trade-offs vs `AppCheckedDI`:
|
|
59
|
+
* - Pro: O(1) per route, no recursion over routes — scales indefinitely.
|
|
60
|
+
* - Pro: Errors surface in the route file, not in `main.ts`.
|
|
61
|
+
* - Con: Each ancestor (app, parent route) must explicitly re-export its
|
|
62
|
+
* cumulative provider names. The generator handles this; hand-written
|
|
63
|
+
* routes must thread the types manually.
|
|
64
|
+
* - Note: The check reads from `GenDeps.provided`. Drift between
|
|
65
|
+
* `@Component.providers` (runtime) and `GenDeps.provided` (type-level) is
|
|
66
|
+
* detected (and auto-fixed) by the `craft-ts/brand-angular-deps-match`
|
|
67
|
+
* ESLint rule. Running `lint` (or `lint --fix`) before `typecheck` is what
|
|
68
|
+
* closes the loop end-to-end.
|
|
69
|
+
*/
|
|
70
|
+
type DepsMap<Input> = Input extends {
|
|
71
|
+
deps: infer Deps extends object;
|
|
72
|
+
} ? Deps : {};
|
|
73
|
+
type ProvidedMap<Input> = Input extends {
|
|
74
|
+
provided: infer Provided extends object;
|
|
75
|
+
} ? Provided : {};
|
|
76
|
+
type PublicPropertiesMap<Input> = Input extends {
|
|
77
|
+
publicProperties: infer PublicProperties extends object;
|
|
78
|
+
} ? PublicProperties : {};
|
|
79
|
+
type MissingProviderMap<Input> = Input extends {
|
|
80
|
+
missingProvider: infer MissingProvider extends object;
|
|
81
|
+
} ? MissingProvider : Simplify<Omit<MissingProvidersFromDepsMap<DepsMap<Input>>, keyof ProvidedMap<Input>>>;
|
|
82
|
+
type InputErrorMessage<Name extends string, Context extends string> = `Input "${Name}" is not provided in ${Context}`;
|
|
83
|
+
type InjectedErrorMessage<Name extends string, Context extends string> = `The ${Name} service is not provided in ${Context}`;
|
|
84
|
+
type InputErrorMessagesFromNames<Names extends readonly unknown[], Context extends string> = Names extends readonly [infer Head extends string, ...infer Tail] ? [
|
|
85
|
+
InputErrorMessage<Head, Context>,
|
|
86
|
+
...InputErrorMessagesFromNames<Tail, Context>
|
|
87
|
+
] : [];
|
|
88
|
+
type InjectedErrorMessagesFromNames<Names extends readonly unknown[], Context extends string> = Names extends readonly [infer Head extends string, ...infer Tail] ? [
|
|
89
|
+
InjectedErrorMessage<Head, Context>,
|
|
90
|
+
...InjectedErrorMessagesFromNames<Tail, Context>
|
|
91
|
+
] : [];
|
|
92
|
+
/**
|
|
93
|
+
* Fail closed when provider-name extraction widens to `string`.
|
|
94
|
+
*
|
|
95
|
+
* `RouteCheckedDI` removes missing providers by their names. If the available
|
|
96
|
+
* names become `string`, that removal hides every missing provider and turns a
|
|
97
|
+
* broken DI graph into `true`. This guard keeps that type-level failure
|
|
98
|
+
* visible until the provider extraction is corrected.
|
|
99
|
+
*/
|
|
100
|
+
type WidenedProviderNamesError<AvailableProviderNames extends string> = string extends AvailableProviderNames ? [
|
|
101
|
+
'Available provider names widened to string; type-safe DI validation is unavailable'
|
|
102
|
+
] : [];
|
|
103
|
+
/**
|
|
104
|
+
* From a component's `MissingProviderMap`, remove entries whose name is in the
|
|
105
|
+
* available provider names union (covers `provide{Name}()` calls anywhere in
|
|
106
|
+
* the ancestor chain).
|
|
107
|
+
*/
|
|
108
|
+
type StripByNames<MissingProviders extends object, AvailableNames extends string> = Simplify<Omit<MissingProviders, AvailableNames>>;
|
|
109
|
+
/**
|
|
110
|
+
* From a `MissingProviderMap`, find entries whose dependency type is
|
|
111
|
+
* structurally assignable from one of the `ProvidedValues` (e.g. `Router`
|
|
112
|
+
* provided by `provideCraftRouter`). Returns the union of those names.
|
|
113
|
+
*/
|
|
114
|
+
type NamesMatchingProvidedValues<MissingProviders extends object, ProvidedValues> = {
|
|
115
|
+
[Name in Extract<keyof MissingProviders, string>]: MissingProviders[Name] extends ProvidedValues ? Name : never;
|
|
116
|
+
}[Extract<keyof MissingProviders, string>];
|
|
117
|
+
/**
|
|
118
|
+
* Final missing providers after stripping by name AND by value type.
|
|
119
|
+
* Mirrors the logic of `AppMissingProviderMap` but operates on a flat union
|
|
120
|
+
* of provider names instead of an `AppRoutes` tuple.
|
|
121
|
+
*/
|
|
122
|
+
type ResolvedMissing<ComponentDeps, AvailableNames extends string, ProvidedValues> = Simplify<Omit<StripByNames<MissingProviderMap<ComponentDeps>, AvailableNames>, NamesMatchingProvidedValues<StripByNames<MissingProviderMap<ComponentDeps>, AvailableNames>, ProvidedValues>>>;
|
|
123
|
+
/**
|
|
124
|
+
* Validates a component's DI graph against an explicit set of available
|
|
125
|
+
* provider names (and optionally a set of provided dependency value types).
|
|
126
|
+
*
|
|
127
|
+
* Returns `true` if everything is satisfied, or a tuple of error messages
|
|
128
|
+
* (suitable as a constraint argument to `CanRun`).
|
|
129
|
+
*
|
|
130
|
+
* @template ComponentDeps - The component's `GenDeps_*` type (must expose
|
|
131
|
+
* `missingProvider` and/or `publicProperties`).
|
|
132
|
+
* @template AvailableProviderNames - Union of service names provided by app
|
|
133
|
+
* config + parent route providers + this component's own providers.
|
|
134
|
+
* @template ProvidedValues - Optional. Union of provided dependency value
|
|
135
|
+
* types (e.g. `Router` instance from `provideCraftRouter`). Defaults to
|
|
136
|
+
* `never` (no value-type matching).
|
|
137
|
+
* @template Context - Human-readable context used in error messages. Defaults
|
|
138
|
+
* to `'this component'`. Generators typically pass the component name.
|
|
139
|
+
*/
|
|
140
|
+
export type RouteCheckedDI<ComponentDeps, AvailableProviderNames extends string, ProvidedValues = never, Context extends string = 'this component', AvailableInputNames extends string = never> = string extends AvailableProviderNames ? WidenedProviderNamesError<AvailableProviderNames> : [
|
|
141
|
+
...InputErrorMessagesFromNames<UnionToTuple<Exclude<Extract<keyof PublicPropertiesMap<ComponentDeps>, string>, AvailableInputNames>>, Context>,
|
|
142
|
+
...InjectedErrorMessagesFromNames<UnionToTuple<Extract<keyof ResolvedMissing<ComponentDeps, AvailableProviderNames, ProvidedValues>, string>>, Context>
|
|
143
|
+
] extends infer Errors extends string[] ? Errors extends [] ? true : Errors : never;
|
|
144
|
+
/** O(1) DI check for renderComponent/errorComponent/withErrorComponent branches. */
|
|
145
|
+
export type RouteExceptionComponentCheckedDI<ComponentDeps, AvailableProviderNames extends string, ProvidedValues = never, Context extends string = 'exception component', AvailableInputNames extends string = never> = RouteCheckedDI<ComponentDeps, AvailableProviderNames, ProvidedValues, Context, AvailableInputNames>;
|
|
146
|
+
/**
|
|
147
|
+
* Extracts the union of provider service names from a `craftAppConfig()`
|
|
148
|
+
* result.
|
|
149
|
+
*
|
|
150
|
+
* Usage:
|
|
151
|
+
* export const appConfig = craftAppConfig({ ... });
|
|
152
|
+
* export type AppProvidedNames = AppProvidedServiceNamesOf<typeof appConfig>;
|
|
153
|
+
*/
|
|
154
|
+
export type AppProvidedServiceNamesOf<AppConfigResult> = AppConfigResult extends {
|
|
155
|
+
readonly [Key in AppConfigProvidedServiceNamesKey]?: infer Names extends string;
|
|
156
|
+
} ? Names : never;
|
|
157
|
+
/**
|
|
158
|
+
* Extracts the union of provided dependency value types from a
|
|
159
|
+
* `craftAppConfig()` result.
|
|
160
|
+
*
|
|
161
|
+
* Usage:
|
|
162
|
+
* export type AppProvidedValues = AppProvidedDependencyValuesOf<typeof appConfig>;
|
|
163
|
+
*/
|
|
164
|
+
export type AppProvidedDependencyValuesOf<AppConfigResult> = AppConfigResult extends {
|
|
165
|
+
readonly [Key in AppConfigProvidedDependencyValuesKey]?: infer Values;
|
|
166
|
+
} ? Values : never;
|
|
167
|
+
/**
|
|
168
|
+
* Extracts the union of service names from a route's `providers` array.
|
|
169
|
+
*
|
|
170
|
+
* Usage:
|
|
171
|
+
* const providers = [provideMyService()] as const;
|
|
172
|
+
* type MyRouteProvidedNames = RouteProvidedServiceNamesOf<typeof providers>;
|
|
173
|
+
*/
|
|
174
|
+
export type RouteProvidedServiceNamesOf<Providers> = Providers extends readonly unknown[] ? RouteProvidedServiceNamesFromEntry<Providers[number]> : never;
|
|
175
|
+
type RouteProvidedServiceNamesFromEntry<Entry> = Entry extends NamedBrandedServiceProvider<infer Name, any, any> ? Name : Entry extends readonly unknown[] ? RouteProvidedServiceNamesOf<Entry> : never;
|
|
176
|
+
type CascadeRouteEntryError<ParentNames extends string, ParentValues, ParentInputNames extends string, RouteMeta> = RouteMeta extends {
|
|
177
|
+
path: infer Path extends string;
|
|
178
|
+
} ? RouteCheckedDI<RouteMeta, ParentNames, ParentValues, `path: "${Path}"`, ParentInputNames> extends infer Result ? Result extends true ? [] : Result extends readonly string[] ? Result : [] : [] : [];
|
|
179
|
+
type AggregateCascadeErrorsByIndex<ParentNames extends string, ParentValues, RoutesMeta extends readonly unknown[], ParentInputNames extends string = never, Traversed extends readonly unknown[] = readonly []> = number extends RoutesMeta['length'] ? [] : Traversed['length'] extends RoutesMeta['length'] ? [] : [...Traversed, unknown]['length'] extends RoutesMeta['length'] ? [
|
|
180
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[Traversed['length']]>
|
|
181
|
+
] : [...Traversed, unknown, unknown]['length'] extends RoutesMeta['length'] ? [
|
|
182
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[Traversed['length']]>,
|
|
183
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[[...Traversed, unknown]['length']]>
|
|
184
|
+
] : [
|
|
185
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[Traversed['length']]>,
|
|
186
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[[...Traversed, unknown]['length']]>,
|
|
187
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[[...Traversed, unknown, unknown]['length']]>,
|
|
188
|
+
...CascadeRouteEntryError<ParentNames, ParentValues, ParentInputNames, RoutesMeta[[...Traversed, unknown, unknown, unknown]['length']]>,
|
|
189
|
+
...AggregateCascadeErrorsByIndex<ParentNames, ParentValues, RoutesMeta, ParentInputNames, [
|
|
190
|
+
...Traversed,
|
|
191
|
+
unknown,
|
|
192
|
+
unknown,
|
|
193
|
+
unknown,
|
|
194
|
+
unknown
|
|
195
|
+
]>
|
|
196
|
+
];
|
|
197
|
+
/**
|
|
198
|
+
* Aggregates `RouteCheckedDI` over every leaf route in a `craftRoutes(...)`
|
|
199
|
+
* result, reading per-route metadata from `META_DATA`.
|
|
200
|
+
*
|
|
201
|
+
* Returns `true` if every route is satisfied, or a tuple of error messages
|
|
202
|
+
* citing each broken route's path. Designed to be used in a SINGLE type alias
|
|
203
|
+
* per route file (no runtime expression, no circular type dependency on the
|
|
204
|
+
* app config):
|
|
205
|
+
*
|
|
206
|
+
* // feature-x.routes.ts
|
|
207
|
+
* import type { AppProvidedNames, AppProvidedValues } from '../../../app.config';
|
|
208
|
+
*
|
|
209
|
+
* export const { featureXRoutes } = craftRoutes('featureX', [...]);
|
|
210
|
+
*
|
|
211
|
+
* type _CheckFeatureXDI = ValidateCascadeRoutesFile<
|
|
212
|
+
* AppProvidedNames,
|
|
213
|
+
* AppProvidedValues,
|
|
214
|
+
* typeof featureXRoutes
|
|
215
|
+
* >;
|
|
216
|
+
* type _CanRunFeatureX = CanRun<_CheckFeatureXDI>;
|
|
217
|
+
*
|
|
218
|
+
* That's the entire cascade boilerplate — two type aliases per file,
|
|
219
|
+
* regardless of how many components it wires.
|
|
220
|
+
*
|
|
221
|
+
* Internally, `META_DATA[N].missingProvider` already accounts for the route's
|
|
222
|
+
* own `providers: [...]` and the component's own `provided` map; only the
|
|
223
|
+
* parent context (app + ancestor routes) needs to be stripped here.
|
|
224
|
+
*/
|
|
225
|
+
export type ValidateCascadeRoutesFile<ParentNames extends string, ParentValues, RoutesApp, ParentInputNames extends string = never> = RoutesApp extends {
|
|
226
|
+
META_DATA: infer Meta extends readonly unknown[];
|
|
227
|
+
} ? AggregateCascadeErrorsByIndex<ParentNames, ParentValues, Meta, ParentInputNames> extends infer Errors extends readonly string[] ? Errors extends readonly [] ? true : Errors : never : never;
|
|
228
|
+
export {};
|
|
229
|
+
//# sourceMappingURL=route-checked-di.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-checked-di.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/route-checked-di.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=route-checked-di.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-checked-di.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/route-checked-di.ts"],"names":[],"mappings":"","sourcesContent":["import type { Simplify, UnionToTuple } from './craft-service.shared';\nimport type { MissingProvidersFromDepsMap } from './branded-component/branded-component';\nimport type { NamedBrandedServiceProvider } from './craft-service';\nimport type {\n AppConfigProvidedDependencyValuesKey,\n AppConfigProvidedServiceNamesKey,\n} from './craft-app-config';\n\n/**\n * `RouteCheckedDI` is a per-route DI validation primitive meant to be used as\n * an alternative to `AppCheckedDI` when route volume makes the global check\n * brittle (TS2589).\n *\n * Where `AppCheckedDI` iterates over every route to build a global proof, this\n * type performs a **local** check: given a component dependency contract and\n * the set of provider names (and optionally provided value types) reachable\n * from this route's ancestors, it returns either `true` or the list of error\n * messages. Functional components expose that contract through\n * `ComponentDepsOf<typeof MyComponent>`; decorated Angular components can\n * still pass their legacy generated `GenDeps_*` alias.\n *\n * Recommended placement (used by the type-stress generator): the check lives\n * **in the route file** — i.e. alongside the `craftRoutes(...)` call that\n * wires the component to a path — rather than in the component file. This\n * keeps components pure and groups all DI validation for a feature in one\n * place.\n *\n * Typical use (chained at generation time):\n *\n * // app.config.ts\n * export const appConfig = craftAppConfig({ providers: [...] });\n * export type AppProvidedNames = AppProvidedServiceNamesOf<typeof appConfig>;\n * export type AppProvidedValues = AppProvidedDependencyValuesOf<typeof appConfig>;\n *\n * // feature-x.routes.ts\n * import type { GenDeps_FeatureXCompYComponent } from './FeatureXCompYComponent';\n * import type { AppProvidedNames, AppProvidedValues } from '../../../app.config';\n *\n * export const { featureXRoutes } = craftRoutes('featureX', [\n * { path: 'item-0', providers: [provideFeatureXRouteService()],\n * loadComponent: () => import('./FeatureXCompYComponent').then(m => m.FeatureXCompYComponent),\n * componentDeps: {} as GenDeps_FeatureXCompYComponent },\n * ]);\n *\n * export type FeatureXRouteProvidedNames = AppProvidedNames | 'FeatureXRouteService';\n * export type FeatureXRouteProvidedValues = AppProvidedValues;\n *\n * // Cascade DI check — name union derived from GenDeps.provided so it stays\n * // in sync with @Component.providers (via the `brand-angular-deps-match`\n * // ESLint rule).\n * type FeatureXCompYComponentProvidedNames =\n * | FeatureXRouteProvidedNames\n * | Extract<keyof GenDeps_FeatureXCompYComponent['provided'], string>;\n * type _Check = RouteCheckedDI<\n * GenDeps_FeatureXCompYComponent,\n * FeatureXCompYComponentProvidedNames,\n * FeatureXRouteProvidedValues,\n * 'FeatureXCompYComponent'\n * >;\n * type _CanRun = CanRun<_Check>;\n *\n * Trade-offs vs `AppCheckedDI`:\n * - Pro: O(1) per route, no recursion over routes — scales indefinitely.\n * - Pro: Errors surface in the route file, not in `main.ts`.\n * - Con: Each ancestor (app, parent route) must explicitly re-export its\n * cumulative provider names. The generator handles this; hand-written\n * routes must thread the types manually.\n * - Note: The check reads from `GenDeps.provided`. Drift between\n * `@Component.providers` (runtime) and `GenDeps.provided` (type-level) is\n * detected (and auto-fixed) by the `craft-ts/brand-angular-deps-match`\n * ESLint rule. Running `lint` (or `lint --fix`) before `typecheck` is what\n * closes the loop end-to-end.\n */\n\n// -----------------------------------------------------------------------------\n// Private helpers — duplicated from app-checked-di.ts on purpose to keep that\n// file untouched (zero risk of regression for the central mode).\n// -----------------------------------------------------------------------------\n\ntype DepsMap<Input> = Input extends { deps: infer Deps extends object }\n ? Deps\n : {};\n\ntype ProvidedMap<Input> = Input extends {\n provided: infer Provided extends object;\n}\n ? Provided\n : {};\n\ntype PublicPropertiesMap<Input> = Input extends {\n publicProperties: infer PublicProperties extends object;\n}\n ? PublicProperties\n : {};\n\ntype MissingProviderMap<Input> = Input extends {\n missingProvider: infer MissingProvider extends object;\n}\n ? MissingProvider\n : Simplify<\n Omit<\n MissingProvidersFromDepsMap<DepsMap<Input>>,\n keyof ProvidedMap<Input>\n >\n >;\n\ntype InputErrorMessage<\n Name extends string,\n Context extends string,\n> = `Input \"${Name}\" is not provided in ${Context}`;\n\ntype InjectedErrorMessage<\n Name extends string,\n Context extends string,\n> = `The ${Name} service is not provided in ${Context}`;\n\ntype InputErrorMessagesFromNames<\n Names extends readonly unknown[],\n Context extends string,\n> = Names extends readonly [infer Head extends string, ...infer Tail]\n ? [\n InputErrorMessage<Head, Context>,\n ...InputErrorMessagesFromNames<Tail, Context>,\n ]\n : [];\n\ntype InjectedErrorMessagesFromNames<\n Names extends readonly unknown[],\n Context extends string,\n> = Names extends readonly [infer Head extends string, ...infer Tail]\n ? [\n InjectedErrorMessage<Head, Context>,\n ...InjectedErrorMessagesFromNames<Tail, Context>,\n ]\n : [];\n\n/**\n * Fail closed when provider-name extraction widens to `string`.\n *\n * `RouteCheckedDI` removes missing providers by their names. If the available\n * names become `string`, that removal hides every missing provider and turns a\n * broken DI graph into `true`. This guard keeps that type-level failure\n * visible until the provider extraction is corrected.\n */\ntype WidenedProviderNamesError<AvailableProviderNames extends string> =\n string extends AvailableProviderNames\n ? [\n 'Available provider names widened to string; type-safe DI validation is unavailable',\n ]\n : [];\n\n// -----------------------------------------------------------------------------\n// Cascade-specific helpers\n// -----------------------------------------------------------------------------\n\n/**\n * From a component's `MissingProviderMap`, remove entries whose name is in the\n * available provider names union (covers `provide{Name}()` calls anywhere in\n * the ancestor chain).\n */\ntype StripByNames<\n MissingProviders extends object,\n AvailableNames extends string,\n> = Simplify<Omit<MissingProviders, AvailableNames>>;\n\n/**\n * From a `MissingProviderMap`, find entries whose dependency type is\n * structurally assignable from one of the `ProvidedValues` (e.g. `Router`\n * provided by `provideCraftRouter`). Returns the union of those names.\n */\ntype NamesMatchingProvidedValues<\n MissingProviders extends object,\n ProvidedValues,\n> = {\n [Name in Extract<\n keyof MissingProviders,\n string\n >]: MissingProviders[Name] extends ProvidedValues ? Name : never;\n}[Extract<keyof MissingProviders, string>];\n\n/**\n * Final missing providers after stripping by name AND by value type.\n * Mirrors the logic of `AppMissingProviderMap` but operates on a flat union\n * of provider names instead of an `AppRoutes` tuple.\n */\ntype ResolvedMissing<\n ComponentDeps,\n AvailableNames extends string,\n ProvidedValues,\n> = Simplify<\n Omit<\n StripByNames<MissingProviderMap<ComponentDeps>, AvailableNames>,\n NamesMatchingProvidedValues<\n StripByNames<MissingProviderMap<ComponentDeps>, AvailableNames>,\n ProvidedValues\n >\n >\n>;\n\n// -----------------------------------------------------------------------------\n// Public API\n// -----------------------------------------------------------------------------\n\n/**\n * Validates a component's DI graph against an explicit set of available\n * provider names (and optionally a set of provided dependency value types).\n *\n * Returns `true` if everything is satisfied, or a tuple of error messages\n * (suitable as a constraint argument to `CanRun`).\n *\n * @template ComponentDeps - The component's `GenDeps_*` type (must expose\n * `missingProvider` and/or `publicProperties`).\n * @template AvailableProviderNames - Union of service names provided by app\n * config + parent route providers + this component's own providers.\n * @template ProvidedValues - Optional. Union of provided dependency value\n * types (e.g. `Router` instance from `provideCraftRouter`). Defaults to\n * `never` (no value-type matching).\n * @template Context - Human-readable context used in error messages. Defaults\n * to `'this component'`. Generators typically pass the component name.\n */\nexport type RouteCheckedDI<\n ComponentDeps,\n AvailableProviderNames extends string,\n ProvidedValues = never,\n Context extends string = 'this component',\n AvailableInputNames extends string = never,\n> = string extends AvailableProviderNames\n ? WidenedProviderNamesError<AvailableProviderNames>\n : [\n ...InputErrorMessagesFromNames<\n UnionToTuple<\n Exclude<\n Extract<keyof PublicPropertiesMap<ComponentDeps>, string>,\n AvailableInputNames\n >\n >,\n Context\n >,\n ...InjectedErrorMessagesFromNames<\n UnionToTuple<\n Extract<\n keyof ResolvedMissing<\n ComponentDeps,\n AvailableProviderNames,\n ProvidedValues\n >,\n string\n >\n >,\n Context\n >,\n ] extends infer Errors extends string[]\n ? Errors extends []\n ? true\n : Errors\n : never;\n\n/** O(1) DI check for renderComponent/errorComponent/withErrorComponent branches. */\nexport type RouteExceptionComponentCheckedDI<\n ComponentDeps,\n AvailableProviderNames extends string,\n ProvidedValues = never,\n Context extends string = 'exception component',\n AvailableInputNames extends string = never,\n> = RouteCheckedDI<\n ComponentDeps,\n AvailableProviderNames,\n ProvidedValues,\n Context,\n AvailableInputNames\n>;\n\n/**\n * Extracts the union of provider service names from a `craftAppConfig()`\n * result.\n *\n * Usage:\n * export const appConfig = craftAppConfig({ ... });\n * export type AppProvidedNames = AppProvidedServiceNamesOf<typeof appConfig>;\n */\nexport type AppProvidedServiceNamesOf<AppConfigResult> =\n AppConfigResult extends {\n readonly [Key in AppConfigProvidedServiceNamesKey]?: infer Names extends\n string;\n }\n ? Names\n : never;\n\n/**\n * Extracts the union of provided dependency value types from a\n * `craftAppConfig()` result.\n *\n * Usage:\n * export type AppProvidedValues = AppProvidedDependencyValuesOf<typeof appConfig>;\n */\nexport type AppProvidedDependencyValuesOf<AppConfigResult> =\n AppConfigResult extends {\n readonly [Key in AppConfigProvidedDependencyValuesKey]?: infer Values;\n }\n ? Values\n : never;\n\n/**\n * Extracts the union of service names from a route's `providers` array.\n *\n * Usage:\n * const providers = [provideMyService()] as const;\n * type MyRouteProvidedNames = RouteProvidedServiceNamesOf<typeof providers>;\n */\nexport type RouteProvidedServiceNamesOf<Providers> =\n Providers extends readonly unknown[]\n ? RouteProvidedServiceNamesFromEntry<Providers[number]>\n : never;\n\ntype RouteProvidedServiceNamesFromEntry<Entry> =\n Entry extends NamedBrandedServiceProvider<infer Name, any, any>\n ? Name\n : Entry extends readonly unknown[]\n ? RouteProvidedServiceNamesOf<Entry>\n : never;\n\n// -----------------------------------------------------------------------------\n// ValidateCascadeRoutesFile — one type alias per route file (zero per-route\n// boilerplate, no circular dependency)\n// -----------------------------------------------------------------------------\n\n// Per-route entry error: reads `META_DATA[N]` directly. The route's own\n// `providers: [...]` are ALREADY stripped from `META_DATA[N].missingProvider`\n// by `RouteResolvedMissingProviderMap` inside craft-routes.ts, and the\n// component's own `provided` is folded into `GenDeps.missingProvider` at the\n// component level. So validation only needs the parent's provided names.\ntype CascadeRouteEntryError<\n ParentNames extends string,\n ParentValues,\n ParentInputNames extends string,\n RouteMeta,\n> = RouteMeta extends { path: infer Path extends string }\n ? RouteCheckedDI<\n RouteMeta,\n ParentNames,\n ParentValues,\n `path: \"${Path}\"`,\n ParentInputNames\n > extends infer Result\n ? Result extends true\n ? []\n : Result extends readonly string[]\n ? Result\n : []\n : []\n : [];\n\n// Unrolls 4 routes per recursion step (same shape as RoutesErrorMessagesByIndex\n// in app-checked-di.ts) to stay well below the TS2589 limit even for large\n// route arrays.\ntype AggregateCascadeErrorsByIndex<\n ParentNames extends string,\n ParentValues,\n RoutesMeta extends readonly unknown[],\n ParentInputNames extends string = never,\n Traversed extends readonly unknown[] = readonly [],\n> = number extends RoutesMeta['length']\n ? []\n : Traversed['length'] extends RoutesMeta['length']\n ? []\n : [...Traversed, unknown]['length'] extends RoutesMeta['length']\n ? [\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[Traversed['length']]\n >,\n ]\n : [...Traversed, unknown, unknown]['length'] extends RoutesMeta['length']\n ? [\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[Traversed['length']]\n >,\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[[...Traversed, unknown]['length']]\n >,\n ]\n : [\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[Traversed['length']]\n >,\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[[...Traversed, unknown]['length']]\n >,\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[[...Traversed, unknown, unknown]['length']]\n >,\n ...CascadeRouteEntryError<\n ParentNames,\n ParentValues,\n ParentInputNames,\n RoutesMeta[[...Traversed, unknown, unknown, unknown]['length']]\n >,\n ...AggregateCascadeErrorsByIndex<\n ParentNames,\n ParentValues,\n RoutesMeta,\n ParentInputNames,\n [...Traversed, unknown, unknown, unknown, unknown]\n >,\n ];\n\n/**\n * Aggregates `RouteCheckedDI` over every leaf route in a `craftRoutes(...)`\n * result, reading per-route metadata from `META_DATA`.\n *\n * Returns `true` if every route is satisfied, or a tuple of error messages\n * citing each broken route's path. Designed to be used in a SINGLE type alias\n * per route file (no runtime expression, no circular type dependency on the\n * app config):\n *\n * // feature-x.routes.ts\n * import type { AppProvidedNames, AppProvidedValues } from '../../../app.config';\n *\n * export const { featureXRoutes } = craftRoutes('featureX', [...]);\n *\n * type _CheckFeatureXDI = ValidateCascadeRoutesFile<\n * AppProvidedNames,\n * AppProvidedValues,\n * typeof featureXRoutes\n * >;\n * type _CanRunFeatureX = CanRun<_CheckFeatureXDI>;\n *\n * That's the entire cascade boilerplate — two type aliases per file,\n * regardless of how many components it wires.\n *\n * Internally, `META_DATA[N].missingProvider` already accounts for the route's\n * own `providers: [...]` and the component's own `provided` map; only the\n * parent context (app + ancestor routes) needs to be stripped here.\n */\nexport type ValidateCascadeRoutesFile<\n ParentNames extends string,\n ParentValues,\n RoutesApp,\n ParentInputNames extends string = never,\n> = RoutesApp extends {\n META_DATA: infer Meta extends readonly unknown[];\n}\n ? AggregateCascadeErrorsByIndex<\n ParentNames,\n ParentValues,\n Meta,\n ParentInputNames\n > extends infer Errors extends readonly string[]\n ? Errors extends readonly []\n ? true\n : Errors\n : never\n : never;\n"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { InjectionToken, type Provider, type Signal } from './host/craft-compat';
|
|
2
|
+
import { type AnyCraftException } from './craft-exception';
|
|
3
|
+
import type { StandardSchemaV1, StandardSchemaV1InferInput, StandardSchemaV1InferOutput, StandardSchemaV1Issue } from './standard-schema';
|
|
4
|
+
export type CraftSchema = StandardSchemaV1<any, any>;
|
|
5
|
+
export type SchemaInput<Schema extends CraftSchema> = StandardSchemaV1InferInput<Schema>;
|
|
6
|
+
export type SchemaOutput<Schema extends CraftSchema> = StandardSchemaV1InferOutput<Schema>;
|
|
7
|
+
export type SchemaValidationStage = 'method' | 'params' | 'loader' | 'state' | 'form';
|
|
8
|
+
export type SchemaValidationOperation = 'initial' | 'set' | 'update' | 'patch' | 'insert' | 'source' | 'method' | 'params' | 'loader' | 'stream' | 'validate';
|
|
9
|
+
export type SchemaValidationContext = {
|
|
10
|
+
exception: AnyCraftException;
|
|
11
|
+
primitive: 'state' | 'query' | 'mutation' | 'asyncProcess' | 'form';
|
|
12
|
+
name: string;
|
|
13
|
+
stage: SchemaValidationStage;
|
|
14
|
+
operation: SchemaValidationOperation;
|
|
15
|
+
identifier?: string;
|
|
16
|
+
};
|
|
17
|
+
export type SchemaValidationDecision = {
|
|
18
|
+
action: 'reject' | 'accept';
|
|
19
|
+
};
|
|
20
|
+
export type SchemaValidationPolicy = (context: SchemaValidationContext) => SchemaValidationDecision;
|
|
21
|
+
export declare const CRAFT_SCHEMA_VALIDATION_POLICY: InjectionToken<SchemaValidationPolicy>;
|
|
22
|
+
export declare function provideCraftSchemaValidationPolicy(policy: SchemaValidationPolicy): Provider;
|
|
23
|
+
export type SchemaValidationExceptionPayload = {
|
|
24
|
+
issues: readonly StandardSchemaV1Issue[];
|
|
25
|
+
value: unknown;
|
|
26
|
+
primitive: SchemaValidationContext['primitive'];
|
|
27
|
+
name: string;
|
|
28
|
+
stage: SchemaValidationStage;
|
|
29
|
+
operation: SchemaValidationOperation;
|
|
30
|
+
identifier?: string;
|
|
31
|
+
};
|
|
32
|
+
export type SchemaValidationException = AnyCraftException & {
|
|
33
|
+
_tag: 'SCHEMA_VALIDATION_ERROR';
|
|
34
|
+
scope: 'parse';
|
|
35
|
+
payload: SchemaValidationExceptionPayload;
|
|
36
|
+
};
|
|
37
|
+
export type SchemaParseExceptions = {
|
|
38
|
+
method?: SchemaValidationException;
|
|
39
|
+
params?: SchemaValidationException;
|
|
40
|
+
loader?: SchemaValidationException;
|
|
41
|
+
state?: SchemaValidationException;
|
|
42
|
+
};
|
|
43
|
+
export type SchemaParseResult<Output> = {
|
|
44
|
+
ok: true;
|
|
45
|
+
value: Output;
|
|
46
|
+
} | {
|
|
47
|
+
ok: false;
|
|
48
|
+
exception: SchemaValidationException;
|
|
49
|
+
};
|
|
50
|
+
export declare function createSchemaValidationException({ issues, value, primitive, name, stage, operation, identifier, }: Omit<SchemaValidationExceptionPayload, 'primitive'> & {
|
|
51
|
+
primitive: SchemaValidationContext['primitive'];
|
|
52
|
+
}): SchemaValidationException;
|
|
53
|
+
export declare function parseSchema<Output>(schema: CraftSchema | undefined, value: unknown, context: Omit<SchemaValidationContext, 'exception'>): SchemaParseResult<Output> | Promise<SchemaParseResult<Output>>;
|
|
54
|
+
export declare function useSchemaValidationPolicy(injector: {
|
|
55
|
+
get<T>(token: InjectionToken<T>): T;
|
|
56
|
+
}, localPolicy?: SchemaValidationPolicy): SchemaValidationPolicy;
|
|
57
|
+
export declare function decideSchemaValidation(result: SchemaParseResult<unknown>, context: Omit<SchemaValidationContext, 'exception'>, policy: SchemaValidationPolicy): {
|
|
58
|
+
accepted: true;
|
|
59
|
+
value: unknown;
|
|
60
|
+
} | {
|
|
61
|
+
accepted: false;
|
|
62
|
+
exception: SchemaValidationException;
|
|
63
|
+
};
|
|
64
|
+
export declare function createSchemaExceptionSignal(): import("./host/craft-signal").CraftWritableSignal<AnyCraftException | undefined>;
|
|
65
|
+
export type SchemaExceptionSignal = Signal<AnyCraftException | undefined>;
|
|
66
|
+
export type SchemaValidationRuntime = ReturnType<typeof createSchemaValidationRuntime>;
|
|
67
|
+
export declare function createSchemaValidationRuntime({ schema, primitive, name, policy, setException, }: {
|
|
68
|
+
schema?: CraftSchema;
|
|
69
|
+
primitive: SchemaValidationContext['primitive'];
|
|
70
|
+
name: string;
|
|
71
|
+
policy: SchemaValidationPolicy;
|
|
72
|
+
setException: (stage: SchemaValidationStage, exception: AnyCraftException | undefined, identifier?: string) => void;
|
|
73
|
+
}): {
|
|
74
|
+
parseSync: <Output>(value: unknown, stage: SchemaValidationStage, operation: SchemaValidationOperation, identifier?: string) => {
|
|
75
|
+
accepted: true;
|
|
76
|
+
value: Output;
|
|
77
|
+
} | {
|
|
78
|
+
accepted: false;
|
|
79
|
+
exception: AnyCraftException;
|
|
80
|
+
};
|
|
81
|
+
parseAsync: <Output>(value: unknown, stage: SchemaValidationStage, operation: SchemaValidationOperation, identifier?: string) => Promise<{
|
|
82
|
+
accepted: true;
|
|
83
|
+
value: Output;
|
|
84
|
+
} | {
|
|
85
|
+
accepted: false;
|
|
86
|
+
exception: AnyCraftException;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=schema-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/schema-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { InjectionToken, isDevMode, signal, } from './host/craft-compat';
|
|
2
|
+
import { craftException } from './craft-exception';
|
|
3
|
+
export const CRAFT_SCHEMA_VALIDATION_POLICY = new InjectionToken('CRAFT_SCHEMA_VALIDATION_POLICY', {
|
|
4
|
+
providedIn: 'root',
|
|
5
|
+
factory: () => (context) => {
|
|
6
|
+
// Invalid data is useful feedback during development. In production the
|
|
7
|
+
// application can keep running while the policy callback reports it.
|
|
8
|
+
void context;
|
|
9
|
+
return { action: isDevMode() ? 'reject' : 'accept' };
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
export function provideCraftSchemaValidationPolicy(policy) {
|
|
13
|
+
return { provide: CRAFT_SCHEMA_VALIDATION_POLICY, useValue: policy };
|
|
14
|
+
}
|
|
15
|
+
export function createSchemaValidationException({ issues, value, primitive, name, stage, operation, identifier, }) {
|
|
16
|
+
return craftException({ _tag: 'SCHEMA_VALIDATION_ERROR', scope: 'parse' }, {
|
|
17
|
+
issues,
|
|
18
|
+
value,
|
|
19
|
+
primitive,
|
|
20
|
+
name,
|
|
21
|
+
stage,
|
|
22
|
+
operation,
|
|
23
|
+
...(identifier === undefined ? {} : { identifier }),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function isPromiseLike(value) {
|
|
27
|
+
return (typeof value === 'object' &&
|
|
28
|
+
value !== null &&
|
|
29
|
+
'then' in value &&
|
|
30
|
+
typeof value.then === 'function');
|
|
31
|
+
}
|
|
32
|
+
export function parseSchema(schema, value, context) {
|
|
33
|
+
if (!schema) {
|
|
34
|
+
return { ok: true, value: value };
|
|
35
|
+
}
|
|
36
|
+
const result = schema['~standard'].validate(value);
|
|
37
|
+
if (isPromiseLike(result)) {
|
|
38
|
+
return result.then((resolved) => resolved.issues
|
|
39
|
+
? {
|
|
40
|
+
ok: false,
|
|
41
|
+
exception: createSchemaValidationException({
|
|
42
|
+
...context,
|
|
43
|
+
issues: resolved.issues,
|
|
44
|
+
value,
|
|
45
|
+
}),
|
|
46
|
+
}
|
|
47
|
+
: { ok: true, value: resolved.value });
|
|
48
|
+
}
|
|
49
|
+
return result.issues
|
|
50
|
+
? {
|
|
51
|
+
ok: false,
|
|
52
|
+
exception: createSchemaValidationException({
|
|
53
|
+
...context,
|
|
54
|
+
issues: result.issues,
|
|
55
|
+
value,
|
|
56
|
+
}),
|
|
57
|
+
}
|
|
58
|
+
: { ok: true, value: result.value };
|
|
59
|
+
}
|
|
60
|
+
export function useSchemaValidationPolicy(injector, localPolicy) {
|
|
61
|
+
return localPolicy ?? injector.get(CRAFT_SCHEMA_VALIDATION_POLICY);
|
|
62
|
+
}
|
|
63
|
+
export function decideSchemaValidation(result, context, policy) {
|
|
64
|
+
if (result.ok) {
|
|
65
|
+
return { accepted: true, value: result.value };
|
|
66
|
+
}
|
|
67
|
+
const fullContext = { ...context, exception: result.exception };
|
|
68
|
+
const decision = policy(fullContext);
|
|
69
|
+
if (decision.action === 'accept') {
|
|
70
|
+
return { accepted: true, value: contextValue(result.exception) };
|
|
71
|
+
}
|
|
72
|
+
return { accepted: false, exception: result.exception };
|
|
73
|
+
}
|
|
74
|
+
function contextValue(exception) {
|
|
75
|
+
return exception.payload.value;
|
|
76
|
+
}
|
|
77
|
+
export function createSchemaExceptionSignal() {
|
|
78
|
+
return signal(undefined);
|
|
79
|
+
}
|
|
80
|
+
export function createSchemaValidationRuntime({ schema, primitive, name, policy, setException, }) {
|
|
81
|
+
const parseSync = (value, stage, operation, identifier) => {
|
|
82
|
+
const parsed = parseSchema(schema, value, {
|
|
83
|
+
primitive,
|
|
84
|
+
name,
|
|
85
|
+
stage,
|
|
86
|
+
operation,
|
|
87
|
+
identifier,
|
|
88
|
+
});
|
|
89
|
+
if (parsed instanceof Promise) {
|
|
90
|
+
throw new Error(`The ${primitive}:${name} ${stage} schema returned a Promise where a synchronous result is required.`);
|
|
91
|
+
}
|
|
92
|
+
const decision = decideSchemaValidation(parsed, { primitive, name, stage, operation, identifier }, policy);
|
|
93
|
+
setException(stage, decision.accepted ? undefined : decision.exception, identifier);
|
|
94
|
+
return decision;
|
|
95
|
+
};
|
|
96
|
+
const parseAsync = async (value, stage, operation, identifier) => {
|
|
97
|
+
const parsed = await parseSchema(schema, value, {
|
|
98
|
+
primitive,
|
|
99
|
+
name,
|
|
100
|
+
stage,
|
|
101
|
+
operation,
|
|
102
|
+
identifier,
|
|
103
|
+
});
|
|
104
|
+
const decision = decideSchemaValidation(parsed, { primitive, name, stage, operation, identifier }, policy);
|
|
105
|
+
setException(stage, decision.accepted ? undefined : decision.exception, identifier);
|
|
106
|
+
return decision;
|
|
107
|
+
};
|
|
108
|
+
return { parseSync, parseAsync };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=schema-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/schema-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n inject,\n InjectionToken,\n isDevMode,\n type Provider,\n type Signal,\n signal,\n} from './host/craft-compat';\nimport { craftException, type AnyCraftException } from './craft-exception';\nimport type {\n StandardSchemaV1,\n StandardSchemaV1InferInput,\n StandardSchemaV1InferOutput,\n StandardSchemaV1Issue,\n} from './standard-schema';\n\nexport type CraftSchema = StandardSchemaV1<any, any>;\nexport type SchemaInput<Schema extends CraftSchema> =\n StandardSchemaV1InferInput<Schema>;\nexport type SchemaOutput<Schema extends CraftSchema> =\n StandardSchemaV1InferOutput<Schema>;\n\nexport type SchemaValidationStage =\n | 'method'\n | 'params'\n | 'loader'\n | 'state'\n | 'form';\n\nexport type SchemaValidationOperation =\n | 'initial'\n | 'set'\n | 'update'\n | 'patch'\n | 'insert'\n | 'source'\n | 'method'\n | 'params'\n | 'loader'\n | 'stream'\n | 'validate';\n\nexport type SchemaValidationContext = {\n exception: AnyCraftException;\n primitive: 'state' | 'query' | 'mutation' | 'asyncProcess' | 'form';\n name: string;\n stage: SchemaValidationStage;\n operation: SchemaValidationOperation;\n identifier?: string;\n};\n\nexport type SchemaValidationDecision = {\n action: 'reject' | 'accept';\n};\n\nexport type SchemaValidationPolicy = (\n context: SchemaValidationContext,\n) => SchemaValidationDecision;\n\nexport const CRAFT_SCHEMA_VALIDATION_POLICY =\n new InjectionToken<SchemaValidationPolicy>('CRAFT_SCHEMA_VALIDATION_POLICY', {\n providedIn: 'root',\n factory: () => (context) => {\n // Invalid data is useful feedback during development. In production the\n // application can keep running while the policy callback reports it.\n void context;\n return { action: isDevMode() ? 'reject' : 'accept' };\n },\n });\n\nexport function provideCraftSchemaValidationPolicy(\n policy: SchemaValidationPolicy,\n): Provider {\n return { provide: CRAFT_SCHEMA_VALIDATION_POLICY, useValue: policy };\n}\n\nexport type SchemaValidationExceptionPayload = {\n issues: readonly StandardSchemaV1Issue[];\n value: unknown;\n primitive: SchemaValidationContext['primitive'];\n name: string;\n stage: SchemaValidationStage;\n operation: SchemaValidationOperation;\n identifier?: string;\n};\n\nexport type SchemaValidationException = AnyCraftException & {\n _tag: 'SCHEMA_VALIDATION_ERROR';\n scope: 'parse';\n payload: SchemaValidationExceptionPayload;\n};\n\nexport type SchemaParseExceptions = {\n method?: SchemaValidationException;\n params?: SchemaValidationException;\n loader?: SchemaValidationException;\n state?: SchemaValidationException;\n};\n\nexport type SchemaParseResult<Output> =\n | { ok: true; value: Output }\n | { ok: false; exception: SchemaValidationException };\n\nexport function createSchemaValidationException({\n issues,\n value,\n primitive,\n name,\n stage,\n operation,\n identifier,\n}: Omit<SchemaValidationExceptionPayload, 'primitive'> & {\n primitive: SchemaValidationContext['primitive'];\n}): SchemaValidationException {\n return craftException(\n { _tag: 'SCHEMA_VALIDATION_ERROR', scope: 'parse' },\n {\n issues,\n value,\n primitive,\n name,\n stage,\n operation,\n ...(identifier === undefined ? {} : { identifier }),\n },\n ) as SchemaValidationException;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nexport function parseSchema<Output>(\n schema: CraftSchema | undefined,\n value: unknown,\n context: Omit<SchemaValidationContext, 'exception'>,\n): SchemaParseResult<Output> | Promise<SchemaParseResult<Output>> {\n if (!schema) {\n return { ok: true, value: value as Output };\n }\n\n const result = schema['~standard'].validate(value);\n if (isPromiseLike(result)) {\n return result.then((resolved) =>\n resolved.issues\n ? {\n ok: false,\n exception: createSchemaValidationException({\n ...context,\n issues: resolved.issues,\n value,\n }),\n }\n : { ok: true, value: resolved.value as Output },\n );\n }\n\n return result.issues\n ? {\n ok: false,\n exception: createSchemaValidationException({\n ...context,\n issues: result.issues,\n value,\n }),\n }\n : { ok: true, value: result.value as Output };\n}\n\nexport function useSchemaValidationPolicy(\n injector: { get<T>(token: InjectionToken<T>): T },\n localPolicy?: SchemaValidationPolicy,\n): SchemaValidationPolicy {\n return localPolicy ?? injector.get(CRAFT_SCHEMA_VALIDATION_POLICY);\n}\n\nexport function decideSchemaValidation(\n result: SchemaParseResult<unknown>,\n context: Omit<SchemaValidationContext, 'exception'>,\n policy: SchemaValidationPolicy,\n):\n | { accepted: true; value: unknown }\n | { accepted: false; exception: SchemaValidationException } {\n if (result.ok) {\n return { accepted: true, value: result.value };\n }\n\n const fullContext = { ...context, exception: result.exception };\n const decision = policy(fullContext);\n if (decision.action === 'accept') {\n return { accepted: true, value: contextValue(result.exception) };\n }\n\n return { accepted: false, exception: result.exception };\n}\n\nfunction contextValue(exception: SchemaValidationException): unknown {\n return exception.payload.value;\n}\n\nexport function createSchemaExceptionSignal() {\n return signal<AnyCraftException | undefined>(undefined);\n}\n\nexport type SchemaExceptionSignal = Signal<AnyCraftException | undefined>;\n\nexport type SchemaValidationRuntime = ReturnType<\n typeof createSchemaValidationRuntime\n>;\n\nexport function createSchemaValidationRuntime({\n schema,\n primitive,\n name,\n policy,\n setException,\n}: {\n schema?: CraftSchema;\n primitive: SchemaValidationContext['primitive'];\n name: string;\n policy: SchemaValidationPolicy;\n setException: (\n stage: SchemaValidationStage,\n exception: AnyCraftException | undefined,\n identifier?: string,\n ) => void;\n}) {\n const parseSync = <Output>(\n value: unknown,\n stage: SchemaValidationStage,\n operation: SchemaValidationOperation,\n identifier?: string,\n ):\n | { accepted: true; value: Output }\n | { accepted: false; exception: AnyCraftException } => {\n const parsed = parseSchema<Output>(schema, value, {\n primitive,\n name,\n stage,\n operation,\n identifier,\n });\n if (parsed instanceof Promise) {\n throw new Error(\n `The ${primitive}:${name} ${stage} schema returned a Promise where a synchronous result is required.`,\n );\n }\n const decision = decideSchemaValidation(\n parsed,\n { primitive, name, stage, operation, identifier },\n policy,\n );\n setException(\n stage,\n decision.accepted ? undefined : decision.exception,\n identifier,\n );\n return decision as\n | { accepted: true; value: Output }\n | { accepted: false; exception: AnyCraftException };\n };\n\n const parseAsync = async <Output>(\n value: unknown,\n stage: SchemaValidationStage,\n operation: SchemaValidationOperation,\n identifier?: string,\n ): Promise<\n | { accepted: true; value: Output }\n | { accepted: false; exception: AnyCraftException }\n > => {\n const parsed = await parseSchema<Output>(schema, value, {\n primitive,\n name,\n stage,\n operation,\n identifier,\n });\n const decision = decideSchemaValidation(\n parsed,\n { primitive, name, stage, operation, identifier },\n policy,\n );\n setException(\n stage,\n decision.accepted ? undefined : decision.exception,\n identifier,\n );\n return decision as\n | { accepted: true; value: Output }\n | { accepted: false; exception: AnyCraftException };\n };\n\n return { parseSync, parseAsync };\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GetDeps } from './branded-component/branded-component';
|
|
2
|
+
import { type SendContextPayload } from './send-context-to-ai.tokens';
|
|
3
|
+
import { type AppSnapshotRegistry, type SnapshotReport } from './take-app-snapshot';
|
|
4
|
+
export { type SendContextPayload };
|
|
5
|
+
/**
|
|
6
|
+
* Collects app snapshot reports so the AI overlay has something to send.
|
|
7
|
+
*
|
|
8
|
+
* The overlay UI itself lives in `@craft-ts/component` (it is built with
|
|
9
|
+
* `craftComponent`, which depends on this package).
|
|
10
|
+
*/
|
|
11
|
+
export type SendContextToAiBuffer = {
|
|
12
|
+
latestReports: SnapshotReport[];
|
|
13
|
+
};
|
|
14
|
+
export declare const SEND_CONTEXT_TO_AI_BUFFER: import("..").CraftToken<SendContextToAiBuffer>;
|
|
15
|
+
export declare function createSendContextToAiBuffer(registry: AppSnapshotRegistry): SendContextToAiBuffer;
|
|
16
|
+
export type GenDeps_SendContextToAiBuffer = GetDeps<{
|
|
17
|
+
deps: {};
|
|
18
|
+
provided: {};
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=send-context-to-ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-context-to-ai.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/send-context-to-ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAGrE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,cAAc,EAAE,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,yBAAyB,gDAErC,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,GAC5B,qBAAqB,CAevB;AAED,MAAM,MAAM,6BAA6B,GAAG,OAAO,CAAC;IAClD,IAAI,EAAE,EAAE,CAAC;IACT,QAAQ,EAAE,EAAE,CAAC;CACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { debounceTime, Subject } from 'rxjs';
|
|
2
|
+
import { craftToken } from './host/craft-injector';
|
|
3
|
+
export const SEND_CONTEXT_TO_AI_BUFFER = craftToken('SendContextToAiBuffer');
|
|
4
|
+
export function createSendContextToAiBuffer(registry) {
|
|
5
|
+
const buffer = { latestReports: [] };
|
|
6
|
+
let pending = [];
|
|
7
|
+
const flush$ = new Subject();
|
|
8
|
+
registry.allSnapShot$.subscribe((report) => {
|
|
9
|
+
pending.push(report);
|
|
10
|
+
flush$.next();
|
|
11
|
+
});
|
|
12
|
+
flush$.pipe(debounceTime(500)).subscribe(() => {
|
|
13
|
+
buffer.latestReports = [...pending];
|
|
14
|
+
pending = [];
|
|
15
|
+
});
|
|
16
|
+
return buffer;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=send-context-to-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-context-to-ai.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/send-context-to-ai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAmBnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CACjD,uBAAuB,CACxB,CAAC;AAEF,MAAM,UAAU,2BAA2B,CACzC,QAA6B;IAE7B,MAAM,MAAM,GAA0B,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC5D,IAAI,OAAO,GAAqB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEnC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QAC5C,MAAM,CAAC,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACpC,OAAO,GAAG,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { GetDeps } from './branded-component/branded-component';\nimport { debounceTime, Subject } from 'rxjs';\nimport { craftToken } from './host/craft-injector';\nimport { type SendContextPayload } from './send-context-to-ai.tokens';\nimport {\n type AppSnapshotRegistry,\n type SnapshotReport,\n} from './take-app-snapshot';\n\nexport { type SendContextPayload };\n\n/**\n * Collects app snapshot reports so the AI overlay has something to send.\n *\n * The overlay UI itself lives in `@craft-ts/component` (it is built with\n * `craftComponent`, which depends on this package).\n */\nexport type SendContextToAiBuffer = {\n latestReports: SnapshotReport[];\n};\n\nexport const SEND_CONTEXT_TO_AI_BUFFER = craftToken<SendContextToAiBuffer>(\n 'SendContextToAiBuffer',\n);\n\nexport function createSendContextToAiBuffer(\n registry: AppSnapshotRegistry,\n): SendContextToAiBuffer {\n const buffer: SendContextToAiBuffer = { latestReports: [] };\n let pending: SnapshotReport[] = [];\n const flush$ = new Subject<void>();\n\n registry.allSnapShot$.subscribe((report) => {\n pending.push(report);\n flush$.next();\n });\n flush$.pipe(debounceTime(500)).subscribe(() => {\n buffer.latestReports = [...pending];\n pending = [];\n });\n\n return buffer;\n}\n\nexport type GenDeps_SendContextToAiBuffer = GetDeps<{\n deps: {};\n provided: {};\n}>;\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SnapshotReport } from './take-app-snapshot';
|
|
2
|
+
export interface SendContextPayload {
|
|
3
|
+
hostName: string;
|
|
4
|
+
tagList: unknown;
|
|
5
|
+
coords: {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
9
|
+
outerHTML: string;
|
|
10
|
+
snapshot: SnapshotReport[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=send-context-to-ai.tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-context-to-ai.tokens.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/send-context-to-ai.tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=send-context-to-ai.tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-context-to-ai.tokens.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/send-context-to-ai.tokens.ts"],"names":[],"mappings":"","sourcesContent":["import type { SnapshotReport } from './take-app-snapshot';\n\nexport interface SendContextPayload {\n hostName: string;\n tagList: unknown;\n coords: { x: number; y: number };\n outerHTML: string;\n snapshot: SnapshotReport[];\n}\n"]}
|