@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,335 @@
|
|
|
1
|
+
import { Signal, ValueEqualityFn, WritableSignal } from './host/craft-compat';
|
|
2
|
+
import { IsUnknown } from './util/util.type';
|
|
3
|
+
import { ReadonlySource } from './util/source.type';
|
|
4
|
+
/**
|
|
5
|
+
* Converts an Angular signal into a readonly source with lazy emission semantics.
|
|
6
|
+
*
|
|
7
|
+
* This function bridges the gap between signals and sources by:
|
|
8
|
+
* - Converting continuous signal values into discrete source emissions
|
|
9
|
+
* - Implementing lazy emission (only emits on signal changes, not on first read)
|
|
10
|
+
* - Supporting optional value transformation via computed function
|
|
11
|
+
* - Providing both standard and value-preserving listener variants
|
|
12
|
+
* - Enabling signal-to-source conversions for event-driven architectures
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* **Signal vs Source Semantics:**
|
|
16
|
+
* - **Signals**: Continuously readable, always have a value, recompute on access
|
|
17
|
+
* - **Sources**: Emit only on explicit changes, lazy by default (undefined on first read)
|
|
18
|
+
* - toSource converts continuous signal behavior to discrete source emissions
|
|
19
|
+
*
|
|
20
|
+
* **Emission Behavior:**
|
|
21
|
+
* - First read returns `undefined` by default (maintains source lazy semantics)
|
|
22
|
+
* - Subsequent reads return new values only when the origin signal changes
|
|
23
|
+
* - Use `preserveLastValue` variant to get immediate value on first read
|
|
24
|
+
*
|
|
25
|
+
* **Use Cases:**
|
|
26
|
+
* - **Event-driven patterns**: Convert signals to sources for reactive chains
|
|
27
|
+
* - **Debounced signals**: Wrap debounced signals as sources for queries/mutations
|
|
28
|
+
* - **External state**: Convert RxJS signals (toSignal) to sources
|
|
29
|
+
* - **Form signals**: Convert form control signals to sources for automatic submission
|
|
30
|
+
* - **Route params**: Convert router param signals to sources for automatic queries
|
|
31
|
+
* - **Filtering**: Transform signal values while converting to source
|
|
32
|
+
*
|
|
33
|
+
* **Transformation:**
|
|
34
|
+
* - Without `computed`: Passes signal values through unchanged
|
|
35
|
+
* - With `computed`: Applies transformation before emitting to source
|
|
36
|
+
* - Useful for extracting fields, formatting, or type narrowing
|
|
37
|
+
*
|
|
38
|
+
* **Comparison with computedSource:**
|
|
39
|
+
* - `toSource`: Converts signals to sources (signal → source)
|
|
40
|
+
* - `computedSource`: Transforms sources to sources (source → source)
|
|
41
|
+
* - Use toSource when bridging from signal world to source world
|
|
42
|
+
*
|
|
43
|
+
* @template SourceState - The type of values from the origin signal
|
|
44
|
+
* @template ComputedValue - The type of values after optional computation
|
|
45
|
+
*
|
|
46
|
+
* @param signalOrigin - The signal or writable signal to convert.
|
|
47
|
+
* Changes to this signal trigger source emissions.
|
|
48
|
+
*
|
|
49
|
+
* @param options - Optional configuration:
|
|
50
|
+
* - `computed`: Function to transform signal values before emission
|
|
51
|
+
* - `equal`: Custom equality function for change detection
|
|
52
|
+
* - `debugName`: Name for debugging purposes
|
|
53
|
+
*
|
|
54
|
+
* @returns A readonly source that emits when the signal changes with:
|
|
55
|
+
* - Standard behavior: First read returns `undefined`, subsequent reads return values after signal changes
|
|
56
|
+
* - `preserveLastValue` property: Returns current value immediately on first read
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* Basic signal to source conversion
|
|
60
|
+
* ```ts
|
|
61
|
+
* const countSignal = signal(0);
|
|
62
|
+
* const countSource = toSource(countSignal);
|
|
63
|
+
*
|
|
64
|
+
* // Use in query for automatic execution
|
|
65
|
+
* const fetchData = craftUse(query({
|
|
66
|
+
* method: afterRecomputation(countSource, (count) => count),
|
|
67
|
+
* loader: async ({ params }) => {
|
|
68
|
+
* const response = await fetch(`/api/data/${params}`);
|
|
69
|
+
* return response.json();
|
|
70
|
+
* },
|
|
71
|
+
* }));
|
|
72
|
+
*
|
|
73
|
+
* // Query executes when signal changes
|
|
74
|
+
* countSignal.set(1);
|
|
75
|
+
* // -> countSource emits 1
|
|
76
|
+
* // -> fetchData executes with params 1
|
|
77
|
+
*
|
|
78
|
+
* countSignal.set(2);
|
|
79
|
+
* // -> countSource emits 2
|
|
80
|
+
* // -> fetchData executes with params 2
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* Converting route params to source
|
|
85
|
+
* ```ts
|
|
86
|
+
* @Component({
|
|
87
|
+
* selector: 'app-user-detail',
|
|
88
|
+
* template: `...`,
|
|
89
|
+
* })
|
|
90
|
+
* export class UserDetailComponent {
|
|
91
|
+
* route = inject(ActivatedRoute);
|
|
92
|
+
*
|
|
93
|
+
* // Convert route param to signal
|
|
94
|
+
* userIdSignal = toSignal(
|
|
95
|
+
* this.route.params.pipe(map(p => p['userId']))
|
|
96
|
+
* );
|
|
97
|
+
*
|
|
98
|
+
* // Convert signal to source
|
|
99
|
+
* userIdSource = toSource(this.userIdSignal);
|
|
100
|
+
*
|
|
101
|
+
* // Use source in query
|
|
102
|
+
* { injectCraft } = craft(
|
|
103
|
+
* { name: '', providedIn: 'root' },
|
|
104
|
+
* craftQuery('user', () =>
|
|
105
|
+
* query({
|
|
106
|
+
* method: afterRecomputation(this.userIdSource, (id) => id),
|
|
107
|
+
* loader: async ({ params }) => {
|
|
108
|
+
* if (!params) return null;
|
|
109
|
+
* const response = await fetch(`/api/users/${params}`);
|
|
110
|
+
* return response.json();
|
|
111
|
+
* },
|
|
112
|
+
* })
|
|
113
|
+
* )
|
|
114
|
+
* );
|
|
115
|
+
*
|
|
116
|
+
* store = this.injectCraft();
|
|
117
|
+
*
|
|
118
|
+
* // Query automatically updates when route changes
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* Transforming signal values during conversion
|
|
124
|
+
* ```ts
|
|
125
|
+
* type FormData = {
|
|
126
|
+
* name: string;
|
|
127
|
+
* email: string;
|
|
128
|
+
* preferences: { newsletter: boolean };
|
|
129
|
+
* };
|
|
130
|
+
*
|
|
131
|
+
* const formSignal = signal<FormData>({
|
|
132
|
+
* name: '',
|
|
133
|
+
* email: '',
|
|
134
|
+
* preferences: { newsletter: false },
|
|
135
|
+
* });
|
|
136
|
+
*
|
|
137
|
+
* // Extract only email for validation
|
|
138
|
+
* const emailSource = toSource(formSignal, {
|
|
139
|
+
* computed: (form) => form.email,
|
|
140
|
+
* });
|
|
141
|
+
*
|
|
142
|
+
* // Use in async method
|
|
143
|
+
* const validateEmail = craftUse(asyncProcess({
|
|
144
|
+
* method: afterRecomputation(emailSource, (email) => email),
|
|
145
|
+
* loader: async ({ params }) => {
|
|
146
|
+
* if (!params) return null;
|
|
147
|
+
* const response = await fetch('/api/validate-email', {
|
|
148
|
+
* method: 'POST',
|
|
149
|
+
* body: JSON.stringify({ email: params }),
|
|
150
|
+
* });
|
|
151
|
+
* return response.json();
|
|
152
|
+
* },
|
|
153
|
+
* }));
|
|
154
|
+
*
|
|
155
|
+
* // Email validation triggers when form email changes
|
|
156
|
+
* formSignal.update(form => ({ ...form, email: 'john@example.com' }));
|
|
157
|
+
* // -> emailSource emits 'john@example.com'
|
|
158
|
+
* // -> validateEmail executes
|
|
159
|
+
* ```
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* Debounced signal to source
|
|
163
|
+
* ```ts
|
|
164
|
+
* const searchInputSignal = signal('');
|
|
165
|
+
*
|
|
166
|
+
* // Create debounced signal (using custom debounce logic)
|
|
167
|
+
* const debouncedSearchSignal = computed(() => {
|
|
168
|
+
* const input = searchInputSignal();
|
|
169
|
+
* // Debounce logic would go here
|
|
170
|
+
* return input;
|
|
171
|
+
* });
|
|
172
|
+
*
|
|
173
|
+
* // Convert to source
|
|
174
|
+
* const debouncedSearchSource = toSource(debouncedSearchSignal);
|
|
175
|
+
*
|
|
176
|
+
* // Use in query
|
|
177
|
+
* const searchResults = craftUse(query({
|
|
178
|
+
* method: afterRecomputation(debouncedSearchSource, (term) => term),
|
|
179
|
+
* loader: async ({ params }) => {
|
|
180
|
+
* if (!params) return [];
|
|
181
|
+
* const response = await fetch(`/api/search?q=${params}`);
|
|
182
|
+
* return response.json();
|
|
183
|
+
* },
|
|
184
|
+
* }));
|
|
185
|
+
*
|
|
186
|
+
* // Query executes only after debounce
|
|
187
|
+
* searchInputSignal.set('ang');
|
|
188
|
+
* searchInputSignal.set('angu');
|
|
189
|
+
* searchInputSignal.set('angular');
|
|
190
|
+
* // -> Eventually debouncedSearchSource emits 'angular'
|
|
191
|
+
* // -> searchResults query executes once
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* Form control signal to source
|
|
196
|
+
* ```ts
|
|
197
|
+
* @Component({
|
|
198
|
+
* selector: 'app-search',
|
|
199
|
+
* template: `
|
|
200
|
+
* <input [formControl]="searchControl" />
|
|
201
|
+
* `,
|
|
202
|
+
* })
|
|
203
|
+
* export class SearchComponent {
|
|
204
|
+
* searchControl = new FormControl('');
|
|
205
|
+
*
|
|
206
|
+
* // Convert form control value to signal
|
|
207
|
+
* searchSignal = toSignal(
|
|
208
|
+
* this.searchControl.valueChanges.pipe(
|
|
209
|
+
* debounceTime(300),
|
|
210
|
+
* distinctUntilChanged()
|
|
211
|
+
* ),
|
|
212
|
+
* { initialValue: '' }
|
|
213
|
+
* );
|
|
214
|
+
*
|
|
215
|
+
* // Convert signal to source
|
|
216
|
+
* searchSource = toSource(this.searchSignal);
|
|
217
|
+
*
|
|
218
|
+
* // Use in store
|
|
219
|
+
* { injectCraft } = craft(
|
|
220
|
+
* { name: '', providedIn: 'root' },
|
|
221
|
+
* craftQuery('results', () =>
|
|
222
|
+
* query({
|
|
223
|
+
* method: afterRecomputation(this.searchSource, (term) => term),
|
|
224
|
+
* loader: async ({ params }) => {
|
|
225
|
+
* const response = await fetch(`/api/search?q=${params}`);
|
|
226
|
+
* return response.json();
|
|
227
|
+
* },
|
|
228
|
+
* })
|
|
229
|
+
* )
|
|
230
|
+
* );
|
|
231
|
+
*
|
|
232
|
+
* store = this.injectCraft();
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* Custom equality for change detection
|
|
238
|
+
* ```ts
|
|
239
|
+
* type SearchParams = { query: string; timestamp: number };
|
|
240
|
+
*
|
|
241
|
+
* const paramsSignal = signal<SearchParams>({
|
|
242
|
+
* query: '',
|
|
243
|
+
* timestamp: Date.now(),
|
|
244
|
+
* });
|
|
245
|
+
*
|
|
246
|
+
* // Only emit when query changes, ignore timestamp
|
|
247
|
+
* const querySource = toSource(paramsSignal, {
|
|
248
|
+
* computed: (params) => params.query,
|
|
249
|
+
* equal: (a, b) => a === b, // Compare strings only
|
|
250
|
+
* });
|
|
251
|
+
*
|
|
252
|
+
* // Update with same query but different timestamp
|
|
253
|
+
* paramsSignal.set({ query: 'test', timestamp: Date.now() });
|
|
254
|
+
* // -> querySource emits 'test'
|
|
255
|
+
*
|
|
256
|
+
* paramsSignal.set({ query: 'test', timestamp: Date.now() });
|
|
257
|
+
* // -> querySource does NOT emit (same query)
|
|
258
|
+
*
|
|
259
|
+
* paramsSignal.set({ query: 'new', timestamp: Date.now() });
|
|
260
|
+
* // -> querySource emits 'new'
|
|
261
|
+
* ```
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* Using preserveLastValue for immediate access
|
|
265
|
+
* ```ts
|
|
266
|
+
* const countSignal = signal(5);
|
|
267
|
+
* const countSource = toSource(countSignal);
|
|
268
|
+
*
|
|
269
|
+
* // Standard behavior - first read is undefined
|
|
270
|
+
* console.log(countSource()); // undefined
|
|
271
|
+
*
|
|
272
|
+
* countSignal.set(10);
|
|
273
|
+
* console.log(countSource()); // 10
|
|
274
|
+
*
|
|
275
|
+
* // Using preserveLastValue - gets current value immediately
|
|
276
|
+
* const immediateCount = countSource.preserveLastValue;
|
|
277
|
+
* console.log(immediateCount()); // 10
|
|
278
|
+
*
|
|
279
|
+
* countSignal.set(15);
|
|
280
|
+
* console.log(immediateCount()); // 15
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* Complex transformation with validation
|
|
285
|
+
* ```ts
|
|
286
|
+
* type RawInput = { text: string; valid?: boolean };
|
|
287
|
+
*
|
|
288
|
+
* const inputSignal = signal<RawInput>({ text: '' });
|
|
289
|
+
*
|
|
290
|
+
* // Transform and validate during conversion
|
|
291
|
+
* const validInputSource = toSource(inputSignal, {
|
|
292
|
+
* computed: (input) => {
|
|
293
|
+
* const trimmed = input.text.trim();
|
|
294
|
+
* if (trimmed.length < 3) {
|
|
295
|
+
* return null; // Invalid input
|
|
296
|
+
* }
|
|
297
|
+
* return {
|
|
298
|
+
* text: trimmed.toLowerCase(),
|
|
299
|
+
* length: trimmed.length,
|
|
300
|
+
* };
|
|
301
|
+
* },
|
|
302
|
+
* });
|
|
303
|
+
*
|
|
304
|
+
* // Use in mutation
|
|
305
|
+
* const submitInput = craftUse(mutation({
|
|
306
|
+
* method: afterRecomputation(validInputSource, (data) => data),
|
|
307
|
+
* loader: async ({ params }) => {
|
|
308
|
+
* if (!params) {
|
|
309
|
+
* throw new Error('Invalid input');
|
|
310
|
+
* }
|
|
311
|
+
* const response = await fetch('/api/submit', {
|
|
312
|
+
* method: 'POST',
|
|
313
|
+
* body: JSON.stringify(params),
|
|
314
|
+
* });
|
|
315
|
+
* return response.json();
|
|
316
|
+
* },
|
|
317
|
+
* }));
|
|
318
|
+
*
|
|
319
|
+
* // Invalid input
|
|
320
|
+
* inputSignal.set({ text: 'ab' });
|
|
321
|
+
* // -> validInputSource emits null
|
|
322
|
+
* // -> submitInput throws error
|
|
323
|
+
*
|
|
324
|
+
* // Valid input
|
|
325
|
+
* inputSignal.set({ text: 'Valid Input' });
|
|
326
|
+
* // -> validInputSource emits { text: 'valid input', length: 11 }
|
|
327
|
+
* // -> submitInput executes with transformed data
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
export declare function toSource<SourceState, ComputedValue>(signalOrigin: Signal<SourceState> | WritableSignal<SourceState>, options?: {
|
|
331
|
+
computed?: (sourceValue: NoInfer<SourceState>) => ComputedValue;
|
|
332
|
+
equal?: ValueEqualityFn<NoInfer<SourceState> | undefined>;
|
|
333
|
+
debugName?: string;
|
|
334
|
+
}): ReadonlySource<IsUnknown<ComputedValue> extends true ? SourceState : ComputedValue>;
|
|
335
|
+
//# sourceMappingURL=to-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-source.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/to-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAEN,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqUG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,aAAa,EACjD,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,EAC/D,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,aAAa,CAAC;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,cAAc,CACf,SAAS,CAAC,aAAa,CAAC,SAAS,IAAI,GAAG,WAAW,GAAG,aAAa,CACpE,CAqCA"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { linkedSignal, untracked, } from './host/craft-compat';
|
|
2
|
+
import { SourceBranded } from './util/util';
|
|
3
|
+
/**
|
|
4
|
+
* Converts an Angular signal into a readonly source with lazy emission semantics.
|
|
5
|
+
*
|
|
6
|
+
* This function bridges the gap between signals and sources by:
|
|
7
|
+
* - Converting continuous signal values into discrete source emissions
|
|
8
|
+
* - Implementing lazy emission (only emits on signal changes, not on first read)
|
|
9
|
+
* - Supporting optional value transformation via computed function
|
|
10
|
+
* - Providing both standard and value-preserving listener variants
|
|
11
|
+
* - Enabling signal-to-source conversions for event-driven architectures
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* **Signal vs Source Semantics:**
|
|
15
|
+
* - **Signals**: Continuously readable, always have a value, recompute on access
|
|
16
|
+
* - **Sources**: Emit only on explicit changes, lazy by default (undefined on first read)
|
|
17
|
+
* - toSource converts continuous signal behavior to discrete source emissions
|
|
18
|
+
*
|
|
19
|
+
* **Emission Behavior:**
|
|
20
|
+
* - First read returns `undefined` by default (maintains source lazy semantics)
|
|
21
|
+
* - Subsequent reads return new values only when the origin signal changes
|
|
22
|
+
* - Use `preserveLastValue` variant to get immediate value on first read
|
|
23
|
+
*
|
|
24
|
+
* **Use Cases:**
|
|
25
|
+
* - **Event-driven patterns**: Convert signals to sources for reactive chains
|
|
26
|
+
* - **Debounced signals**: Wrap debounced signals as sources for queries/mutations
|
|
27
|
+
* - **External state**: Convert RxJS signals (toSignal) to sources
|
|
28
|
+
* - **Form signals**: Convert form control signals to sources for automatic submission
|
|
29
|
+
* - **Route params**: Convert router param signals to sources for automatic queries
|
|
30
|
+
* - **Filtering**: Transform signal values while converting to source
|
|
31
|
+
*
|
|
32
|
+
* **Transformation:**
|
|
33
|
+
* - Without `computed`: Passes signal values through unchanged
|
|
34
|
+
* - With `computed`: Applies transformation before emitting to source
|
|
35
|
+
* - Useful for extracting fields, formatting, or type narrowing
|
|
36
|
+
*
|
|
37
|
+
* **Comparison with computedSource:**
|
|
38
|
+
* - `toSource`: Converts signals to sources (signal → source)
|
|
39
|
+
* - `computedSource`: Transforms sources to sources (source → source)
|
|
40
|
+
* - Use toSource when bridging from signal world to source world
|
|
41
|
+
*
|
|
42
|
+
* @template SourceState - The type of values from the origin signal
|
|
43
|
+
* @template ComputedValue - The type of values after optional computation
|
|
44
|
+
*
|
|
45
|
+
* @param signalOrigin - The signal or writable signal to convert.
|
|
46
|
+
* Changes to this signal trigger source emissions.
|
|
47
|
+
*
|
|
48
|
+
* @param options - Optional configuration:
|
|
49
|
+
* - `computed`: Function to transform signal values before emission
|
|
50
|
+
* - `equal`: Custom equality function for change detection
|
|
51
|
+
* - `debugName`: Name for debugging purposes
|
|
52
|
+
*
|
|
53
|
+
* @returns A readonly source that emits when the signal changes with:
|
|
54
|
+
* - Standard behavior: First read returns `undefined`, subsequent reads return values after signal changes
|
|
55
|
+
* - `preserveLastValue` property: Returns current value immediately on first read
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* Basic signal to source conversion
|
|
59
|
+
* ```ts
|
|
60
|
+
* const countSignal = signal(0);
|
|
61
|
+
* const countSource = toSource(countSignal);
|
|
62
|
+
*
|
|
63
|
+
* // Use in query for automatic execution
|
|
64
|
+
* const fetchData = craftUse(query({
|
|
65
|
+
* method: afterRecomputation(countSource, (count) => count),
|
|
66
|
+
* loader: async ({ params }) => {
|
|
67
|
+
* const response = await fetch(`/api/data/${params}`);
|
|
68
|
+
* return response.json();
|
|
69
|
+
* },
|
|
70
|
+
* }));
|
|
71
|
+
*
|
|
72
|
+
* // Query executes when signal changes
|
|
73
|
+
* countSignal.set(1);
|
|
74
|
+
* // -> countSource emits 1
|
|
75
|
+
* // -> fetchData executes with params 1
|
|
76
|
+
*
|
|
77
|
+
* countSignal.set(2);
|
|
78
|
+
* // -> countSource emits 2
|
|
79
|
+
* // -> fetchData executes with params 2
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* Converting route params to source
|
|
84
|
+
* ```ts
|
|
85
|
+
* @Component({
|
|
86
|
+
* selector: 'app-user-detail',
|
|
87
|
+
* template: `...`,
|
|
88
|
+
* })
|
|
89
|
+
* export class UserDetailComponent {
|
|
90
|
+
* route = inject(ActivatedRoute);
|
|
91
|
+
*
|
|
92
|
+
* // Convert route param to signal
|
|
93
|
+
* userIdSignal = toSignal(
|
|
94
|
+
* this.route.params.pipe(map(p => p['userId']))
|
|
95
|
+
* );
|
|
96
|
+
*
|
|
97
|
+
* // Convert signal to source
|
|
98
|
+
* userIdSource = toSource(this.userIdSignal);
|
|
99
|
+
*
|
|
100
|
+
* // Use source in query
|
|
101
|
+
* { injectCraft } = craft(
|
|
102
|
+
* { name: '', providedIn: 'root' },
|
|
103
|
+
* craftQuery('user', () =>
|
|
104
|
+
* query({
|
|
105
|
+
* method: afterRecomputation(this.userIdSource, (id) => id),
|
|
106
|
+
* loader: async ({ params }) => {
|
|
107
|
+
* if (!params) return null;
|
|
108
|
+
* const response = await fetch(`/api/users/${params}`);
|
|
109
|
+
* return response.json();
|
|
110
|
+
* },
|
|
111
|
+
* })
|
|
112
|
+
* )
|
|
113
|
+
* );
|
|
114
|
+
*
|
|
115
|
+
* store = this.injectCraft();
|
|
116
|
+
*
|
|
117
|
+
* // Query automatically updates when route changes
|
|
118
|
+
* }
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* Transforming signal values during conversion
|
|
123
|
+
* ```ts
|
|
124
|
+
* type FormData = {
|
|
125
|
+
* name: string;
|
|
126
|
+
* email: string;
|
|
127
|
+
* preferences: { newsletter: boolean };
|
|
128
|
+
* };
|
|
129
|
+
*
|
|
130
|
+
* const formSignal = signal<FormData>({
|
|
131
|
+
* name: '',
|
|
132
|
+
* email: '',
|
|
133
|
+
* preferences: { newsletter: false },
|
|
134
|
+
* });
|
|
135
|
+
*
|
|
136
|
+
* // Extract only email for validation
|
|
137
|
+
* const emailSource = toSource(formSignal, {
|
|
138
|
+
* computed: (form) => form.email,
|
|
139
|
+
* });
|
|
140
|
+
*
|
|
141
|
+
* // Use in async method
|
|
142
|
+
* const validateEmail = craftUse(asyncProcess({
|
|
143
|
+
* method: afterRecomputation(emailSource, (email) => email),
|
|
144
|
+
* loader: async ({ params }) => {
|
|
145
|
+
* if (!params) return null;
|
|
146
|
+
* const response = await fetch('/api/validate-email', {
|
|
147
|
+
* method: 'POST',
|
|
148
|
+
* body: JSON.stringify({ email: params }),
|
|
149
|
+
* });
|
|
150
|
+
* return response.json();
|
|
151
|
+
* },
|
|
152
|
+
* }));
|
|
153
|
+
*
|
|
154
|
+
* // Email validation triggers when form email changes
|
|
155
|
+
* formSignal.update(form => ({ ...form, email: 'john@example.com' }));
|
|
156
|
+
* // -> emailSource emits 'john@example.com'
|
|
157
|
+
* // -> validateEmail executes
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* Debounced signal to source
|
|
162
|
+
* ```ts
|
|
163
|
+
* const searchInputSignal = signal('');
|
|
164
|
+
*
|
|
165
|
+
* // Create debounced signal (using custom debounce logic)
|
|
166
|
+
* const debouncedSearchSignal = computed(() => {
|
|
167
|
+
* const input = searchInputSignal();
|
|
168
|
+
* // Debounce logic would go here
|
|
169
|
+
* return input;
|
|
170
|
+
* });
|
|
171
|
+
*
|
|
172
|
+
* // Convert to source
|
|
173
|
+
* const debouncedSearchSource = toSource(debouncedSearchSignal);
|
|
174
|
+
*
|
|
175
|
+
* // Use in query
|
|
176
|
+
* const searchResults = craftUse(query({
|
|
177
|
+
* method: afterRecomputation(debouncedSearchSource, (term) => term),
|
|
178
|
+
* loader: async ({ params }) => {
|
|
179
|
+
* if (!params) return [];
|
|
180
|
+
* const response = await fetch(`/api/search?q=${params}`);
|
|
181
|
+
* return response.json();
|
|
182
|
+
* },
|
|
183
|
+
* }));
|
|
184
|
+
*
|
|
185
|
+
* // Query executes only after debounce
|
|
186
|
+
* searchInputSignal.set('ang');
|
|
187
|
+
* searchInputSignal.set('angu');
|
|
188
|
+
* searchInputSignal.set('angular');
|
|
189
|
+
* // -> Eventually debouncedSearchSource emits 'angular'
|
|
190
|
+
* // -> searchResults query executes once
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* Form control signal to source
|
|
195
|
+
* ```ts
|
|
196
|
+
* @Component({
|
|
197
|
+
* selector: 'app-search',
|
|
198
|
+
* template: `
|
|
199
|
+
* <input [formControl]="searchControl" />
|
|
200
|
+
* `,
|
|
201
|
+
* })
|
|
202
|
+
* export class SearchComponent {
|
|
203
|
+
* searchControl = new FormControl('');
|
|
204
|
+
*
|
|
205
|
+
* // Convert form control value to signal
|
|
206
|
+
* searchSignal = toSignal(
|
|
207
|
+
* this.searchControl.valueChanges.pipe(
|
|
208
|
+
* debounceTime(300),
|
|
209
|
+
* distinctUntilChanged()
|
|
210
|
+
* ),
|
|
211
|
+
* { initialValue: '' }
|
|
212
|
+
* );
|
|
213
|
+
*
|
|
214
|
+
* // Convert signal to source
|
|
215
|
+
* searchSource = toSource(this.searchSignal);
|
|
216
|
+
*
|
|
217
|
+
* // Use in store
|
|
218
|
+
* { injectCraft } = craft(
|
|
219
|
+
* { name: '', providedIn: 'root' },
|
|
220
|
+
* craftQuery('results', () =>
|
|
221
|
+
* query({
|
|
222
|
+
* method: afterRecomputation(this.searchSource, (term) => term),
|
|
223
|
+
* loader: async ({ params }) => {
|
|
224
|
+
* const response = await fetch(`/api/search?q=${params}`);
|
|
225
|
+
* return response.json();
|
|
226
|
+
* },
|
|
227
|
+
* })
|
|
228
|
+
* )
|
|
229
|
+
* );
|
|
230
|
+
*
|
|
231
|
+
* store = this.injectCraft();
|
|
232
|
+
* }
|
|
233
|
+
* ```
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* Custom equality for change detection
|
|
237
|
+
* ```ts
|
|
238
|
+
* type SearchParams = { query: string; timestamp: number };
|
|
239
|
+
*
|
|
240
|
+
* const paramsSignal = signal<SearchParams>({
|
|
241
|
+
* query: '',
|
|
242
|
+
* timestamp: Date.now(),
|
|
243
|
+
* });
|
|
244
|
+
*
|
|
245
|
+
* // Only emit when query changes, ignore timestamp
|
|
246
|
+
* const querySource = toSource(paramsSignal, {
|
|
247
|
+
* computed: (params) => params.query,
|
|
248
|
+
* equal: (a, b) => a === b, // Compare strings only
|
|
249
|
+
* });
|
|
250
|
+
*
|
|
251
|
+
* // Update with same query but different timestamp
|
|
252
|
+
* paramsSignal.set({ query: 'test', timestamp: Date.now() });
|
|
253
|
+
* // -> querySource emits 'test'
|
|
254
|
+
*
|
|
255
|
+
* paramsSignal.set({ query: 'test', timestamp: Date.now() });
|
|
256
|
+
* // -> querySource does NOT emit (same query)
|
|
257
|
+
*
|
|
258
|
+
* paramsSignal.set({ query: 'new', timestamp: Date.now() });
|
|
259
|
+
* // -> querySource emits 'new'
|
|
260
|
+
* ```
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* Using preserveLastValue for immediate access
|
|
264
|
+
* ```ts
|
|
265
|
+
* const countSignal = signal(5);
|
|
266
|
+
* const countSource = toSource(countSignal);
|
|
267
|
+
*
|
|
268
|
+
* // Standard behavior - first read is undefined
|
|
269
|
+
* console.log(countSource()); // undefined
|
|
270
|
+
*
|
|
271
|
+
* countSignal.set(10);
|
|
272
|
+
* console.log(countSource()); // 10
|
|
273
|
+
*
|
|
274
|
+
* // Using preserveLastValue - gets current value immediately
|
|
275
|
+
* const immediateCount = countSource.preserveLastValue;
|
|
276
|
+
* console.log(immediateCount()); // 10
|
|
277
|
+
*
|
|
278
|
+
* countSignal.set(15);
|
|
279
|
+
* console.log(immediateCount()); // 15
|
|
280
|
+
* ```
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* Complex transformation with validation
|
|
284
|
+
* ```ts
|
|
285
|
+
* type RawInput = { text: string; valid?: boolean };
|
|
286
|
+
*
|
|
287
|
+
* const inputSignal = signal<RawInput>({ text: '' });
|
|
288
|
+
*
|
|
289
|
+
* // Transform and validate during conversion
|
|
290
|
+
* const validInputSource = toSource(inputSignal, {
|
|
291
|
+
* computed: (input) => {
|
|
292
|
+
* const trimmed = input.text.trim();
|
|
293
|
+
* if (trimmed.length < 3) {
|
|
294
|
+
* return null; // Invalid input
|
|
295
|
+
* }
|
|
296
|
+
* return {
|
|
297
|
+
* text: trimmed.toLowerCase(),
|
|
298
|
+
* length: trimmed.length,
|
|
299
|
+
* };
|
|
300
|
+
* },
|
|
301
|
+
* });
|
|
302
|
+
*
|
|
303
|
+
* // Use in mutation
|
|
304
|
+
* const submitInput = craftUse(mutation({
|
|
305
|
+
* method: afterRecomputation(validInputSource, (data) => data),
|
|
306
|
+
* loader: async ({ params }) => {
|
|
307
|
+
* if (!params) {
|
|
308
|
+
* throw new Error('Invalid input');
|
|
309
|
+
* }
|
|
310
|
+
* const response = await fetch('/api/submit', {
|
|
311
|
+
* method: 'POST',
|
|
312
|
+
* body: JSON.stringify(params),
|
|
313
|
+
* });
|
|
314
|
+
* return response.json();
|
|
315
|
+
* },
|
|
316
|
+
* }));
|
|
317
|
+
*
|
|
318
|
+
* // Invalid input
|
|
319
|
+
* inputSignal.set({ text: 'ab' });
|
|
320
|
+
* // -> validInputSource emits null
|
|
321
|
+
* // -> submitInput throws error
|
|
322
|
+
*
|
|
323
|
+
* // Valid input
|
|
324
|
+
* inputSignal.set({ text: 'Valid Input' });
|
|
325
|
+
* // -> validInputSource emits { text: 'valid input', length: 11 }
|
|
326
|
+
* // -> submitInput executes with transformed data
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
export function toSource(signalOrigin, options) {
|
|
330
|
+
const sourceState = linkedSignal(signalOrigin, {
|
|
331
|
+
...(options?.equal && { equal: options?.equal }), // add the equal function here, it may helps to detect changes when using scalar values
|
|
332
|
+
...(options?.debugName && {
|
|
333
|
+
debugName: options?.debugName + '_sourceState',
|
|
334
|
+
}),
|
|
335
|
+
});
|
|
336
|
+
const listener = (listenerOptions) => linkedSignal({
|
|
337
|
+
source: sourceState,
|
|
338
|
+
computation: (currentSourceState, previousData) => {
|
|
339
|
+
// always when first listened return undefined
|
|
340
|
+
if (!previousData && listenerOptions?.nullishFirstValue !== false) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
//! use untracked to avoid computation to be re-evaluated when used inside another effect/computed
|
|
344
|
+
return untracked(() => options?.computed
|
|
345
|
+
? options?.computed?.(currentSourceState)
|
|
346
|
+
: currentSourceState);
|
|
347
|
+
},
|
|
348
|
+
...(options?.equal && { equal: options?.equal }),
|
|
349
|
+
...(options?.debugName && { debugName: options?.debugName }),
|
|
350
|
+
});
|
|
351
|
+
return Object.assign(listener({
|
|
352
|
+
nullishFirstValue: true,
|
|
353
|
+
}), {
|
|
354
|
+
preserveLastValue: listener({
|
|
355
|
+
nullishFirstValue: false,
|
|
356
|
+
}),
|
|
357
|
+
}, SourceBranded);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=to-source.js.map
|