@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,8 @@
|
|
|
1
|
+
import { ValueEqualityFn } from './host/craft-compat';
|
|
2
|
+
import { ReadonlySource } from './util/source.type';
|
|
3
|
+
import { SignalSource } from './signal-source';
|
|
4
|
+
export declare function linkedSource<SourceState, ComputedValue>(signalOrigin: SignalSource<SourceState> | ReadonlySource<SourceState>, computedFn: (sourceValue: NoInfer<SourceState>) => ComputedValue, options?: {
|
|
5
|
+
equal?: ValueEqualityFn<NoInfer<ComputedValue> | undefined>;
|
|
6
|
+
debugName?: string;
|
|
7
|
+
}): SignalSource<ComputedValue>;
|
|
8
|
+
//# sourceMappingURL=linked-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-source.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/linked-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,eAAe,EAAU,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,wBAAgB,YAAY,CAAC,WAAW,EAAE,aAAa,EACrD,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,EACrE,UAAU,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,aAAa,EAChE,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,YAAY,CAAC,aAAa,CAAC,CAyB7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { linkedSignal } from './host/craft-compat';
|
|
2
|
+
import { SourceBranded } from './util/util';
|
|
3
|
+
export function linkedSource(signalOrigin, computedFn, options) {
|
|
4
|
+
const listener = (listenerOptions) => linkedSignal({
|
|
5
|
+
source: signalOrigin,
|
|
6
|
+
computation: (currentSourceState, previousData) => {
|
|
7
|
+
// always when first listened return undefined
|
|
8
|
+
if (!previousData && listenerOptions?.nullishFirstValue !== false) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return computedFn(currentSourceState);
|
|
12
|
+
},
|
|
13
|
+
...(options?.equal && { equal: options?.equal }),
|
|
14
|
+
...(options?.debugName && { debugName: options?.debugName }),
|
|
15
|
+
});
|
|
16
|
+
return Object.assign(listener({
|
|
17
|
+
nullishFirstValue: true,
|
|
18
|
+
}), {
|
|
19
|
+
preserveLastValue: listener({
|
|
20
|
+
nullishFirstValue: false,
|
|
21
|
+
}),
|
|
22
|
+
}, SourceBranded);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=linked-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-source.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/linked-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmC,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,YAAY,CAC1B,YAAqE,EACrE,UAAgE,EAChE,OAGC;IAED,MAAM,QAAQ,GAAG,CAAC,eAAgD,EAAE,EAAE,CACpE,YAAY,CAAyC;QACnD,MAAM,EAAE,YAAmC;QAC3C,WAAW,EAAE,CAAC,kBAAkB,EAAE,YAAY,EAAE,EAAE;YAChD,8CAA8C;YAC9C,IAAI,CAAC,YAAY,IAAI,eAAe,EAAE,iBAAiB,KAAK,KAAK,EAAE,CAAC;gBAClE,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAChD,GAAG,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KAC7D,CAAC,CAAC;IACL,OAAO,MAAM,CAAC,MAAM,CAClB,QAAQ,CAAC;QACP,iBAAiB,EAAE,IAAI;KACxB,CAAC,EACF;QACE,iBAAiB,EAAE,QAAQ,CAAC;YAC1B,iBAAiB,EAAE,KAAK;SACzB,CAAC;KACH,EACD,aAAa,CAC4B,CAAC;AAC9C,CAAC","sourcesContent":["import { linkedSignal, Signal, ValueEqualityFn, signal } from './host/craft-compat';\nimport { ReadonlySource } from './util/source.type';\nimport { SignalSource } from './signal-source';\nimport { SourceBranded } from './util/util';\n\nexport function linkedSource<SourceState, ComputedValue>(\n signalOrigin: SignalSource<SourceState> | ReadonlySource<SourceState>,\n computedFn: (sourceValue: NoInfer<SourceState>) => ComputedValue,\n options?: {\n equal?: ValueEqualityFn<NoInfer<ComputedValue> | undefined>;\n debugName?: string;\n },\n): SignalSource<ComputedValue> {\n const listener = (listenerOptions: { nullishFirstValue?: boolean }) =>\n linkedSignal<SourceState, ComputedValue | undefined>({\n source: signalOrigin as Signal<SourceState>,\n computation: (currentSourceState, previousData) => {\n // always when first listened return undefined\n if (!previousData && listenerOptions?.nullishFirstValue !== false) {\n return undefined;\n }\n return computedFn(currentSourceState);\n },\n ...(options?.equal && { equal: options?.equal }),\n ...(options?.debugName && { debugName: options?.debugName }),\n });\n return Object.assign(\n listener({\n nullishFirstValue: true,\n }),\n {\n preserveLastValue: listener({\n nullishFirstValue: false,\n }),\n },\n SourceBranded,\n ) as unknown as SignalSource<ComputedValue>;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { StorageServiceApi } from './browser-boundaries';
|
|
2
|
+
import { QueriesPersister } from './util/persister.type';
|
|
3
|
+
export declare function createStoragePersister(prefix: string, storage: StorageServiceApi): QueriesPersister;
|
|
4
|
+
//# sourceMappingURL=local-storage-persister.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-storage-persister.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/local-storage-persister.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAGL,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AA+B/B,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,gBAAgB,CAsWlB"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { effect, inject, Injector, linkedSignal, signal, untracked, } from './host/craft-compat';
|
|
2
|
+
import { isEqual } from './util/persister.util';
|
|
3
|
+
import { nestedEffect, selfStoppingNestedEffect, } from './util/types/util';
|
|
4
|
+
function diffNewKeys(currentKeys, previous) {
|
|
5
|
+
if (currentKeys.length === 0) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
const previousKeys = previous?.allKeys ?? [];
|
|
9
|
+
const newKeys = currentKeys.filter((key) => !previousKeys.includes(key));
|
|
10
|
+
return newKeys.length > 0
|
|
11
|
+
? { newKeys, allKeys: [...currentKeys] }
|
|
12
|
+
: previous;
|
|
13
|
+
}
|
|
14
|
+
export function createStoragePersister(prefix, storage) {
|
|
15
|
+
const _injector = inject(Injector);
|
|
16
|
+
const queriesMap = signal(new Map(), {
|
|
17
|
+
equal: () => false,
|
|
18
|
+
});
|
|
19
|
+
const queriesByIdMap = signal(new Map(), {
|
|
20
|
+
equal: () => false,
|
|
21
|
+
});
|
|
22
|
+
const newQueryKeysForNestedEffect = linkedSignal({
|
|
23
|
+
source: queriesMap,
|
|
24
|
+
computation: (currentSource, previous) => diffNewKeys(Array.from(currentSource?.keys() ?? []), previous?.value),
|
|
25
|
+
});
|
|
26
|
+
effect(() => {
|
|
27
|
+
if (!newQueryKeysForNestedEffect()?.newKeys) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
newQueryKeysForNestedEffect()?.newKeys.forEach((newKey) => {
|
|
31
|
+
const data = untracked(() => queriesMap().get(newKey));
|
|
32
|
+
nestedEffect(_injector, () => {
|
|
33
|
+
if (!data) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const { queryResource, queryResourceParamsSrc, storageKey } = data;
|
|
37
|
+
const queryStatus = queryResource.status();
|
|
38
|
+
const queryValue = queryResource.value(); // also track the query value, because the status can stayed local but the value may change
|
|
39
|
+
if (queryStatus !== 'resolved' && queryStatus !== 'local') {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
untracked(() => {
|
|
43
|
+
const queryParams = queryResourceParamsSrc();
|
|
44
|
+
storage.setItem(storageKey, JSON.stringify({
|
|
45
|
+
queryParams,
|
|
46
|
+
queryValue,
|
|
47
|
+
timestamp: Date.now(),
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
if (data?.waitForParamsSrcToBeEqualToPreviousValue) {
|
|
52
|
+
selfStoppingNestedEffect(_injector, (stop) => {
|
|
53
|
+
const { queryResourceParamsSrc, storageKey, queryResource, staleTime, validate } = data;
|
|
54
|
+
const params = queryResourceParamsSrc();
|
|
55
|
+
if (params === undefined) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const storedValue = storage.getItem(storageKey);
|
|
59
|
+
if (!storedValue) {
|
|
60
|
+
stop();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const { queryValue, queryParams, timestamp } = JSON.parse(storedValue);
|
|
65
|
+
if (validate && !validate(queryValue)) {
|
|
66
|
+
storage.removeItem(storageKey);
|
|
67
|
+
stop();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Check if cache is expired
|
|
71
|
+
if (timestamp &&
|
|
72
|
+
data.cacheTime > 0 &&
|
|
73
|
+
isValueExpired(timestamp, data.cacheTime)) {
|
|
74
|
+
storage.removeItem(storageKey);
|
|
75
|
+
stop();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const isEqualParams = isEqual(params, queryParams);
|
|
79
|
+
if (!isEqualParams) {
|
|
80
|
+
storage.removeItem(storageKey);
|
|
81
|
+
stop();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (isEqualParams) {
|
|
85
|
+
queryResource.set(queryValue);
|
|
86
|
+
if (staleTime !== undefined && timestamp && isValueExpired(timestamp, staleTime)) {
|
|
87
|
+
queryResource.reload();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
stop();
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.error('Error parsing stored value from localStorage', e);
|
|
94
|
+
stop();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
const newQueryByIdKeysForNestedEffect = linkedSignal({
|
|
102
|
+
source: queriesByIdMap,
|
|
103
|
+
computation: (currentSource, previous) => diffNewKeys(Array.from(currentSource?.keys() ?? []), previous?.value),
|
|
104
|
+
});
|
|
105
|
+
effect(() => {
|
|
106
|
+
if (!newQueryByIdKeysForNestedEffect()?.newKeys) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Each time their is a status change in the queryById resource it will save the query with only the resource that are 'resolved' or 'local' (it may be improved)
|
|
110
|
+
newQueryByIdKeysForNestedEffect()?.newKeys.forEach((newKey) => {
|
|
111
|
+
const data = untracked(() => queriesByIdMap().get(newKey));
|
|
112
|
+
nestedEffect(_injector, () => {
|
|
113
|
+
if (!data) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const { queryByIdResource, queryResourceParamsSrc, storageKey } = data;
|
|
117
|
+
const newRecordInQueryByIdForNestedEffect = linkedSignal({
|
|
118
|
+
source: queryByIdResource,
|
|
119
|
+
computation: (currentSource, previous) => diffNewKeys(Object.keys(currentSource ?? {}), previous?.value),
|
|
120
|
+
});
|
|
121
|
+
newRecordInQueryByIdForNestedEffect()?.newKeys.forEach((newRecord) => {
|
|
122
|
+
const data = untracked(() => queryByIdResource()[newRecord]);
|
|
123
|
+
nestedEffect(_injector, () => {
|
|
124
|
+
if (!data) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
let storedValue;
|
|
128
|
+
try {
|
|
129
|
+
storedValue = JSON.parse(storage.getItem(storageKey) || 'null');
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
console.error('Error parsing stored value from localStorage', e);
|
|
133
|
+
storage.removeItem(storageKey);
|
|
134
|
+
}
|
|
135
|
+
storedValue = storedValue ?? {
|
|
136
|
+
queryParams: queryResourceParamsSrc(),
|
|
137
|
+
queryByIdValue: {},
|
|
138
|
+
timestamp: Date.now(),
|
|
139
|
+
};
|
|
140
|
+
const isStable = data.status() === 'resolved' || data.status() === 'local';
|
|
141
|
+
const dataValue = data.hasValue() ? data.value() : undefined;
|
|
142
|
+
untracked(() => {
|
|
143
|
+
storedValue = {
|
|
144
|
+
queryParams: queryResourceParamsSrc(),
|
|
145
|
+
queryByIdValue: {
|
|
146
|
+
...storedValue?.queryByIdValue,
|
|
147
|
+
[newRecord]: {
|
|
148
|
+
params: storedValue?.queryByIdValue[newRecord]?.params ??
|
|
149
|
+
queryResourceParamsSrc(),
|
|
150
|
+
value: dataValue,
|
|
151
|
+
reloadOnMount: !isStable,
|
|
152
|
+
timestamp: Date.now(),
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
timestamp: Date.now(),
|
|
156
|
+
};
|
|
157
|
+
storage.setItem(storageKey, JSON.stringify(storedValue));
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
addQueryToPersist(data) {
|
|
166
|
+
const { key, storeName, queryResource, queryResourceParamsSrc, waitForParamsSrcToBeEqualToPreviousValue, cacheTime, staleTime, validate, } = data;
|
|
167
|
+
const storageKey = getStorageKey(storeName ?? prefix, key, 'resource');
|
|
168
|
+
const storedValue = storage.getItem(storageKey);
|
|
169
|
+
if (storedValue && !waitForParamsSrcToBeEqualToPreviousValue) {
|
|
170
|
+
try {
|
|
171
|
+
const { queryValue, timestamp } = JSON.parse(storedValue);
|
|
172
|
+
if (validate && !validate(queryValue)) {
|
|
173
|
+
storage.removeItem(storageKey);
|
|
174
|
+
}
|
|
175
|
+
else if (timestamp &&
|
|
176
|
+
cacheTime > 0 &&
|
|
177
|
+
isValueExpired(timestamp, cacheTime)) {
|
|
178
|
+
storage.removeItem(storageKey);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
queryResource.set(queryValue);
|
|
182
|
+
if (staleTime !== undefined && timestamp && isValueExpired(timestamp, staleTime)) {
|
|
183
|
+
queryResource.reload();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
console.error('Error parsing stored value from localStorage', e);
|
|
189
|
+
storage.removeItem(storageKey);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
queriesMap.update((map) => {
|
|
193
|
+
map.set(getPersisterMapKey(storeName ?? prefix, key), {
|
|
194
|
+
queryResource,
|
|
195
|
+
queryResourceParamsSrc,
|
|
196
|
+
storageKey,
|
|
197
|
+
waitForParamsSrcToBeEqualToPreviousValue,
|
|
198
|
+
cacheTime,
|
|
199
|
+
staleTime,
|
|
200
|
+
validate,
|
|
201
|
+
key,
|
|
202
|
+
});
|
|
203
|
+
return map;
|
|
204
|
+
});
|
|
205
|
+
},
|
|
206
|
+
addQueryByIdToPersist(data) {
|
|
207
|
+
const { key, storeName, queryByIdResource, queryResourceParamsSrc, cacheTime, staleTime, validate } = data;
|
|
208
|
+
const storageKey = getStorageKey(storeName ?? prefix, key, 'resourceById');
|
|
209
|
+
let storedValue;
|
|
210
|
+
try {
|
|
211
|
+
storedValue = JSON.parse(storage.getItem(storageKey) || 'null');
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
console.error('Error parsing stored value from localStorage', e);
|
|
215
|
+
storage.removeItem(storageKey);
|
|
216
|
+
}
|
|
217
|
+
const storedValueWithValidCacheTime = removeNotValidRecordsWithValidCacheTime(storageKey, storedValue, cacheTime, storage);
|
|
218
|
+
if (storedValueWithValidCacheTime) {
|
|
219
|
+
const { queryByIdValue } = storedValueWithValidCacheTime;
|
|
220
|
+
if (queryByIdValue && typeof queryByIdValue === 'object') {
|
|
221
|
+
Object.entries(queryByIdValue).forEach(([resourceKey, resourceValue]) => {
|
|
222
|
+
const isValueValid = !validate || resourceValue.value === undefined || validate(resourceValue.value);
|
|
223
|
+
const resourceRef = queryByIdResource.addById(resourceKey, {
|
|
224
|
+
defaultParam: resourceValue.params,
|
|
225
|
+
defaultValue: isValueValid ? resourceValue.value : undefined,
|
|
226
|
+
});
|
|
227
|
+
const isStale = staleTime !== undefined && resourceValue.timestamp && isValueExpired(resourceValue.timestamp, staleTime);
|
|
228
|
+
// The reload strategy can be improved to prioritize the current displayed resource
|
|
229
|
+
if (resourceValue.reloadOnMount || (isValueValid && isStale)) {
|
|
230
|
+
resourceRef.reload();
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
queriesByIdMap.update((map) => {
|
|
236
|
+
map.set(getPersisterMapKey(storeName ?? prefix, key), {
|
|
237
|
+
queryByIdResource,
|
|
238
|
+
queryResourceParamsSrc,
|
|
239
|
+
storageKey,
|
|
240
|
+
cacheTime,
|
|
241
|
+
staleTime,
|
|
242
|
+
validate,
|
|
243
|
+
key,
|
|
244
|
+
});
|
|
245
|
+
return map;
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
clearQuery(queryKey) {
|
|
249
|
+
queriesMap.update((map) => {
|
|
250
|
+
for (const [mapKey, query] of map) {
|
|
251
|
+
if (query.key !== queryKey)
|
|
252
|
+
continue;
|
|
253
|
+
map.delete(mapKey);
|
|
254
|
+
storage.removeItem(query.storageKey);
|
|
255
|
+
}
|
|
256
|
+
return map;
|
|
257
|
+
});
|
|
258
|
+
},
|
|
259
|
+
clearQueryBy(queryByIdKey) {
|
|
260
|
+
queriesByIdMap.update((map) => {
|
|
261
|
+
for (const [mapKey, query] of map) {
|
|
262
|
+
if (query.key !== queryByIdKey)
|
|
263
|
+
continue;
|
|
264
|
+
map.delete(mapKey);
|
|
265
|
+
storage.removeItem(query.storageKey);
|
|
266
|
+
}
|
|
267
|
+
return map;
|
|
268
|
+
});
|
|
269
|
+
},
|
|
270
|
+
clearAllQueries() {
|
|
271
|
+
queriesMap().forEach((query) => {
|
|
272
|
+
storage.removeItem(query.storageKey);
|
|
273
|
+
});
|
|
274
|
+
queriesMap.update((map) => {
|
|
275
|
+
map.clear();
|
|
276
|
+
return map;
|
|
277
|
+
});
|
|
278
|
+
},
|
|
279
|
+
clearAllQueriesById() {
|
|
280
|
+
queriesByIdMap().forEach((query) => {
|
|
281
|
+
storage.removeItem(query.storageKey);
|
|
282
|
+
});
|
|
283
|
+
queriesByIdMap.update((map) => {
|
|
284
|
+
map.clear();
|
|
285
|
+
return map;
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
clearAllCache() {
|
|
289
|
+
this.clearAllQueriesById();
|
|
290
|
+
this.clearAllQueries();
|
|
291
|
+
// Also remove entries restored from a previous application lifetime.
|
|
292
|
+
// The global handler delegates here so cleanup follows the selected
|
|
293
|
+
// storage backend instead of reaching for browser storage directly.
|
|
294
|
+
const keysToRemove = [];
|
|
295
|
+
const storageLength = storage.length();
|
|
296
|
+
for (let index = 0; index < storageLength; index++) {
|
|
297
|
+
const keyName = storage.key(index);
|
|
298
|
+
if (keyName?.startsWith('craft-ts-')) {
|
|
299
|
+
keysToRemove.push(keyName);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
keysToRemove.forEach((keyName) => storage.removeItem(keyName));
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function getStorageKey(prefix, key, type) {
|
|
307
|
+
return `craft-ts-${prefix}-${type}-${key}`;
|
|
308
|
+
}
|
|
309
|
+
function getPersisterMapKey(prefix, key) {
|
|
310
|
+
return `${prefix}\u0000${key}`;
|
|
311
|
+
}
|
|
312
|
+
function isValueExpired(timestamp, cacheTime) {
|
|
313
|
+
return Date.now() - timestamp > cacheTime;
|
|
314
|
+
}
|
|
315
|
+
function removeNotValidRecordsWithValidCacheTime(storageKey, storedValue, cacheTime, storage) {
|
|
316
|
+
if (!storedValue) {
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
const { queryByIdValue, timestamp } = storedValue;
|
|
320
|
+
if (timestamp && cacheTime > 0 && isValueExpired(timestamp, cacheTime)) {
|
|
321
|
+
// remove from storage
|
|
322
|
+
storage.removeItem(storageKey);
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
const validQueryByIdValue = Object.entries(queryByIdValue).reduce((acc, [key, value]) => {
|
|
326
|
+
const isValueExpiredResult = isValueExpired(value.timestamp, cacheTime);
|
|
327
|
+
if (!isValueExpiredResult) {
|
|
328
|
+
acc[key] = value;
|
|
329
|
+
}
|
|
330
|
+
return acc;
|
|
331
|
+
}, {});
|
|
332
|
+
// update local storage
|
|
333
|
+
storage.setItem(storageKey, JSON.stringify({
|
|
334
|
+
...storedValue,
|
|
335
|
+
queryByIdValue: validQueryByIdValue,
|
|
336
|
+
}));
|
|
337
|
+
return {
|
|
338
|
+
...storedValue,
|
|
339
|
+
queryByIdValue: validQueryByIdValue,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=local-storage-persister.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-storage-persister.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/local-storage-persister.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n effect,\n inject,\n Injector,\n linkedSignal,\n signal,\n untracked,\n} from './host/craft-compat';\n\nimport type { StorageServiceApi } from './browser-boundaries';\nimport { isEqual } from './util/persister.util';\nimport {\n PersistedQuery,\n PersistedQueryById,\n QueriesPersister,\n} from './util/persister.type';\nimport {\n nestedEffect,\n selfStoppingNestedEffect,\n} from './util/types/util';\nimport { ResourceByIdRef } from './resource-by-id';\n\n/**\n * The keys registered since the last time, plus the full key set they were\n * diffed against.\n *\n * Carrying `allKeys` is what makes the diff correct: the registration maps are\n * mutated in place and re-published (`equal: () => false`), so the previous\n * SOURCE is the very same Map instance as the current one and diffing against\n * it always yields nothing. Diffing against the previous RESULT — a snapshot\n * this computation owns — holds whether the computation runs eagerly or is\n * deferred to a later flush.\n */\ntype NewKeys = { newKeys: string[]; allKeys: string[] } | undefined;\n\nfunction diffNewKeys(currentKeys: readonly string[], previous: NewKeys): NewKeys {\n if (currentKeys.length === 0) {\n return undefined;\n }\n const previousKeys = previous?.allKeys ?? [];\n const newKeys = currentKeys.filter((key) => !previousKeys.includes(key));\n return newKeys.length > 0\n ? { newKeys, allKeys: [...currentKeys] }\n : previous;\n}\n\nexport function createStoragePersister(\n prefix: string,\n storage: StorageServiceApi,\n): QueriesPersister {\n const _injector = inject(Injector);\n const queriesMap = signal(\n new Map<string, PersistedQuery & { storageKey: string }>(),\n {\n equal: () => false,\n }\n );\n\n const queriesByIdMap = signal(\n new Map<string, PersistedQueryById & { storageKey: string }>(),\n {\n equal: () => false,\n }\n );\n\n const newQueryKeysForNestedEffect = linkedSignal<any, NewKeys>({\n source: queriesMap,\n computation: (currentSource, previous) =>\n diffNewKeys(Array.from(currentSource?.keys() ?? []), previous?.value),\n });\n\n effect(() => {\n if (!newQueryKeysForNestedEffect()?.newKeys) {\n return;\n }\n\n newQueryKeysForNestedEffect()?.newKeys.forEach((newKey) => {\n const data = untracked(() => queriesMap().get(newKey));\n nestedEffect(_injector, () => {\n if (!data) {\n return;\n }\n const { queryResource, queryResourceParamsSrc, storageKey } = data;\n const queryStatus = queryResource.status();\n const queryValue = queryResource.value(); // also track the query value, because the status can stayed local but the value may change\n\n if (queryStatus !== 'resolved' && queryStatus !== 'local') {\n return;\n }\n untracked(() => {\n const queryParams = queryResourceParamsSrc();\n storage.setItem(\n storageKey,\n JSON.stringify({\n queryParams,\n queryValue,\n timestamp: Date.now(),\n })\n );\n });\n });\n\n if (data?.waitForParamsSrcToBeEqualToPreviousValue) {\n selfStoppingNestedEffect(\n _injector,\n (stop) => {\n const { queryResourceParamsSrc, storageKey, queryResource, staleTime, validate } = data;\n const params = queryResourceParamsSrc();\n if (params === undefined) {\n return;\n }\n const storedValue = storage.getItem(storageKey);\n if (!storedValue) {\n stop();\n return;\n }\n try {\n const { queryValue, queryParams, timestamp } =\n JSON.parse(storedValue);\n\n if (validate && !validate(queryValue)) {\n storage.removeItem(storageKey);\n stop();\n return;\n }\n\n // Check if cache is expired\n if (\n timestamp &&\n data.cacheTime > 0 &&\n isValueExpired(timestamp, data.cacheTime)\n ) {\n storage.removeItem(storageKey);\n stop();\n return;\n }\n\n const isEqualParams = isEqual(params, queryParams);\n if (!isEqualParams) {\n storage.removeItem(storageKey);\n stop();\n return;\n }\n if (isEqualParams) {\n queryResource.set(queryValue);\n if (staleTime !== undefined && timestamp && isValueExpired(timestamp, staleTime)) {\n queryResource.reload();\n }\n }\n stop();\n } catch (e) {\n console.error('Error parsing stored value from localStorage', e);\n stop();\n return;\n }\n }\n );\n }\n });\n });\n\n const newQueryByIdKeysForNestedEffect = linkedSignal<any, NewKeys>({\n source: queriesByIdMap,\n computation: (currentSource, previous) =>\n diffNewKeys(Array.from(currentSource?.keys() ?? []), previous?.value),\n });\n\n effect(() => {\n if (!newQueryByIdKeysForNestedEffect()?.newKeys) {\n return;\n }\n\n // Each time their is a status change in the queryById resource it will save the query with only the resource that are 'resolved' or 'local' (it may be improved)\n newQueryByIdKeysForNestedEffect()?.newKeys.forEach((newKey) => {\n const data = untracked(() => queriesByIdMap().get(newKey));\n nestedEffect(_injector, () => {\n if (!data) {\n return;\n }\n\n const { queryByIdResource, queryResourceParamsSrc, storageKey } = data;\n\n const newRecordInQueryByIdForNestedEffect = linkedSignal<any, NewKeys>({\n source: queryByIdResource,\n computation: (\n currentSource: ReturnType<\n ResourceByIdRef<string, unknown, unknown>\n >,\n previous,\n ) => diffNewKeys(Object.keys(currentSource ?? {}), previous?.value),\n });\n newRecordInQueryByIdForNestedEffect()?.newKeys.forEach((newRecord) => {\n const data = untracked(() => queryByIdResource()[newRecord]);\n nestedEffect(_injector, () => {\n if (!data) {\n return;\n }\n\n let storedValue: QueryByIdStored | undefined;\n try {\n storedValue = JSON.parse(\n storage.getItem(storageKey) || 'null'\n );\n } catch (e) {\n console.error('Error parsing stored value from localStorage', e);\n storage.removeItem(storageKey);\n }\n storedValue = storedValue ?? {\n queryParams: queryResourceParamsSrc(),\n queryByIdValue: {},\n timestamp: Date.now(),\n };\n\n const isStable =\n data.status() === 'resolved' || data.status() === 'local';\n const dataValue = data.hasValue() ? data.value() : undefined;\n untracked(() => {\n storedValue = {\n queryParams: queryResourceParamsSrc(),\n queryByIdValue: {\n ...storedValue?.queryByIdValue,\n [newRecord]: {\n params:\n storedValue?.queryByIdValue[newRecord]?.params ??\n queryResourceParamsSrc(),\n value: dataValue,\n reloadOnMount: !isStable,\n timestamp: Date.now(),\n },\n },\n timestamp: Date.now(),\n };\n storage.setItem(storageKey, JSON.stringify(storedValue));\n });\n });\n });\n });\n });\n });\n\n return {\n addQueryToPersist(data: PersistedQuery): void {\n const {\n key,\n storeName,\n queryResource,\n queryResourceParamsSrc,\n waitForParamsSrcToBeEqualToPreviousValue,\n cacheTime,\n staleTime,\n validate,\n } = data;\n\n const storageKey = getStorageKey(storeName ?? prefix, key, 'resource');\n const storedValue = storage.getItem(storageKey);\n if (storedValue && !waitForParamsSrcToBeEqualToPreviousValue) {\n try {\n const { queryValue, timestamp } = JSON.parse(storedValue);\n if (validate && !validate(queryValue)) {\n storage.removeItem(storageKey);\n } else if (\n timestamp &&\n cacheTime > 0 &&\n isValueExpired(timestamp, cacheTime)\n ) {\n storage.removeItem(storageKey);\n } else {\n queryResource.set(queryValue);\n if (staleTime !== undefined && timestamp && isValueExpired(timestamp, staleTime)) {\n queryResource.reload();\n }\n }\n } catch (e) {\n console.error('Error parsing stored value from localStorage', e);\n storage.removeItem(storageKey);\n }\n }\n queriesMap.update((map) => {\n map.set(getPersisterMapKey(storeName ?? prefix, key), {\n queryResource,\n queryResourceParamsSrc,\n storageKey,\n waitForParamsSrcToBeEqualToPreviousValue,\n cacheTime,\n staleTime,\n validate,\n key,\n });\n return map;\n });\n },\n\n addQueryByIdToPersist(data: PersistedQueryById): void {\n const { key, storeName, queryByIdResource, queryResourceParamsSrc, cacheTime, staleTime, validate } =\n data;\n\n const storageKey = getStorageKey(storeName ?? prefix, key, 'resourceById');\n let storedValue: QueryByIdStored | undefined;\n try {\n storedValue = JSON.parse(storage.getItem(storageKey) || 'null');\n } catch (e) {\n console.error('Error parsing stored value from localStorage', e);\n storage.removeItem(storageKey);\n }\n\n const storedValueWithValidCacheTime =\n removeNotValidRecordsWithValidCacheTime(\n storageKey,\n storedValue,\n cacheTime,\n storage,\n );\n if (storedValueWithValidCacheTime) {\n const { queryByIdValue } = storedValueWithValidCacheTime;\n\n if (queryByIdValue && typeof queryByIdValue === 'object') {\n Object.entries(queryByIdValue).forEach(\n ([resourceKey, resourceValue]) => {\n const isValueValid = !validate || resourceValue.value === undefined || validate(resourceValue.value);\n const resourceRef = queryByIdResource.addById(resourceKey, {\n defaultParam: resourceValue.params,\n defaultValue: isValueValid ? resourceValue.value : undefined,\n });\n const isStale = staleTime !== undefined && resourceValue.timestamp && isValueExpired(resourceValue.timestamp, staleTime);\n // The reload strategy can be improved to prioritize the current displayed resource\n if (resourceValue.reloadOnMount || (isValueValid && isStale)) {\n resourceRef.reload();\n }\n }\n );\n }\n }\n queriesByIdMap.update((map) => {\n map.set(getPersisterMapKey(storeName ?? prefix, key), {\n queryByIdResource,\n queryResourceParamsSrc,\n storageKey,\n cacheTime,\n staleTime,\n validate,\n key,\n });\n return map;\n });\n },\n\n clearQuery(queryKey: string): void {\n queriesMap.update((map) => {\n for (const [mapKey, query] of map) {\n if (query.key !== queryKey) continue;\n map.delete(mapKey);\n storage.removeItem(query.storageKey);\n }\n return map;\n });\n },\n\n clearQueryBy(queryByIdKey: string): void {\n queriesByIdMap.update((map) => {\n for (const [mapKey, query] of map) {\n if (query.key !== queryByIdKey) continue;\n map.delete(mapKey);\n storage.removeItem(query.storageKey);\n }\n return map;\n });\n },\n\n clearAllQueries(): void {\n queriesMap().forEach((query) => {\n storage.removeItem(query.storageKey);\n });\n queriesMap.update((map) => {\n map.clear();\n return map;\n });\n },\n\n clearAllQueriesById(): void {\n queriesByIdMap().forEach((query) => {\n storage.removeItem(query.storageKey);\n });\n queriesByIdMap.update((map) => {\n map.clear();\n return map;\n });\n },\n clearAllCache(): void {\n this.clearAllQueriesById();\n this.clearAllQueries();\n\n // Also remove entries restored from a previous application lifetime.\n // The global handler delegates here so cleanup follows the selected\n // storage backend instead of reaching for browser storage directly.\n const keysToRemove: string[] = [];\n const storageLength = storage.length();\n\n for (let index = 0; index < storageLength; index++) {\n const keyName = storage.key(index);\n if (keyName?.startsWith('craft-ts-')) {\n keysToRemove.push(keyName);\n }\n }\n\n keysToRemove.forEach((keyName) => storage.removeItem(keyName));\n },\n };\n}\n\ntype QueryByIdStored = {\n queryParams: any;\n queryByIdValue: Record<\n string,\n {\n params: any;\n value: any;\n /**\n * Use it when the resource was loading and didn't finish before the app was closed\n */\n reloadOnMount: boolean;\n timestamp: number;\n }\n >;\n /**\n * Newest timestamp of the stored value\n */\n timestamp: number;\n};\n\nfunction getStorageKey(prefix: string, key: string, type: string) {\n return `craft-ts-${prefix}-${type}-${key}`;\n}\n\nfunction getPersisterMapKey(prefix: string, key: string): string {\n return `${prefix}\\u0000${key}`;\n}\n\nfunction isValueExpired(timestamp: number, cacheTime: number): boolean {\n return Date.now() - timestamp > cacheTime;\n}\n\nfunction removeNotValidRecordsWithValidCacheTime(\n storageKey: string,\n storedValue: QueryByIdStored | undefined,\n cacheTime: number,\n storage: StorageServiceApi,\n): QueryByIdStored | undefined {\n if (!storedValue) {\n return undefined;\n }\n const { queryByIdValue, timestamp } = storedValue;\n\n if (timestamp && cacheTime > 0 && isValueExpired(timestamp, cacheTime)) {\n // remove from storage\n storage.removeItem(storageKey);\n return undefined;\n }\n\n const validQueryByIdValue = Object.entries(queryByIdValue).reduce(\n (acc, [key, value]) => {\n const isValueExpiredResult = isValueExpired(value.timestamp, cacheTime);\n if (!isValueExpiredResult) {\n acc[key] = value;\n }\n return acc;\n },\n {} as QueryByIdStored['queryByIdValue']\n );\n\n // update local storage\n storage.setItem(\n storageKey,\n JSON.stringify({\n ...storedValue,\n queryByIdValue: validQueryByIdValue,\n })\n );\n\n return {\n ...storedValue,\n queryByIdValue: validQueryByIdValue,\n };\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { CraftSchema, SchemaInput, SchemaOutput } from './schema-validation';
|
|
2
|
+
/**
|
|
3
|
+
* Briques de typage partagées par les deux familles de middleware — serveur
|
|
4
|
+
* (`craftMiddleware(id).server(...)`) et client (`.client(...)`).
|
|
5
|
+
*
|
|
6
|
+
* La fusion des contextes et des schémas est strictement la même logique
|
|
7
|
+
* appliquée à deux canaux différents : elle vit donc ici plutôt que dupliquée.
|
|
8
|
+
*/
|
|
9
|
+
export type MiddlewareContext = Record<string, unknown>;
|
|
10
|
+
/** Fusion ordonnée de deux contextes : les clés de droite gagnent. */
|
|
11
|
+
export type OverwriteContext<Left, Right> = Simplify<Omit<Left, keyof Right & keyof Left> & Right>;
|
|
12
|
+
export type Simplify<Value> = {
|
|
13
|
+
[Key in keyof Value]: Value[Key];
|
|
14
|
+
} & {};
|
|
15
|
+
export type UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (value: infer Intersection) => void ? Intersection : never;
|
|
16
|
+
/**
|
|
17
|
+
* Intersection des sorties de tous les schémas collectés le long de la chaîne.
|
|
18
|
+
* Un schéma unique est conservé tel quel : une server function sans middleware
|
|
19
|
+
* peut donc garder un input non objet.
|
|
20
|
+
*/
|
|
21
|
+
export type MergeSchemaOutputs<Schemas extends readonly CraftSchema[]> = Schemas extends readonly [infer Only extends CraftSchema] ? SchemaOutput<Only> : Simplify<UnionToIntersection<SchemaOutput<Schemas[number]>>>;
|
|
22
|
+
/** Pendant de `MergeSchemaOutputs` côté entrée : ce que l'appelant doit fournir. */
|
|
23
|
+
export type MergeSchemaInputs<Schemas extends readonly CraftSchema[]> = Schemas extends readonly [infer Only extends CraftSchema] ? SchemaInput<Only> : Simplify<UnionToIntersection<SchemaInput<Schemas[number]>>>;
|
|
24
|
+
/**
|
|
25
|
+
* Comme `MergeSchemaOutputs`, mais un tuple vide vaut « aucune clé » plutôt que
|
|
26
|
+
* l'intersection dégénérée d'un ensemble vide. Utilisé pour les canaux
|
|
27
|
+
* facultatifs (contexte client), où l'absence de schéma est le cas courant.
|
|
28
|
+
*/
|
|
29
|
+
export type MergeOptionalSchemaOutputs<Schemas extends readonly CraftSchema[]> = Schemas extends readonly [] ? Record<never, never> : MergeSchemaOutputs<Schemas>;
|
|
30
|
+
export type MergeOptionalSchemaInputs<Schemas extends readonly CraftSchema[]> = Schemas extends readonly [] ? Record<never, never> : MergeSchemaInputs<Schemas>;
|
|
31
|
+
declare const MIDDLEWARE_RESULT: unique symbol;
|
|
32
|
+
declare const MIDDLEWARE_DOWNSTREAM_ERROR: unique symbol;
|
|
33
|
+
/**
|
|
34
|
+
* Résultat opaque de `next()`, porteur du contexte que le middleware ajoute.
|
|
35
|
+
*
|
|
36
|
+
* C'est le pivot de l'inférence : TypeScript ne peut rien déduire de l'argument
|
|
37
|
+
* passé à un paramètre, mais il déduit sans peine depuis le type de retour. Le
|
|
38
|
+
* contexte voyage donc dans le type retourné par `next()`.
|
|
39
|
+
*
|
|
40
|
+
* Conséquence utile : ce type n'est constructible que par `next()`. La chaîne
|
|
41
|
+
* serveur propose en parallèle une forme directe `{ context }` pour les
|
|
42
|
+
* enrichissements synchrones ou Promise, qui fait avancer la chaîne
|
|
43
|
+
* automatiquement.
|
|
44
|
+
*/
|
|
45
|
+
export interface MiddlewareResult<Context extends MiddlewareContext> {
|
|
46
|
+
readonly [MIDDLEWARE_RESULT]: Context;
|
|
47
|
+
}
|
|
48
|
+
/** Échec produit par la suite de la chaîne : observable, non inspectable. */
|
|
49
|
+
export interface MiddlewareDownstreamError {
|
|
50
|
+
readonly [MIDDLEWARE_DOWNSTREAM_ERROR]: true;
|
|
51
|
+
}
|
|
52
|
+
/** Le minimum commun aux deux familles pour être aplati et dédupliqué. */
|
|
53
|
+
export type MiddlewareNode = {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly dependencies: readonly MiddlewareNode[];
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Aplatit les dépendances (profondeur d'abord) et déduplique par identifiant.
|
|
59
|
+
*
|
|
60
|
+
* La déduplication serait silencieuse par construction : deux middleware de même
|
|
61
|
+
* identifiant mais d'implémentation différente donneraient un typage juste et un
|
|
62
|
+
* runtime faux, d'où le rejet explicite.
|
|
63
|
+
*/
|
|
64
|
+
export declare function flattenMiddlewareGraph<Middleware extends MiddlewareNode>(middlewares: readonly Middleware[]): readonly Middleware[];
|
|
65
|
+
export declare function assertMiddlewareId(id: string): void;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=middleware-schema-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-schema-shared.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/middleware-schema-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElF;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,CAAC,IAAI,EAAE,KAAK,IAAI,QAAQ,CAClD,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,CAC7C,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,KAAK,IAAI;KAAG,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;CAAE,GAAG,EAAE,CAAC;AAExE,MAAM,MAAM,mBAAmB,CAAC,KAAK,IAAI,CACvC,KAAK,SAAS,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,KAAK,CACvD,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,KAAK,IAAI,GACzC,YAAY,GACZ,KAAK,CAAC;AAEV;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,SAAS,WAAW,EAAE,IACnE,OAAO,SAAS,SAAS,CAAC,MAAM,IAAI,SAAS,WAAW,CAAC,GACrD,YAAY,CAAC,IAAI,CAAC,GAClB,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnE,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,CAAC,OAAO,SAAS,SAAS,WAAW,EAAE,IAClE,OAAO,SAAS,SAAS,CAAC,MAAM,IAAI,SAAS,WAAW,CAAC,GACrD,WAAW,CAAC,IAAI,CAAC,GACjB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAElE;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CACpC,OAAO,SAAS,SAAS,WAAW,EAAE,IACpC,OAAO,SAAS,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAErF,MAAM,MAAM,yBAAyB,CACnC,OAAO,SAAS,SAAS,WAAW,EAAE,IACpC,OAAO,SAAS,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAEpF,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAC/C,OAAO,CAAC,MAAM,2BAA2B,EAAE,OAAO,MAAM,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,iBAAiB;IACjE,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,6EAA6E;AAC7E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC;CAC9C;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;CAClD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,SAAS,cAAc,EACtE,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,SAAS,UAAU,EAAE,CAuBvB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMnD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aplatit les dépendances (profondeur d'abord) et déduplique par identifiant.
|
|
3
|
+
*
|
|
4
|
+
* La déduplication serait silencieuse par construction : deux middleware de même
|
|
5
|
+
* identifiant mais d'implémentation différente donneraient un typage juste et un
|
|
6
|
+
* runtime faux, d'où le rejet explicite.
|
|
7
|
+
*/
|
|
8
|
+
export function flattenMiddlewareGraph(middlewares) {
|
|
9
|
+
const seen = new Map();
|
|
10
|
+
const ordered = [];
|
|
11
|
+
const visit = (middleware) => {
|
|
12
|
+
const known = seen.get(middleware.id);
|
|
13
|
+
if (known) {
|
|
14
|
+
if (known !== middleware) {
|
|
15
|
+
throw new Error(`Duplicate middleware id "${middleware.id}" with two different implementations.`);
|
|
16
|
+
}
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
seen.set(middleware.id, middleware);
|
|
20
|
+
for (const dependency of middleware.dependencies) {
|
|
21
|
+
visit(dependency);
|
|
22
|
+
}
|
|
23
|
+
ordered.push(middleware);
|
|
24
|
+
};
|
|
25
|
+
for (const middleware of middlewares)
|
|
26
|
+
visit(middleware);
|
|
27
|
+
return ordered;
|
|
28
|
+
}
|
|
29
|
+
export function assertMiddlewareId(id) {
|
|
30
|
+
if (!/^[A-Za-z][A-Za-z0-9._:-]*$/.test(id)) {
|
|
31
|
+
throw new Error(`Invalid middleware id "${id}". Use a stable dotted identifier.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=middleware-schema-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-schema-shared.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/middleware-schema-shared.ts"],"names":[],"mappings":"AAoFA;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAkC;IAElC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,CAAC,UAAsB,EAAQ,EAAE;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,4BAA4B,UAAU,CAAC,EAAE,uCAAuC,CACjF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACpC,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YACjD,KAAK,CAAC,UAAwB,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW;QAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,0BAA0B,EAAE,oCAAoC,CACjE,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { CraftSchema, SchemaInput, SchemaOutput } from './schema-validation';\n\n/**\n * Briques de typage partagées par les deux familles de middleware — serveur\n * (`craftMiddleware(id).server(...)`) et client (`.client(...)`).\n *\n * La fusion des contextes et des schémas est strictement la même logique\n * appliquée à deux canaux différents : elle vit donc ici plutôt que dupliquée.\n */\n\nexport type MiddlewareContext = Record<string, unknown>;\n\n/** Fusion ordonnée de deux contextes : les clés de droite gagnent. */\nexport type OverwriteContext<Left, Right> = Simplify<\n Omit<Left, keyof Right & keyof Left> & Right\n>;\n\nexport type Simplify<Value> = { [Key in keyof Value]: Value[Key] } & {};\n\nexport type UnionToIntersection<Union> = (\n Union extends unknown ? (value: Union) => void : never\n) extends (value: infer Intersection) => void\n ? Intersection\n : never;\n\n/**\n * Intersection des sorties de tous les schémas collectés le long de la chaîne.\n * Un schéma unique est conservé tel quel : une server function sans middleware\n * peut donc garder un input non objet.\n */\nexport type MergeSchemaOutputs<Schemas extends readonly CraftSchema[]> =\n Schemas extends readonly [infer Only extends CraftSchema]\n ? SchemaOutput<Only>\n : Simplify<UnionToIntersection<SchemaOutput<Schemas[number]>>>;\n\n/** Pendant de `MergeSchemaOutputs` côté entrée : ce que l'appelant doit fournir. */\nexport type MergeSchemaInputs<Schemas extends readonly CraftSchema[]> =\n Schemas extends readonly [infer Only extends CraftSchema]\n ? SchemaInput<Only>\n : Simplify<UnionToIntersection<SchemaInput<Schemas[number]>>>;\n\n/**\n * Comme `MergeSchemaOutputs`, mais un tuple vide vaut « aucune clé » plutôt que\n * l'intersection dégénérée d'un ensemble vide. Utilisé pour les canaux\n * facultatifs (contexte client), où l'absence de schéma est le cas courant.\n */\nexport type MergeOptionalSchemaOutputs<\n Schemas extends readonly CraftSchema[],\n> = Schemas extends readonly [] ? Record<never, never> : MergeSchemaOutputs<Schemas>;\n\nexport type MergeOptionalSchemaInputs<\n Schemas extends readonly CraftSchema[],\n> = Schemas extends readonly [] ? Record<never, never> : MergeSchemaInputs<Schemas>;\n\ndeclare const MIDDLEWARE_RESULT: unique symbol;\ndeclare const MIDDLEWARE_DOWNSTREAM_ERROR: unique symbol;\n\n/**\n * Résultat opaque de `next()`, porteur du contexte que le middleware ajoute.\n *\n * C'est le pivot de l'inférence : TypeScript ne peut rien déduire de l'argument\n * passé à un paramètre, mais il déduit sans peine depuis le type de retour. Le\n * contexte voyage donc dans le type retourné par `next()`.\n *\n * Conséquence utile : ce type n'est constructible que par `next()`. La chaîne\n * serveur propose en parallèle une forme directe `{ context }` pour les\n * enrichissements synchrones ou Promise, qui fait avancer la chaîne\n * automatiquement.\n */\nexport interface MiddlewareResult<Context extends MiddlewareContext> {\n readonly [MIDDLEWARE_RESULT]: Context;\n}\n\n/** Échec produit par la suite de la chaîne : observable, non inspectable. */\nexport interface MiddlewareDownstreamError {\n readonly [MIDDLEWARE_DOWNSTREAM_ERROR]: true;\n}\n\n/** Le minimum commun aux deux familles pour être aplati et dédupliqué. */\nexport type MiddlewareNode = {\n readonly id: string;\n readonly dependencies: readonly MiddlewareNode[];\n};\n\n/**\n * Aplatit les dépendances (profondeur d'abord) et déduplique par identifiant.\n *\n * La déduplication serait silencieuse par construction : deux middleware de même\n * identifiant mais d'implémentation différente donneraient un typage juste et un\n * runtime faux, d'où le rejet explicite.\n */\nexport function flattenMiddlewareGraph<Middleware extends MiddlewareNode>(\n middlewares: readonly Middleware[],\n): readonly Middleware[] {\n const seen = new Map<string, Middleware>();\n const ordered: Middleware[] = [];\n\n const visit = (middleware: Middleware): void => {\n const known = seen.get(middleware.id);\n if (known) {\n if (known !== middleware) {\n throw new Error(\n `Duplicate middleware id \"${middleware.id}\" with two different implementations.`,\n );\n }\n return;\n }\n seen.set(middleware.id, middleware);\n for (const dependency of middleware.dependencies) {\n visit(dependency as Middleware);\n }\n ordered.push(middleware);\n };\n\n for (const middleware of middlewares) visit(middleware);\n return ordered;\n}\n\nexport function assertMiddlewareId(id: string): void {\n if (!/^[A-Za-z][A-Za-z0-9._:-]*$/.test(id)) {\n throw new Error(\n `Invalid middleware id \"${id}\". Use a stable dotted identifier.`,\n );\n }\n}\n"]}
|