@pravosleva/reactive-engine 1.8.2-beta → 2.0.0-beta
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/README.md +271 -0
- package/dist/AbstractService.cjs.map +1 -1
- package/dist/AbstractService.mjs.map +1 -1
- package/dist/BaseREServiceEnhanced.cjs.map +1 -1
- package/dist/BaseREServiceEnhanced.mjs.map +1 -1
- package/dist/_react-bindings.d.ts +1 -1
- package/dist/_react-bindings.d.ts.map +1 -1
- package/dist/angular/core.angular-adapter.cjs +2 -0
- package/dist/angular/core.angular-adapter.cjs.map +1 -0
- package/dist/angular/core.angular-adapter.d.ts +15 -0
- package/dist/angular/core.angular-adapter.d.ts.map +1 -0
- package/dist/angular/core.angular-adapter.mjs +28 -0
- package/dist/angular/core.angular-adapter.mjs.map +1 -0
- package/dist/angular/core.angular-adapter.test.d.ts +2 -0
- package/dist/angular/core.angular-adapter.test.d.ts.map +1 -0
- package/dist/angular/index.cjs +2 -1
- package/dist/angular/index.cjs.map +1 -0
- package/dist/angular/index.d.ts +19 -2
- package/dist/angular/index.d.ts.map +1 -1
- package/dist/angular/index.mjs +28 -2
- package/dist/angular/index.mjs.map +1 -0
- package/dist/core/AbstractService.d.ts +3 -3
- package/dist/core/AbstractService.d.ts.map +1 -1
- package/dist/core/BaseREServiceEnhanced.d.ts +3 -3
- package/dist/core/BaseREServiceEnhanced.d.ts.map +1 -1
- package/dist/core/_draft.core.methods.d.ts +13 -0
- package/dist/core/_draft.core.methods.d.ts.map +1 -0
- package/dist/core/core.advanced.reactive-framework-test-suite.p2.test.d.ts +2 -0
- package/dist/core/core.advanced.reactive-framework-test-suite.p2.test.d.ts.map +1 -0
- package/dist/core/core.advanced.test.d.ts +2 -0
- package/dist/core/core.advanced.test.d.ts.map +1 -0
- package/dist/core/core.autolog.d.ts +15 -0
- package/dist/core/core.autolog.d.ts.map +1 -0
- package/dist/core/core.automatic.d.ts +23 -0
- package/dist/core/core.automatic.d.ts.map +1 -0
- package/dist/core/core.automatic.test.d.ts +2 -0
- package/dist/core/core.automatic.test.d.ts.map +1 -0
- package/dist/core/core.d.ts +38 -152
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.method.batch.d.ts +6 -0
- package/dist/core/core.method.batch.d.ts.map +1 -0
- package/dist/core/core.method.computed.d.ts +7 -0
- package/dist/core/core.method.computed.d.ts.map +1 -0
- package/dist/core/core.method.effect.d.ts +7 -0
- package/dist/core/core.method.effect.d.ts.map +1 -0
- package/dist/core/core.method.reactive.d.ts +6 -0
- package/dist/core/core.method.reactive.d.ts.map +1 -0
- package/dist/core/core.method.signal.d.ts +7 -0
- package/dist/core/core.method.signal.d.ts.map +1 -0
- package/dist/core/core.method.untrack.d.ts +6 -0
- package/dist/core/core.method.untrack.d.ts.map +1 -0
- package/dist/core/core.propagation.test.d.ts +2 -0
- package/dist/core/core.propagation.test.d.ts.map +1 -0
- package/dist/core/core.test.d.ts +2 -0
- package/dist/core/core.test.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +31 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core.autolog.cjs +2 -0
- package/dist/core.autolog.cjs.map +1 -0
- package/dist/core.autolog.mjs +41 -0
- package/dist/core.autolog.mjs.map +1 -0
- package/dist/core.automatic.cjs +2 -0
- package/dist/core.automatic.cjs.map +1 -0
- package/dist/core.automatic.mjs +26 -0
- package/dist/core.automatic.mjs.map +1 -0
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.method.batch.cjs +2 -0
- package/dist/core.method.batch.cjs.map +1 -0
- package/dist/core.method.batch.mjs +13 -0
- package/dist/core.method.batch.mjs.map +1 -0
- package/dist/core.method.computed.cjs +2 -0
- package/dist/core.method.computed.cjs.map +1 -0
- package/dist/core.method.computed.mjs +122 -0
- package/dist/core.method.computed.mjs.map +1 -0
- package/dist/core.method.effect.cjs +2 -0
- package/dist/core.method.effect.cjs.map +1 -0
- package/dist/core.method.effect.mjs +49 -0
- package/dist/core.method.effect.mjs.map +1 -0
- package/dist/core.method.reactive.cjs +2 -0
- package/dist/core.method.reactive.cjs.map +1 -0
- package/dist/core.method.reactive.mjs +39 -0
- package/dist/core.method.reactive.mjs.map +1 -0
- package/dist/core.method.signal.cjs +2 -0
- package/dist/core.method.signal.cjs.map +1 -0
- package/dist/core.method.signal.mjs +75 -0
- package/dist/core.method.signal.mjs.map +1 -0
- package/dist/core.method.untrack.cjs +2 -0
- package/dist/core.method.untrack.cjs.map +1 -0
- package/dist/core.method.untrack.mjs +14 -0
- package/dist/core.method.untrack.mjs.map +1 -0
- package/dist/core.mjs +268 -531
- package/dist/core.mjs.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/withCache/types.d.ts +29 -0
- package/dist/decorators/withCache/types.d.ts.map +1 -0
- package/dist/decorators/withCache/withCache.cjs +1 -1
- package/dist/decorators/withCache/withCache.cjs.map +1 -1
- package/dist/decorators/withCache/withCache.d.ts +4 -61
- package/dist/decorators/withCache/withCache.d.ts.map +1 -1
- package/dist/decorators/withCache/withCache.mjs +29 -9
- package/dist/decorators/withCache/withCache.mjs.map +1 -1
- package/dist/decorators/withValidation/index.d.ts +2 -0
- package/dist/decorators/withValidation/index.d.ts.map +1 -0
- package/dist/decorators/withValidation/withValidation.cjs +2 -0
- package/dist/decorators/withValidation/withValidation.cjs.map +1 -0
- package/dist/decorators/withValidation/withValidation.d.ts +18 -0
- package/dist/decorators/withValidation/withValidation.d.ts.map +1 -0
- package/dist/decorators/withValidation/withValidation.mjs +27 -0
- package/dist/decorators/withValidation/withValidation.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +14 -11
- package/dist/react/core.react-adapter.test.d.ts +2 -0
- package/dist/react/core.react-adapter.test.d.ts.map +1 -0
- package/dist/react/hooks/_draft.useReactiveValue.v2.d.ts +9 -0
- package/dist/react/hooks/_draft.useReactiveValue.v2.d.ts.map +1 -0
- package/dist/react/hooks/useReactiveSubscription.cjs +2 -0
- package/dist/react/hooks/useReactiveSubscription.cjs.map +1 -0
- package/dist/react/hooks/useReactiveSubscription.d.ts +7 -0
- package/dist/react/hooks/useReactiveSubscription.d.ts.map +1 -0
- package/dist/react/hooks/useReactiveSubscription.mjs +21 -0
- package/dist/react/hooks/useReactiveSubscription.mjs.map +1 -0
- package/dist/react/hooks/useReactiveValue.cjs +2 -0
- package/dist/react/hooks/useReactiveValue.cjs.map +1 -0
- package/dist/react/hooks/useReactiveValue.d.ts +3 -0
- package/dist/react/hooks/useReactiveValue.d.ts.map +1 -0
- package/dist/react/hooks/useReactiveValue.mjs +25 -0
- package/dist/react/hooks/useReactiveValue.mjs.map +1 -0
- package/dist/react/index.cjs +2 -1
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.ts +9 -3
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.mjs +13 -6
- package/dist/react/index.mjs.map +1 -0
- package/dist/react/types.d.ts +0 -1
- package/dist/react/types.d.ts.map +1 -1
- package/dist/reactive-engine.umd.js +2 -2
- package/dist/reactive-engine.umd.js.map +1 -1
- package/dist/report/reactive-framework-test-suite/scripts/update-readme.d.mts +2 -0
- package/dist/report/reactive-framework-test-suite/scripts/update-readme.d.mts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/assert.d.ts +10 -0
- package/dist/report/reactive-framework-test-suite/src/assert.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/batching.d.ts +19 -0
- package/dist/report/reactive-framework-test-suite/src/batching.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/behaviorDifferences.d.ts +19 -0
- package/dist/report/reactive-framework-test-suite/src/behaviorDifferences.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/computedEval.d.ts +19 -0
- package/dist/report/reactive-framework-test-suite/src/computedEval.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/cycleDetection.d.ts +18 -0
- package/dist/report/reactive-framework-test-suite/src/cycleDetection.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/dynamicDeps.d.ts +20 -0
- package/dist/report/reactive-framework-test-suite/src/dynamicDeps.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/effectLifecycle.d.ts +20 -0
- package/dist/report/reactive-framework-test-suite/src/effectLifecycle.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/equality.d.ts +19 -0
- package/dist/report/reactive-framework-test-suite/src/equality.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/errorHandling.d.ts +20 -0
- package/dist/report/reactive-framework-test-suite/src/errorHandling.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/framework.d.ts +24 -0
- package/dist/report/reactive-framework-test-suite/src/framework.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/graphPropagation.d.ts +18 -0
- package/dist/report/reactive-framework-test-suite/src/graphPropagation.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/index.d.ts +11 -0
- package/dist/report/reactive-framework-test-suite/src/index.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/innerWrite.d.ts +20 -0
- package/dist/report/reactive-framework-test-suite/src/innerWrite.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/memoryGc.d.ts +18 -0
- package/dist/report/reactive-framework-test-suite/src/memoryGc.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/nestedEffects.d.ts +20 -0
- package/dist/report/reactive-framework-test-suite/src/nestedEffects.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/reactiveEngine.test.d.ts +2 -0
- package/dist/report/reactive-framework-test-suite/src/reactiveEngine.test.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/staleEvaluation.d.ts +18 -0
- package/dist/report/reactive-framework-test-suite/src/staleEvaluation.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/src/untracked.d.ts +18 -0
- package/dist/report/reactive-framework-test-suite/src/untracked.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/alienSignals.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/alienSignals.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/angularSignals.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/angularSignals.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/anod.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/anod.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/index.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/index.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/mobx.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/mobx.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/pota.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/pota.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/preactSignals.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/preactSignals.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/reactively.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/reactively.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/reatom.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/reatom.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/sjs.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/sjs.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/solid.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/solid.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/solidSignals.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/solidSignals.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/svelte.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/svelte.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/tansu.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/tansu.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/tc39Signals.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/tc39Signals.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/vueReactivity.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/test/frameworks/vueReactivity.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/test/run.test.d.ts +2 -0
- package/dist/report/reactive-framework-test-suite/test/run.test.d.ts.map +1 -0
- package/dist/report/reactive-framework-test-suite/vitest.config.d.ts +3 -0
- package/dist/report/reactive-framework-test-suite/vitest.config.d.ts.map +1 -0
- package/dist/utils/getExtractedValues.cjs +2 -0
- package/dist/utils/getExtractedValues.cjs.map +1 -0
- package/dist/utils/getExtractedValues.mjs +24 -0
- package/dist/utils/getExtractedValues.mjs.map +1 -0
- package/dist/vue/core.vue-adapter.cjs +2 -0
- package/dist/vue/core.vue-adapter.cjs.map +1 -0
- package/dist/vue/core.vue-adapter.d.ts +8 -0
- package/dist/vue/core.vue-adapter.d.ts.map +1 -0
- package/dist/vue/core.vue-adapter.mjs +22 -0
- package/dist/vue/core.vue-adapter.mjs.map +1 -0
- package/dist/vue/core.vue-adapter.test.d.ts +2 -0
- package/dist/vue/core.vue-adapter.test.d.ts.map +1 -0
- package/dist/vue/index.cjs +2 -1
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.ts +14 -2
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.mjs +54 -3
- package/dist/vue/index.mjs.map +1 -0
- package/package.json +4 -3
- package/dist/angular/ReactiveEngine4Angular.cjs +0 -2
- package/dist/angular/ReactiveEngine4Angular.cjs.map +0 -1
- package/dist/angular/ReactiveEngine4Angular.d.ts +0 -37
- package/dist/angular/ReactiveEngine4Angular.d.ts.map +0 -1
- package/dist/angular/ReactiveEngine4Angular.mjs +0 -45
- package/dist/angular/ReactiveEngine4Angular.mjs.map +0 -1
- package/dist/angular/core.angular.auto.test.d.ts +0 -2
- package/dist/angular/core.angular.auto.test.d.ts.map +0 -1
- package/dist/angular/core.angular.test.d.ts +0 -2
- package/dist/angular/core.angular.test.d.ts.map +0 -1
- package/dist/core/core.auto.test.d.ts +0 -2
- package/dist/core/core.auto.test.d.ts.map +0 -1
- package/dist/react/ReactiveEngine4React.cjs +0 -2
- package/dist/react/ReactiveEngine4React.cjs.map +0 -1
- package/dist/react/ReactiveEngine4React.d.ts +0 -34
- package/dist/react/ReactiveEngine4React.d.ts.map +0 -1
- package/dist/react/ReactiveEngine4React.mjs +0 -51
- package/dist/react/ReactiveEngine4React.mjs.map +0 -1
- package/dist/react/core.react.auto.test.d.ts +0 -2
- package/dist/react/core.react.auto.test.d.ts.map +0 -1
- package/dist/react/core.react.test.d.ts +0 -2
- package/dist/react/core.react.test.d.ts.map +0 -1
- package/dist/react/hooks/FilteredCatalog.auto.test.d.ts +0 -2
- package/dist/react/hooks/FilteredCatalog.auto.test.d.ts.map +0 -1
- package/dist/react/hooks/FilteredCatalog.test.d.ts +0 -2
- package/dist/react/hooks/FilteredCatalog.test.d.ts.map +0 -1
- package/dist/react/hooks/index.cjs +0 -1
- package/dist/react/hooks/index.d.ts +0 -4
- package/dist/react/hooks/index.d.ts.map +0 -1
- package/dist/react/hooks/index.mjs +0 -7
- package/dist/react/hooks/types.d.ts +0 -20
- package/dist/react/hooks/types.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/index.cjs +0 -1
- package/dist/react/hooks/useReactiveSubscription/index.d.ts +0 -2
- package/dist/react/hooks/useReactiveSubscription/index.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/index.mjs +0 -2
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts +0 -2
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs +0 -2
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts +0 -7
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs +0 -27
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs.map +0 -1
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.test.d.ts +0 -2
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.test.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue/index.cjs +0 -1
- package/dist/react/hooks/useReactiveValue/index.d.ts +0 -2
- package/dist/react/hooks/useReactiveValue/index.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue/index.mjs +0 -2
- package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts +0 -2
- package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs +0 -2
- package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs.map +0 -1
- package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts +0 -18
- package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs +0 -25
- package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs.map +0 -1
- package/dist/react/hooks/useReactiveValue/useReactiveValue.test.d.ts +0 -2
- package/dist/react/hooks/useReactiveValue/useReactiveValue.test.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue0/index.cjs +0 -1
- package/dist/react/hooks/useReactiveValue0/index.d.ts +0 -2
- package/dist/react/hooks/useReactiveValue0/index.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue0/index.mjs +0 -2
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.cjs +0 -2
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.cjs.map +0 -1
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.d.ts +0 -51
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.d.ts.map +0 -1
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.mjs +0 -23
- package/dist/react/hooks/useReactiveValue0/useReactiveValue0.mjs.map +0 -1
- package/dist/vue/ReactiveEngine4Vue.cjs +0 -2
- package/dist/vue/ReactiveEngine4Vue.cjs.map +0 -1
- package/dist/vue/ReactiveEngine4Vue.d.ts +0 -37
- package/dist/vue/ReactiveEngine4Vue.d.ts.map +0 -1
- package/dist/vue/ReactiveEngine4Vue.mjs +0 -53
- package/dist/vue/ReactiveEngine4Vue.mjs.map +0 -1
- package/dist/vue/composables/index.d.ts +0 -2
- package/dist/vue/composables/index.d.ts.map +0 -1
- package/dist/vue/composables/useReactiveValue.auto.test.d.ts +0 -2
- package/dist/vue/composables/useReactiveValue.auto.test.d.ts.map +0 -1
- package/dist/vue/composables/useReactiveValue.cjs +0 -2
- package/dist/vue/composables/useReactiveValue.cjs.map +0 -1
- package/dist/vue/composables/useReactiveValue.d.ts +0 -12
- package/dist/vue/composables/useReactiveValue.d.ts.map +0 -1
- package/dist/vue/composables/useReactiveValue.mjs +0 -19
- package/dist/vue/composables/useReactiveValue.mjs.map +0 -1
- package/dist/vue/composables/useReactiveValue.test.d.ts +0 -2
- package/dist/vue/composables/useReactiveValue.test.d.ts.map +0 -1
- package/dist/vue/core.vue.auto.test.d.ts +0 -2
- package/dist/vue/core.vue.auto.test.d.ts.map +0 -1
- package/dist/vue/core.vue.test.d.ts +0 -2
- package/dist/vue/core.vue.test.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -184,3 +184,274 @@ export class AngularCounterComponent {
|
|
|
184
184
|
|
|
185
185
|
</details>
|
|
186
186
|
</div>
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
## Core Architecture: Push/Pull & Atomic Scheduling
|
|
190
|
+
The engine utilizes a hybrid Push/Pull topology paired with an Atomic Transaction Scheduler to guarantee glitch-free propagation, automated cleanup, and maximum runtime performance.
|
|
191
|
+
```
|
|
192
|
+
[ Mutate Signal ] ──( Synchronous Push )──> [ Mark Nodes Dirty ]
|
|
193
|
+
│
|
|
194
|
+
┌───────────────────────────────────────────────┘
|
|
195
|
+
▼
|
|
196
|
+
[ Atomic Scheduler ] ──( Microtask/Batch Flush )──> [ Trigger Effects ]
|
|
197
|
+
│
|
|
198
|
+
┌───────────────────────────────────────────────────────┘
|
|
199
|
+
▼
|
|
200
|
+
[ Lazy Pull Evaluation ] ──( Computed Derivations )──> [ Framework Bridges ]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
• Synchronous Push (Invalidation): Mutating a signal triggers a cascade that immediately flags dependent `computed` and `effect` nodes as dirty.
|
|
204
|
+
• Lazy Pull (Evaluation): Values are computed only when explicitly read, using cached execution tracks.
|
|
205
|
+
• Atomic Batching: State changes made inside an `engine.batch` transaction are collapsed. Effects fire exactly once at the end of the batch block, avoiding intermediate cascade states and rendering glitches.
|
|
206
|
+
|
|
207
|
+
## Canonical Performance Patterns
|
|
208
|
+
|
|
209
|
+
1. State Mirroring Anti-Pattern vs. Lazy Derivations
|
|
210
|
+
|
|
211
|
+
Copying external async state directly into local mutable signals introduces synchronization traps, rendering loops, and memory overhead. The engine enforces a Zero-Copy Architecture through memoized computations.
|
|
212
|
+
```ts
|
|
213
|
+
// ❌ Mirroring Trap (Causes redundant pushes & recursion)
|
|
214
|
+
engine.effect(() => {
|
|
215
|
+
const data = apiResource.data
|
|
216
|
+
if (data) localSignal.value = data
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
// 🟢 Canonical Pattern (Pure Lazy Derivation)
|
|
220
|
+
const validData = engine.computed(() => {
|
|
221
|
+
return apiResource.data?.filter(item => item.isValid) ?? []
|
|
222
|
+
})
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
2. Segmented Micro-Inputs Pattern
|
|
226
|
+
|
|
227
|
+
To eliminate parent re-renders in deep form trees, push state subscriptions down to individual inputs. The parent controls global layouts by observing only top-level boundary states (like current step counters), while input fields mutate and observe point signals independently.
|
|
228
|
+
|
|
229
|
+
## Architecture-Grade Form Wizard (Example 254)
|
|
230
|
+
This enterprise-ready multi-step form implementation demonstrates absolute separation of concerns: state, cross-step validation schemas, and API fetch mechanics are completely decoupled from React.
|
|
231
|
+
|
|
232
|
+
1. Action Validation Decorators (`withValidation.ts`)
|
|
233
|
+
```ts
|
|
234
|
+
import { Signal } from '@pravosleva/reactive-engine'
|
|
235
|
+
|
|
236
|
+
export type ValidationSchema<T> = {
|
|
237
|
+
[K in keyof T]?: (value: T[K], state: T) => string | true
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface ValidationOptions<T> {
|
|
241
|
+
schema: ValidationSchema<T>
|
|
242
|
+
errorsSignal: Signal<Record<string, string>>
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export const withValidation = <T, Args extends any[], R>(
|
|
246
|
+
targetAction: (...args: Args) => R,
|
|
247
|
+
options: ValidationOptions<T>
|
|
248
|
+
) => {
|
|
249
|
+
return (currentState: T, ...args: Args): R | void => {
|
|
250
|
+
const { schema, errorsSignal } = options
|
|
251
|
+
const nextErrors: Record<string, string> = {}
|
|
252
|
+
let hasErrors = false
|
|
253
|
+
|
|
254
|
+
for (const key in schema) {
|
|
255
|
+
const validator = schema[key]
|
|
256
|
+
if (typeof validator === 'function') {
|
|
257
|
+
const result = validator(currentState[key], currentState)
|
|
258
|
+
if (typeof result === 'string') {
|
|
259
|
+
nextErrors[key] = result
|
|
260
|
+
hasErrors = true
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
errorsSignal.value = nextErrors
|
|
266
|
+
if (hasErrors) return
|
|
267
|
+
|
|
268
|
+
return targetAction(...args)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export const withResourceValidation = <S, T>(
|
|
273
|
+
fetcher: (source: S, signal: AbortSignal) => Promise<T>,
|
|
274
|
+
options: ValidationOptions<S>
|
|
275
|
+
) => {
|
|
276
|
+
return async (sourceValue: S, abortSignal: AbortSignal): Promise<T> => {
|
|
277
|
+
const { schema, errorsSignal } = options
|
|
278
|
+
const nextErrors: Record<string, string> = {}
|
|
279
|
+
let hasErrors = false
|
|
280
|
+
|
|
281
|
+
for (const key in schema) {
|
|
282
|
+
const validator = schema[key]
|
|
283
|
+
if (typeof validator === 'function') {
|
|
284
|
+
const result = validator(sourceValue[key], sourceValue)
|
|
285
|
+
if (typeof result === 'string') {
|
|
286
|
+
nextErrors[key] = result
|
|
287
|
+
hasErrors = true
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
errorsSignal.value = nextErrors
|
|
293
|
+
if (hasErrors) throw new Error('Validation failed')
|
|
294
|
+
|
|
295
|
+
return fetcher(sourceValue, abortSignal)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
2. Domain & Validation Service (`FormWizardLogic.ts`)
|
|
300
|
+
```tsx
|
|
301
|
+
import { AbstractService } from '@pravosleva/reactive-engine'
|
|
302
|
+
import { withValidation, withResourceValidation, ValidationSchema } from './withValidation'
|
|
303
|
+
|
|
304
|
+
export interface WizardState {
|
|
305
|
+
step: number
|
|
306
|
+
account: { email: string; phone: string }
|
|
307
|
+
profile: { firstName: string; lastName: string }
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export class ApiService {
|
|
311
|
+
public async submitWizard(data: WizardState['profile']): Promise<{ success: boolean }> {
|
|
312
|
+
return new Promise(resolve => setTimeout(() => resolve({ success: true }), 1000))
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export class FormWizardLogic extends AbstractService {
|
|
317
|
+
private api = this.engine.inject(ApiService)
|
|
318
|
+
|
|
319
|
+
public currentStep = this.createSignal<number>(1)
|
|
320
|
+
public errors = this.createSignal<Record<string, string>>({})
|
|
321
|
+
|
|
322
|
+
public formData = this.engine.reactive<WizardState>({
|
|
323
|
+
step: 1,
|
|
324
|
+
account: { email: '', phone: '' },
|
|
325
|
+
profile: { firstName: '', lastName: '' }
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
private accountSchema: ValidationSchema<WizardState['account']> = {
|
|
329
|
+
email: (val) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val) ? true : 'Invalid email pattern',
|
|
330
|
+
phone: (val) => val.length >= 10 ? true : 'Phone must be at least 10 digits'
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private profileSchema: ValidationSchema<WizardState['profile']> = {
|
|
334
|
+
firstName: (val) => val.trim() ? true : 'First name is required',
|
|
335
|
+
lastName: (val) => val.trim() ? true : 'Last name is required'
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
public isWizardValid = this.engine.computed<boolean>(() => {
|
|
339
|
+
const { email, phone } = this.formData.account
|
|
340
|
+
const { firstName, lastName } = this.formData.profile
|
|
341
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
342
|
+
return emailRegex.test(email) && phone.length >= 10 && !!firstName.trim() && !!lastName.trim()
|
|
343
|
+
})
|
|
344
|
+
|
|
345
|
+
private profileSource = this.engine.computed(() => this.formData.profile)
|
|
346
|
+
|
|
347
|
+
public nextToProfileStep = () => {
|
|
348
|
+
const action = withValidation(() => {
|
|
349
|
+
this.currentStep.value = 2
|
|
350
|
+
}, { schema: this.accountSchema, errorsSignal: this.errors })
|
|
351
|
+
|
|
352
|
+
action(this.formData.account)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
public submitWizardForm = this.engine.resource(
|
|
356
|
+
withResourceValidation(
|
|
357
|
+
async (profileData, abortSignal) => {
|
|
358
|
+
return this.api.submitWizard(profileData)
|
|
359
|
+
},
|
|
360
|
+
{ schema: this.profileSchema, errorsSignal: this.errors }
|
|
361
|
+
),
|
|
362
|
+
this.profileSource
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
public prevStep = () => {
|
|
366
|
+
this.errors.value = {}
|
|
367
|
+
this.currentStep.value = 1
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
3. Framework Representation (`Example254.tsx`)
|
|
372
|
+
The React tier remains completely stateless, eliminating all hook declaration chains. Prop-drilling the stable `logic` context doesn't trigger parent updates, providing maximum render insulation.
|
|
373
|
+
```tsx
|
|
374
|
+
import React from 'react'
|
|
375
|
+
import { ReactiveEngine, use } from '@pravosleva/reactive-engine/react'
|
|
376
|
+
import { FormWizardLogic } from './FormWizardLogic'
|
|
377
|
+
|
|
378
|
+
const engine = new ReactiveEngine()
|
|
379
|
+
|
|
380
|
+
export const Example254 = () => {
|
|
381
|
+
const logic = engine.inject(FormWizardLogic)
|
|
382
|
+
const step = use(logic.currentStep)
|
|
383
|
+
const errors = use(logic.errors)
|
|
384
|
+
const isFormValid = use(logic.isWizardValid)
|
|
385
|
+
const submitState = use(logic.submitWizardForm)
|
|
386
|
+
const form = use(logic.formData)
|
|
387
|
+
|
|
388
|
+
return (
|
|
389
|
+
<div className="wizard-container">
|
|
390
|
+
{step === 1 && (
|
|
391
|
+
<div className="step-pane">
|
|
392
|
+
<h3>Step 1: Account Setup</h3>
|
|
393
|
+
<input
|
|
394
|
+
value={form.account.email}
|
|
395
|
+
onChange={(e) => {
|
|
396
|
+
logic.formData.account.email = e.target.value
|
|
397
|
+
if (errors.email) logic.errors.value = { ...errors, email: '' }
|
|
398
|
+
}}
|
|
399
|
+
placeholder="Email (user@domain.com)"
|
|
400
|
+
/>
|
|
401
|
+
{errors.email && <span className="err-label">{errors.email}</span>}
|
|
402
|
+
|
|
403
|
+
<input
|
|
404
|
+
value={form.account.phone}
|
|
405
|
+
onChange={(e) => {
|
|
406
|
+
logic.formData.account.phone = e.target.value.replace(/\D/g, '')
|
|
407
|
+
if (errors.phone) logic.errors.value = { ...errors, phone: '' }
|
|
408
|
+
}}
|
|
409
|
+
placeholder="Phone (digits only)"
|
|
410
|
+
/>
|
|
411
|
+
{errors.phone && <span className="err-label">{errors.phone}</span>}
|
|
412
|
+
|
|
413
|
+
<button onClick={logic.nextToProfileStep}>Next</button>
|
|
414
|
+
</div>
|
|
415
|
+
)}
|
|
416
|
+
|
|
417
|
+
{step === 2 && (
|
|
418
|
+
<div className="step-pane">
|
|
419
|
+
<h3>Step 2: Personal Profile</h3>
|
|
420
|
+
<input
|
|
421
|
+
value={form.profile.firstName}
|
|
422
|
+
onChange={(e) => {
|
|
423
|
+
logic.formData.profile.firstName = e.target.value
|
|
424
|
+
if (errors.firstName) logic.errors.value = { ...errors, firstName: '' }
|
|
425
|
+
}}
|
|
426
|
+
placeholder="First Name"
|
|
427
|
+
/>
|
|
428
|
+
{errors.firstName && <span className="err-label">{errors.firstName}</span>}
|
|
429
|
+
|
|
430
|
+
<button onClick={logic.prevStep}>Back</button>
|
|
431
|
+
<button onClick={() => logic.submitWizardForm.refetch()} disabled={submitState.loading}>
|
|
432
|
+
{submitState.loading ? 'Submitting...' : 'Finish'}
|
|
433
|
+
</button>
|
|
434
|
+
</div>
|
|
435
|
+
)}
|
|
436
|
+
|
|
437
|
+
<div className="status-footer">
|
|
438
|
+
<div>Validation Boundary: {isFormValid ? '🟢 Valid' : '🔴 Missing Criteria'}</div>
|
|
439
|
+
{submitState.data?.success && <div className="success">Form successfully submitted!</div>}
|
|
440
|
+
</div>
|
|
441
|
+
</div>
|
|
442
|
+
)
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## Unified Framework Bridges
|
|
447
|
+
### Angular 16+ Integration (`src/angular/index.ts`)
|
|
448
|
+
Converts push/pull graph nodes synchronously into standard immutable read-only Angular Signals. Includes auto-unsubscribing lifecycle hooks tied to DestroyRef with injection safety.
|
|
449
|
+
```ts
|
|
450
|
+
const engine = new ReactiveEngine4Angular()
|
|
451
|
+
const searchLogic = engine.inject(SearchLogic)
|
|
452
|
+
|
|
453
|
+
// Exposed directly to Angular HTML template as search()
|
|
454
|
+
public search = this.engine.use(this.searchLogic.searchResource)
|
|
455
|
+
```
|
|
456
|
+
### Vue 3 Integration (`src/vue/index.ts`)
|
|
457
|
+
Exposes full integration with the Vue Composition API via deep proxy snapshots, supporting on-demand computed triggers and automated component scope teardowns.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractService.cjs","names":[],"sources":["../src/core/AbstractService.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"AbstractService.cjs","names":[],"sources":["../src/core/AbstractService.ts"],"sourcesContent":["import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n"],"mappings":"AAEA,IAAsB,EAAtB,KAAsC,CACd,OAAtB,YAAY,EAA2C,CAAjC,KAAA,OAAA,EAEpB,KAAK,OAAO,CACd,CAGA,oBAA8B,EAAa,EAAc,CACvD,OAAO,KAAK,OAAO,OAAO,EAAK,CAC7B,OACA,SAAW,GAAM,OAAO,GAAM,UAAY,CAAC,MAAM,CAAC,CACpD,CAAC,CACH,CAEA,eAA4B,EAAa,CACvC,OAAO,KAAK,OAAO,SAAS,CAAE,CAChC,CAEA,aAA0B,EAAQ,EAAe,CAC/C,OAAO,KAAK,OAAO,OAAO,EAAK,CAAI,CACrC,CAIA,QAAyB,CAAE,CAC7B,EAEa,EAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractService.mjs","names":[],"sources":["../src/core/AbstractService.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"AbstractService.mjs","names":[],"sources":["../src/core/AbstractService.ts"],"sourcesContent":["import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n"],"mappings":";AAEA,IAAsB,IAAtB,MAAsC;CACd;CAAtB,YAAY,GAA2C;EAErD,AAFoB,KAAA,SAAA,GAEpB,KAAK,OAAO;CACd;CAGA,oBAA8B,GAAa,GAAc;EACvD,OAAO,KAAK,OAAO,OAAO,GAAK;GAC7B;GACA,WAAW,MAAM,OAAO,KAAM,YAAY,CAAC,MAAM,CAAC;EACpD,CAAC;CACH;CAEA,eAA4B,GAAa;EACvC,OAAO,KAAK,OAAO,SAAS,CAAE;CAChC;CAEA,aAA0B,GAAQ,GAAe;EAC/C,OAAO,KAAK,OAAO,OAAO,GAAK,CAAI;CACrC;CAIA,SAAyB,CAAE;AAC7B,GAEa,IAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseREServiceEnhanced.cjs","names":[],"sources":["../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"BaseREServiceEnhanced.cjs","names":[],"sources":["../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineAutomatic) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"AAEA,IAAsB,EAAtB,KAA4C,CACpB,OAAtB,YAAY,EAA2C,CAAjC,KAAA,OAAA,EACpB,eAAiB,KAAK,OAAO,EAAG,CAAC,CACnC,CAEA,QAAyB,CAAE,CAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseREServiceEnhanced.mjs","names":[],"sources":["../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"BaseREServiceEnhanced.mjs","names":[],"sources":["../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineAutomatic) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":";AAEA,IAAsB,IAAtB,MAA4C;CACpB;CAAtB,YAAY,GAA2C;EACrD,AADoB,KAAA,SAAA,GACpB,iBAAiB,KAAK,OAAO,GAAG,CAAC;CACnC;CAEA,SAAyB,CAAE;AAC7B"}
|
|
@@ -13,5 +13,5 @@ export declare function useComputed<T>(computed: Computed<T>): T;
|
|
|
13
13
|
* Хук для реактивного отслеживания асинхронного ресурса.
|
|
14
14
|
* Возвращает объект состояния { data, loading, error }
|
|
15
15
|
*/
|
|
16
|
-
export declare function useResource<T>(resource: Resource<T>): import('
|
|
16
|
+
export declare function useResource<T>(resource: Resource<T>): import('.').ResourceState<T>;
|
|
17
17
|
//# sourceMappingURL=_react-bindings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_react-bindings.d.ts","sourceRoot":"","sources":["../src/_react-bindings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAQnD,eAAO,MAAM,MAAM,gBAAuB,CAAA;AAK1C;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAGjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"_react-bindings.d.ts","sourceRoot":"","sources":["../src/_react-bindings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAQnD,eAAO,MAAM,MAAM,gBAAuB,CAAA;AAK1C;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAGjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,gCAGnD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@angular/core");function t(t,n){if(typeof t!=`object`||!t)return(0,e.signal)(t).asReadonly();let r=`subscribe`in t&&typeof t.subscribe==`function`,i=(0,e.signal)(r?t.value:t),a=null;if(r)a=t.subscribe(e=>{i.set(e)});else if(`__subscribe`in t&&typeof t.__subscribe==`function`){let e=t;a=e.__subscribe(()=>{i.update(t=>Array.isArray(e)?[...e]:{...e})})}let o=null;try{o=n||(0,e.inject)(e.DestroyRef)}catch{n||console.warn(`[Reactive Engine Angular Adapter] Вызов toAngularSignal осуществлен вне контекста инъекций. Не забудьте передать DestroyRef вторым аргументом для защиты от утечек памяти.`)}return a&&o&&o.onDestroy(()=>{a()}),i.asReadonly()}exports.toAngularSignal=t;
|
|
2
|
+
//# sourceMappingURL=core.angular-adapter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular-adapter.cjs","names":[],"sources":["../../src/angular/core.angular-adapter.ts"],"sourcesContent":["import { signal, DestroyRef, inject, WritableSignal, Signal as NgSignal } from '@angular/core'\nimport { ISignalLike } from '../core/types'\n\ntype CleanupFn = () => void\n\n/**\n * 🔴 REACTIVE ENGINE ADAPTER FOR ANGULAR (v1.9.0)\n *\n * Нативно интегрирует синхронные и асингулярные графы ядра с Angular Signals.\n * Автоматически отписывается от утечек памяти через DestroyRef контекст инъекций.\n */\n\n/**\n * Функция-адаптер для преобразования реактивных примитивов ядра в Angular Signals.\n * @param item Сигнал, Компьютед или Reactive-Proxy ядра\n * @param injectRef Опциональный DestroyRef (если вызывается вне конструктора/inject-контекста)\n */\nexport function toAngularSignal<T>(\n item: T,\n injectRef?: DestroyRef\n): NgSignal<T extends ISignalLike<infer V> ? V : T> {\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return signal(item as any).asReadonly()\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Инициализируем нативный WritableSignal из Angular стартовым значением из ядра\n const ngSignal: WritableSignal<any> = signal(isSignal ? (item as any).value : item)\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue: any) => {\n // Синхронно пушим обновление в Angular Signal\n ngSignal.set(newValue)\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const reactiveItem = item as any\n unsubscribe = reactiveItem.__subscribe(() => {\n // Для Proxy-массивов вызываем .update() с поверхностным спредом ссылки,\n // чтобы Change Detection в Angular мгновенно отловил изменения .push()/.splice()\n ngSignal.update((prev) => Array.isArray(reactiveItem) ? [...reactiveItem] : { ...reactiveItem })\n })\n }\n\n // Разрешаем контекст уничтожения для автоматического GC (Garbage Collection)\n let destroyRef: DestroyRef | null = null\n try {\n destroyRef = injectRef || inject(DestroyRef)\n } catch (e) {\n // Вызвано вне контекста инъекций Angular (например, в сырых функциях) и injectRef не передан\n if (!injectRef) {\n console.warn('[Reactive Engine Angular Adapter] Вызов toAngularSignal осуществлен вне контекста инъекций. Не забудьте передать DestroyRef вторым аргументом для защиты от утечек памяти.')\n }\n }\n\n if (unsubscribe && destroyRef) {\n destroyRef.onDestroy(() => {\n unsubscribe!()\n })\n }\n\n // Возвращаем как Readonly Signal, защищая стейт от несанкционированных внешних записей (.set/.update) во вьюхах\n return ngSignal.asReadonly()\n}\n"],"mappings":"+BAiBA,SAAgB,EACd,EACA,EACkD,CAElD,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,OAAA,CAAc,CAAW,CAAC,CAAC,WAAW,EAGxC,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAGzF,GAAA,EAAA,EAAA,OAAA,CAAuC,EAAY,EAAa,MAAQ,CAAI,EAC9E,EAAgC,KAKpC,GAAI,EAEF,EAAc,EAAW,UAAW,GAAkB,CAEpD,EAAS,IAAI,CAAQ,CACvB,CAAC,OAKE,GAAI,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WAAY,CACrG,IAAM,EAAe,EACrB,EAAc,EAAa,gBAAkB,CAG3C,EAAS,OAAQ,GAAS,MAAM,QAAQ,CAAY,EAAI,CAAC,GAAG,CAAY,EAAI,CAAE,GAAG,CAAa,CAAC,CACjG,CAAC,CACH,CAGA,IAAI,EAAgC,KACpC,GAAI,CACF,EAAa,IAAA,EAAA,EAAA,OAAA,CAAoB,EAAA,UAAU,CAC7C,MAAY,CAEL,GACH,QAAQ,KAAK,4KAA4K,CAE7L,CASA,OAPI,GAAe,GACjB,EAAW,cAAgB,CACzB,EAAa,CACf,CAAC,EAII,EAAS,WAAW,CAC7B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DestroyRef, Signal as NgSignal } from '@angular/core';
|
|
2
|
+
import { ISignalLike } from '../core/types';
|
|
3
|
+
/**
|
|
4
|
+
* 🔴 REACTIVE ENGINE ADAPTER FOR ANGULAR (v1.9.0)
|
|
5
|
+
*
|
|
6
|
+
* Нативно интегрирует синхронные и асингулярные графы ядра с Angular Signals.
|
|
7
|
+
* Автоматически отписывается от утечек памяти через DestroyRef контекст инъекций.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Функция-адаптер для преобразования реактивных примитивов ядра в Angular Signals.
|
|
11
|
+
* @param item Сигнал, Компьютед или Reactive-Proxy ядра
|
|
12
|
+
* @param injectRef Опциональный DestroyRef (если вызывается вне конструктора/inject-контекста)
|
|
13
|
+
*/
|
|
14
|
+
export declare function toAngularSignal<T>(item: T, injectRef?: DestroyRef): NgSignal<T extends ISignalLike<infer V> ? V : T>;
|
|
15
|
+
//# sourceMappingURL=core.angular-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular-adapter.d.ts","sourceRoot":"","sources":["../../src/angular/core.angular-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,UAAU,EAA0B,MAAM,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAI3C;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,IAAI,EAAE,CAAC,EACP,SAAS,CAAC,EAAE,UAAU,GACrB,QAAQ,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAqDlD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DestroyRef as e, inject as t, signal as n } from "@angular/core";
|
|
2
|
+
//#region src/angular/core.angular-adapter.ts
|
|
3
|
+
function r(r, i) {
|
|
4
|
+
if (typeof r != "object" || !r) return n(r).asReadonly();
|
|
5
|
+
let a = "subscribe" in r && typeof r.subscribe == "function", o = n(a ? r.value : r), s = null;
|
|
6
|
+
if (a) s = r.subscribe((e) => {
|
|
7
|
+
o.set(e);
|
|
8
|
+
});
|
|
9
|
+
else if ("__subscribe" in r && typeof r.__subscribe == "function") {
|
|
10
|
+
let e = r;
|
|
11
|
+
s = e.__subscribe(() => {
|
|
12
|
+
o.update((t) => Array.isArray(e) ? [...e] : { ...e });
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
let c = null;
|
|
16
|
+
try {
|
|
17
|
+
c = i || t(e);
|
|
18
|
+
} catch {
|
|
19
|
+
i || console.warn("[Reactive Engine Angular Adapter] Вызов toAngularSignal осуществлен вне контекста инъекций. Не забудьте передать DestroyRef вторым аргументом для защиты от утечек памяти.");
|
|
20
|
+
}
|
|
21
|
+
return s && c && c.onDestroy(() => {
|
|
22
|
+
s();
|
|
23
|
+
}), o.asReadonly();
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { r as toAngularSignal };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=core.angular-adapter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular-adapter.mjs","names":[],"sources":["../../src/angular/core.angular-adapter.ts"],"sourcesContent":["import { signal, DestroyRef, inject, WritableSignal, Signal as NgSignal } from '@angular/core'\nimport { ISignalLike } from '../core/types'\n\ntype CleanupFn = () => void\n\n/**\n * 🔴 REACTIVE ENGINE ADAPTER FOR ANGULAR (v1.9.0)\n *\n * Нативно интегрирует синхронные и асингулярные графы ядра с Angular Signals.\n * Автоматически отписывается от утечек памяти через DestroyRef контекст инъекций.\n */\n\n/**\n * Функция-адаптер для преобразования реактивных примитивов ядра в Angular Signals.\n * @param item Сигнал, Компьютед или Reactive-Proxy ядра\n * @param injectRef Опциональный DestroyRef (если вызывается вне конструктора/inject-контекста)\n */\nexport function toAngularSignal<T>(\n item: T,\n injectRef?: DestroyRef\n): NgSignal<T extends ISignalLike<infer V> ? V : T> {\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return signal(item as any).asReadonly()\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Инициализируем нативный WritableSignal из Angular стартовым значением из ядра\n const ngSignal: WritableSignal<any> = signal(isSignal ? (item as any).value : item)\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue: any) => {\n // Синхронно пушим обновление в Angular Signal\n ngSignal.set(newValue)\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const reactiveItem = item as any\n unsubscribe = reactiveItem.__subscribe(() => {\n // Для Proxy-массивов вызываем .update() с поверхностным спредом ссылки,\n // чтобы Change Detection в Angular мгновенно отловил изменения .push()/.splice()\n ngSignal.update((prev) => Array.isArray(reactiveItem) ? [...reactiveItem] : { ...reactiveItem })\n })\n }\n\n // Разрешаем контекст уничтожения для автоматического GC (Garbage Collection)\n let destroyRef: DestroyRef | null = null\n try {\n destroyRef = injectRef || inject(DestroyRef)\n } catch (e) {\n // Вызвано вне контекста инъекций Angular (например, в сырых функциях) и injectRef не передан\n if (!injectRef) {\n console.warn('[Reactive Engine Angular Adapter] Вызов toAngularSignal осуществлен вне контекста инъекций. Не забудьте передать DestroyRef вторым аргументом для защиты от утечек памяти.')\n }\n }\n\n if (unsubscribe && destroyRef) {\n destroyRef.onDestroy(() => {\n unsubscribe!()\n })\n }\n\n // Возвращаем как Readonly Signal, защищая стейт от несанкционированных внешних записей (.set/.update) во вьюхах\n return ngSignal.asReadonly()\n}\n"],"mappings":";;AAiBA,SAAgB,EACd,GACA,GACkD;CAElD,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAO,CAAW,CAAC,CAAC,WAAW;CAGxC,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAGzF,IAAgC,EAAO,IAAY,EAAa,QAAQ,CAAI,GAC9E,IAAgC;CAKpC,IAAI,GAEF,IAAc,EAAW,WAAW,MAAkB;EAEpD,EAAS,IAAI,CAAQ;CACvB,CAAC;MAKE,IAAI,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,YAAY;EACrG,IAAM,IAAe;EACrB,IAAc,EAAa,kBAAkB;GAG3C,EAAS,QAAQ,MAAS,MAAM,QAAQ,CAAY,IAAI,CAAC,GAAG,CAAY,IAAI,EAAE,GAAG,EAAa,CAAC;EACjG,CAAC;CACH;CAGA,IAAI,IAAgC;CACpC,IAAI;EACF,IAAa,KAAa,EAAO,CAAU;CAC7C,QAAY;EAEV,AAAK,KACH,QAAQ,KAAK,4KAA4K;CAE7L;CASA,OAPI,KAAe,KACjB,EAAW,gBAAgB;EACzB,EAAa;CACf,CAAC,GAII,EAAS,WAAW;AAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular-adapter.test.d.ts","sourceRoot":"","sources":["../../src/angular/core.angular-adapter.test.ts"],"names":[],"mappings":""}
|
package/dist/angular/index.cjs
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.angular-adapter.cjs");let n=require("@angular/core");var r=class extends e.ReactiveEngine{frameworkPrefix=`angular`;use(e,t){if(e==null)return(0,n.signal)(e).asReadonly();let r=`subscribe`in e&&typeof e.subscribe==`function`,i=()=>r?e.value:e,a=(0,n.signal)(i()),o=!1,s=()=>{o||=(o=!0,a.set(i()),!1)},c=null;if(r?c=e.subscribe(s):`__subscribe`in e&&typeof e.__subscribe==`function`&&(c=e.__subscribe(s)),c){let e=c,r=()=>{try{(0,n.inject)(n.DestroyRef).onDestroy(()=>{e()})}catch{}};t?.injector?(0,n.runInInjectionContext)(t.injector,r):r()}return a.asReadonly()}};exports.ReactiveEngine=r,exports.toAngularSignal=t.toAngularSignal;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/angular/index.ts"],"sourcesContent":["export { toAngularSignal } from './core.angular-adapter'\n\nimport { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngineAutomatic } from '../core'\nimport { type CleanupFn } from '../core/types'\n\nexport interface AngularUseOptions {\n /**\n * Кастомный инжектор Angular.\n * Позволяет использовать .use() вне конструктора (например, в асинхронных функциях),\n * если передать текущий Injector вручную.\n */\n injector?: Injector\n}\n\nexport class ReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'angular'\n\n /**\n * Использование реактивного значения (Signal, Computed, Resource или Reactive Proxy) в Angular.\n * Возвращает стандартный неизменяемый Angular Signal.\n */\n public use<T>(\n item: any,\n options?: AngularUseOptions\n ): Signal<any> {\n if (item === null || item === undefined) {\n return signal(item).asReadonly()\n }\n\n const isSignalOrComputed = 'subscribe' in item && typeof item.subscribe === 'function'\n \n const getFreshValue = () => {\n if (isSignalOrComputed) return item.value\n return item\n }\n\n const angularSignal = signal<any>(getFreshValue())\n let isPendingUpdate = false\n\n const triggerUpdate = () => {\n if (isPendingUpdate) return\n isPendingUpdate = true\n \n angularSignal.set(getFreshValue())\n \n // Синхронно разжимаем защёлку, позволяя Angular подхватывать\n // асинхронные хвостовые вызовы (trailing edge) декораторов ядра\n isPendingUpdate = false\n }\n\n let unsubscribe: CleanupFn | null = null\n\n if (isSignalOrComputed) {\n unsubscribe = item.subscribe(triggerUpdate)\n } else if ('__subscribe' in item && typeof item.__subscribe === 'function') {\n unsubscribe = item.__subscribe(triggerUpdate)\n }\n\n if (unsubscribe) {\n const activeUnsub = unsubscribe\n const registerCleanup = () => {\n try {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n activeUnsub()\n })\n } catch (e) {}\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n }\n\n return angularSignal.asReadonly()\n }\n}\n"],"mappings":"yKAeA,IAAa,EAAb,cAAoC,EAAA,cAAwB,CAC1D,gBAAqC,UAMrC,IACE,EACA,EACa,CACb,GAAI,GAAS,KACX,OAAA,EAAA,EAAA,OAAA,CAAc,CAAI,CAAC,CAAC,WAAW,EAGjC,IAAM,EAAqB,cAAe,GAAQ,OAAO,EAAK,WAAc,WAEtE,MACA,EAA2B,EAAK,MAC7B,EAGH,GAAA,EAAA,EAAA,OAAA,CAA4B,EAAc,CAAC,EAC7C,EAAkB,GAEhB,MAAsB,CACtB,AAOJ,KANA,EAAkB,GAElB,EAAc,IAAI,EAAc,CAAC,EAIf,GACpB,EAEI,EAAgC,KAQpC,GANI,EACF,EAAc,EAAK,UAAU,CAAa,EACjC,gBAAiB,GAAQ,OAAO,EAAK,aAAgB,aAC9D,EAAc,EAAK,YAAY,CAAa,GAG1C,EAAa,CACf,IAAM,EAAc,EACd,MAAwB,CAC5B,GAAI,EAEF,EAAA,EAAA,OAAA,CAD0B,EAAA,UAC1B,CAAA,CAAW,cAAgB,CACzB,EAAY,CACd,CAAC,CACH,MAAY,CAAC,CACf,EAEI,GAAS,UACX,EAAA,EAAA,sBAAA,CAAsB,EAAQ,SAAU,CAAe,EAEvD,EAAgB,CAEpB,CAEA,OAAO,EAAc,WAAW,CAClC,CACF"}
|
package/dist/angular/index.d.ts
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Injector, Signal } from '@angular/core';
|
|
2
|
+
import { ReactiveEngineAutomatic } from '../core';
|
|
3
|
+
export { toAngularSignal } from './core.angular-adapter';
|
|
4
|
+
export interface AngularUseOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Кастомный инжектор Angular.
|
|
7
|
+
* Позволяет использовать .use() вне конструктора (например, в асинхронных функциях),
|
|
8
|
+
* если передать текущий Injector вручную.
|
|
9
|
+
*/
|
|
10
|
+
injector?: Injector;
|
|
11
|
+
}
|
|
12
|
+
export declare class ReactiveEngine extends ReactiveEngineAutomatic {
|
|
13
|
+
protected frameworkPrefix: string;
|
|
14
|
+
/**
|
|
15
|
+
* Использование реактивного значения (Signal, Computed, Resource или Reactive Proxy) в Angular.
|
|
16
|
+
* Возвращает стандартный неизменяемый Angular Signal.
|
|
17
|
+
*/
|
|
18
|
+
use<T>(item: any, options?: AngularUseOptions): Signal<any>;
|
|
19
|
+
}
|
|
3
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAA8B,QAAQ,EAAyB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AACxG,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAGjD,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IACzD,UAAmB,eAAe,SAAY;IAE9C;;;OAGG;IACI,GAAG,CAAC,CAAC,EACV,IAAI,EAAE,GAAG,EACT,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAAC,GAAG,CAAC;CAsDf"}
|
package/dist/angular/index.mjs
CHANGED
|
@@ -1,2 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { ReactiveEngine as e } from "../core.mjs";
|
|
2
|
+
import { toAngularSignal as t } from "./core.angular-adapter.mjs";
|
|
3
|
+
import { DestroyRef as n, inject as r, runInInjectionContext as i, signal as a } from "@angular/core";
|
|
4
|
+
//#region src/angular/index.ts
|
|
5
|
+
var o = class extends e {
|
|
6
|
+
frameworkPrefix = "angular";
|
|
7
|
+
use(e, t) {
|
|
8
|
+
if (e == null) return a(e).asReadonly();
|
|
9
|
+
let o = "subscribe" in e && typeof e.subscribe == "function", s = () => o ? e.value : e, c = a(s()), l = !1, u = () => {
|
|
10
|
+
l ||= (l = !0, c.set(s()), !1);
|
|
11
|
+
}, d = null;
|
|
12
|
+
if (o ? d = e.subscribe(u) : "__subscribe" in e && typeof e.__subscribe == "function" && (d = e.__subscribe(u)), d) {
|
|
13
|
+
let e = d, a = () => {
|
|
14
|
+
try {
|
|
15
|
+
r(n).onDestroy(() => {
|
|
16
|
+
e();
|
|
17
|
+
});
|
|
18
|
+
} catch {}
|
|
19
|
+
};
|
|
20
|
+
t?.injector ? i(t.injector, a) : a();
|
|
21
|
+
}
|
|
22
|
+
return c.asReadonly();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { o as ReactiveEngine, t as toAngularSignal };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/angular/index.ts"],"sourcesContent":["export { toAngularSignal } from './core.angular-adapter'\n\nimport { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngineAutomatic } from '../core'\nimport { type CleanupFn } from '../core/types'\n\nexport interface AngularUseOptions {\n /**\n * Кастомный инжектор Angular.\n * Позволяет использовать .use() вне конструктора (например, в асинхронных функциях),\n * если передать текущий Injector вручную.\n */\n injector?: Injector\n}\n\nexport class ReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'angular'\n\n /**\n * Использование реактивного значения (Signal, Computed, Resource или Reactive Proxy) в Angular.\n * Возвращает стандартный неизменяемый Angular Signal.\n */\n public use<T>(\n item: any,\n options?: AngularUseOptions\n ): Signal<any> {\n if (item === null || item === undefined) {\n return signal(item).asReadonly()\n }\n\n const isSignalOrComputed = 'subscribe' in item && typeof item.subscribe === 'function'\n \n const getFreshValue = () => {\n if (isSignalOrComputed) return item.value\n return item\n }\n\n const angularSignal = signal<any>(getFreshValue())\n let isPendingUpdate = false\n\n const triggerUpdate = () => {\n if (isPendingUpdate) return\n isPendingUpdate = true\n \n angularSignal.set(getFreshValue())\n \n // Синхронно разжимаем защёлку, позволяя Angular подхватывать\n // асинхронные хвостовые вызовы (trailing edge) декораторов ядра\n isPendingUpdate = false\n }\n\n let unsubscribe: CleanupFn | null = null\n\n if (isSignalOrComputed) {\n unsubscribe = item.subscribe(triggerUpdate)\n } else if ('__subscribe' in item && typeof item.__subscribe === 'function') {\n unsubscribe = item.__subscribe(triggerUpdate)\n }\n\n if (unsubscribe) {\n const activeUnsub = unsubscribe\n const registerCleanup = () => {\n try {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n activeUnsub()\n })\n } catch (e) {}\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n }\n\n return angularSignal.asReadonly()\n }\n}\n"],"mappings":";;;;AAeA,IAAa,IAAb,cAAoC,EAAwB;CAC1D,kBAAqC;CAMrC,IACE,GACA,GACa;EACb,IAAI,KAAS,MACX,OAAO,EAAO,CAAI,CAAC,CAAC,WAAW;EAGjC,IAAM,IAAqB,eAAe,KAAQ,OAAO,EAAK,aAAc,YAEtE,UACA,IAA2B,EAAK,QAC7B,GAGH,IAAgB,EAAY,EAAc,CAAC,GAC7C,IAAkB,IAEhB,UAAsB;GACtB,AAOJ,OANA,IAAkB,IAElB,EAAc,IAAI,EAAc,CAAC,GAIf;EACpB,GAEI,IAAgC;EAQpC,IANI,IACF,IAAc,EAAK,UAAU,CAAa,IACjC,iBAAiB,KAAQ,OAAO,EAAK,eAAgB,eAC9D,IAAc,EAAK,YAAY,CAAa,IAG1C,GAAa;GACf,IAAM,IAAc,GACd,UAAwB;IAC5B,IAAI;KAEF,EAD0B,CAC1B,CAAA,CAAW,gBAAgB;MACzB,EAAY;KACd,CAAC;IACH,QAAY,CAAC;GACf;GAEA,AAAI,GAAS,WACX,EAAsB,EAAQ,UAAU,CAAe,IAEvD,EAAgB;EAEpB;EAEA,OAAO,EAAc,WAAW;CAClC;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngineAutomatic } from './core.automatic';
|
|
2
2
|
export declare abstract class AbstractService {
|
|
3
|
-
protected engine:
|
|
4
|
-
constructor(engine:
|
|
3
|
+
protected engine: ReactiveEngineAutomatic;
|
|
4
|
+
constructor(engine: ReactiveEngineAutomatic);
|
|
5
5
|
protected createNumericSignal(val: number, name: string): import('./types').Signal<number>;
|
|
6
6
|
protected createComputed<T>(fn: () => T): import('./types').Computed<T>;
|
|
7
7
|
protected createSignal<T>(val: T, name?: string): import('./types').Signal<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractService.d.ts","sourceRoot":"","sources":["../../src/core/AbstractService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"AbstractService.d.ts","sourceRoot":"","sources":["../../src/core/AbstractService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,8BAAsB,eAAe;IACvB,SAAS,CAAC,MAAM,EAAE,uBAAuB;gBAA/B,MAAM,EAAE,uBAAuB;IAMrD,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAOvD,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC;IAIvC,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM;IAM/C,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB;AAED,eAAO,MAAM,aAAa,wBAAkB,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngineAutomatic } from './core.automatic';
|
|
2
2
|
export declare abstract class BaseREServiceEnhanced {
|
|
3
|
-
protected engine:
|
|
4
|
-
constructor(engine:
|
|
3
|
+
protected engine: ReactiveEngineAutomatic;
|
|
4
|
+
constructor(engine: ReactiveEngineAutomatic);
|
|
5
5
|
protected onInit(): void;
|
|
6
6
|
}
|
|
7
7
|
//# sourceMappingURL=BaseREServiceEnhanced.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseREServiceEnhanced.d.ts","sourceRoot":"","sources":["../../src/core/BaseREServiceEnhanced.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"BaseREServiceEnhanced.d.ts","sourceRoot":"","sources":["../../src/core/BaseREServiceEnhanced.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,8BAAsB,qBAAqB;IAC7B,SAAS,CAAC,MAAM,EAAE,uBAAuB;gBAA/B,MAAM,EAAE,uBAAuB;IAIrD,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const resetDataOnSourceChange: any;
|
|
2
|
+
declare const responseValidate: any;
|
|
3
|
+
declare const validateBeforeFetch: any;
|
|
4
|
+
declare const retryCount = 1;
|
|
5
|
+
declare const baseDelay = 1000;
|
|
6
|
+
declare const useExponential = true;
|
|
7
|
+
declare const maxRetryDelay: number;
|
|
8
|
+
declare const timeoutMs = 1000;
|
|
9
|
+
declare const state: any;
|
|
10
|
+
declare const updateResourceState: (nextState: ResourceState<T>) => void;
|
|
11
|
+
declare const load: (sValue: S, effectSignal: AbortSignal, isSourceChange?: boolean) => Promise<void>;
|
|
12
|
+
declare let activeEffectController: AbortController | null;
|
|
13
|
+
//# sourceMappingURL=_draft.core.methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_draft.core.methods.d.ts","sourceRoot":"","sources":["../../src/core/_draft.core.methods.ts"],"names":[],"mappings":"AA+MI,QAAA,MAAM,uBAAuB,KAA0C,CAAA;AACvE,QAAA,MAAM,gBAAgB,KAA2B,CAAA;AACjD,QAAA,MAAM,mBAAmB,KAA8B,CAAA;AAEvD,QAAA,MAAM,UAAU,IAAI,CAAA;AACpB,QAAA,MAAM,SAAS,OAAO,CAAA;AACtB,QAAA,MAAM,cAAc,OAAO,CAAA;AAC3B,QAAA,MAAM,aAAa,QAAgB,CAAA;AACnC,QAAA,MAAM,SAAS,OAAO,CAAA;AAGtB,QAAA,MAAM,KAAK,KAGV,CAAA;AAGD,QAAA,MAAM,mBAAmB,GAAI,WAAW,aAAa,CAAC,CAAC,CAAC,SAGvD,CAAA;AAED,QAAA,MAAM,IAAI,GAAU,QAAQ,CAAC,EAAE,cAAc,WAAW,EAAE,wBAAsB,kBA+H/E,CAAA;AAED,QAAA,IAAI,sBAAsB,EAAE,eAAe,GAAG,IAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.advanced.reactive-framework-test-suite.p2.test.d.ts","sourceRoot":"","sources":["../../src/core/core.advanced.reactive-framework-test-suite.p2.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.advanced.test.d.ts","sourceRoot":"","sources":["../../src/core/core.advanced.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactiveEngineAutomatic } from './core.automatic';
|
|
2
|
+
import { Computed } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 📊 REACTIVE ENGINE AUTOLOG (core.autolog)
|
|
5
|
+
* Расширяет автоматический шедулер. Добавляет Enterprise-логирование,
|
|
6
|
+
* замер производительности и Pull Duration каскадов графа.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ReactiveEngineAutolog extends ReactiveEngineAutomatic {
|
|
9
|
+
autoLogQueue: Array<any>;
|
|
10
|
+
isHardFlushScheduled: boolean;
|
|
11
|
+
queueLog(type: string, name: string, meta?: any): void;
|
|
12
|
+
flushLogs(): void;
|
|
13
|
+
computed<T>(fn: () => T, signalName?: string): Computed<T>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=core.autolog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.autolog.d.ts","sourceRoot":"","sources":["../../src/core/core.autolog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,uBAAuB;IACzD,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAK;IAC7B,oBAAoB,UAAQ;IAE5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAQtD,SAAS,IAAI,IAAI;IAWR,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;CAiC3E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactiveEngineCore } from './core';
|
|
2
|
+
/**
|
|
3
|
+
* ⚛️ AUTOMATIC ASYNCULAR REACTION ENGINE (v2.6.0)
|
|
4
|
+
*
|
|
5
|
+
* Нативно склеивает множественные мутации в рамках ОДНОГО тика Event Loop.
|
|
6
|
+
* Полностью закрывает капканы untrack/batch изоляции внешних тестов #218 и #219.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ReactiveEngineAutomatic extends ReactiveEngineCore {
|
|
9
|
+
private microtaskScheduled;
|
|
10
|
+
/**
|
|
11
|
+
* Канонический метод схождения автоматического движка.
|
|
12
|
+
* Восстанавливает флаг-замок строго по окончании выгрузки очереди.
|
|
13
|
+
*/
|
|
14
|
+
flushEffects(): void;
|
|
15
|
+
/**
|
|
16
|
+
* ПЕРЕХВАТЧИК МУТАЦИЙ И ТРАНЗАКЦИЙ АВТОМАТИЧЕСКОГО ЯДРА
|
|
17
|
+
*
|
|
18
|
+
* Переопределяет базовое пакетное выполнение. Синхронно флушит очередь
|
|
19
|
+
* на выходе из батча, полностью убирая рассинхронизацию микрозадач в untrack контекстах!
|
|
20
|
+
*/
|
|
21
|
+
batch<R>(fn: () => R): R;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=core.automatic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.automatic.d.ts","sourceRoot":"","sources":["../../src/core/core.automatic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAE3C;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,kBAAkB;IAC7D,OAAO,CAAC,kBAAkB,CAAQ;IAElC;;;OAGG;IACa,YAAY,IAAI,IAAI;IAUpC;;;;;OAKG;IACa,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;CAsBzC"}
|