diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..c23265b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,25 @@
+The MIT License (MIT)
+
+Copyright (c) 2017-2023 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+This repository includes a file "debounceSync.ts" originially copied from
+https://github.com/cartant/rxjs-etc by Nicholas Jamieson, MIT licensed. See the
+file header for details.
diff --git a/README.md b/README.md
index cba4522..3468965 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
-# NgRx Signals Builds
+# @ngrx/signals
+
+The sources for this package are in the main [NgRx](https://github.com/ngrx/platform) repo. Please file issues and pull requests against that repo.
diff --git a/commit_message b/commit_message
new file mode 100644
index 0000000..184271c
--- /dev/null
+++ b/commit_message
@@ -0,0 +1 @@
+5871d4dc chore: release 17.0.0-beta.0
diff --git a/esm2022/index.mjs b/esm2022/index.mjs
new file mode 100644
index 0000000..bdfab56
--- /dev/null
+++ b/esm2022/index.mjs
@@ -0,0 +1,2 @@
+export * from './src/index';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NyYy9pbmRleCc7XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/ngrx-signals.mjs b/esm2022/ngrx-signals.mjs
new file mode 100644
index 0000000..e0f2ad5
--- /dev/null
+++ b/esm2022/ngrx-signals.mjs
@@ -0,0 +1,5 @@
+/**
+ * Generated bundle index. Do not edit.
+ */
+export * from './index';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyeC1zaWduYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9zaWduYWxzL25ncngtc2lnbmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
\ No newline at end of file
diff --git a/esm2022/rxjs-interop/index.mjs b/esm2022/rxjs-interop/index.mjs
new file mode 100644
index 0000000..8062824
--- /dev/null
+++ b/esm2022/rxjs-interop/index.mjs
@@ -0,0 +1,2 @@
+export * from './src/index';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvcnhqcy1pbnRlcm9wL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zcmMvaW5kZXgnO1xuIl19
\ No newline at end of file
diff --git a/esm2022/rxjs-interop/ngrx-signals-rxjs-interop.mjs b/esm2022/rxjs-interop/ngrx-signals-rxjs-interop.mjs
new file mode 100644
index 0000000..979ea40
--- /dev/null
+++ b/esm2022/rxjs-interop/ngrx-signals-rxjs-interop.mjs
@@ -0,0 +1,5 @@
+/**
+ * Generated bundle index. Do not edit.
+ */
+export * from './index';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyeC1zaWduYWxzLXJ4anMtaW50ZXJvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9yeGpzLWludGVyb3AvbmdyeC1zaWduYWxzLXJ4anMtaW50ZXJvcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
\ No newline at end of file
diff --git a/esm2022/rxjs-interop/src/index.mjs b/esm2022/rxjs-interop/src/index.mjs
new file mode 100644
index 0000000..fdbb8c4
--- /dev/null
+++ b/esm2022/rxjs-interop/src/index.mjs
@@ -0,0 +1,2 @@
+export { rxMethod } from './rx-method';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvcnhqcy1pbnRlcm9wL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgcnhNZXRob2QgfSBmcm9tICcuL3J4LW1ldGhvZCc7XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/rxjs-interop/src/rx-method.mjs b/esm2022/rxjs-interop/src/rx-method.mjs
new file mode 100644
index 0000000..cf2a400
--- /dev/null
+++ b/esm2022/rxjs-interop/src/rx-method.mjs
@@ -0,0 +1,31 @@
+import { assertInInjectionContext, DestroyRef, inject, Injector, isSignal, } from '@angular/core';
+import { toObservable } from '@angular/core/rxjs-interop';
+import { isObservable, of, Subject } from 'rxjs';
+export function rxMethod(generator, config) {
+ if (!config?.injector) {
+ assertInInjectionContext(rxMethod);
+ }
+ const injector = config?.injector ?? inject(Injector);
+ const destroyRef = injector.get(DestroyRef);
+ const source$ = new Subject();
+ const sourceSub = generator(source$).subscribe();
+ destroyRef.onDestroy(() => sourceSub.unsubscribe());
+ const rxMethodFn = (input) => {
+ let input$;
+ if (isSignal(input)) {
+ input$ = toObservable(input, { injector });
+ }
+ else if (isObservable(input)) {
+ input$ = input;
+ }
+ else {
+ input$ = of(input);
+ }
+ const instanceSub = input$.subscribe((value) => source$.next(value));
+ sourceSub.add(instanceSub);
+ return instanceSub;
+ };
+ rxMethodFn.unsubscribe = sourceSub.unsubscribe.bind(sourceSub);
+ return rxMethodFn;
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtbWV0aG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zaWduYWxzL3J4anMtaW50ZXJvcC9zcmMvcngtbWV0aG9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWtCLE1BQU0sTUFBTSxDQUFDO0FBTzdFLE1BQU0sVUFBVSxRQUFRLENBQ3RCLFNBQThELEVBQzlELE1BQWdDO0lBRWhDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO1FBQ3JCLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3BDO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBUyxDQUFDO0lBRXJDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqRCxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRXBELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBMkIsRUFBRSxFQUFFO1FBQ2pELElBQUksTUFBeUIsQ0FBQztRQUU5QixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUM7YUFBTSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ2hCO2FBQU07WUFDTCxNQUFNLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0IsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0LFxuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBpc1NpZ25hbCxcbiAgU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFVuc3Vic2NyaWJhYmxlIH0gZnJvbSAncnhqcyc7XG5cbnR5cGUgUnhNZXRob2RJbnB1dDxJbnB1dD4gPSBJbnB1dCB8IE9ic2VydmFibGU8SW5wdXQ+IHwgU2lnbmFsPElucHV0PjtcblxudHlwZSBSeE1ldGhvZDxJbnB1dD4gPSAoKGlucHV0OiBSeE1ldGhvZElucHV0PElucHV0PikgPT4gVW5zdWJzY3JpYmFibGUpICZcbiAgVW5zdWJzY3JpYmFibGU7XG5cbmV4cG9ydCBmdW5jdGlvbiByeE1ldGhvZDxJbnB1dD4oXG4gIGdlbmVyYXRvcjogKHNvdXJjZSQ6IE9ic2VydmFibGU8SW5wdXQ+KSA9PiBPYnNlcnZhYmxlPHVua25vd24+LFxuICBjb25maWc/OiB7IGluamVjdG9yPzogSW5qZWN0b3IgfVxuKTogUnhNZXRob2Q8SW5wdXQ+IHtcbiAgaWYgKCFjb25maWc/LmluamVjdG9yKSB7XG4gICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KHJ4TWV0aG9kKTtcbiAgfVxuXG4gIGNvbnN0IGluamVjdG9yID0gY29uZmlnPy5pbmplY3RvciA/PyBpbmplY3QoSW5qZWN0b3IpO1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0b3IuZ2V0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBzb3VyY2UkID0gbmV3IFN1YmplY3Q8SW5wdXQ+KCk7XG5cbiAgY29uc3Qgc291cmNlU3ViID0gZ2VuZXJhdG9yKHNvdXJjZSQpLnN1YnNjcmliZSgpO1xuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBzb3VyY2VTdWIudW5zdWJzY3JpYmUoKSk7XG5cbiAgY29uc3QgcnhNZXRob2RGbiA9IChpbnB1dDogUnhNZXRob2RJbnB1dDxJbnB1dD4pID0+IHtcbiAgICBsZXQgaW5wdXQkOiBPYnNlcnZhYmxlPElucHV0PjtcblxuICAgIGlmIChpc1NpZ25hbChpbnB1dCkpIHtcbiAgICAgIGlucHV0JCA9IHRvT2JzZXJ2YWJsZShpbnB1dCwgeyBpbmplY3RvciB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgIGlucHV0JCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dCQgPSBvZihpbnB1dCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VTdWIgPSBpbnB1dCQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gc291cmNlJC5uZXh0KHZhbHVlKSk7XG4gICAgc291cmNlU3ViLmFkZChpbnN0YW5jZVN1Yik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VTdWI7XG4gIH07XG4gIHJ4TWV0aG9kRm4udW5zdWJzY3JpYmUgPSBzb3VyY2VTdWIudW5zdWJzY3JpYmUuYmluZChzb3VyY2VTdWIpO1xuXG4gIHJldHVybiByeE1ldGhvZEZuO1xufVxuIl19
\ No newline at end of file
diff --git a/esm2022/src/deep-signal.mjs b/esm2022/src/deep-signal.mjs
new file mode 100644
index 0000000..6e2f448
--- /dev/null
+++ b/esm2022/src/deep-signal.mjs
@@ -0,0 +1,22 @@
+import { computed, untracked } from '@angular/core';
+export function toDeepSignal(signal) {
+ const value = untracked(() => signal());
+ if (!isRecord(value)) {
+ return signal;
+ }
+ return new Proxy(signal, {
+ get(target, prop) {
+ if (!(prop in value)) {
+ return target[prop];
+ }
+ if (!target[prop]) {
+ target[prop] = computed(() => target()[prop]);
+ }
+ return toDeepSignal(target[prop]);
+ },
+ });
+}
+function isRecord(value) {
+ return value?.constructor === Object;
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcC1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvc3JjL2RlZXAtc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBZ0I1RCxNQUFNLFVBQVUsWUFBWSxDQUFJLE1BQWlCO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxNQUF1QixDQUFDO0tBQ2hDO0lBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDdkIsR0FBRyxDQUFDLE1BQVcsRUFBRSxJQUFJO1lBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckI7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDL0M7WUFFRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxLQUFLLEVBQUUsV0FBVyxLQUFLLE1BQU0sQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIFNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJc1Vua25vd25SZWNvcmQgfSBmcm9tICcuL3RzLWhlbHBlcnMnO1xuXG5leHBvcnQgdHlwZSBEZWVwU2lnbmFsPFQ+ID0gU2lnbmFsPFQ+ICZcbiAgKFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID8gSXNVbmtub3duUmVjb3JkPFQ+IGV4dGVuZHMgdHJ1ZVxuICAgICAgPyB1bmtub3duXG4gICAgICA6IFJlYWRvbmx5PHtcbiAgICAgICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICA/IElzVW5rbm93blJlY29yZDxUW0tdPiBleHRlbmRzIHRydWVcbiAgICAgICAgICAgICAgPyBTaWduYWw8VFtLXT5cbiAgICAgICAgICAgICAgOiBEZWVwU2lnbmFsPFRbS10+XG4gICAgICAgICAgICA6IFNpZ25hbDxUW0tdPjtcbiAgICAgICAgfT5cbiAgICA6IHVua25vd24pO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9EZWVwU2lnbmFsPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KTogRGVlcFNpZ25hbDxUPiB7XG4gIGNvbnN0IHZhbHVlID0gdW50cmFja2VkKCgpID0+IHNpZ25hbCgpKTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc2lnbmFsIGFzIERlZXBTaWduYWw8VD47XG4gIH1cblxuICByZXR1cm4gbmV3IFByb3h5KHNpZ25hbCwge1xuICAgIGdldCh0YXJnZXQ6IGFueSwgcHJvcCkge1xuICAgICAgaWYgKCEocHJvcCBpbiB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gY29tcHV0ZWQoKCkgPT4gdGFyZ2V0KClbcHJvcF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9EZWVwU2lnbmFsKHRhcmdldFtwcm9wXSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdmFsdWU/LmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/src/helpers.mjs b/esm2022/src/helpers.mjs
new file mode 100644
index 0000000..58b48b1
--- /dev/null
+++ b/esm2022/src/helpers.mjs
@@ -0,0 +1,4 @@
+export function excludeKeys(obj, keys) {
+ return Object.keys(obj).reduce((acc, key) => (keys.includes(key) ? acc : { ...acc, [key]: obj[key] }), {});
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsV0FBVyxDQUd6QixHQUFRLEVBQUUsSUFBVTtJQUNwQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUM1QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDdEUsRUFBRSxDQUN3QixDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZXhjbHVkZUtleXM8XG4gIE9iaiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBLZXlzIGV4dGVuZHMgc3RyaW5nW11cbj4ob2JqOiBPYmosIGtleXM6IEtleXMpOiBPbWl0PE9iaiwgS2V5c1tudW1iZXJdPiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShcbiAgICAoYWNjLCBrZXkpID0+IChrZXlzLmluY2x1ZGVzKGtleSkgPyBhY2MgOiB7IC4uLmFjYywgW2tleV06IG9ialtrZXldIH0pLFxuICAgIHt9XG4gICkgYXMgT21pdDxPYmosIEtleXNbbnVtYmVyXT47XG59XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/src/index.mjs b/esm2022/src/index.mjs
new file mode 100644
index 0000000..b081879
--- /dev/null
+++ b/esm2022/src/index.mjs
@@ -0,0 +1,9 @@
+export { patchState } from './patch-state';
+export { signalState } from './signal-state';
+export { signalStore } from './signal-store';
+export { signalStoreFeature, type } from './signal-store-feature';
+export { withComputed } from './with-computed';
+export { withHooks } from './with-hooks';
+export { withMethods } from './with-methods';
+export { withState } from './with-state';
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUGFydGlhbFN0YXRlVXBkYXRlciwgcGF0Y2hTdGF0ZSB9IGZyb20gJy4vcGF0Y2gtc3RhdGUnO1xuZXhwb3J0IHsgc2lnbmFsU3RhdGUgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5leHBvcnQgeyBzaWduYWxTdG9yZSB9IGZyb20gJy4vc2lnbmFsLXN0b3JlJztcbmV4cG9ydCB7IHNpZ25hbFN0b3JlRmVhdHVyZSwgdHlwZSB9IGZyb20gJy4vc2lnbmFsLXN0b3JlLWZlYXR1cmUnO1xuZXhwb3J0IHsgd2l0aENvbXB1dGVkIH0gZnJvbSAnLi93aXRoLWNvbXB1dGVkJztcbmV4cG9ydCB7IHdpdGhIb29rcyB9IGZyb20gJy4vd2l0aC1ob29rcyc7XG5leHBvcnQgeyB3aXRoTWV0aG9kcyB9IGZyb20gJy4vd2l0aC1tZXRob2RzJztcbmV4cG9ydCB7IHdpdGhTdGF0ZSB9IGZyb20gJy4vd2l0aC1zdGF0ZSc7XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/src/patch-state.mjs b/esm2022/src/patch-state.mjs
new file mode 100644
index 0000000..355f712
--- /dev/null
+++ b/esm2022/src/patch-state.mjs
@@ -0,0 +1,8 @@
+import { STATE_SIGNAL } from './signal-state';
+export function patchState(signalState, ...updaters) {
+ signalState[STATE_SIGNAL].update((currentState) => updaters.reduce((nextState, updater) => ({
+ ...nextState,
+ ...(typeof updater === 'function' ? updater(nextState) : updater),
+ }), currentState));
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2gtc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvc3JjL3BhdGNoLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFNL0QsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsV0FBbUMsRUFDbkMsR0FBRyxRQUE0RDtJQUUvRCxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDaEQsUUFBUSxDQUFDLE1BQU0sQ0FDYixDQUFDLFNBQWdCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLEdBQUcsU0FBUztRQUNaLEdBQUcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQ2xFLENBQUMsRUFDRixZQUFZLENBQ2IsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNUQVRFX1NJR05BTCwgU2lnbmFsU3RhdGVNZXRhIH0gZnJvbSAnLi9zaWduYWwtc3RhdGUnO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsU3RhdGVVcGRhdGVyPFN0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0gKFxuICBzdGF0ZTogU3RhdGVcbikgPT4gUGFydGlhbDxTdGF0ZT47XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFN0YXRlPFN0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBzaWduYWxTdGF0ZTogU2lnbmFsU3RhdGVNZXRhPFN0YXRlPixcbiAgLi4udXBkYXRlcnM6IEFycmF5PFBhcnRpYWw8U3RhdGU+IHwgUGFydGlhbFN0YXRlVXBkYXRlcjxTdGF0ZT4+XG4pOiB2b2lkIHtcbiAgc2lnbmFsU3RhdGVbU1RBVEVfU0lHTkFMXS51cGRhdGUoKGN1cnJlbnRTdGF0ZSkgPT5cbiAgICB1cGRhdGVycy5yZWR1Y2UoXG4gICAgICAobmV4dFN0YXRlOiBTdGF0ZSwgdXBkYXRlcikgPT4gKHtcbiAgICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgICAuLi4odHlwZW9mIHVwZGF0ZXIgPT09ICdmdW5jdGlvbicgPyB1cGRhdGVyKG5leHRTdGF0ZSkgOiB1cGRhdGVyKSxcbiAgICAgIH0pLFxuICAgICAgY3VycmVudFN0YXRlXG4gICAgKVxuICApO1xufVxuIl19
\ No newline at end of file
diff --git a/esm2022/src/signal-state.mjs b/esm2022/src/signal-state.mjs
new file mode 100644
index 0000000..1670e20
--- /dev/null
+++ b/esm2022/src/signal-state.mjs
@@ -0,0 +1,12 @@
+import { signal } from '@angular/core';
+import { toDeepSignal } from './deep-signal';
+export const STATE_SIGNAL = Symbol('STATE_SIGNAL');
+export function signalState(initialState) {
+ const stateSignal = signal(initialState);
+ const deepSignal = toDeepSignal(stateSignal.asReadonly());
+ Object.defineProperty(deepSignal, STATE_SIGNAL, {
+ value: stateSignal,
+ });
+ return deepSignal;
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zaWduYWxzL3NyYy9zaWduYWwtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBYW5ELE1BQU0sVUFBVSxXQUFXLENBQ3pCLFlBQTZDO0lBRTdDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxZQUFxQixDQUFDLENBQUM7SUFDbEQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRTtRQUM5QyxLQUFLLEVBQUUsV0FBVztLQUNuQixDQUFDLENBQUM7SUFFSCxPQUFPLFVBQWdDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlZXBTaWduYWwsIHRvRGVlcFNpZ25hbCB9IGZyb20gJy4vZGVlcC1zaWduYWwnO1xuaW1wb3J0IHsgSGFzRnVuY3Rpb25LZXlzIH0gZnJvbSAnLi90cy1oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IFNUQVRFX1NJR05BTCA9IFN5bWJvbCgnU1RBVEVfU0lHTkFMJyk7XG5cbmV4cG9ydCB0eXBlIFNpZ25hbFN0YXRlTWV0YTxTdGF0ZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgW1NUQVRFX1NJR05BTF06IFdyaXRhYmxlU2lnbmFsPFN0YXRlPjtcbn07XG5cbnR5cGUgU2lnbmFsU3RhdGVDaGVjazxTdGF0ZT4gPSBIYXNGdW5jdGlvbktleXM8U3RhdGU+IGV4dGVuZHMgZmFsc2UgfCB1bmRlZmluZWRcbiAgPyB1bmtub3duXG4gIDogJ0BuZ3J4L3NpZ25hbHM6IHNpZ25hbCBzdGF0ZSBjYW5ub3QgY29udGFpbiBgRnVuY3Rpb25gIHByb3BlcnR5IG9yIG1ldGhvZCBuYW1lcyc7XG5cbnR5cGUgU2lnbmFsU3RhdGU8U3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBEZWVwU2lnbmFsPFN0YXRlPiAmXG4gIFNpZ25hbFN0YXRlTWV0YTxTdGF0ZT47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdGF0ZTxTdGF0ZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZSAmIFNpZ25hbFN0YXRlQ2hlY2s8U3RhdGU+XG4pOiBTaWduYWxTdGF0ZTxTdGF0ZT4ge1xuICBjb25zdCBzdGF0ZVNpZ25hbCA9IHNpZ25hbChpbml0aWFsU3RhdGUgYXMgU3RhdGUpO1xuICBjb25zdCBkZWVwU2lnbmFsID0gdG9EZWVwU2lnbmFsKHN0YXRlU2lnbmFsLmFzUmVhZG9ubHkoKSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWVwU2lnbmFsLCBTVEFURV9TSUdOQUwsIHtcbiAgICB2YWx1ZTogc3RhdGVTaWduYWwsXG4gIH0pO1xuXG4gIHJldHVybiBkZWVwU2lnbmFsIGFzIFNpZ25hbFN0YXRlPFN0YXRlPjtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/esm2022/src/signal-store-feature.mjs b/esm2022/src/signal-store-feature.mjs
new file mode 100644
index 0000000..e78c81f
--- /dev/null
+++ b/esm2022/src/signal-store-feature.mjs
@@ -0,0 +1,10 @@
+export function signalStoreFeature(featureOrInput, ...restFeatures) {
+ const features = typeof featureOrInput === 'function'
+ ? [featureOrInput, ...restFeatures]
+ : restFeatures;
+ return (inputStore) => features.reduce((store, feature) => feature(store), inputStore);
+}
+export function type() {
+ return undefined;
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXN0b3JlLWZlYXR1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1OQSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLGNBQXNFLEVBQ3RFLEdBQUcsWUFBa0M7SUFFckMsTUFBTSxRQUFRLEdBQ1osT0FBTyxjQUFjLEtBQUssVUFBVTtRQUNsQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFDbkMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUVuQixPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDcEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FBTyxTQUFjLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVtcHR5RmVhdHVyZVJlc3VsdCxcbiAgTWVyZ2VGZWF0dXJlUmVzdWx0cyxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG59IGZyb20gJy4vc2lnbmFsLXN0b3JlLW1vZGVscyc7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gJy4vdHMtaGVscGVycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZUZlYXR1cmU8RjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+KFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+XG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmVGZWF0dXJlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+XG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmVGZWF0dXJlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPiwgRjM+XG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND5cbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPiwgRjM+LFxuICBmNDogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjNdPiwgRjQ+LFxuICBmNTogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0XT4sIEY1PlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PixcbiAgZjU6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+LCBGNT4sXG4gIGY2OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1XT4sIEY2PlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjZdPlxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgSW5wdXQgZXh0ZW5kcyBQYXJ0aWFsPFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4sXG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBpbnB1dDogSW5wdXQsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8UHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMT5cbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxPjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZUZlYXR1cmU8XG4gIElucHV0IGV4dGVuZHMgUGFydGlhbDxTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+LFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGlucHV0OiBJbnB1dCxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxXT4sXG4gICAgRjJcbiAgPlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sXG4gIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgSW5wdXQgZXh0ZW5kcyBQYXJ0aWFsPFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4sXG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGlucHV0OiBJbnB1dCxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxXT4sXG4gICAgRjJcbiAgPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxLCBGMl0+LFxuICAgIEYzXG4gID5cbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LFxuICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT5cbj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmVGZWF0dXJlPFxuICBJbnB1dCBleHRlbmRzIFBhcnRpYWw8U2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0PixcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIElucHV0OiBJbnB1dCxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxXT4sXG4gICAgRjJcbiAgPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxLCBGMl0+LFxuICAgIEYzXG4gID4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMSwgRjIsIEYzXT4sXG4gICAgRjRcbiAgPlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sXG4gIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0XT5cbj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmVGZWF0dXJlPFxuICBJbnB1dCBleHRlbmRzIFBhcnRpYWw8U2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0PixcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBpbnB1dDogSW5wdXQsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8UHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMV0+LFxuICAgIEYyXG4gID4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMSwgRjJdPixcbiAgICBGM1xuICA+LFxuICBmNDogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICAgIE1lcmdlRmVhdHVyZVJlc3VsdHM8W1ByZXR0aWZ5PEVtcHR5RmVhdHVyZVJlc3VsdCAmIElucHV0PiwgRjEsIEYyLCBGM10+LFxuICAgIEY0XG4gID4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMSwgRjIsIEYzLCBGNF0+LFxuICAgIEY1XG4gID5cbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LFxuICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNCwgRjVdPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZUZlYXR1cmU8XG4gIElucHV0IGV4dGVuZHMgUGFydGlhbDxTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+LFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjUgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY2IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBpbnB1dDogSW5wdXQsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8UHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMV0+LFxuICAgIEYyXG4gID4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMSwgRjJdPixcbiAgICBGM1xuICA+LFxuICBmNDogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICAgIE1lcmdlRmVhdHVyZVJlc3VsdHM8W1ByZXR0aWZ5PEVtcHR5RmVhdHVyZVJlc3VsdCAmIElucHV0PiwgRjEsIEYyLCBGM10+LFxuICAgIEY0XG4gID4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxbUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LCBGMSwgRjIsIEYzLCBGNF0+LFxuICAgIEY1XG4gID4sXG4gIGY2OiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAgTWVyZ2VGZWF0dXJlUmVzdWx0czxcbiAgICAgIFtQcmV0dGlmeTxFbXB0eUZlYXR1cmVSZXN1bHQgJiBJbnB1dD4sIEYxLCBGMiwgRjMsIEY0LCBGNV1cbiAgICA+LFxuICAgIEY2XG4gID5cbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgUHJldHRpZnk8RW1wdHlGZWF0dXJlUmVzdWx0ICYgSW5wdXQ+LFxuICBNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNCwgRjUsIEY2XT5cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gIGZlYXR1cmVPcklucHV0OiBTaWduYWxTdG9yZUZlYXR1cmUgfCBQYXJ0aWFsPFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4sXG4gIC4uLnJlc3RGZWF0dXJlczogU2lnbmFsU3RvcmVGZWF0dXJlW11cbik6IFNpZ25hbFN0b3JlRmVhdHVyZSB7XG4gIGNvbnN0IGZlYXR1cmVzID1cbiAgICB0eXBlb2YgZmVhdHVyZU9ySW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgID8gW2ZlYXR1cmVPcklucHV0LCAuLi5yZXN0RmVhdHVyZXNdXG4gICAgICA6IHJlc3RGZWF0dXJlcztcblxuICByZXR1cm4gKGlucHV0U3RvcmUpID0+XG4gICAgZmVhdHVyZXMucmVkdWNlKChzdG9yZSwgZmVhdHVyZSkgPT4gZmVhdHVyZShzdG9yZSksIGlucHV0U3RvcmUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZTxUPigpOiBUIHtcbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xufVxuIl19
\ No newline at end of file
diff --git a/esm2022/src/signal-store-models.mjs b/esm2022/src/signal-store-models.mjs
new file mode 100644
index 0000000..184ab2d
--- /dev/null
+++ b/esm2022/src/signal-store-models.mjs
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXN0b3JlLW1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvc2lnbmFsLXN0b3JlLW1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEZWVwU2lnbmFsIH0gZnJvbSAnLi9kZWVwLXNpZ25hbCc7XG5pbXBvcnQgeyBTaWduYWxTdGF0ZU1ldGEgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5pbXBvcnQgeyBJc1Vua25vd25SZWNvcmQsIFByZXR0aWZ5IH0gZnJvbSAnLi90cy1oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgU2lnbmFsU3RvcmVDb25maWcgPSB7IHByb3ZpZGVkSW46ICdyb290JyB9O1xuXG5leHBvcnQgdHlwZSBTaWduYWxTdG9yZVNsaWNlczxTdGF0ZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgU3RhdGVdOiBTdGF0ZVtLZXldIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA/IElzVW5rbm93blJlY29yZDxTdGF0ZVtLZXldPiBleHRlbmRzIHRydWVcbiAgICAgID8gU2lnbmFsPFN0YXRlW0tleV0+XG4gICAgICA6IERlZXBTaWduYWw8U3RhdGVbS2V5XT5cbiAgICA6IFNpZ25hbDxTdGF0ZVtLZXldPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZ25hbFN0b3JlPEZlYXR1cmVSZXN1bHQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+ID1cbiAgUHJldHRpZnk8XG4gICAgU2lnbmFsU3RvcmVTbGljZXM8RmVhdHVyZVJlc3VsdFsnc3RhdGUnXT4gJlxuICAgICAgRmVhdHVyZVJlc3VsdFsnc2lnbmFscyddICZcbiAgICAgIEZlYXR1cmVSZXN1bHRbJ21ldGhvZHMnXSAmXG4gICAgICBTaWduYWxTdGF0ZU1ldGE8UHJldHRpZnk8RmVhdHVyZVJlc3VsdFsnc3RhdGUnXT4+XG4gID47XG5cbmV4cG9ydCB0eXBlIFNpZ25hbHNEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+PjtcblxuZXhwb3J0IHR5cGUgTWV0aG9kc0RpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55W10pID0+IHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBTaWduYWxTdG9yZUhvb2tzID0ge1xuICBvbkluaXQ/OiAoKSA9PiB2b2lkO1xuICBvbkRlc3Ryb3k/OiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgSW5uZXJTaWduYWxTdG9yZTxcbiAgU3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBTaWduYWxzIGV4dGVuZHMgU2lnbmFsc0RpY3Rpb25hcnkgPSBTaWduYWxzRGljdGlvbmFyeSxcbiAgTWV0aG9kcyBleHRlbmRzIE1ldGhvZHNEaWN0aW9uYXJ5ID0gTWV0aG9kc0RpY3Rpb25hcnlcbj4gPSB7XG4gIHNsaWNlczogU2lnbmFsU3RvcmVTbGljZXM8U3RhdGU+O1xuICBzaWduYWxzOiBTaWduYWxzO1xuICBtZXRob2RzOiBNZXRob2RzO1xuICBob29rczogU2lnbmFsU3RvcmVIb29rcztcbn0gJiBTaWduYWxTdGF0ZU1ldGE8U3RhdGU+O1xuXG5leHBvcnQgdHlwZSBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQgPSB7XG4gIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc2lnbmFsczogU2lnbmFsc0RpY3Rpb25hcnk7XG4gIG1ldGhvZHM6IE1ldGhvZHNEaWN0aW9uYXJ5O1xufTtcblxuZXhwb3J0IHR5cGUgRW1wdHlGZWF0dXJlUmVzdWx0ID0geyBzdGF0ZToge307IHNpZ25hbHM6IHt9OyBtZXRob2RzOiB7fSB9O1xuXG5leHBvcnQgdHlwZSBTaWduYWxTdG9yZUZlYXR1cmU8XG4gIElucHV0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0ID0gU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBPdXRwdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQgPSBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4gPSAoXG4gIHN0b3JlOiBJbm5lclNpZ25hbFN0b3JlPElucHV0WydzdGF0ZSddLCBJbnB1dFsnc2lnbmFscyddLCBJbnB1dFsnbWV0aG9kcyddPlxuKSA9PiBJbm5lclNpZ25hbFN0b3JlPE91dHB1dFsnc3RhdGUnXSwgT3V0cHV0WydzaWduYWxzJ10sIE91dHB1dFsnbWV0aG9kcyddPjtcblxuZXhwb3J0IHR5cGUgTWVyZ2VGZWF0dXJlUmVzdWx0czxcbiAgRmVhdHVyZVJlc3VsdHMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRbXVxuPiA9IEZlYXR1cmVSZXN1bHRzIGV4dGVuZHMgW11cbiAgPyB7fVxuICA6IEZlYXR1cmVSZXN1bHRzIGV4dGVuZHMgW2luZmVyIEZpcnN0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XVxuICA/IEZpcnN0XG4gIDogRmVhdHVyZVJlc3VsdHMgZXh0ZW5kcyBbXG4gICAgICBpbmZlciBGaXJzdCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgICAgIGluZmVyIFNlY29uZCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuICAgIF1cbiAgPyBNZXJnZVR3b0ZlYXR1cmVSZXN1bHRzPEZpcnN0LCBTZWNvbmQ+XG4gIDogRmVhdHVyZVJlc3VsdHMgZXh0ZW5kcyBbXG4gICAgICBpbmZlciBGaXJzdCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgICAgIGluZmVyIFNlY29uZCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgICAgIC4uLmluZmVyIFJlc3QgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRbXVxuICAgIF1cbiAgPyBNZXJnZUZlYXR1cmVSZXN1bHRzPFtNZXJnZVR3b0ZlYXR1cmVSZXN1bHRzPEZpcnN0LCBTZWNvbmQ+LCAuLi5SZXN0XT5cbiAgOiBuZXZlcjtcblxudHlwZSBGZWF0dXJlUmVzdWx0S2V5czxGZWF0dXJlUmVzdWx0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0PiA9XG4gIHwga2V5b2YgRmVhdHVyZVJlc3VsdFsnc3RhdGUnXVxuICB8IGtleW9mIEZlYXR1cmVSZXN1bHRbJ3NpZ25hbHMnXVxuICB8IGtleW9mIEZlYXR1cmVSZXN1bHRbJ21ldGhvZHMnXTtcblxudHlwZSBNZXJnZVR3b0ZlYXR1cmVSZXN1bHRzPFxuICBGaXJzdCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgU2Vjb25kIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+ID0ge1xuICBzdGF0ZTogT21pdDxGaXJzdFsnc3RhdGUnXSwgRmVhdHVyZVJlc3VsdEtleXM8U2Vjb25kPj47XG4gIHNpZ25hbHM6IE9taXQ8Rmlyc3RbJ3NpZ25hbHMnXSwgRmVhdHVyZVJlc3VsdEtleXM8U2Vjb25kPj47XG4gIG1ldGhvZHM6IE9taXQ8Rmlyc3RbJ21ldGhvZHMnXSwgRmVhdHVyZVJlc3VsdEtleXM8U2Vjb25kPj47XG59ICYgU2Vjb25kO1xuIl19
\ No newline at end of file
diff --git a/esm2022/src/signal-store.mjs b/esm2022/src/signal-store.mjs
new file mode 100644
index 0000000..4eeae58
--- /dev/null
+++ b/esm2022/src/signal-store.mjs
@@ -0,0 +1,47 @@
+import { DestroyRef, inject, Injectable, Injector, runInInjectionContext, signal, } from '@angular/core';
+import { STATE_SIGNAL } from './signal-state';
+import * as i0 from "@angular/core";
+export function signalStore(...args) {
+ const signalStoreArgs = [...args];
+ const config = 'providedIn' in signalStoreArgs[0]
+ ? signalStoreArgs.shift()
+ : {};
+ const features = signalStoreArgs;
+ class SignalStore {
+ constructor() {
+ const innerStore = features.reduce((store, feature) => feature(store), getInitialInnerStore());
+ const { slices, signals, methods, hooks } = innerStore;
+ const props = { ...slices, ...signals, ...methods };
+ this[STATE_SIGNAL] = innerStore[STATE_SIGNAL];
+ for (const key in props) {
+ this[key] = props[key];
+ }
+ if (hooks.onInit) {
+ hooks.onInit();
+ }
+ if (hooks.onDestroy) {
+ const injector = inject(Injector);
+ inject(DestroyRef).onDestroy(() => {
+ runInInjectionContext(injector, hooks.onDestroy);
+ });
+ }
+ }
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
+ /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, providedIn: config.providedIn || null });
+ }
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, decorators: [{
+ type: Injectable,
+ args: [{ providedIn: config.providedIn || null }]
+ }], ctorParameters: () => [] });
+ return SignalStore;
+}
+export function getInitialInnerStore() {
+ return {
+ [STATE_SIGNAL]: signal({}),
+ slices: {},
+ signals: {},
+ methods: {},
+ hooks: {},
+ };
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zaWduYWxzL3NyYy9zaWduYWwtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixxQkFBcUIsRUFDckIsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFrUTlDLE1BQU0sVUFBVSxXQUFXLENBQ3pCLEdBQUcsSUFBeUU7SUFFNUUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUNWLFlBQVksSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBRSxlQUFlLENBQUMsS0FBSyxFQUF3QjtRQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsTUFBTSxRQUFRLEdBQUcsZUFBdUMsQ0FBQztJQUV6RCxNQUNNLFdBQVc7UUFDZjtZQUNFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQ2hDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNsQyxvQkFBb0IsRUFBRSxDQUN2QixDQUFDO1lBQ0YsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFFbkQsSUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtnQkFDdEIsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQztZQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUNuQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWxDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNoQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztxSUExQkcsV0FBVzt5SUFBWCxXQUFXLGNBRFMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJOztzR0FDN0MsV0FBVztzQkFEaEIsVUFBVTt1QkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTs7SUE4QnJELE9BQU8sV0FBVyxDQUFDO0NBQ3BCO0FBRUQsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPO1FBQ0wsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtRQUNYLEtBQUssRUFBRSxFQUFFO0tBQ1YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBydW5JbkluamVjdGlvbkNvbnRleHQsXG4gIHNpZ25hbCxcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTVEFURV9TSUdOQUwgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5pbXBvcnQge1xuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIElubmVyU2lnbmFsU3RvcmUsXG4gIE1lcmdlRmVhdHVyZVJlc3VsdHMsXG4gIFNpZ25hbFN0b3JlLFxuICBTaWduYWxTdG9yZUNvbmZpZyxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG59IGZyb20gJy4vc2lnbmFsLXN0b3JlLW1vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT5cbik6IFR5cGU8U2lnbmFsU3RvcmU8RjE+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPiwgRjM+XG4pOiBUeXBlPFNpZ25hbFN0b3JlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjNdPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+Pj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmU8XG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PixcbiAgZjU6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+LCBGNT5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1XT4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PixcbiAgZjU6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+LCBGNT4sXG4gIGY2OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1XT4sIEY2PlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNCwgRjUsIEY2XT4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjcgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjUgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY2IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjggZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz4sXG4gIGY4OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPiwgRjg+XG4pOiBUeXBlPFNpZ25hbFN0b3JlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjYsIEY3LCBGOF0+Pj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmU8XG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjYgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY3IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGOCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjkgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz4sXG4gIGY4OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPiwgRjg+LFxuICBmOTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICAgIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjYsIEY3LCBGOF0+LFxuICAgIEY5XG4gID5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjcsIEY4LCBGOV0+Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4oXG4gIGNvbmZpZzogU2lnbmFsU3RvcmVDb25maWcsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT5cbik6IFR5cGU8U2lnbmFsU3RvcmU8RjE+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBjb25maWc6IFNpZ25hbFN0b3JlQ29uZmlnLFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0XG4+KFxuICBjb25maWc6IFNpZ25hbFN0b3JlQ29uZmlnLFxuICBmMTogU2lnbmFsU3RvcmVGZWF0dXJlPEVtcHR5RmVhdHVyZVJlc3VsdCwgRjE+LFxuICBmMjogU2lnbmFsU3RvcmVGZWF0dXJlPHt9ICYgRjEsIEYyPixcbiAgZjM6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjJdPiwgRjM+XG4pOiBUeXBlPFNpZ25hbFN0b3JlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjNdPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgY29uZmlnOiBTaWduYWxTdG9yZUNvbmZpZyxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+Pj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmU8XG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgY29uZmlnOiBTaWduYWxTdG9yZUNvbmZpZyxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PixcbiAgZjU6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+LCBGNT5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1XT4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdFxuPihcbiAgY29uZmlnOiBTaWduYWxTdG9yZUNvbmZpZyxcbiAgZjE6IFNpZ25hbFN0b3JlRmVhdHVyZTxFbXB0eUZlYXR1cmVSZXN1bHQsIEYxPixcbiAgZjI6IFNpZ25hbFN0b3JlRmVhdHVyZTx7fSAmIEYxLCBGMj4sXG4gIGYzOiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyXT4sIEYzPixcbiAgZjQ6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzXT4sIEY0PixcbiAgZjU6IFNpZ25hbFN0b3JlRmVhdHVyZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNF0+LCBGNT4sXG4gIGY2OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1XT4sIEY2PlxuKTogVHlwZTxTaWduYWxTdG9yZTxNZXJnZUZlYXR1cmVSZXN1bHRzPFtGMSwgRjIsIEYzLCBGNCwgRjUsIEY2XT4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZTxcbiAgRjEgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYyIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY1IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjcgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGNvbmZpZzogU2lnbmFsU3RvcmVDb25maWcsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFN0b3JlPFxuICBGMSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjIgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEYzIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjUgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY2IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNyBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjggZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGNvbmZpZzogU2lnbmFsU3RvcmVDb25maWcsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz4sXG4gIGY4OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPiwgRjg+XG4pOiBUeXBlPFNpZ25hbFN0b3JlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjYsIEY3LCBGOF0+Pj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsU3RvcmU8XG4gIEYxIGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGMiBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjMgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGNSBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjYgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIEY3IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBGOCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgRjkgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHRcbj4oXG4gIGNvbmZpZzogU2lnbmFsU3RvcmVDb25maWcsXG4gIGYxOiBTaWduYWxTdG9yZUZlYXR1cmU8RW1wdHlGZWF0dXJlUmVzdWx0LCBGMT4sXG4gIGYyOiBTaWduYWxTdG9yZUZlYXR1cmU8e30gJiBGMSwgRjI+LFxuICBmMzogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMl0+LCBGMz4sXG4gIGY0OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGM10+LCBGND4sXG4gIGY1OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjRdPiwgRjU+LFxuICBmNjogU2lnbmFsU3RvcmVGZWF0dXJlPE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNV0+LCBGNj4sXG4gIGY3OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNl0+LCBGNz4sXG4gIGY4OiBTaWduYWxTdG9yZUZlYXR1cmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjddPiwgRjg+LFxuICBmOTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICAgIE1lcmdlRmVhdHVyZVJlc3VsdHM8W0YxLCBGMiwgRjMsIEY0LCBGNSwgRjYsIEY3LCBGOF0+LFxuICAgIEY5XG4gID5cbik6IFR5cGU8U2lnbmFsU3RvcmU8TWVyZ2VGZWF0dXJlUmVzdWx0czxbRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjcsIEY4LCBGOV0+Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxTdG9yZShcbiAgLi4uYXJnczogW1NpZ25hbFN0b3JlQ29uZmlnLCAuLi5TaWduYWxTdG9yZUZlYXR1cmVbXV0gfCBTaWduYWxTdG9yZUZlYXR1cmVbXVxuKTogVHlwZTxTaWduYWxTdG9yZTxhbnk+PiB7XG4gIGNvbnN0IHNpZ25hbFN0b3JlQXJncyA9IFsuLi5hcmdzXTtcblxuICBjb25zdCBjb25maWc6IFBhcnRpYWw8U2lnbmFsU3RvcmVDb25maWc+ID1cbiAgICAncHJvdmlkZWRJbicgaW4gc2lnbmFsU3RvcmVBcmdzWzBdXG4gICAgICA/IChzaWduYWxTdG9yZUFyZ3Muc2hpZnQoKSBhcyBTaWduYWxTdG9yZUNvbmZpZylcbiAgICAgIDoge307XG4gIGNvbnN0IGZlYXR1cmVzID0gc2lnbmFsU3RvcmVBcmdzIGFzIFNpZ25hbFN0b3JlRmVhdHVyZVtdO1xuXG4gIEBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogY29uZmlnLnByb3ZpZGVkSW4gfHwgbnVsbCB9KVxuICBjbGFzcyBTaWduYWxTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBpbm5lclN0b3JlID0gZmVhdHVyZXMucmVkdWNlKFxuICAgICAgICAoc3RvcmUsIGZlYXR1cmUpID0+IGZlYXR1cmUoc3RvcmUpLFxuICAgICAgICBnZXRJbml0aWFsSW5uZXJTdG9yZSgpXG4gICAgICApO1xuICAgICAgY29uc3QgeyBzbGljZXMsIHNpZ25hbHMsIG1ldGhvZHMsIGhvb2tzIH0gPSBpbm5lclN0b3JlO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLnNsaWNlcywgLi4uc2lnbmFscywgLi4ubWV0aG9kcyB9O1xuXG4gICAgICAodGhpcyBhcyBhbnkpW1NUQVRFX1NJR05BTF0gPSBpbm5lclN0b3JlW1NUQVRFX1NJR05BTF07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IHByb3BzW2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmIChob29rcy5vbkluaXQpIHtcbiAgICAgICAgaG9va3Mub25Jbml0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChob29rcy5vbkRlc3Ryb3kpIHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgaG9va3Mub25EZXN0cm95ISk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTaWduYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxJbm5lclN0b3JlKCk6IElubmVyU2lnbmFsU3RvcmUge1xuICByZXR1cm4ge1xuICAgIFtTVEFURV9TSUdOQUxdOiBzaWduYWwoe30pLFxuICAgIHNsaWNlczoge30sXG4gICAgc2lnbmFsczoge30sXG4gICAgbWV0aG9kczoge30sXG4gICAgaG9va3M6IHt9LFxuICB9O1xufVxuIl19
\ No newline at end of file
diff --git a/esm2022/src/ts-helpers.mjs b/esm2022/src/ts-helpers.mjs
new file mode 100644
index 0000000..432de0a
--- /dev/null
+++ b/esm2022/src/ts-helpers.mjs
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvdHMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUHJldHRpZnk8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gJiB7fTtcblxuZXhwb3J0IHR5cGUgSXNVbmtub3duUmVjb3JkPFQ+ID0gc3RyaW5nIGV4dGVuZHMga2V5b2YgVFxuICA/IHRydWVcbiAgOiBudW1iZXIgZXh0ZW5kcyBrZXlvZiBUXG4gID8gdHJ1ZVxuICA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBIYXNPcHRpb25hbFByb3BzPFQ+ID0gVCBleHRlbmRzIFJlcXVpcmVkPFQ+ID8gZmFsc2UgOiB0cnVlO1xuXG5leHBvcnQgdHlwZSBIYXNGdW5jdGlvbktleXM8VD4gPSBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgPyB7XG4gICAgICBbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIGtleW9mIEZ1bmN0aW9uID8gdHJ1ZSA6IEhhc0Z1bmN0aW9uS2V5czxUW0tdPjtcbiAgICB9W2tleW9mIFRdXG4gIDogZmFsc2U7XG5cbmV4cG9ydCB0eXBlIEhhc05lc3RlZEZ1bmN0aW9uS2V5czxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IEhhc0Z1bmN0aW9uS2V5czxUW0tdPjtcbn1ba2V5b2YgVF07XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/src/with-computed.mjs b/esm2022/src/with-computed.mjs
new file mode 100644
index 0000000..68935bd
--- /dev/null
+++ b/esm2022/src/with-computed.mjs
@@ -0,0 +1,16 @@
+import { excludeKeys } from './helpers';
+export function withComputed(signalsFactory) {
+ return (store) => {
+ const signals = signalsFactory({ ...store.slices, ...store.signals });
+ const signalsKeys = Object.keys(signals);
+ const slices = excludeKeys(store.slices, signalsKeys);
+ const methods = excludeKeys(store.methods, signalsKeys);
+ return {
+ ...store,
+ slices,
+ signals: { ...store.signals, ...signals },
+ methods,
+ };
+ };
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jb21wdXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvd2l0aC1jb21wdXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBV3hDLE1BQU0sVUFBVSxZQUFZLENBSTFCLGNBRVk7SUFFWixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDZixNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXhELE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixNQUFNO1lBQ04sT0FBTyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFO1lBQ3pDLE9BQU87U0FDOEMsQ0FBQztJQUMxRCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhjbHVkZUtleXMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBJbm5lclNpZ25hbFN0b3JlLFxuICBTaWduYWxzRGljdGlvbmFyeSxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIFNpZ25hbFN0b3JlU2xpY2VzLFxufSBmcm9tICcuL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tICcuL3RzLWhlbHBlcnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aENvbXB1dGVkPFxuICBJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgU2lnbmFscyBleHRlbmRzIFNpZ25hbHNEaWN0aW9uYXJ5XG4+KFxuICBzaWduYWxzRmFjdG9yeTogKFxuICAgIHN0b3JlOiBQcmV0dGlmeTxTaWduYWxTdG9yZVNsaWNlczxJbnB1dFsnc3RhdGUnXT4gJiBJbnB1dFsnc2lnbmFscyddPlxuICApID0+IFNpZ25hbHNcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxJbnB1dCwgRW1wdHlGZWF0dXJlUmVzdWx0ICYgeyBzaWduYWxzOiBTaWduYWxzIH0+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IHNpZ25hbHMgPSBzaWduYWxzRmFjdG9yeSh7IC4uLnN0b3JlLnNsaWNlcywgLi4uc3RvcmUuc2lnbmFscyB9KTtcbiAgICBjb25zdCBzaWduYWxzS2V5cyA9IE9iamVjdC5rZXlzKHNpZ25hbHMpO1xuICAgIGNvbnN0IHNsaWNlcyA9IGV4Y2x1ZGVLZXlzKHN0b3JlLnNsaWNlcywgc2lnbmFsc0tleXMpO1xuICAgIGNvbnN0IG1ldGhvZHMgPSBleGNsdWRlS2V5cyhzdG9yZS5tZXRob2RzLCBzaWduYWxzS2V5cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBzbGljZXMsXG4gICAgICBzaWduYWxzOiB7IC4uLnN0b3JlLnNpZ25hbHMsIC4uLnNpZ25hbHMgfSxcbiAgICAgIG1ldGhvZHMsXG4gICAgfSBhcyBJbm5lclNpZ25hbFN0b3JlPFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTaWduYWxzPjtcbiAgfTtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/esm2022/src/with-hooks.mjs b/esm2022/src/with-hooks.mjs
new file mode 100644
index 0000000..b8ca433
--- /dev/null
+++ b/esm2022/src/with-hooks.mjs
@@ -0,0 +1,30 @@
+import { STATE_SIGNAL } from './signal-state';
+export function withHooks(hooks) {
+ return (store) => {
+ const createHook = (name) => {
+ const hook = hooks[name];
+ const currentHook = store.hooks[name];
+ return hook
+ ? () => {
+ if (currentHook) {
+ currentHook();
+ }
+ hook({
+ [STATE_SIGNAL]: store[STATE_SIGNAL],
+ ...store.slices,
+ ...store.signals,
+ ...store.methods,
+ });
+ }
+ : currentHook;
+ };
+ return {
+ ...store,
+ hooks: {
+ onInit: createHook('onInit'),
+ onDestroy: createHook('onDestroy'),
+ },
+ };
+ };
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ob29rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvd2l0aC1ob29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBa0IvRCxNQUFNLFVBQVUsU0FBUyxDQUF5QyxLQUdqRTtJQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBd0IsRUFBRSxFQUFFO1lBQzlDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRDLE9BQU8sSUFBSTtnQkFDVCxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUNILElBQUksV0FBVyxFQUFFO3dCQUNmLFdBQVcsRUFBRSxDQUFDO3FCQUNmO29CQUVELElBQUksQ0FBQzt3QkFDSCxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUM7d0JBQ25DLEdBQUcsS0FBSyxDQUFDLE1BQU07d0JBQ2YsR0FBRyxLQUFLLENBQUMsT0FBTzt3QkFDaEIsR0FBRyxLQUFLLENBQUMsT0FBTztxQkFDakIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNsQixDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1IsS0FBSyxFQUFFO2dCQUNMLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO2dCQUM1QixTQUFTLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQzthQUNuQztTQUNGLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU1RBVEVfU0lHTkFMLCBTaWduYWxTdGF0ZU1ldGEgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5pbXBvcnQge1xuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgU2lnbmFsU3RvcmVTbGljZXMsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbn0gZnJvbSAnLi9zaWduYWwtc3RvcmUtbW9kZWxzJztcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSAnLi90cy1oZWxwZXJzJztcblxudHlwZSBIb29rc0ZhY3Rvcnk8SW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+ID0gKFxuICBzdG9yZTogUHJldHRpZnk8XG4gICAgU2lnbmFsU3RvcmVTbGljZXM8SW5wdXRbJ3N0YXRlJ10+ICZcbiAgICAgIElucHV0WydzaWduYWxzJ10gJlxuICAgICAgSW5wdXRbJ21ldGhvZHMnXSAmXG4gICAgICBTaWduYWxTdGF0ZU1ldGE8UHJldHRpZnk8SW5wdXRbJ3N0YXRlJ10+PlxuICA+XG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoSG9va3M8SW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+KGhvb2tzOiB7XG4gIG9uSW5pdD86IEhvb2tzRmFjdG9yeTxJbnB1dD47XG4gIG9uRGVzdHJveT86IEhvb2tzRmFjdG9yeTxJbnB1dD47XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPElucHV0LCBFbXB0eUZlYXR1cmVSZXN1bHQ+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZUhvb2sgPSAobmFtZToga2V5b2YgdHlwZW9mIGhvb2tzKSA9PiB7XG4gICAgICBjb25zdCBob29rID0gaG9va3NbbmFtZV07XG4gICAgICBjb25zdCBjdXJyZW50SG9vayA9IHN0b3JlLmhvb2tzW25hbWVdO1xuXG4gICAgICByZXR1cm4gaG9va1xuICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SG9vaykge1xuICAgICAgICAgICAgICBjdXJyZW50SG9vaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBob29rKHtcbiAgICAgICAgICAgICAgW1NUQVRFX1NJR05BTF06IHN0b3JlW1NUQVRFX1NJR05BTF0sXG4gICAgICAgICAgICAgIC4uLnN0b3JlLnNsaWNlcyxcbiAgICAgICAgICAgICAgLi4uc3RvcmUuc2lnbmFscyxcbiAgICAgICAgICAgICAgLi4uc3RvcmUubWV0aG9kcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBjdXJyZW50SG9vaztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgaG9va3M6IHtcbiAgICAgICAgb25Jbml0OiBjcmVhdGVIb29rKCdvbkluaXQnKSxcbiAgICAgICAgb25EZXN0cm95OiBjcmVhdGVIb29rKCdvbkRlc3Ryb3knKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/esm2022/src/with-methods.mjs b/esm2022/src/with-methods.mjs
new file mode 100644
index 0000000..314b896
--- /dev/null
+++ b/esm2022/src/with-methods.mjs
@@ -0,0 +1,22 @@
+import { excludeKeys } from './helpers';
+import { STATE_SIGNAL } from './signal-state';
+export function withMethods(methodsFactory) {
+ return (store) => {
+ const methods = methodsFactory({
+ [STATE_SIGNAL]: store[STATE_SIGNAL],
+ ...store.slices,
+ ...store.signals,
+ ...store.methods,
+ });
+ const methodsKeys = Object.keys(methods);
+ const slices = excludeKeys(store.slices, methodsKeys);
+ const signals = excludeKeys(store.signals, methodsKeys);
+ return {
+ ...store,
+ slices,
+ signals,
+ methods: { ...store.methods, ...methods },
+ };
+ };
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zaWduYWxzL3NyYy93aXRoLW1ldGhvZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBWS9ELE1BQU0sVUFBVSxXQUFXLENBSXpCLGNBT1k7SUFFWixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDZixNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUM7WUFDN0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ25DLEdBQUcsS0FBSyxDQUFDLE1BQU07WUFDZixHQUFHLEtBQUssQ0FBQyxPQUFPO1lBQ2hCLEdBQUcsS0FBSyxDQUFDLE9BQU87U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1IsTUFBTTtZQUNOLE9BQU87WUFDUCxPQUFPLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUU7U0FDK0IsQ0FBQztJQUM3RSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhjbHVkZUtleXMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgU1RBVEVfU0lHTkFMLCBTaWduYWxTdGF0ZU1ldGEgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5pbXBvcnQge1xuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIElubmVyU2lnbmFsU3RvcmUsXG4gIE1ldGhvZHNEaWN0aW9uYXJ5LFxuICBTaWduYWxzRGljdGlvbmFyeSxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIFNpZ25hbFN0b3JlU2xpY2VzLFxufSBmcm9tICcuL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tICcuL3RzLWhlbHBlcnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aE1ldGhvZHM8XG4gIElucHV0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBNZXRob2RzIGV4dGVuZHMgTWV0aG9kc0RpY3Rpb25hcnlcbj4oXG4gIG1ldGhvZHNGYWN0b3J5OiAoXG4gICAgc3RvcmU6IFByZXR0aWZ5PFxuICAgICAgU2lnbmFsU3RvcmVTbGljZXM8SW5wdXRbJ3N0YXRlJ10+ICZcbiAgICAgICAgSW5wdXRbJ3NpZ25hbHMnXSAmXG4gICAgICAgIElucHV0WydtZXRob2RzJ10gJlxuICAgICAgICBTaWduYWxTdGF0ZU1ldGE8UHJldHRpZnk8SW5wdXRbJ3N0YXRlJ10+PlxuICAgID5cbiAgKSA9PiBNZXRob2RzXG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8SW5wdXQsIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHsgbWV0aG9kczogTWV0aG9kcyB9PiB7XG4gIHJldHVybiAoc3RvcmUpID0+IHtcbiAgICBjb25zdCBtZXRob2RzID0gbWV0aG9kc0ZhY3Rvcnkoe1xuICAgICAgW1NUQVRFX1NJR05BTF06IHN0b3JlW1NUQVRFX1NJR05BTF0sXG4gICAgICAuLi5zdG9yZS5zbGljZXMsXG4gICAgICAuLi5zdG9yZS5zaWduYWxzLFxuICAgICAgLi4uc3RvcmUubWV0aG9kcyxcbiAgICB9KTtcbiAgICBjb25zdCBtZXRob2RzS2V5cyA9IE9iamVjdC5rZXlzKG1ldGhvZHMpO1xuICAgIGNvbnN0IHNsaWNlcyA9IGV4Y2x1ZGVLZXlzKHN0b3JlLnNsaWNlcywgbWV0aG9kc0tleXMpO1xuICAgIGNvbnN0IHNpZ25hbHMgPSBleGNsdWRlS2V5cyhzdG9yZS5zaWduYWxzLCBtZXRob2RzS2V5cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBzbGljZXMsXG4gICAgICBzaWduYWxzLFxuICAgICAgbWV0aG9kczogeyAuLi5zdG9yZS5tZXRob2RzLCAuLi5tZXRob2RzIH0sXG4gICAgfSBhcyBJbm5lclNpZ25hbFN0b3JlPFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTaWduYWxzRGljdGlvbmFyeSwgTWV0aG9kcz47XG4gIH07XG59XG4iXX0=
\ No newline at end of file
diff --git a/esm2022/src/with-state.mjs b/esm2022/src/with-state.mjs
new file mode 100644
index 0000000..4167484
--- /dev/null
+++ b/esm2022/src/with-state.mjs
@@ -0,0 +1,27 @@
+import { computed } from '@angular/core';
+import { toDeepSignal } from './deep-signal';
+import { excludeKeys } from './helpers';
+import { STATE_SIGNAL } from './signal-state';
+export function withState(stateOrFactory) {
+ return (store) => {
+ const state = typeof stateOrFactory === 'function' ? stateOrFactory() : stateOrFactory;
+ const stateKeys = Object.keys(state);
+ store[STATE_SIGNAL].update((currentState) => ({
+ ...currentState,
+ ...state,
+ }));
+ const slices = stateKeys.reduce((acc, key) => {
+ const slice = computed(() => store[STATE_SIGNAL]()[key]);
+ return { ...acc, [key]: toDeepSignal(slice) };
+ }, {});
+ const signals = excludeKeys(store.signals, stateKeys);
+ const methods = excludeKeys(store.methods, stateKeys);
+ return {
+ ...store,
+ slices: { ...store.slices, ...slices },
+ signals,
+ methods,
+ };
+ };
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc2lnbmFscy9zcmMvd2l0aC1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFrQzlDLE1BQU0sVUFBVSxTQUFTLENBQ3ZCLGNBQXFDO0lBS3JDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sS0FBSyxHQUNULE9BQU8sY0FBYyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUMzRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUMsR0FBRyxZQUFZO1lBQ2YsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzNDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELENBQUMsRUFBRSxFQUF1QixDQUFDLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdEQsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLE1BQU0sRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sRUFBRTtZQUN0QyxPQUFPO1lBQ1AsT0FBTztTQUNtQixDQUFDO0lBQy9CLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9EZWVwU2lnbmFsIH0gZnJvbSAnLi9kZWVwLXNpZ25hbCc7XG5pbXBvcnQgeyBleGNsdWRlS2V5cyB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBTVEFURV9TSUdOQUwgfSBmcm9tICcuL3NpZ25hbC1zdGF0ZSc7XG5pbXBvcnQge1xuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIElubmVyU2lnbmFsU3RvcmUsXG4gIFNpZ25hbHNEaWN0aW9uYXJ5LFxuICBTaWduYWxTdG9yZUZlYXR1cmUsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbn0gZnJvbSAnLi9zaWduYWwtc3RvcmUtbW9kZWxzJztcbmltcG9ydCB7XG4gIEhhc05lc3RlZEZ1bmN0aW9uS2V5cyxcbiAgSGFzT3B0aW9uYWxQcm9wcyxcbiAgSXNVbmtub3duUmVjb3JkLFxufSBmcm9tICcuL3RzLWhlbHBlcnMnO1xuXG50eXBlIFdpdGhTdGF0ZUNoZWNrPFN0YXRlPiA9IElzVW5rbm93blJlY29yZDxTdGF0ZT4gZXh0ZW5kcyB0cnVlXG4gID8gJ0BuZ3J4L3NpZ25hbHM6IHJvb3Qgc3RhdGUga2V5cyBtdXN0IGJlIHN0cmluZyBsaXRlcmFscydcbiAgOiBIYXNPcHRpb25hbFByb3BzPFN0YXRlPiBleHRlbmRzIHRydWVcbiAgPyAnQG5ncngvc2lnbmFsczogcm9vdCBzdGF0ZSBzbGljZXMgY2Fubm90IGJlIG9wdGlvbmFsJ1xuICA6IEhhc05lc3RlZEZ1bmN0aW9uS2V5czxTdGF0ZT4gZXh0ZW5kcyBmYWxzZSB8IHVuZGVmaW5lZFxuICA/IHVua25vd25cbiAgOiAnQG5ncngvc2lnbmFsczogbmVzdGVkIHN0YXRlIHNsaWNlcyBjYW5ub3QgY29udGFpbiBgRnVuY3Rpb25gIHByb3BlcnR5IG9yIG1ldGhvZCBuYW1lcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3RhdGU8U3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIHN0YXRlOiBTdGF0ZSAmIFdpdGhTdGF0ZUNoZWNrPFN0YXRlPlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHsgc3RhdGU6IFN0YXRlIH1cbj47XG5leHBvcnQgZnVuY3Rpb24gd2l0aFN0YXRlPFN0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBzdGF0ZUZhY3Rvcnk6ICgpID0+IFN0YXRlICYgV2l0aFN0YXRlQ2hlY2s8U3RhdGU+XG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gIEVtcHR5RmVhdHVyZVJlc3VsdCxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0ICYgeyBzdGF0ZTogU3RhdGUgfVxuPjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3RhdGU8U3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIHN0YXRlT3JGYWN0b3J5OiBTdGF0ZSB8ICgoKSA9PiBTdGF0ZSlcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0LFxuICBFbXB0eUZlYXR1cmVSZXN1bHQgJiB7IHN0YXRlOiBTdGF0ZSB9XG4+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID1cbiAgICAgIHR5cGVvZiBzdGF0ZU9yRmFjdG9yeSA9PT0gJ2Z1bmN0aW9uJyA/IHN0YXRlT3JGYWN0b3J5KCkgOiBzdGF0ZU9yRmFjdG9yeTtcbiAgICBjb25zdCBzdGF0ZUtleXMgPSBPYmplY3Qua2V5cyhzdGF0ZSk7XG5cbiAgICBzdG9yZVtTVEFURV9TSUdOQUxdLnVwZGF0ZSgoY3VycmVudFN0YXRlKSA9PiAoe1xuICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgLi4uc3RhdGUsXG4gICAgfSkpO1xuXG4gICAgY29uc3Qgc2xpY2VzID0gc3RhdGVLZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHNsaWNlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmVbU1RBVEVfU0lHTkFMXSgpW2tleV0pO1xuICAgICAgcmV0dXJuIHsgLi4uYWNjLCBba2V5XTogdG9EZWVwU2lnbmFsKHNsaWNlKSB9O1xuICAgIH0sIHt9IGFzIFNpZ25hbHNEaWN0aW9uYXJ5KTtcbiAgICBjb25zdCBzaWduYWxzID0gZXhjbHVkZUtleXMoc3RvcmUuc2lnbmFscywgc3RhdGVLZXlzKTtcbiAgICBjb25zdCBtZXRob2RzID0gZXhjbHVkZUtleXMoc3RvcmUubWV0aG9kcywgc3RhdGVLZXlzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdG9yZSxcbiAgICAgIHNsaWNlczogeyAuLi5zdG9yZS5zbGljZXMsIC4uLnNsaWNlcyB9LFxuICAgICAgc2lnbmFscyxcbiAgICAgIG1ldGhvZHMsXG4gICAgfSBhcyBJbm5lclNpZ25hbFN0b3JlPFN0YXRlPjtcbiAgfTtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/fesm2022/ngrx-signals-rxjs-interop.mjs b/fesm2022/ngrx-signals-rxjs-interop.mjs
new file mode 100644
index 0000000..e3dc34a
--- /dev/null
+++ b/fesm2022/ngrx-signals-rxjs-interop.mjs
@@ -0,0 +1,38 @@
+import { assertInInjectionContext, inject, Injector, DestroyRef, isSignal } from '@angular/core';
+import { toObservable } from '@angular/core/rxjs-interop';
+import { Subject, isObservable, of } from 'rxjs';
+
+function rxMethod(generator, config) {
+ if (!config?.injector) {
+ assertInInjectionContext(rxMethod);
+ }
+ const injector = config?.injector ?? inject(Injector);
+ const destroyRef = injector.get(DestroyRef);
+ const source$ = new Subject();
+ const sourceSub = generator(source$).subscribe();
+ destroyRef.onDestroy(() => sourceSub.unsubscribe());
+ const rxMethodFn = (input) => {
+ let input$;
+ if (isSignal(input)) {
+ input$ = toObservable(input, { injector });
+ }
+ else if (isObservable(input)) {
+ input$ = input;
+ }
+ else {
+ input$ = of(input);
+ }
+ const instanceSub = input$.subscribe((value) => source$.next(value));
+ sourceSub.add(instanceSub);
+ return instanceSub;
+ };
+ rxMethodFn.unsubscribe = sourceSub.unsubscribe.bind(sourceSub);
+ return rxMethodFn;
+}
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+export { rxMethod };
+//# sourceMappingURL=ngrx-signals-rxjs-interop.mjs.map
diff --git a/fesm2022/ngrx-signals-rxjs-interop.mjs.map b/fesm2022/ngrx-signals-rxjs-interop.mjs.map
new file mode 100644
index 0000000..0e70808
--- /dev/null
+++ b/fesm2022/ngrx-signals-rxjs-interop.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"ngrx-signals-rxjs-interop.mjs","sources":["../../../../modules/signals/rxjs-interop/src/rx-method.ts","../../../../modules/signals/rxjs-interop/ngrx-signals-rxjs-interop.ts"],"sourcesContent":["import {\n assertInInjectionContext,\n DestroyRef,\n inject,\n Injector,\n isSignal,\n Signal,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { isObservable, Observable, of, Subject, Unsubscribable } from 'rxjs';\n\ntype RxMethodInput = Input | Observable | Signal;\n\ntype RxMethod = ((input: RxMethodInput) => Unsubscribable) &\n Unsubscribable;\n\nexport function rxMethod(\n generator: (source$: Observable) => Observable,\n config?: { injector?: Injector }\n): RxMethod {\n if (!config?.injector) {\n assertInInjectionContext(rxMethod);\n }\n\n const injector = config?.injector ?? inject(Injector);\n const destroyRef = injector.get(DestroyRef);\n const source$ = new Subject();\n\n const sourceSub = generator(source$).subscribe();\n destroyRef.onDestroy(() => sourceSub.unsubscribe());\n\n const rxMethodFn = (input: RxMethodInput) => {\n let input$: Observable;\n\n if (isSignal(input)) {\n input$ = toObservable(input, { injector });\n } else if (isObservable(input)) {\n input$ = input;\n } else {\n input$ = of(input);\n }\n\n const instanceSub = input$.subscribe((value) => source$.next(value));\n sourceSub.add(instanceSub);\n\n return instanceSub;\n };\n rxMethodFn.unsubscribe = sourceSub.unsubscribe.bind(sourceSub);\n\n return rxMethodFn;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgBgB,SAAA,QAAQ,CACtB,SAA8D,EAC9D,MAAgC,EAAA;AAEhC,IAAA,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;QACrB,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AACpC,KAAA;IAED,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC5C,IAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAS,CAAC;IAErC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;IACjD,UAAU,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AAEpD,IAAA,MAAM,UAAU,GAAG,CAAC,KAA2B,KAAI;AACjD,QAAA,IAAI,MAAyB,CAAC;AAE9B,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACnB,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5C,SAAA;AAAM,aAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YAC9B,MAAM,GAAG,KAAK,CAAC;AAChB,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AACpB,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,QAAA,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAE3B,QAAA,OAAO,WAAW,CAAC;AACrB,KAAC,CAAC;IACF,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE/D,IAAA,OAAO,UAAU,CAAC;AACpB;;AClDA;;AAEG;;;;"}
\ No newline at end of file
diff --git a/fesm2022/ngrx-signals.mjs b/fesm2022/ngrx-signals.mjs
new file mode 100644
index 0000000..bb7df5b
--- /dev/null
+++ b/fesm2022/ngrx-signals.mjs
@@ -0,0 +1,192 @@
+import * as i0 from '@angular/core';
+import { untracked, computed, signal, inject, Injector, DestroyRef, runInInjectionContext, Injectable } from '@angular/core';
+
+function toDeepSignal(signal) {
+ const value = untracked(() => signal());
+ if (!isRecord(value)) {
+ return signal;
+ }
+ return new Proxy(signal, {
+ get(target, prop) {
+ if (!(prop in value)) {
+ return target[prop];
+ }
+ if (!target[prop]) {
+ target[prop] = computed(() => target()[prop]);
+ }
+ return toDeepSignal(target[prop]);
+ },
+ });
+}
+function isRecord(value) {
+ return value?.constructor === Object;
+}
+
+const STATE_SIGNAL = Symbol('STATE_SIGNAL');
+function signalState(initialState) {
+ const stateSignal = signal(initialState);
+ const deepSignal = toDeepSignal(stateSignal.asReadonly());
+ Object.defineProperty(deepSignal, STATE_SIGNAL, {
+ value: stateSignal,
+ });
+ return deepSignal;
+}
+
+function patchState(signalState, ...updaters) {
+ signalState[STATE_SIGNAL].update((currentState) => updaters.reduce((nextState, updater) => ({
+ ...nextState,
+ ...(typeof updater === 'function' ? updater(nextState) : updater),
+ }), currentState));
+}
+
+function signalStore(...args) {
+ const signalStoreArgs = [...args];
+ const config = 'providedIn' in signalStoreArgs[0]
+ ? signalStoreArgs.shift()
+ : {};
+ const features = signalStoreArgs;
+ class SignalStore {
+ constructor() {
+ const innerStore = features.reduce((store, feature) => feature(store), getInitialInnerStore());
+ const { slices, signals, methods, hooks } = innerStore;
+ const props = { ...slices, ...signals, ...methods };
+ this[STATE_SIGNAL] = innerStore[STATE_SIGNAL];
+ for (const key in props) {
+ this[key] = props[key];
+ }
+ if (hooks.onInit) {
+ hooks.onInit();
+ }
+ if (hooks.onDestroy) {
+ const injector = inject(Injector);
+ inject(DestroyRef).onDestroy(() => {
+ runInInjectionContext(injector, hooks.onDestroy);
+ });
+ }
+ }
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
+ /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, providedIn: config.providedIn || null });
+ }
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.8", ngImport: i0, type: SignalStore, decorators: [{
+ type: Injectable,
+ args: [{ providedIn: config.providedIn || null }]
+ }], ctorParameters: () => [] });
+ return SignalStore;
+}
+function getInitialInnerStore() {
+ return {
+ [STATE_SIGNAL]: signal({}),
+ slices: {},
+ signals: {},
+ methods: {},
+ hooks: {},
+ };
+}
+
+function signalStoreFeature(featureOrInput, ...restFeatures) {
+ const features = typeof featureOrInput === 'function'
+ ? [featureOrInput, ...restFeatures]
+ : restFeatures;
+ return (inputStore) => features.reduce((store, feature) => feature(store), inputStore);
+}
+function type() {
+ return undefined;
+}
+
+function excludeKeys(obj, keys) {
+ return Object.keys(obj).reduce((acc, key) => (keys.includes(key) ? acc : { ...acc, [key]: obj[key] }), {});
+}
+
+function withComputed(signalsFactory) {
+ return (store) => {
+ const signals = signalsFactory({ ...store.slices, ...store.signals });
+ const signalsKeys = Object.keys(signals);
+ const slices = excludeKeys(store.slices, signalsKeys);
+ const methods = excludeKeys(store.methods, signalsKeys);
+ return {
+ ...store,
+ slices,
+ signals: { ...store.signals, ...signals },
+ methods,
+ };
+ };
+}
+
+function withHooks(hooks) {
+ return (store) => {
+ const createHook = (name) => {
+ const hook = hooks[name];
+ const currentHook = store.hooks[name];
+ return hook
+ ? () => {
+ if (currentHook) {
+ currentHook();
+ }
+ hook({
+ [STATE_SIGNAL]: store[STATE_SIGNAL],
+ ...store.slices,
+ ...store.signals,
+ ...store.methods,
+ });
+ }
+ : currentHook;
+ };
+ return {
+ ...store,
+ hooks: {
+ onInit: createHook('onInit'),
+ onDestroy: createHook('onDestroy'),
+ },
+ };
+ };
+}
+
+function withMethods(methodsFactory) {
+ return (store) => {
+ const methods = methodsFactory({
+ [STATE_SIGNAL]: store[STATE_SIGNAL],
+ ...store.slices,
+ ...store.signals,
+ ...store.methods,
+ });
+ const methodsKeys = Object.keys(methods);
+ const slices = excludeKeys(store.slices, methodsKeys);
+ const signals = excludeKeys(store.signals, methodsKeys);
+ return {
+ ...store,
+ slices,
+ signals,
+ methods: { ...store.methods, ...methods },
+ };
+ };
+}
+
+function withState(stateOrFactory) {
+ return (store) => {
+ const state = typeof stateOrFactory === 'function' ? stateOrFactory() : stateOrFactory;
+ const stateKeys = Object.keys(state);
+ store[STATE_SIGNAL].update((currentState) => ({
+ ...currentState,
+ ...state,
+ }));
+ const slices = stateKeys.reduce((acc, key) => {
+ const slice = computed(() => store[STATE_SIGNAL]()[key]);
+ return { ...acc, [key]: toDeepSignal(slice) };
+ }, {});
+ const signals = excludeKeys(store.signals, stateKeys);
+ const methods = excludeKeys(store.methods, stateKeys);
+ return {
+ ...store,
+ slices: { ...store.slices, ...slices },
+ signals,
+ methods,
+ };
+ };
+}
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+export { patchState, signalState, signalStore, signalStoreFeature, type, withComputed, withHooks, withMethods, withState };
+//# sourceMappingURL=ngrx-signals.mjs.map
diff --git a/fesm2022/ngrx-signals.mjs.map b/fesm2022/ngrx-signals.mjs.map
new file mode 100644
index 0000000..349162d
--- /dev/null
+++ b/fesm2022/ngrx-signals.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"ngrx-signals.mjs","sources":["../../../../modules/signals/src/deep-signal.ts","../../../../modules/signals/src/signal-state.ts","../../../../modules/signals/src/patch-state.ts","../../../../modules/signals/src/signal-store.ts","../../../../modules/signals/src/signal-store-feature.ts","../../../../modules/signals/src/helpers.ts","../../../../modules/signals/src/with-computed.ts","../../../../modules/signals/src/with-hooks.ts","../../../../modules/signals/src/with-methods.ts","../../../../modules/signals/src/with-state.ts","../../../../modules/signals/ngrx-signals.ts"],"sourcesContent":["import { computed, Signal, untracked } from '@angular/core';\nimport { IsUnknownRecord } from './ts-helpers';\n\nexport type DeepSignal = Signal &\n (T extends Record\n ? IsUnknownRecord extends true\n ? unknown\n : Readonly<{\n [K in keyof T]: T[K] extends Record\n ? IsUnknownRecord extends true\n ? Signal\n : DeepSignal\n : Signal;\n }>\n : unknown);\n\nexport function toDeepSignal(signal: Signal): DeepSignal {\n const value = untracked(() => signal());\n if (!isRecord(value)) {\n return signal as DeepSignal;\n }\n\n return new Proxy(signal, {\n get(target: any, prop) {\n if (!(prop in value)) {\n return target[prop];\n }\n\n if (!target[prop]) {\n target[prop] = computed(() => target()[prop]);\n }\n\n return toDeepSignal(target[prop]);\n },\n });\n}\n\nfunction isRecord(value: unknown): value is Record {\n return value?.constructor === Object;\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { DeepSignal, toDeepSignal } from './deep-signal';\nimport { HasFunctionKeys } from './ts-helpers';\n\nexport const STATE_SIGNAL = Symbol('STATE_SIGNAL');\n\nexport type SignalStateMeta> = {\n [STATE_SIGNAL]: WritableSignal;\n};\n\ntype SignalStateCheck = HasFunctionKeys extends false | undefined\n ? unknown\n : '@ngrx/signals: signal state cannot contain `Function` property or method names';\n\ntype SignalState> = DeepSignal &\n SignalStateMeta;\n\nexport function signalState>(\n initialState: State & SignalStateCheck\n): SignalState {\n const stateSignal = signal(initialState as State);\n const deepSignal = toDeepSignal(stateSignal.asReadonly());\n Object.defineProperty(deepSignal, STATE_SIGNAL, {\n value: stateSignal,\n });\n\n return deepSignal as SignalState;\n}\n","import { STATE_SIGNAL, SignalStateMeta } from './signal-state';\n\nexport type PartialStateUpdater> = (\n state: State\n) => Partial;\n\nexport function patchState>(\n signalState: SignalStateMeta,\n ...updaters: Array | PartialStateUpdater>\n): void {\n signalState[STATE_SIGNAL].update((currentState) =>\n updaters.reduce(\n (nextState: State, updater) => ({\n ...nextState,\n ...(typeof updater === 'function' ? updater(nextState) : updater),\n }),\n currentState\n )\n );\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n Injector,\n runInInjectionContext,\n signal,\n Type,\n} from '@angular/core';\nimport { STATE_SIGNAL } from './signal-state';\nimport {\n EmptyFeatureResult,\n InnerSignalStore,\n MergeFeatureResults,\n SignalStore,\n SignalStoreConfig,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n} from './signal-store-models';\n\nexport function signalStore(\n f1: SignalStoreFeature\n): Type>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult,\n F8 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>,\n f8: SignalStoreFeature, F8>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult,\n F8 extends SignalStoreFeatureResult,\n F9 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>,\n f8: SignalStoreFeature, F8>,\n f9: SignalStoreFeature<\n MergeFeatureResults<[F1, F2, F3, F4, F5, F6, F7, F8]>,\n F9\n >\n): Type>>;\n\nexport function signalStore(\n config: SignalStoreConfig,\n f1: SignalStoreFeature\n): Type>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult,\n F8 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>,\n f8: SignalStoreFeature, F8>\n): Type>>;\nexport function signalStore<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult,\n F7 extends SignalStoreFeatureResult,\n F8 extends SignalStoreFeatureResult,\n F9 extends SignalStoreFeatureResult\n>(\n config: SignalStoreConfig,\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>,\n f7: SignalStoreFeature, F7>,\n f8: SignalStoreFeature, F8>,\n f9: SignalStoreFeature<\n MergeFeatureResults<[F1, F2, F3, F4, F5, F6, F7, F8]>,\n F9\n >\n): Type>>;\n\nexport function signalStore(\n ...args: [SignalStoreConfig, ...SignalStoreFeature[]] | SignalStoreFeature[]\n): Type> {\n const signalStoreArgs = [...args];\n\n const config: Partial =\n 'providedIn' in signalStoreArgs[0]\n ? (signalStoreArgs.shift() as SignalStoreConfig)\n : {};\n const features = signalStoreArgs as SignalStoreFeature[];\n\n @Injectable({ providedIn: config.providedIn || null })\n class SignalStore {\n constructor() {\n const innerStore = features.reduce(\n (store, feature) => feature(store),\n getInitialInnerStore()\n );\n const { slices, signals, methods, hooks } = innerStore;\n const props = { ...slices, ...signals, ...methods };\n\n (this as any)[STATE_SIGNAL] = innerStore[STATE_SIGNAL];\n\n for (const key in props) {\n (this as any)[key] = props[key];\n }\n\n if (hooks.onInit) {\n hooks.onInit();\n }\n\n if (hooks.onDestroy) {\n const injector = inject(Injector);\n\n inject(DestroyRef).onDestroy(() => {\n runInInjectionContext(injector, hooks.onDestroy!);\n });\n }\n }\n }\n\n return SignalStore;\n}\n\nexport function getInitialInnerStore(): InnerSignalStore {\n return {\n [STATE_SIGNAL]: signal({}),\n slices: {},\n signals: {},\n methods: {},\n hooks: {},\n };\n}\n","import {\n EmptyFeatureResult,\n MergeFeatureResults,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n} from './signal-store-models';\nimport { Prettify } from './ts-helpers';\n\nexport function signalStoreFeature(\n f1: SignalStoreFeature\n): SignalStoreFeature;\nexport function signalStoreFeature<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>\n): SignalStoreFeature>;\nexport function signalStoreFeature<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>\n): SignalStoreFeature>;\nexport function signalStoreFeature<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>\n): SignalStoreFeature<\n EmptyFeatureResult,\n MergeFeatureResults<[F1, F2, F3, F4]>\n>;\nexport function signalStoreFeature<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>\n): SignalStoreFeature<\n EmptyFeatureResult,\n MergeFeatureResults<[F1, F2, F3, F4, F5]>\n>;\nexport function signalStoreFeature<\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult\n>(\n f1: SignalStoreFeature,\n f2: SignalStoreFeature<{} & F1, F2>,\n f3: SignalStoreFeature, F3>,\n f4: SignalStoreFeature, F4>,\n f5: SignalStoreFeature, F5>,\n f6: SignalStoreFeature, F6>\n): SignalStoreFeature<\n EmptyFeatureResult,\n MergeFeatureResults<[F1, F2, F3, F4, F5, F6]>\n>;\n\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult\n>(\n input: Input,\n f1: SignalStoreFeature, F1>\n): SignalStoreFeature, F1>;\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult\n>(\n input: Input,\n f1: SignalStoreFeature, F1>,\n f2: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1]>,\n F2\n >\n): SignalStoreFeature<\n Prettify,\n MergeFeatureResults<[F1, F2]>\n>;\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult\n>(\n input: Input,\n f1: SignalStoreFeature, F1>,\n f2: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1]>,\n F2\n >,\n f3: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2]>,\n F3\n >\n): SignalStoreFeature<\n Prettify,\n MergeFeatureResults<[F1, F2, F3]>\n>;\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult\n>(\n Input: Input,\n f1: SignalStoreFeature, F1>,\n f2: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1]>,\n F2\n >,\n f3: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2]>,\n F3\n >,\n f4: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2, F3]>,\n F4\n >\n): SignalStoreFeature<\n Prettify,\n MergeFeatureResults<[F1, F2, F3, F4]>\n>;\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult\n>(\n input: Input,\n f1: SignalStoreFeature, F1>,\n f2: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1]>,\n F2\n >,\n f3: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2]>,\n F3\n >,\n f4: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2, F3]>,\n F4\n >,\n f5: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2, F3, F4]>,\n F5\n >\n): SignalStoreFeature<\n Prettify,\n MergeFeatureResults<[F1, F2, F3, F4, F5]>\n>;\nexport function signalStoreFeature<\n Input extends Partial,\n F1 extends SignalStoreFeatureResult,\n F2 extends SignalStoreFeatureResult,\n F3 extends SignalStoreFeatureResult,\n F4 extends SignalStoreFeatureResult,\n F5 extends SignalStoreFeatureResult,\n F6 extends SignalStoreFeatureResult\n>(\n input: Input,\n f1: SignalStoreFeature, F1>,\n f2: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1]>,\n F2\n >,\n f3: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2]>,\n F3\n >,\n f4: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2, F3]>,\n F4\n >,\n f5: SignalStoreFeature<\n MergeFeatureResults<[Prettify, F1, F2, F3, F4]>,\n F5\n >,\n f6: SignalStoreFeature<\n MergeFeatureResults<\n [Prettify, F1, F2, F3, F4, F5]\n >,\n F6\n >\n): SignalStoreFeature<\n Prettify,\n MergeFeatureResults<[F1, F2, F3, F4, F5, F6]>\n>;\n\nexport function signalStoreFeature(\n featureOrInput: SignalStoreFeature | Partial,\n ...restFeatures: SignalStoreFeature[]\n): SignalStoreFeature {\n const features =\n typeof featureOrInput === 'function'\n ? [featureOrInput, ...restFeatures]\n : restFeatures;\n\n return (inputStore) =>\n features.reduce((store, feature) => feature(store), inputStore);\n}\n\nexport function type(): T {\n return undefined as T;\n}\n","export function excludeKeys<\n Obj extends Record,\n Keys extends string[]\n>(obj: Obj, keys: Keys): Omit {\n return Object.keys(obj).reduce(\n (acc, key) => (keys.includes(key) ? acc : { ...acc, [key]: obj[key] }),\n {}\n ) as Omit;\n}\n","import { excludeKeys } from './helpers';\nimport {\n EmptyFeatureResult,\n InnerSignalStore,\n SignalsDictionary,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n SignalStoreSlices,\n} from './signal-store-models';\nimport { Prettify } from './ts-helpers';\n\nexport function withComputed<\n Input extends SignalStoreFeatureResult,\n Signals extends SignalsDictionary\n>(\n signalsFactory: (\n store: Prettify & Input['signals']>\n ) => Signals\n): SignalStoreFeature {\n return (store) => {\n const signals = signalsFactory({ ...store.slices, ...store.signals });\n const signalsKeys = Object.keys(signals);\n const slices = excludeKeys(store.slices, signalsKeys);\n const methods = excludeKeys(store.methods, signalsKeys);\n\n return {\n ...store,\n slices,\n signals: { ...store.signals, ...signals },\n methods,\n } as InnerSignalStore, Signals>;\n };\n}\n","import { STATE_SIGNAL, SignalStateMeta } from './signal-state';\nimport {\n EmptyFeatureResult,\n SignalStoreFeature,\n SignalStoreSlices,\n SignalStoreFeatureResult,\n} from './signal-store-models';\nimport { Prettify } from './ts-helpers';\n\ntype HooksFactory = (\n store: Prettify<\n SignalStoreSlices &\n Input['signals'] &\n Input['methods'] &\n SignalStateMeta>\n >\n) => void;\n\nexport function withHooks(hooks: {\n onInit?: HooksFactory;\n onDestroy?: HooksFactory;\n}): SignalStoreFeature {\n return (store) => {\n const createHook = (name: keyof typeof hooks) => {\n const hook = hooks[name];\n const currentHook = store.hooks[name];\n\n return hook\n ? () => {\n if (currentHook) {\n currentHook();\n }\n\n hook({\n [STATE_SIGNAL]: store[STATE_SIGNAL],\n ...store.slices,\n ...store.signals,\n ...store.methods,\n });\n }\n : currentHook;\n };\n\n return {\n ...store,\n hooks: {\n onInit: createHook('onInit'),\n onDestroy: createHook('onDestroy'),\n },\n };\n };\n}\n","import { excludeKeys } from './helpers';\nimport { STATE_SIGNAL, SignalStateMeta } from './signal-state';\nimport {\n EmptyFeatureResult,\n InnerSignalStore,\n MethodsDictionary,\n SignalsDictionary,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n SignalStoreSlices,\n} from './signal-store-models';\nimport { Prettify } from './ts-helpers';\n\nexport function withMethods<\n Input extends SignalStoreFeatureResult,\n Methods extends MethodsDictionary\n>(\n methodsFactory: (\n store: Prettify<\n SignalStoreSlices &\n Input['signals'] &\n Input['methods'] &\n SignalStateMeta>\n >\n ) => Methods\n): SignalStoreFeature {\n return (store) => {\n const methods = methodsFactory({\n [STATE_SIGNAL]: store[STATE_SIGNAL],\n ...store.slices,\n ...store.signals,\n ...store.methods,\n });\n const methodsKeys = Object.keys(methods);\n const slices = excludeKeys(store.slices, methodsKeys);\n const signals = excludeKeys(store.signals, methodsKeys);\n\n return {\n ...store,\n slices,\n signals,\n methods: { ...store.methods, ...methods },\n } as InnerSignalStore, SignalsDictionary, Methods>;\n };\n}\n","import { computed } from '@angular/core';\nimport { toDeepSignal } from './deep-signal';\nimport { excludeKeys } from './helpers';\nimport { STATE_SIGNAL } from './signal-state';\nimport {\n EmptyFeatureResult,\n InnerSignalStore,\n SignalsDictionary,\n SignalStoreFeature,\n SignalStoreFeatureResult,\n} from './signal-store-models';\nimport {\n HasNestedFunctionKeys,\n HasOptionalProps,\n IsUnknownRecord,\n} from './ts-helpers';\n\ntype WithStateCheck = IsUnknownRecord extends true\n ? '@ngrx/signals: root state keys must be string literals'\n : HasOptionalProps extends true\n ? '@ngrx/signals: root state slices cannot be optional'\n : HasNestedFunctionKeys extends false | undefined\n ? unknown\n : '@ngrx/signals: nested state slices cannot contain `Function` property or method names';\n\nexport function withState>(\n state: State & WithStateCheck\n): SignalStoreFeature<\n EmptyFeatureResult,\n EmptyFeatureResult & { state: State }\n>;\nexport function withState>(\n stateFactory: () => State & WithStateCheck\n): SignalStoreFeature<\n EmptyFeatureResult,\n EmptyFeatureResult & { state: State }\n>;\nexport function withState>(\n stateOrFactory: State | (() => State)\n): SignalStoreFeature<\n SignalStoreFeatureResult,\n EmptyFeatureResult & { state: State }\n> {\n return (store) => {\n const state =\n typeof stateOrFactory === 'function' ? stateOrFactory() : stateOrFactory;\n const stateKeys = Object.keys(state);\n\n store[STATE_SIGNAL].update((currentState) => ({\n ...currentState,\n ...state,\n }));\n\n const slices = stateKeys.reduce((acc, key) => {\n const slice = computed(() => store[STATE_SIGNAL]()[key]);\n return { ...acc, [key]: toDeepSignal(slice) };\n }, {} as SignalsDictionary);\n const signals = excludeKeys(store.signals, stateKeys);\n const methods = excludeKeys(store.methods, stateKeys);\n\n return {\n ...store,\n slices: { ...store.slices, ...slices },\n signals,\n methods,\n } as InnerSignalStore;\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/index.d.ts b/index.d.ts
new file mode 100644
index 0000000..cba1843
--- /dev/null
+++ b/index.d.ts
@@ -0,0 +1 @@
+export * from './src/index';
diff --git a/migrations/migration.json b/migrations/migration.json
new file mode 100644
index 0000000..00b46c7
--- /dev/null
+++ b/migrations/migration.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json",
+ "schematics": {}
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..aabad59
--- /dev/null
+++ b/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "@ngrx/signals",
+ "version": "17.0.0-beta.0",
+ "description": "Reactive State Management with Angular Signals",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ngrx/platform.git"
+ },
+ "keywords": [
+ "Angular",
+ "NgRx",
+ "Signals",
+ "Signal Store",
+ "Signal State",
+ "State Management"
+ ],
+ "author": "NgRx",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ngrx/platform/issues"
+ },
+ "homepage": "https://github.com/ngrx/platform#readme",
+ "peerDependencies": {
+ "@angular/core": "^17.0.0-rc.0",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ },
+ "peerDependenciesMeta": {
+ "rxjs": {
+ "optional": true
+ }
+ },
+ "schematics": "./schematics/collection.json",
+ "sideEffects": false,
+ "ng-update": {
+ "packageGroup": [
+ "@ngrx/store",
+ "@ngrx/effects",
+ "@ngrx/entity",
+ "@ngrx/router-store",
+ "@ngrx/data",
+ "@ngrx/schematics",
+ "@ngrx/store-devtools",
+ "@ngrx/component-store",
+ "@ngrx/component",
+ "@ngrx/eslint-plugin",
+ "@ngrx/signals"
+ ],
+ "migrations": "./migrations/migration.json"
+ },
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "module": "fesm2022/ngrx-signals.mjs",
+ "typings": "index.d.ts",
+ "exports": {
+ "./package.json": {
+ "default": "./package.json"
+ },
+ ".": {
+ "types": "./index.d.ts",
+ "esm2022": "./esm2022/ngrx-signals.mjs",
+ "esm": "./esm2022/ngrx-signals.mjs",
+ "default": "./fesm2022/ngrx-signals.mjs"
+ },
+ "./rxjs-interop": {
+ "types": "./rxjs-interop/index.d.ts",
+ "esm2022": "./esm2022/rxjs-interop/ngrx-signals-rxjs-interop.mjs",
+ "esm": "./esm2022/rxjs-interop/ngrx-signals-rxjs-interop.mjs",
+ "default": "./fesm2022/ngrx-signals-rxjs-interop.mjs"
+ }
+ }
+}
\ No newline at end of file
diff --git a/rxjs-interop/index.d.ts b/rxjs-interop/index.d.ts
new file mode 100644
index 0000000..cba1843
--- /dev/null
+++ b/rxjs-interop/index.d.ts
@@ -0,0 +1 @@
+export * from './src/index';
diff --git a/rxjs-interop/src/index.d.ts b/rxjs-interop/src/index.d.ts
new file mode 100644
index 0000000..4feadb4
--- /dev/null
+++ b/rxjs-interop/src/index.d.ts
@@ -0,0 +1 @@
+export { rxMethod } from './rx-method';
diff --git a/rxjs-interop/src/rx-method.d.ts b/rxjs-interop/src/rx-method.d.ts
new file mode 100644
index 0000000..2d047b8
--- /dev/null
+++ b/rxjs-interop/src/rx-method.d.ts
@@ -0,0 +1,8 @@
+import { Injector, Signal } from '@angular/core';
+import { Observable, Unsubscribable } from 'rxjs';
+type RxMethodInput = Input | Observable | Signal;
+type RxMethod = ((input: RxMethodInput) => Unsubscribable) & Unsubscribable;
+export declare function rxMethod(generator: (source$: Observable) => Observable, config?: {
+ injector?: Injector;
+}): RxMethod;
+export {};
diff --git a/schematics-core/index.js b/schematics-core/index.js
new file mode 100644
index 0000000..53c114a
--- /dev/null
+++ b/schematics-core/index.js
@@ -0,0 +1,77 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.visitTemplates = exports.visitNgModules = exports.visitDecorator = exports.visitComponents = exports.visitNgModuleExports = exports.visitNgModuleImports = exports.visitTSSourceFiles = exports.platformVersion = exports.addPackageToPackageJson = exports.parseName = exports.updatePackage = exports.stringUtils = exports.isLib = exports.getProject = exports.getProjectPath = exports.getPrefix = exports.omit = exports.addReducerToActionReducerMap = exports.addReducerImportToNgModule = exports.addReducerToStateInterface = exports.addReducerToState = exports.findPropertyInAstObject = exports.buildRelativePath = exports.findModuleFromOptions = exports.findModule = exports.findComponentFromOptions = exports.getWorkspacePath = exports.getWorkspace = exports.commitChanges = exports.createChangeRecorder = exports.createReplaceChange = exports.ReplaceChange = exports.RemoveChange = exports.InsertChange = exports.NoopChange = exports.containsProperty = exports.replaceImport = exports.addProviderToModule = exports.addProviderToComponent = exports.addImportToModule = exports.addExportToModule = exports.addDeclarationToModule = exports.addBootstrapToModule = exports.insertImport = exports.insertAfterLastOccurrence = exports.getContentOfKeyLiteral = exports.getDecoratorMetadata = exports.getSourceNodes = exports.findNodes = void 0;
+var strings_1 = require("./utility/strings");
+var ast_utils_1 = require("./utility/ast-utils");
+Object.defineProperty(exports, "findNodes", { enumerable: true, get: function () { return ast_utils_1.findNodes; } });
+Object.defineProperty(exports, "getSourceNodes", { enumerable: true, get: function () { return ast_utils_1.getSourceNodes; } });
+Object.defineProperty(exports, "getDecoratorMetadata", { enumerable: true, get: function () { return ast_utils_1.getDecoratorMetadata; } });
+Object.defineProperty(exports, "getContentOfKeyLiteral", { enumerable: true, get: function () { return ast_utils_1.getContentOfKeyLiteral; } });
+Object.defineProperty(exports, "insertAfterLastOccurrence", { enumerable: true, get: function () { return ast_utils_1.insertAfterLastOccurrence; } });
+Object.defineProperty(exports, "insertImport", { enumerable: true, get: function () { return ast_utils_1.insertImport; } });
+Object.defineProperty(exports, "addBootstrapToModule", { enumerable: true, get: function () { return ast_utils_1.addBootstrapToModule; } });
+Object.defineProperty(exports, "addDeclarationToModule", { enumerable: true, get: function () { return ast_utils_1.addDeclarationToModule; } });
+Object.defineProperty(exports, "addExportToModule", { enumerable: true, get: function () { return ast_utils_1.addExportToModule; } });
+Object.defineProperty(exports, "addImportToModule", { enumerable: true, get: function () { return ast_utils_1.addImportToModule; } });
+Object.defineProperty(exports, "addProviderToComponent", { enumerable: true, get: function () { return ast_utils_1.addProviderToComponent; } });
+Object.defineProperty(exports, "addProviderToModule", { enumerable: true, get: function () { return ast_utils_1.addProviderToModule; } });
+Object.defineProperty(exports, "replaceImport", { enumerable: true, get: function () { return ast_utils_1.replaceImport; } });
+Object.defineProperty(exports, "containsProperty", { enumerable: true, get: function () { return ast_utils_1.containsProperty; } });
+var change_1 = require("./utility/change");
+Object.defineProperty(exports, "NoopChange", { enumerable: true, get: function () { return change_1.NoopChange; } });
+Object.defineProperty(exports, "InsertChange", { enumerable: true, get: function () { return change_1.InsertChange; } });
+Object.defineProperty(exports, "RemoveChange", { enumerable: true, get: function () { return change_1.RemoveChange; } });
+Object.defineProperty(exports, "ReplaceChange", { enumerable: true, get: function () { return change_1.ReplaceChange; } });
+Object.defineProperty(exports, "createReplaceChange", { enumerable: true, get: function () { return change_1.createReplaceChange; } });
+Object.defineProperty(exports, "createChangeRecorder", { enumerable: true, get: function () { return change_1.createChangeRecorder; } });
+Object.defineProperty(exports, "commitChanges", { enumerable: true, get: function () { return change_1.commitChanges; } });
+var config_1 = require("./utility/config");
+Object.defineProperty(exports, "getWorkspace", { enumerable: true, get: function () { return config_1.getWorkspace; } });
+Object.defineProperty(exports, "getWorkspacePath", { enumerable: true, get: function () { return config_1.getWorkspacePath; } });
+var find_component_1 = require("./utility/find-component");
+Object.defineProperty(exports, "findComponentFromOptions", { enumerable: true, get: function () { return find_component_1.findComponentFromOptions; } });
+var find_module_1 = require("./utility/find-module");
+Object.defineProperty(exports, "findModule", { enumerable: true, get: function () { return find_module_1.findModule; } });
+Object.defineProperty(exports, "findModuleFromOptions", { enumerable: true, get: function () { return find_module_1.findModuleFromOptions; } });
+Object.defineProperty(exports, "buildRelativePath", { enumerable: true, get: function () { return find_module_1.buildRelativePath; } });
+var json_utilts_1 = require("./utility/json-utilts");
+Object.defineProperty(exports, "findPropertyInAstObject", { enumerable: true, get: function () { return json_utilts_1.findPropertyInAstObject; } });
+var ngrx_utils_1 = require("./utility/ngrx-utils");
+Object.defineProperty(exports, "addReducerToState", { enumerable: true, get: function () { return ngrx_utils_1.addReducerToState; } });
+Object.defineProperty(exports, "addReducerToStateInterface", { enumerable: true, get: function () { return ngrx_utils_1.addReducerToStateInterface; } });
+Object.defineProperty(exports, "addReducerImportToNgModule", { enumerable: true, get: function () { return ngrx_utils_1.addReducerImportToNgModule; } });
+Object.defineProperty(exports, "addReducerToActionReducerMap", { enumerable: true, get: function () { return ngrx_utils_1.addReducerToActionReducerMap; } });
+Object.defineProperty(exports, "omit", { enumerable: true, get: function () { return ngrx_utils_1.omit; } });
+Object.defineProperty(exports, "getPrefix", { enumerable: true, get: function () { return ngrx_utils_1.getPrefix; } });
+var project_1 = require("./utility/project");
+Object.defineProperty(exports, "getProjectPath", { enumerable: true, get: function () { return project_1.getProjectPath; } });
+Object.defineProperty(exports, "getProject", { enumerable: true, get: function () { return project_1.getProject; } });
+Object.defineProperty(exports, "isLib", { enumerable: true, get: function () { return project_1.isLib; } });
+exports.stringUtils = {
+ dasherize: strings_1.dasherize,
+ decamelize: strings_1.decamelize,
+ camelize: strings_1.camelize,
+ classify: strings_1.classify,
+ underscore: strings_1.underscore,
+ group: strings_1.group,
+ capitalize: strings_1.capitalize,
+ featurePath: strings_1.featurePath,
+ pluralize: strings_1.pluralize,
+};
+var update_1 = require("./utility/update");
+Object.defineProperty(exports, "updatePackage", { enumerable: true, get: function () { return update_1.updatePackage; } });
+var parse_name_1 = require("./utility/parse-name");
+Object.defineProperty(exports, "parseName", { enumerable: true, get: function () { return parse_name_1.parseName; } });
+var package_1 = require("./utility/package");
+Object.defineProperty(exports, "addPackageToPackageJson", { enumerable: true, get: function () { return package_1.addPackageToPackageJson; } });
+var libs_version_1 = require("./utility/libs-version");
+Object.defineProperty(exports, "platformVersion", { enumerable: true, get: function () { return libs_version_1.platformVersion; } });
+var visitors_1 = require("./utility/visitors");
+Object.defineProperty(exports, "visitTSSourceFiles", { enumerable: true, get: function () { return visitors_1.visitTSSourceFiles; } });
+Object.defineProperty(exports, "visitNgModuleImports", { enumerable: true, get: function () { return visitors_1.visitNgModuleImports; } });
+Object.defineProperty(exports, "visitNgModuleExports", { enumerable: true, get: function () { return visitors_1.visitNgModuleExports; } });
+Object.defineProperty(exports, "visitComponents", { enumerable: true, get: function () { return visitors_1.visitComponents; } });
+Object.defineProperty(exports, "visitDecorator", { enumerable: true, get: function () { return visitors_1.visitDecorator; } });
+Object.defineProperty(exports, "visitNgModules", { enumerable: true, get: function () { return visitors_1.visitNgModules; } });
+Object.defineProperty(exports, "visitTemplates", { enumerable: true, get: function () { return visitors_1.visitTemplates; } });
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/schematics-core/index.js.map b/schematics-core/index.js.map
new file mode 100644
index 0000000..e2ddc33
--- /dev/null
+++ b/schematics-core/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../modules/signals/schematics-core/index.ts"],"names":[],"mappings":";;;AAAA,6CAU2B;AAE3B,iDAe6B;AAd3B,sGAAA,SAAS,OAAA;AACT,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AACpB,mHAAA,sBAAsB,OAAA;AACtB,sHAAA,yBAAyB,OAAA;AACzB,yGAAA,YAAY,OAAA;AACZ,iHAAA,oBAAoB,OAAA;AACpB,mHAAA,sBAAsB,OAAA;AACtB,8GAAA,iBAAiB,OAAA;AACjB,8GAAA,iBAAiB,OAAA;AACjB,mHAAA,sBAAsB,OAAA;AACtB,gHAAA,mBAAmB,OAAA;AACnB,0GAAA,aAAa,OAAA;AACb,6GAAA,gBAAgB,OAAA;AAGlB,2CAU0B;AAPxB,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,sGAAA,YAAY,OAAA;AACZ,uGAAA,aAAa,OAAA;AACb,6GAAA,mBAAmB,OAAA;AACnB,8GAAA,oBAAoB,OAAA;AACpB,uGAAA,aAAa,OAAA;AAGf,2CAA6E;AAAzD,sGAAA,YAAY,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAElD,2DAAoE;AAA3D,0HAAA,wBAAwB,OAAA;AAEjC,qDAK+B;AAJ7B,yGAAA,UAAU,OAAA;AACV,oHAAA,qBAAqB,OAAA;AACrB,gHAAA,iBAAiB,OAAA;AAInB,qDAAgE;AAAvD,sHAAA,uBAAuB,OAAA;AAEhC,mDAO8B;AAN5B,+GAAA,iBAAiB,OAAA;AACjB,wHAAA,0BAA0B,OAAA;AAC1B,wHAAA,0BAA0B,OAAA;AAC1B,0HAAA,4BAA4B,OAAA;AAC5B,kGAAA,IAAI,OAAA;AACJ,uGAAA,SAAS,OAAA;AAGX,6CAAsE;AAA7D,yGAAA,cAAc,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,gGAAA,KAAK,OAAA;AAE7B,QAAA,WAAW,GAAG;IACzB,SAAS,qBAAA;IACT,UAAU,sBAAA;IACV,QAAQ,oBAAA;IACR,QAAQ,oBAAA;IACR,UAAU,sBAAA;IACV,KAAK,iBAAA;IACL,UAAU,sBAAA;IACV,WAAW,uBAAA;IACX,SAAS,qBAAA;CACV,CAAC;AAEF,2CAAiD;AAAxC,uGAAA,aAAa,OAAA;AAEtB,mDAAiD;AAAxC,uGAAA,SAAS,OAAA;AAElB,6CAA4D;AAAnD,kHAAA,uBAAuB,OAAA;AAEhC,uDAAyD;AAAhD,+GAAA,eAAe,OAAA;AAExB,+CAQ4B;AAP1B,8GAAA,kBAAkB,OAAA;AAClB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,2GAAA,eAAe,OAAA;AACf,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA","sourcesContent":["import {\n dasherize,\n decamelize,\n camelize,\n classify,\n underscore,\n group,\n capitalize,\n featurePath,\n pluralize,\n} from './utility/strings';\n\nexport {\n findNodes,\n getSourceNodes,\n getDecoratorMetadata,\n getContentOfKeyLiteral,\n insertAfterLastOccurrence,\n insertImport,\n addBootstrapToModule,\n addDeclarationToModule,\n addExportToModule,\n addImportToModule,\n addProviderToComponent,\n addProviderToModule,\n replaceImport,\n containsProperty,\n} from './utility/ast-utils';\n\nexport {\n Host,\n Change,\n NoopChange,\n InsertChange,\n RemoveChange,\n ReplaceChange,\n createReplaceChange,\n createChangeRecorder,\n commitChanges,\n} from './utility/change';\n\nexport { AppConfig, getWorkspace, getWorkspacePath } from './utility/config';\n\nexport { findComponentFromOptions } from './utility/find-component';\n\nexport {\n findModule,\n findModuleFromOptions,\n buildRelativePath,\n ModuleOptions,\n} from './utility/find-module';\n\nexport { findPropertyInAstObject } from './utility/json-utilts';\n\nexport {\n addReducerToState,\n addReducerToStateInterface,\n addReducerImportToNgModule,\n addReducerToActionReducerMap,\n omit,\n getPrefix,\n} from './utility/ngrx-utils';\n\nexport { getProjectPath, getProject, isLib } from './utility/project';\n\nexport const stringUtils = {\n dasherize,\n decamelize,\n camelize,\n classify,\n underscore,\n group,\n capitalize,\n featurePath,\n pluralize,\n};\n\nexport { updatePackage } from './utility/update';\n\nexport { parseName } from './utility/parse-name';\n\nexport { addPackageToPackageJson } from './utility/package';\n\nexport { platformVersion } from './utility/libs-version';\n\nexport {\n visitTSSourceFiles,\n visitNgModuleImports,\n visitNgModuleExports,\n visitComponents,\n visitDecorator,\n visitNgModules,\n visitTemplates,\n} from './utility/visitors';\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/ast-utils.js b/schematics-core/utility/ast-utils.js
new file mode 100644
index 0000000..9ba497c
--- /dev/null
+++ b/schematics-core/utility/ast-utils.js
@@ -0,0 +1,705 @@
+"use strict";
+var __values = (this && this.__values) || function(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+};
+var __read = (this && this.__read) || function (o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+};
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.containsProperty = exports.replaceImport = exports.insertImport = exports.addBootstrapToModule = exports.addExportToModule = exports.addProviderToComponent = exports.addProviderToModule = exports.addImportToModule = exports.addDeclarationToModule = exports.getDecoratorMetadata = exports.getContentOfKeyLiteral = exports.insertAfterLastOccurrence = exports.getSourceNodes = exports.findNodes = void 0;
+/* istanbul ignore file */
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var ts = require("typescript");
+var change_1 = require("./change");
+/**
+ * Find all nodes from the AST in the subtree of node of SyntaxKind kind.
+ * @param node
+ * @param kind
+ * @param max The maximum number of items to return.
+ * @return all nodes of kind, or [] if none is found
+ */
+function findNodes(node, kind, max) {
+ var e_1, _a;
+ if (max === void 0) { max = Infinity; }
+ if (!node || max == 0) {
+ return [];
+ }
+ var arr = [];
+ if (node.kind === kind) {
+ arr.push(node);
+ max--;
+ }
+ if (max > 0) {
+ try {
+ for (var _b = __values(node.getChildren()), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var child = _c.value;
+ findNodes(child, kind, max).forEach(function (node) {
+ if (max > 0) {
+ arr.push(node);
+ }
+ max--;
+ });
+ if (max <= 0) {
+ break;
+ }
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ }
+ return arr;
+}
+exports.findNodes = findNodes;
+/**
+ * Get all the nodes from a source.
+ * @param sourceFile The source file object.
+ * @returns {Observable} An observable of all the nodes in the source.
+ */
+function getSourceNodes(sourceFile) {
+ var nodes = [sourceFile];
+ var result = [];
+ while (nodes.length > 0) {
+ var node = nodes.shift();
+ if (node) {
+ result.push(node);
+ if (node.getChildCount(sourceFile) >= 0) {
+ nodes.unshift.apply(nodes, __spreadArray([], __read(node.getChildren()), false));
+ }
+ }
+ }
+ return result;
+}
+exports.getSourceNodes = getSourceNodes;
+/**
+ * Helper for sorting nodes.
+ * @return function to sort nodes in increasing order of position in sourceFile
+ */
+function nodesByPosition(first, second) {
+ return first.pos - second.pos;
+}
+/**
+ * Insert `toInsert` after the last occurence of `ts.SyntaxKind[nodes[i].kind]`
+ * or after the last of occurence of `syntaxKind` if the last occurence is a sub child
+ * of ts.SyntaxKind[nodes[i].kind] and save the changes in file.
+ *
+ * @param nodes insert after the last occurence of nodes
+ * @param toInsert string to insert
+ * @param file file to insert changes into
+ * @param fallbackPos position to insert if toInsert happens to be the first occurence
+ * @param syntaxKind the ts.SyntaxKind of the subchildren to insert after
+ * @return Change instance
+ * @throw Error if toInsert is first occurence but fall back is not set
+ */
+function insertAfterLastOccurrence(nodes, toInsert, file, fallbackPos, syntaxKind) {
+ var lastItem = nodes.sort(nodesByPosition).pop();
+ if (!lastItem) {
+ throw new Error();
+ }
+ if (syntaxKind) {
+ lastItem = findNodes(lastItem, syntaxKind).sort(nodesByPosition).pop();
+ }
+ if (!lastItem && fallbackPos == undefined) {
+ throw new Error("tried to insert ".concat(toInsert, " as first occurence with no fallback position"));
+ }
+ var lastItemPosition = lastItem ? lastItem.end : fallbackPos;
+ return new change_1.InsertChange(file, lastItemPosition, toInsert);
+}
+exports.insertAfterLastOccurrence = insertAfterLastOccurrence;
+function getContentOfKeyLiteral(_source, node) {
+ if (node.kind == ts.SyntaxKind.Identifier) {
+ return node.text;
+ }
+ else if (node.kind == ts.SyntaxKind.StringLiteral) {
+ return node.text;
+ }
+ else {
+ return null;
+ }
+}
+exports.getContentOfKeyLiteral = getContentOfKeyLiteral;
+function _angularImportsFromNode(node, _sourceFile) {
+ var _a;
+ var ms = node.moduleSpecifier;
+ var modulePath;
+ switch (ms.kind) {
+ case ts.SyntaxKind.StringLiteral:
+ modulePath = ms.text;
+ break;
+ default:
+ return {};
+ }
+ if (!modulePath.startsWith('@angular/')) {
+ return {};
+ }
+ if (node.importClause) {
+ if (node.importClause.name) {
+ // This is of the form `import Name from 'path'`. Ignore.
+ return {};
+ }
+ else if (node.importClause.namedBindings) {
+ var nb = node.importClause.namedBindings;
+ if (nb.kind == ts.SyntaxKind.NamespaceImport) {
+ // This is of the form `import * as name from 'path'`. Return `name.`.
+ return _a = {},
+ _a[nb.name.text + '.'] = modulePath,
+ _a;
+ }
+ else {
+ // This is of the form `import {a,b,c} from 'path'`
+ var namedImports = nb;
+ return namedImports.elements
+ .map(function (is) {
+ return is.propertyName ? is.propertyName.text : is.name.text;
+ })
+ .reduce(function (acc, curr) {
+ acc[curr] = modulePath;
+ return acc;
+ }, {});
+ }
+ }
+ return {};
+ }
+ else {
+ // This is of the form `import 'path';`. Nothing to do.
+ return {};
+ }
+}
+function getDecoratorMetadata(source, identifier, module) {
+ var angularImports = findNodes(source, ts.SyntaxKind.ImportDeclaration)
+ .map(function (node) {
+ return _angularImportsFromNode(node, source);
+ })
+ .reduce(function (acc, current) {
+ var e_2, _a;
+ try {
+ for (var _b = __values(Object.keys(current)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var key = _c.value;
+ acc[key] = current[key];
+ }
+ }
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_2) throw e_2.error; }
+ }
+ return acc;
+ }, {});
+ return getSourceNodes(source)
+ .filter(function (node) {
+ return (node.kind == ts.SyntaxKind.Decorator &&
+ node.expression.kind == ts.SyntaxKind.CallExpression);
+ })
+ .map(function (node) { return node.expression; })
+ .filter(function (expr) {
+ if (expr.expression.kind == ts.SyntaxKind.Identifier) {
+ var id = expr.expression;
+ return (id.getFullText(source) == identifier &&
+ angularImports[id.getFullText(source)] === module);
+ }
+ else if (expr.expression.kind == ts.SyntaxKind.PropertyAccessExpression) {
+ // This covers foo.NgModule when importing * as foo.
+ var paExpr = expr.expression;
+ // If the left expression is not an identifier, just give up at that point.
+ if (paExpr.expression.kind !== ts.SyntaxKind.Identifier) {
+ return false;
+ }
+ var id = paExpr.name.text;
+ var moduleId = paExpr.expression.getText(source);
+ return id === identifier && angularImports[moduleId + '.'] === module;
+ }
+ return false;
+ })
+ .filter(function (expr) {
+ return expr.arguments[0] &&
+ expr.arguments[0].kind == ts.SyntaxKind.ObjectLiteralExpression;
+ })
+ .map(function (expr) { return expr.arguments[0]; });
+}
+exports.getDecoratorMetadata = getDecoratorMetadata;
+function _addSymbolToNgModuleMetadata(source, ngModulePath, metadataField, symbolName, importPath) {
+ var nodes = getDecoratorMetadata(source, 'NgModule', '@angular/core');
+ var node = nodes[0]; // eslint-disable-line @typescript-eslint/no-explicit-any
+ // Find the decorator declaration.
+ if (!node) {
+ return [];
+ }
+ // Get all the children property assignment of object literals.
+ var matchingProperties = node.properties
+ .filter(function (prop) { return prop.kind == ts.SyntaxKind.PropertyAssignment; })
+ // Filter out every fields that's not "metadataField". Also handles string literals
+ // (but not expressions).
+ .filter(function (prop) {
+ var name = prop.name;
+ switch (name.kind) {
+ case ts.SyntaxKind.Identifier:
+ return name.getText(source) == metadataField;
+ case ts.SyntaxKind.StringLiteral:
+ return name.text == metadataField;
+ }
+ return false;
+ });
+ // Get the last node of the array literal.
+ if (!matchingProperties) {
+ return [];
+ }
+ if (matchingProperties.length == 0) {
+ // We haven't found the field in the metadata declaration. Insert a new field.
+ var expr = node;
+ var position_1;
+ var toInsert_1;
+ if (expr.properties.length == 0) {
+ position_1 = expr.getEnd() - 1;
+ toInsert_1 = " ".concat(metadataField, ": [").concat(symbolName, "]\n");
+ }
+ else {
+ node = expr.properties[expr.properties.length - 1];
+ position_1 = node.getEnd();
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ var matches = text.match(/^\r?\n\s*/);
+ if (matches.length > 0) {
+ toInsert_1 = ",".concat(matches[0]).concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ else {
+ toInsert_1 = ", ".concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ }
+ var newMetadataProperty = new change_1.InsertChange(ngModulePath, position_1, toInsert_1);
+ var newMetadataImport = insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath);
+ return [newMetadataProperty, newMetadataImport];
+ }
+ var assignment = matchingProperties[0];
+ // If it's not an array, nothing we can do really.
+ if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {
+ return [];
+ }
+ var arrLiteral = assignment.initializer;
+ if (arrLiteral.elements.length == 0) {
+ // Forward the property.
+ node = arrLiteral;
+ }
+ else {
+ node = arrLiteral.elements;
+ }
+ if (!node) {
+ console.log('No app module found. Please add your new class to your component.');
+ return [];
+ }
+ if (Array.isArray(node)) {
+ var nodeArray = node;
+ var symbolsArray = nodeArray.map(function (node) { return node.getText(); });
+ if (symbolsArray.includes(symbolName)) {
+ return [];
+ }
+ node = node[node.length - 1];
+ var effectsModule = nodeArray.find(function (node) {
+ return (node.getText().includes('EffectsModule.forRoot') &&
+ symbolName.includes('EffectsModule.forRoot')) ||
+ (node.getText().includes('EffectsModule.forFeature') &&
+ symbolName.includes('EffectsModule.forFeature'));
+ });
+ if (effectsModule && symbolName.includes('EffectsModule')) {
+ var effectsArgs = effectsModule.arguments.shift();
+ if (effectsArgs &&
+ effectsArgs.kind === ts.SyntaxKind.ArrayLiteralExpression) {
+ var effectsElements = effectsArgs
+ .elements;
+ var _a = __read(symbolName.match(/\[(.*)\]/), 2), effectsSymbol = _a[1];
+ var epos = void 0;
+ if (effectsElements.length === 0) {
+ epos = effectsArgs.getStart() + 1;
+ return [new change_1.InsertChange(ngModulePath, epos, effectsSymbol)];
+ }
+ else {
+ var lastEffect = effectsElements[effectsElements.length - 1];
+ epos = lastEffect.getEnd();
+ // Get the indentation of the last element, if any.
+ var text = lastEffect.getFullText(source);
+ var effectInsert = void 0;
+ if (text.match('^\r?\r?\n')) {
+ effectInsert = ",".concat(text.match(/^\r?\n\s+/)[0]).concat(effectsSymbol);
+ }
+ else {
+ effectInsert = ", ".concat(effectsSymbol);
+ }
+ return [new change_1.InsertChange(ngModulePath, epos, effectInsert)];
+ }
+ }
+ else {
+ return [];
+ }
+ }
+ }
+ var toInsert;
+ var position = node.getEnd();
+ if (node.kind == ts.SyntaxKind.ObjectLiteralExpression) {
+ // We haven't found the field in the metadata declaration. Insert a new
+ // field.
+ var expr = node;
+ if (expr.properties.length == 0) {
+ position = expr.getEnd() - 1;
+ toInsert = " ".concat(metadataField, ": [").concat(symbolName, "]\n");
+ }
+ else {
+ node = expr.properties[expr.properties.length - 1];
+ position = node.getEnd();
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ if (text.match('^\r?\r?\n')) {
+ toInsert = ",".concat(text.match(/^\r?\n\s+/)[0]).concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ else {
+ toInsert = ", ".concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ }
+ }
+ else if (node.kind == ts.SyntaxKind.ArrayLiteralExpression) {
+ // We found the field but it's empty. Insert it just before the `]`.
+ position--;
+ toInsert = "".concat(symbolName);
+ }
+ else {
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ if (text.match(/^\r?\n/)) {
+ toInsert = ",".concat(text.match(/^\r?\n(\r?)\s+/)[0]).concat(symbolName);
+ }
+ else {
+ toInsert = ", ".concat(symbolName);
+ }
+ }
+ var insert = new change_1.InsertChange(ngModulePath, position, toInsert);
+ var importInsert = insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath);
+ return [insert, importInsert];
+}
+function _addSymbolToComponentMetadata(source, componentPath, metadataField, symbolName, importPath) {
+ var nodes = getDecoratorMetadata(source, 'Component', '@angular/core');
+ var node = nodes[0]; // eslint-disable-line @typescript-eslint/no-explicit-any
+ // Find the decorator declaration.
+ if (!node) {
+ return [];
+ }
+ // Get all the children property assignment of object literals.
+ var matchingProperties = node.properties
+ .filter(function (prop) { return prop.kind == ts.SyntaxKind.PropertyAssignment; })
+ // Filter out every fields that's not "metadataField". Also handles string literals
+ // (but not expressions).
+ .filter(function (prop) {
+ var name = prop.name;
+ switch (name.kind) {
+ case ts.SyntaxKind.Identifier:
+ return name.getText(source) == metadataField;
+ case ts.SyntaxKind.StringLiteral:
+ return name.text == metadataField;
+ }
+ return false;
+ });
+ // Get the last node of the array literal.
+ if (!matchingProperties) {
+ return [];
+ }
+ if (matchingProperties.length == 0) {
+ // We haven't found the field in the metadata declaration. Insert a new field.
+ var expr = node;
+ var position_2;
+ var toInsert_2;
+ if (expr.properties.length == 0) {
+ position_2 = expr.getEnd() - 1;
+ toInsert_2 = " ".concat(metadataField, ": [").concat(symbolName, "]\n");
+ }
+ else {
+ node = expr.properties[expr.properties.length - 1];
+ position_2 = node.getEnd();
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ var matches = text.match(/^\r?\n\s*/);
+ if (matches.length > 0) {
+ toInsert_2 = ",".concat(matches[0]).concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ else {
+ toInsert_2 = ", ".concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ }
+ var newMetadataProperty = new change_1.InsertChange(componentPath, position_2, toInsert_2);
+ var newMetadataImport = insertImport(source, componentPath, symbolName.replace(/\..*$/, ''), importPath);
+ return [newMetadataProperty, newMetadataImport];
+ }
+ var assignment = matchingProperties[0];
+ // If it's not an array, nothing we can do really.
+ if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {
+ return [];
+ }
+ var arrLiteral = assignment.initializer;
+ if (arrLiteral.elements.length == 0) {
+ // Forward the property.
+ node = arrLiteral;
+ }
+ else {
+ node = arrLiteral.elements;
+ }
+ if (!node) {
+ console.log('No component found. Please add your new class to your component.');
+ return [];
+ }
+ if (Array.isArray(node)) {
+ var nodeArray = node;
+ var symbolsArray = nodeArray.map(function (node) { return node.getText(); });
+ if (symbolsArray.includes(symbolName)) {
+ return [];
+ }
+ node = node[node.length - 1];
+ }
+ var toInsert;
+ var position = node.getEnd();
+ if (node.kind == ts.SyntaxKind.ObjectLiteralExpression) {
+ // We haven't found the field in the metadata declaration. Insert a new
+ // field.
+ var expr = node;
+ if (expr.properties.length == 0) {
+ position = expr.getEnd() - 1;
+ toInsert = " ".concat(metadataField, ": [").concat(symbolName, "]\n");
+ }
+ else {
+ node = expr.properties[expr.properties.length - 1];
+ position = node.getEnd();
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ if (text.match('^\r?\r?\n')) {
+ toInsert = ",".concat(text.match(/^\r?\n\s+/)[0]).concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ else {
+ toInsert = ", ".concat(metadataField, ": [").concat(symbolName, "]");
+ }
+ }
+ }
+ else if (node.kind == ts.SyntaxKind.ArrayLiteralExpression) {
+ // We found the field but it's empty. Insert it just before the `]`.
+ position--;
+ toInsert = "".concat(symbolName);
+ }
+ else {
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ if (text.match(/^\r?\n/)) {
+ toInsert = ",".concat(text.match(/^\r?\n(\r?)\s+/)[0]).concat(symbolName);
+ }
+ else {
+ toInsert = ", ".concat(symbolName);
+ }
+ }
+ var insert = new change_1.InsertChange(componentPath, position, toInsert);
+ var importInsert = insertImport(source, componentPath, symbolName.replace(/\..*$/, ''), importPath);
+ return [insert, importInsert];
+}
+/**
+ * Custom function to insert a declaration (component, pipe, directive)
+ * into NgModule declarations. It also imports the component.
+ */
+function addDeclarationToModule(source, modulePath, classifiedName, importPath) {
+ return _addSymbolToNgModuleMetadata(source, modulePath, 'declarations', classifiedName, importPath);
+}
+exports.addDeclarationToModule = addDeclarationToModule;
+/**
+ * Custom function to insert a declaration (component, pipe, directive)
+ * into NgModule declarations. It also imports the component.
+ */
+function addImportToModule(source, modulePath, classifiedName, importPath) {
+ return _addSymbolToNgModuleMetadata(source, modulePath, 'imports', classifiedName, importPath);
+}
+exports.addImportToModule = addImportToModule;
+/**
+ * Custom function to insert a provider into NgModule. It also imports it.
+ */
+function addProviderToModule(source, modulePath, classifiedName, importPath) {
+ return _addSymbolToNgModuleMetadata(source, modulePath, 'providers', classifiedName, importPath);
+}
+exports.addProviderToModule = addProviderToModule;
+/**
+ * Custom function to insert a provider into Component. It also imports it.
+ */
+function addProviderToComponent(source, componentPath, classifiedName, importPath) {
+ return _addSymbolToComponentMetadata(source, componentPath, 'providers', classifiedName, importPath);
+}
+exports.addProviderToComponent = addProviderToComponent;
+/**
+ * Custom function to insert an export into NgModule. It also imports it.
+ */
+function addExportToModule(source, modulePath, classifiedName, importPath) {
+ return _addSymbolToNgModuleMetadata(source, modulePath, 'exports', classifiedName, importPath);
+}
+exports.addExportToModule = addExportToModule;
+/**
+ * Custom function to insert an export into NgModule. It also imports it.
+ */
+function addBootstrapToModule(source, modulePath, classifiedName, importPath) {
+ return _addSymbolToNgModuleMetadata(source, modulePath, 'bootstrap', classifiedName, importPath);
+}
+exports.addBootstrapToModule = addBootstrapToModule;
+/**
+ * Add Import `import { symbolName } from fileName` if the import doesn't exit
+ * already. Assumes fileToEdit can be resolved and accessed.
+ * @param fileToEdit (file we want to add import to)
+ * @param symbolName (item to import)
+ * @param fileName (path to the file)
+ * @param isDefault (if true, import follows style for importing default exports)
+ * @return Change
+ */
+function insertImport(source, fileToEdit, symbolName, fileName, isDefault) {
+ if (isDefault === void 0) { isDefault = false; }
+ var rootNode = source;
+ var allImports = findNodes(rootNode, ts.SyntaxKind.ImportDeclaration);
+ // get nodes that map to import statements from the file fileName
+ var relevantImports = allImports.filter(function (node) {
+ // StringLiteral of the ImportDeclaration is the import file (fileName in this case).
+ var importFiles = node
+ .getChildren()
+ .filter(function (child) { return child.kind === ts.SyntaxKind.StringLiteral; })
+ .map(function (n) { return n.text; });
+ return importFiles.filter(function (file) { return file === fileName; }).length === 1;
+ });
+ if (relevantImports.length > 0) {
+ var importsAsterisk_1 = false;
+ // imports from import file
+ var imports_1 = [];
+ relevantImports.forEach(function (n) {
+ Array.prototype.push.apply(imports_1, findNodes(n, ts.SyntaxKind.Identifier));
+ if (findNodes(n, ts.SyntaxKind.AsteriskToken).length > 0) {
+ importsAsterisk_1 = true;
+ }
+ });
+ // if imports * from fileName, don't add symbolName
+ if (importsAsterisk_1) {
+ return new change_1.NoopChange();
+ }
+ var importTextNodes = imports_1.filter(function (n) { return n.text === symbolName; });
+ // insert import if it's not there
+ if (importTextNodes.length === 0) {
+ var fallbackPos_1 = findNodes(relevantImports[0], ts.SyntaxKind.CloseBraceToken)[0].getStart() ||
+ findNodes(relevantImports[0], ts.SyntaxKind.FromKeyword)[0].getStart();
+ return insertAfterLastOccurrence(imports_1, ", ".concat(symbolName), fileToEdit, fallbackPos_1);
+ }
+ return new change_1.NoopChange();
+ }
+ // no such import declaration exists
+ var useStrict = findNodes(rootNode, ts.SyntaxKind.StringLiteral).filter(function (n) { return n.getText() === 'use strict'; });
+ var fallbackPos = 0;
+ if (useStrict.length > 0) {
+ fallbackPos = useStrict[0].end;
+ }
+ var open = isDefault ? '' : '{ ';
+ var close = isDefault ? '' : ' }';
+ // if there are no imports or 'use strict' statement, insert import at beginning of file
+ var insertAtBeginning = allImports.length === 0 && useStrict.length === 0;
+ var separator = insertAtBeginning ? '' : ';\n';
+ var toInsert = "".concat(separator, "import ").concat(open).concat(symbolName).concat(close) +
+ " from '".concat(fileName, "'").concat(insertAtBeginning ? ';\n' : '');
+ return insertAfterLastOccurrence(allImports, toInsert, fileToEdit, fallbackPos, ts.SyntaxKind.StringLiteral);
+}
+exports.insertImport = insertImport;
+function replaceImport(sourceFile, path, importFrom, importAsIs, importToBe) {
+ var imports = sourceFile.statements
+ .filter(ts.isImportDeclaration)
+ .filter(function (_a) {
+ var moduleSpecifier = _a.moduleSpecifier;
+ return moduleSpecifier.getText(sourceFile) === "'".concat(importFrom, "'") ||
+ moduleSpecifier.getText(sourceFile) === "\"".concat(importFrom, "\"");
+ });
+ if (imports.length === 0) {
+ return [];
+ }
+ var importText = function (specifier) {
+ if (specifier.name.text) {
+ return specifier.name.text;
+ }
+ // if import is renamed
+ if (specifier.propertyName && specifier.propertyName.text) {
+ return specifier.propertyName.text;
+ }
+ return '';
+ };
+ var changes = imports.map(function (p) {
+ var _a;
+ var namedImports = (_a = p === null || p === void 0 ? void 0 : p.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings;
+ if (!namedImports) {
+ return [];
+ }
+ var importSpecifiers = namedImports.elements;
+ var isAlreadyImported = importSpecifiers
+ .map(importText)
+ .includes(importToBe);
+ var importChanges = importSpecifiers.map(function (specifier, index) {
+ var text = importText(specifier);
+ // import is not the one we're looking for, can be skipped
+ if (text !== importAsIs) {
+ return undefined;
+ }
+ // identifier has not been imported, simply replace the old text with the new text
+ if (!isAlreadyImported) {
+ return (0, change_1.createReplaceChange)(sourceFile, specifier, importAsIs, importToBe);
+ }
+ var nextIdentifier = importSpecifiers[index + 1];
+ // identifer is not the last, also clean up the comma
+ if (nextIdentifier) {
+ return (0, change_1.createRemoveChange)(sourceFile, specifier, specifier.getStart(sourceFile), nextIdentifier.getStart(sourceFile));
+ }
+ // there are no imports following, just remove it
+ return (0, change_1.createRemoveChange)(sourceFile, specifier, specifier.getStart(sourceFile), specifier.getEnd());
+ });
+ return importChanges.filter(Boolean);
+ });
+ return changes.reduce(function (imports, curr) { return imports.concat(curr); }, []);
+}
+exports.replaceImport = replaceImport;
+function containsProperty(objectLiteral, propertyName) {
+ return (objectLiteral &&
+ objectLiteral.properties.some(function (prop) {
+ return ts.isPropertyAssignment(prop) &&
+ ts.isIdentifier(prop.name) &&
+ prop.name.text === propertyName;
+ }));
+}
+exports.containsProperty = containsProperty;
+//# sourceMappingURL=ast-utils.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/ast-utils.js.map b/schematics-core/utility/ast-utils.js.map
new file mode 100644
index 0000000..3823a65
--- /dev/null
+++ b/schematics-core/utility/ast-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/ast-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ts from 'typescript';\nimport {\n Change,\n InsertChange,\n NoopChange,\n createReplaceChange,\n ReplaceChange,\n RemoveChange,\n createRemoveChange,\n} from './change';\nimport { Path } from '@angular-devkit/core';\n\n/**\n * Find all nodes from the AST in the subtree of node of SyntaxKind kind.\n * @param node\n * @param kind\n * @param max The maximum number of items to return.\n * @return all nodes of kind, or [] if none is found\n */\nexport function findNodes(\n node: ts.Node,\n kind: ts.SyntaxKind,\n max = Infinity\n): ts.Node[] {\n if (!node || max == 0) {\n return [];\n }\n\n const arr: ts.Node[] = [];\n if (node.kind === kind) {\n arr.push(node);\n max--;\n }\n if (max > 0) {\n for (const child of node.getChildren()) {\n findNodes(child, kind, max).forEach((node) => {\n if (max > 0) {\n arr.push(node);\n }\n max--;\n });\n\n if (max <= 0) {\n break;\n }\n }\n }\n\n return arr;\n}\n\n/**\n * Get all the nodes from a source.\n * @param sourceFile The source file object.\n * @returns {Observable} An observable of all the nodes in the source.\n */\nexport function getSourceNodes(sourceFile: ts.SourceFile): ts.Node[] {\n const nodes: ts.Node[] = [sourceFile];\n const result = [];\n\n while (nodes.length > 0) {\n const node = nodes.shift();\n\n if (node) {\n result.push(node);\n if (node.getChildCount(sourceFile) >= 0) {\n nodes.unshift(...node.getChildren());\n }\n }\n }\n\n return result;\n}\n\n/**\n * Helper for sorting nodes.\n * @return function to sort nodes in increasing order of position in sourceFile\n */\nfunction nodesByPosition(first: ts.Node, second: ts.Node): number {\n return first.pos - second.pos;\n}\n\n/**\n * Insert `toInsert` after the last occurence of `ts.SyntaxKind[nodes[i].kind]`\n * or after the last of occurence of `syntaxKind` if the last occurence is a sub child\n * of ts.SyntaxKind[nodes[i].kind] and save the changes in file.\n *\n * @param nodes insert after the last occurence of nodes\n * @param toInsert string to insert\n * @param file file to insert changes into\n * @param fallbackPos position to insert if toInsert happens to be the first occurence\n * @param syntaxKind the ts.SyntaxKind of the subchildren to insert after\n * @return Change instance\n * @throw Error if toInsert is first occurence but fall back is not set\n */\nexport function insertAfterLastOccurrence(\n nodes: ts.Node[],\n toInsert: string,\n file: string,\n fallbackPos: number,\n syntaxKind?: ts.SyntaxKind\n): Change {\n let lastItem = nodes.sort(nodesByPosition).pop();\n if (!lastItem) {\n throw new Error();\n }\n if (syntaxKind) {\n lastItem = findNodes(lastItem, syntaxKind).sort(nodesByPosition).pop();\n }\n if (!lastItem && fallbackPos == undefined) {\n throw new Error(\n `tried to insert ${toInsert} as first occurence with no fallback position`\n );\n }\n const lastItemPosition: number = lastItem ? lastItem.end : fallbackPos;\n\n return new InsertChange(file, lastItemPosition, toInsert);\n}\n\nexport function getContentOfKeyLiteral(\n _source: ts.SourceFile,\n node: ts.Node\n): string | null {\n if (node.kind == ts.SyntaxKind.Identifier) {\n return (node as ts.Identifier).text;\n } else if (node.kind == ts.SyntaxKind.StringLiteral) {\n return (node as ts.StringLiteral).text;\n } else {\n return null;\n }\n}\n\nfunction _angularImportsFromNode(\n node: ts.ImportDeclaration,\n _sourceFile: ts.SourceFile\n): { [name: string]: string } {\n const ms = node.moduleSpecifier;\n let modulePath: string;\n switch (ms.kind) {\n case ts.SyntaxKind.StringLiteral:\n modulePath = (ms as ts.StringLiteral).text;\n break;\n default:\n return {};\n }\n\n if (!modulePath.startsWith('@angular/')) {\n return {};\n }\n\n if (node.importClause) {\n if (node.importClause.name) {\n // This is of the form `import Name from 'path'`. Ignore.\n return {};\n } else if (node.importClause.namedBindings) {\n const nb = node.importClause.namedBindings;\n if (nb.kind == ts.SyntaxKind.NamespaceImport) {\n // This is of the form `import * as name from 'path'`. Return `name.`.\n return {\n [(nb as ts.NamespaceImport).name.text + '.']: modulePath,\n };\n } else {\n // This is of the form `import {a,b,c} from 'path'`\n const namedImports = nb as ts.NamedImports;\n\n return namedImports.elements\n .map((is: ts.ImportSpecifier) =>\n is.propertyName ? is.propertyName.text : is.name.text\n )\n .reduce((acc: { [name: string]: string }, curr: string) => {\n acc[curr] = modulePath;\n\n return acc;\n }, {});\n }\n }\n\n return {};\n } else {\n // This is of the form `import 'path';`. Nothing to do.\n return {};\n }\n}\n\nexport function getDecoratorMetadata(\n source: ts.SourceFile,\n identifier: string,\n module: string\n): ts.Node[] {\n const angularImports: { [name: string]: string } = findNodes(\n source,\n ts.SyntaxKind.ImportDeclaration\n )\n .map((node) =>\n _angularImportsFromNode(node as ts.ImportDeclaration, source)\n )\n .reduce(\n (\n acc: { [name: string]: string },\n current: { [name: string]: string }\n ) => {\n for (const key of Object.keys(current)) {\n acc[key] = current[key];\n }\n\n return acc;\n },\n {}\n );\n\n return getSourceNodes(source)\n .filter((node) => {\n return (\n node.kind == ts.SyntaxKind.Decorator &&\n (node as ts.Decorator).expression.kind == ts.SyntaxKind.CallExpression\n );\n })\n .map((node) => (node as ts.Decorator).expression as ts.CallExpression)\n .filter((expr) => {\n if (expr.expression.kind == ts.SyntaxKind.Identifier) {\n const id = expr.expression as ts.Identifier;\n\n return (\n id.getFullText(source) == identifier &&\n angularImports[id.getFullText(source)] === module\n );\n } else if (\n expr.expression.kind == ts.SyntaxKind.PropertyAccessExpression\n ) {\n // This covers foo.NgModule when importing * as foo.\n const paExpr = expr.expression as ts.PropertyAccessExpression;\n // If the left expression is not an identifier, just give up at that point.\n if (paExpr.expression.kind !== ts.SyntaxKind.Identifier) {\n return false;\n }\n\n const id = paExpr.name.text;\n const moduleId = (paExpr.expression as ts.Identifier).getText(source);\n\n return id === identifier && angularImports[moduleId + '.'] === module;\n }\n\n return false;\n })\n .filter(\n (expr) =>\n expr.arguments[0] &&\n expr.arguments[0].kind == ts.SyntaxKind.ObjectLiteralExpression\n )\n .map((expr) => expr.arguments[0] as ts.ObjectLiteralExpression);\n}\n\nfunction _addSymbolToNgModuleMetadata(\n source: ts.SourceFile,\n ngModulePath: string,\n metadataField: string,\n symbolName: string,\n importPath: string\n): Change[] {\n const nodes = getDecoratorMetadata(source, 'NgModule', '@angular/core');\n let node: any = nodes[0]; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // Find the decorator declaration.\n if (!node) {\n return [];\n }\n\n // Get all the children property assignment of object literals.\n const matchingProperties: ts.ObjectLiteralElement[] = (\n node as ts.ObjectLiteralExpression\n ).properties\n .filter((prop) => prop.kind == ts.SyntaxKind.PropertyAssignment)\n // Filter out every fields that's not \"metadataField\". Also handles string literals\n // (but not expressions).\n .filter((prop: any) => {\n const name = prop.name;\n switch (name.kind) {\n case ts.SyntaxKind.Identifier:\n return (name as ts.Identifier).getText(source) == metadataField;\n case ts.SyntaxKind.StringLiteral:\n return (name as ts.StringLiteral).text == metadataField;\n }\n\n return false;\n });\n\n // Get the last node of the array literal.\n if (!matchingProperties) {\n return [];\n }\n if (matchingProperties.length == 0) {\n // We haven't found the field in the metadata declaration. Insert a new field.\n const expr = node as ts.ObjectLiteralExpression;\n let position: number;\n let toInsert: string;\n if (expr.properties.length == 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${metadataField}: [${symbolName}]\\n`;\n } else {\n node = expr.properties[expr.properties.length - 1];\n position = node.getEnd();\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n const matches = text.match(/^\\r?\\n\\s*/);\n if (matches.length > 0) {\n toInsert = `,${matches[0]}${metadataField}: [${symbolName}]`;\n } else {\n toInsert = `, ${metadataField}: [${symbolName}]`;\n }\n }\n const newMetadataProperty = new InsertChange(\n ngModulePath,\n position,\n toInsert\n );\n const newMetadataImport = insertImport(\n source,\n ngModulePath,\n symbolName.replace(/\\..*$/, ''),\n importPath\n );\n\n return [newMetadataProperty, newMetadataImport];\n }\n\n const assignment = matchingProperties[0] as ts.PropertyAssignment;\n\n // If it's not an array, nothing we can do really.\n if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {\n return [];\n }\n\n const arrLiteral = assignment.initializer as ts.ArrayLiteralExpression;\n if (arrLiteral.elements.length == 0) {\n // Forward the property.\n node = arrLiteral;\n } else {\n node = arrLiteral.elements;\n }\n\n if (!node) {\n console.log(\n 'No app module found. Please add your new class to your component.'\n );\n\n return [];\n }\n\n if (Array.isArray(node)) {\n const nodeArray = node as {} as Array;\n const symbolsArray = nodeArray.map((node) => node.getText());\n if (symbolsArray.includes(symbolName)) {\n return [];\n }\n\n node = node[node.length - 1];\n\n const effectsModule = nodeArray.find(\n (node) =>\n (node.getText().includes('EffectsModule.forRoot') &&\n symbolName.includes('EffectsModule.forRoot')) ||\n (node.getText().includes('EffectsModule.forFeature') &&\n symbolName.includes('EffectsModule.forFeature'))\n );\n\n if (effectsModule && symbolName.includes('EffectsModule')) {\n const effectsArgs = (effectsModule as any).arguments.shift();\n\n if (\n effectsArgs &&\n effectsArgs.kind === ts.SyntaxKind.ArrayLiteralExpression\n ) {\n const effectsElements = (effectsArgs as ts.ArrayLiteralExpression)\n .elements;\n const [, effectsSymbol] = (symbolName).match(/\\[(.*)\\]/);\n\n let epos;\n if (effectsElements.length === 0) {\n epos = effectsArgs.getStart() + 1;\n return [new InsertChange(ngModulePath, epos, effectsSymbol)];\n } else {\n const lastEffect = effectsElements[\n effectsElements.length - 1\n ] as ts.Expression;\n epos = lastEffect.getEnd();\n // Get the indentation of the last element, if any.\n const text: any = lastEffect.getFullText(source);\n\n let effectInsert: string;\n if (text.match('^\\r?\\r?\\n')) {\n effectInsert = `,${text.match(/^\\r?\\n\\s+/)[0]}${effectsSymbol}`;\n } else {\n effectInsert = `, ${effectsSymbol}`;\n }\n\n return [new InsertChange(ngModulePath, epos, effectInsert)];\n }\n } else {\n return [];\n }\n }\n }\n\n let toInsert: string;\n let position = node.getEnd();\n if (node.kind == ts.SyntaxKind.ObjectLiteralExpression) {\n // We haven't found the field in the metadata declaration. Insert a new\n // field.\n const expr = node as ts.ObjectLiteralExpression;\n if (expr.properties.length == 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${metadataField}: [${symbolName}]\\n`;\n } else {\n node = expr.properties[expr.properties.length - 1];\n position = node.getEnd();\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n if (text.match('^\\r?\\r?\\n')) {\n toInsert = `,${\n text.match(/^\\r?\\n\\s+/)[0]\n }${metadataField}: [${symbolName}]`;\n } else {\n toInsert = `, ${metadataField}: [${symbolName}]`;\n }\n }\n } else if (node.kind == ts.SyntaxKind.ArrayLiteralExpression) {\n // We found the field but it's empty. Insert it just before the `]`.\n position--;\n toInsert = `${symbolName}`;\n } else {\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n if (text.match(/^\\r?\\n/)) {\n toInsert = `,${text.match(/^\\r?\\n(\\r?)\\s+/)[0]}${symbolName}`;\n } else {\n toInsert = `, ${symbolName}`;\n }\n }\n const insert = new InsertChange(ngModulePath, position, toInsert);\n const importInsert: Change = insertImport(\n source,\n ngModulePath,\n symbolName.replace(/\\..*$/, ''),\n importPath\n );\n\n return [insert, importInsert];\n}\n\nfunction _addSymbolToComponentMetadata(\n source: ts.SourceFile,\n componentPath: string,\n metadataField: string,\n symbolName: string,\n importPath: string\n): Change[] {\n const nodes = getDecoratorMetadata(source, 'Component', '@angular/core');\n let node: any = nodes[0]; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // Find the decorator declaration.\n if (!node) {\n return [];\n }\n\n // Get all the children property assignment of object literals.\n const matchingProperties: ts.ObjectLiteralElement[] = (\n node as ts.ObjectLiteralExpression\n ).properties\n .filter((prop) => prop.kind == ts.SyntaxKind.PropertyAssignment)\n // Filter out every fields that's not \"metadataField\". Also handles string literals\n // (but not expressions).\n .filter((prop: any) => {\n const name = prop.name;\n switch (name.kind) {\n case ts.SyntaxKind.Identifier:\n return (name as ts.Identifier).getText(source) == metadataField;\n case ts.SyntaxKind.StringLiteral:\n return (name as ts.StringLiteral).text == metadataField;\n }\n\n return false;\n });\n\n // Get the last node of the array literal.\n if (!matchingProperties) {\n return [];\n }\n if (matchingProperties.length == 0) {\n // We haven't found the field in the metadata declaration. Insert a new field.\n const expr = node as ts.ObjectLiteralExpression;\n let position: number;\n let toInsert: string;\n if (expr.properties.length == 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${metadataField}: [${symbolName}]\\n`;\n } else {\n node = expr.properties[expr.properties.length - 1];\n position = node.getEnd();\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n const matches = text.match(/^\\r?\\n\\s*/);\n if (matches.length > 0) {\n toInsert = `,${matches[0]}${metadataField}: [${symbolName}]`;\n } else {\n toInsert = `, ${metadataField}: [${symbolName}]`;\n }\n }\n const newMetadataProperty = new InsertChange(\n componentPath,\n position,\n toInsert\n );\n const newMetadataImport = insertImport(\n source,\n componentPath,\n symbolName.replace(/\\..*$/, ''),\n importPath\n );\n\n return [newMetadataProperty, newMetadataImport];\n }\n\n const assignment = matchingProperties[0] as ts.PropertyAssignment;\n\n // If it's not an array, nothing we can do really.\n if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {\n return [];\n }\n\n const arrLiteral = assignment.initializer as ts.ArrayLiteralExpression;\n if (arrLiteral.elements.length == 0) {\n // Forward the property.\n node = arrLiteral;\n } else {\n node = arrLiteral.elements;\n }\n\n if (!node) {\n console.log(\n 'No component found. Please add your new class to your component.'\n );\n\n return [];\n }\n\n if (Array.isArray(node)) {\n const nodeArray = node as {} as Array;\n const symbolsArray = nodeArray.map((node) => node.getText());\n if (symbolsArray.includes(symbolName)) {\n return [];\n }\n\n node = node[node.length - 1];\n }\n\n let toInsert: string;\n let position = node.getEnd();\n if (node.kind == ts.SyntaxKind.ObjectLiteralExpression) {\n // We haven't found the field in the metadata declaration. Insert a new\n // field.\n const expr = node as ts.ObjectLiteralExpression;\n if (expr.properties.length == 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${metadataField}: [${symbolName}]\\n`;\n } else {\n node = expr.properties[expr.properties.length - 1];\n position = node.getEnd();\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n if (text.match('^\\r?\\r?\\n')) {\n toInsert = `,${\n text.match(/^\\r?\\n\\s+/)[0]\n }${metadataField}: [${symbolName}]`;\n } else {\n toInsert = `, ${metadataField}: [${symbolName}]`;\n }\n }\n } else if (node.kind == ts.SyntaxKind.ArrayLiteralExpression) {\n // We found the field but it's empty. Insert it just before the `]`.\n position--;\n toInsert = `${symbolName}`;\n } else {\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n if (text.match(/^\\r?\\n/)) {\n toInsert = `,${text.match(/^\\r?\\n(\\r?)\\s+/)[0]}${symbolName}`;\n } else {\n toInsert = `, ${symbolName}`;\n }\n }\n const insert = new InsertChange(componentPath, position, toInsert);\n const importInsert: Change = insertImport(\n source,\n componentPath,\n symbolName.replace(/\\..*$/, ''),\n importPath\n );\n\n return [insert, importInsert];\n}\n\n/**\n * Custom function to insert a declaration (component, pipe, directive)\n * into NgModule declarations. It also imports the component.\n */\nexport function addDeclarationToModule(\n source: ts.SourceFile,\n modulePath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToNgModuleMetadata(\n source,\n modulePath,\n 'declarations',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Custom function to insert a declaration (component, pipe, directive)\n * into NgModule declarations. It also imports the component.\n */\nexport function addImportToModule(\n source: ts.SourceFile,\n modulePath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToNgModuleMetadata(\n source,\n modulePath,\n 'imports',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Custom function to insert a provider into NgModule. It also imports it.\n */\nexport function addProviderToModule(\n source: ts.SourceFile,\n modulePath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToNgModuleMetadata(\n source,\n modulePath,\n 'providers',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Custom function to insert a provider into Component. It also imports it.\n */\nexport function addProviderToComponent(\n source: ts.SourceFile,\n componentPath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToComponentMetadata(\n source,\n componentPath,\n 'providers',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Custom function to insert an export into NgModule. It also imports it.\n */\nexport function addExportToModule(\n source: ts.SourceFile,\n modulePath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToNgModuleMetadata(\n source,\n modulePath,\n 'exports',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Custom function to insert an export into NgModule. It also imports it.\n */\nexport function addBootstrapToModule(\n source: ts.SourceFile,\n modulePath: string,\n classifiedName: string,\n importPath: string\n): Change[] {\n return _addSymbolToNgModuleMetadata(\n source,\n modulePath,\n 'bootstrap',\n classifiedName,\n importPath\n );\n}\n\n/**\n * Add Import `import { symbolName } from fileName` if the import doesn't exit\n * already. Assumes fileToEdit can be resolved and accessed.\n * @param fileToEdit (file we want to add import to)\n * @param symbolName (item to import)\n * @param fileName (path to the file)\n * @param isDefault (if true, import follows style for importing default exports)\n * @return Change\n */\n\nexport function insertImport(\n source: ts.SourceFile,\n fileToEdit: string,\n symbolName: string,\n fileName: string,\n isDefault = false\n): Change {\n const rootNode = source;\n const allImports = findNodes(rootNode, ts.SyntaxKind.ImportDeclaration);\n\n // get nodes that map to import statements from the file fileName\n const relevantImports = allImports.filter((node) => {\n // StringLiteral of the ImportDeclaration is the import file (fileName in this case).\n const importFiles = node\n .getChildren()\n .filter((child) => child.kind === ts.SyntaxKind.StringLiteral)\n .map((n) => (n as ts.StringLiteral).text);\n\n return importFiles.filter((file) => file === fileName).length === 1;\n });\n\n if (relevantImports.length > 0) {\n let importsAsterisk = false;\n // imports from import file\n const imports: ts.Node[] = [];\n relevantImports.forEach((n) => {\n Array.prototype.push.apply(\n imports,\n findNodes(n, ts.SyntaxKind.Identifier)\n );\n if (findNodes(n, ts.SyntaxKind.AsteriskToken).length > 0) {\n importsAsterisk = true;\n }\n });\n\n // if imports * from fileName, don't add symbolName\n if (importsAsterisk) {\n return new NoopChange();\n }\n\n const importTextNodes = imports.filter(\n (n) => (n as ts.Identifier).text === symbolName\n );\n\n // insert import if it's not there\n if (importTextNodes.length === 0) {\n const fallbackPos =\n findNodes(\n relevantImports[0],\n ts.SyntaxKind.CloseBraceToken\n )[0].getStart() ||\n findNodes(relevantImports[0], ts.SyntaxKind.FromKeyword)[0].getStart();\n\n return insertAfterLastOccurrence(\n imports,\n `, ${symbolName}`,\n fileToEdit,\n fallbackPos\n );\n }\n\n return new NoopChange();\n }\n\n // no such import declaration exists\n const useStrict = findNodes(rootNode, ts.SyntaxKind.StringLiteral).filter(\n (n) => n.getText() === 'use strict'\n );\n let fallbackPos = 0;\n if (useStrict.length > 0) {\n fallbackPos = useStrict[0].end;\n }\n const open = isDefault ? '' : '{ ';\n const close = isDefault ? '' : ' }';\n // if there are no imports or 'use strict' statement, insert import at beginning of file\n const insertAtBeginning = allImports.length === 0 && useStrict.length === 0;\n const separator = insertAtBeginning ? '' : ';\\n';\n const toInsert =\n `${separator}import ${open}${symbolName}${close}` +\n ` from '${fileName}'${insertAtBeginning ? ';\\n' : ''}`;\n\n return insertAfterLastOccurrence(\n allImports,\n toInsert,\n fileToEdit,\n fallbackPos,\n ts.SyntaxKind.StringLiteral\n );\n}\n\nexport function replaceImport(\n sourceFile: ts.SourceFile,\n path: Path,\n importFrom: string,\n importAsIs: string,\n importToBe: string\n): (ReplaceChange | RemoveChange)[] {\n const imports = sourceFile.statements\n .filter(ts.isImportDeclaration)\n .filter(\n ({ moduleSpecifier }) =>\n moduleSpecifier.getText(sourceFile) === `'${importFrom}'` ||\n moduleSpecifier.getText(sourceFile) === `\"${importFrom}\"`\n );\n\n if (imports.length === 0) {\n return [];\n }\n\n const importText = (specifier: ts.ImportSpecifier) => {\n if (specifier.name.text) {\n return specifier.name.text;\n }\n\n // if import is renamed\n if (specifier.propertyName && specifier.propertyName.text) {\n return specifier.propertyName.text;\n }\n\n return '';\n };\n\n const changes = imports.map((p) => {\n const namedImports = p?.importClause?.namedBindings as ts.NamedImports;\n if (!namedImports) {\n return [];\n }\n\n const importSpecifiers = namedImports.elements;\n const isAlreadyImported = importSpecifiers\n .map(importText)\n .includes(importToBe);\n\n const importChanges = importSpecifiers.map((specifier, index) => {\n const text = importText(specifier);\n\n // import is not the one we're looking for, can be skipped\n if (text !== importAsIs) {\n return undefined;\n }\n\n // identifier has not been imported, simply replace the old text with the new text\n if (!isAlreadyImported) {\n return createReplaceChange(\n sourceFile,\n specifier,\n importAsIs,\n importToBe\n );\n }\n\n const nextIdentifier = importSpecifiers[index + 1];\n // identifer is not the last, also clean up the comma\n if (nextIdentifier) {\n return createRemoveChange(\n sourceFile,\n specifier,\n specifier.getStart(sourceFile),\n nextIdentifier.getStart(sourceFile)\n );\n }\n\n // there are no imports following, just remove it\n return createRemoveChange(\n sourceFile,\n specifier,\n specifier.getStart(sourceFile),\n specifier.getEnd()\n );\n });\n\n return importChanges.filter(Boolean) as (ReplaceChange | RemoveChange)[];\n });\n\n return changes.reduce((imports, curr) => imports.concat(curr), []);\n}\n\nexport function containsProperty(\n objectLiteral: ts.ObjectLiteralExpression,\n propertyName: string\n) {\n return (\n objectLiteral &&\n objectLiteral.properties.some(\n (prop) =>\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === propertyName\n )\n );\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/change.js b/schematics-core/utility/change.js
new file mode 100644
index 0000000..0dc8eff
--- /dev/null
+++ b/schematics-core/utility/change.js
@@ -0,0 +1,162 @@
+"use strict";
+var __values = (this && this.__values) || function(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.commitChanges = exports.createChangeRecorder = exports.createRemoveChange = exports.createReplaceChange = exports.ReplaceChange = exports.RemoveChange = exports.InsertChange = exports.NoopChange = void 0;
+/**
+ * An operation that does nothing.
+ */
+var NoopChange = /** @class */ (function () {
+ function NoopChange() {
+ this.description = 'No operation.';
+ this.order = Infinity;
+ this.path = null;
+ }
+ NoopChange.prototype.apply = function () {
+ return Promise.resolve();
+ };
+ return NoopChange;
+}());
+exports.NoopChange = NoopChange;
+/**
+ * Will add text to the source code.
+ */
+var InsertChange = /** @class */ (function () {
+ function InsertChange(path, pos, toAdd) {
+ this.path = path;
+ this.pos = pos;
+ this.toAdd = toAdd;
+ if (pos < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = "Inserted ".concat(toAdd, " into position ").concat(pos, " of ").concat(path);
+ this.order = pos;
+ }
+ /**
+ * This method does not insert spaces if there is none in the original string.
+ */
+ InsertChange.prototype.apply = function (host) {
+ var _this = this;
+ return host.read(this.path).then(function (content) {
+ var prefix = content.substring(0, _this.pos);
+ var suffix = content.substring(_this.pos);
+ return host.write(_this.path, "".concat(prefix).concat(_this.toAdd).concat(suffix));
+ });
+ };
+ return InsertChange;
+}());
+exports.InsertChange = InsertChange;
+/**
+ * Will remove text from the source code.
+ */
+var RemoveChange = /** @class */ (function () {
+ function RemoveChange(path, pos, end) {
+ this.path = path;
+ this.pos = pos;
+ this.end = end;
+ if (pos < 0 || end < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = "Removed text in position ".concat(pos, " to ").concat(end, " of ").concat(path);
+ this.order = pos;
+ }
+ RemoveChange.prototype.apply = function (host) {
+ var _this = this;
+ return host.read(this.path).then(function (content) {
+ var prefix = content.substring(0, _this.pos);
+ var suffix = content.substring(_this.end);
+ // TODO: throw error if toRemove doesn't match removed string.
+ return host.write(_this.path, "".concat(prefix).concat(suffix));
+ });
+ };
+ return RemoveChange;
+}());
+exports.RemoveChange = RemoveChange;
+/**
+ * Will replace text from the source code.
+ */
+var ReplaceChange = /** @class */ (function () {
+ function ReplaceChange(path, pos, oldText, newText) {
+ this.path = path;
+ this.pos = pos;
+ this.oldText = oldText;
+ this.newText = newText;
+ if (pos < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = "Replaced ".concat(oldText, " into position ").concat(pos, " of ").concat(path, " with ").concat(newText);
+ this.order = pos;
+ }
+ ReplaceChange.prototype.apply = function (host) {
+ var _this = this;
+ return host.read(this.path).then(function (content) {
+ var prefix = content.substring(0, _this.pos);
+ var suffix = content.substring(_this.pos + _this.oldText.length);
+ var text = content.substring(_this.pos, _this.pos + _this.oldText.length);
+ if (text !== _this.oldText) {
+ return Promise.reject(new Error("Invalid replace: \"".concat(text, "\" != \"").concat(_this.oldText, "\".")));
+ }
+ // TODO: throw error if oldText doesn't match removed string.
+ return host.write(_this.path, "".concat(prefix).concat(_this.newText).concat(suffix));
+ });
+ };
+ return ReplaceChange;
+}());
+exports.ReplaceChange = ReplaceChange;
+function createReplaceChange(sourceFile, node, oldText, newText) {
+ return new ReplaceChange(sourceFile.fileName, node.getStart(sourceFile), oldText, newText);
+}
+exports.createReplaceChange = createReplaceChange;
+function createRemoveChange(sourceFile, node, from, to) {
+ if (from === void 0) { from = node.getStart(sourceFile); }
+ if (to === void 0) { to = node.getEnd(); }
+ return new RemoveChange(sourceFile.fileName, from, to);
+}
+exports.createRemoveChange = createRemoveChange;
+function createChangeRecorder(tree, path, changes) {
+ var e_1, _a;
+ var recorder = tree.beginUpdate(path);
+ try {
+ for (var changes_1 = __values(changes), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
+ var change = changes_1_1.value;
+ if (change instanceof InsertChange) {
+ recorder.insertLeft(change.pos, change.toAdd);
+ }
+ else if (change instanceof RemoveChange) {
+ recorder.remove(change.pos, change.end - change.pos);
+ }
+ else if (change instanceof ReplaceChange) {
+ recorder.remove(change.pos, change.oldText.length);
+ recorder.insertLeft(change.pos, change.newText);
+ }
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (changes_1_1 && !changes_1_1.done && (_a = changes_1.return)) _a.call(changes_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return recorder;
+}
+exports.createChangeRecorder = createChangeRecorder;
+function commitChanges(tree, path, changes) {
+ if (changes.length === 0) {
+ return false;
+ }
+ var recorder = createChangeRecorder(tree, path, changes);
+ tree.commitUpdate(recorder);
+ return true;
+}
+exports.commitChanges = commitChanges;
+//# sourceMappingURL=change.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/change.js.map b/schematics-core/utility/change.js.map
new file mode 100644
index 0000000..5536368
--- /dev/null
+++ b/schematics-core/utility/change.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"change.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/change.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\nimport { Tree, UpdateRecorder } from '@angular-devkit/schematics';\nimport { Path } from '@angular-devkit/core';\n\n/* istanbul ignore file */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nexport interface Host {\n write(path: string, content: string): Promise;\n read(path: string): Promise;\n}\n\nexport interface Change {\n apply(host: Host): Promise;\n\n // The file this change should be applied to. Some changes might not apply to\n // a file (maybe the config).\n readonly path: string | null;\n\n // The order this change should be applied. Normally the position inside the file.\n // Changes are applied from the bottom of a file to the top.\n readonly order: number;\n\n // The description of this change. This will be outputted in a dry or verbose run.\n readonly description: string;\n}\n\n/**\n * An operation that does nothing.\n */\nexport class NoopChange implements Change {\n description = 'No operation.';\n order = Infinity;\n path = null;\n apply() {\n return Promise.resolve();\n }\n}\n\n/**\n * Will add text to the source code.\n */\nexport class InsertChange implements Change {\n order: number;\n description: string;\n\n constructor(public path: string, public pos: number, public toAdd: string) {\n if (pos < 0) {\n throw new Error('Negative positions are invalid');\n }\n this.description = `Inserted ${toAdd} into position ${pos} of ${path}`;\n this.order = pos;\n }\n\n /**\n * This method does not insert spaces if there is none in the original string.\n */\n apply(host: Host) {\n return host.read(this.path).then((content) => {\n const prefix = content.substring(0, this.pos);\n const suffix = content.substring(this.pos);\n\n return host.write(this.path, `${prefix}${this.toAdd}${suffix}`);\n });\n }\n}\n\n/**\n * Will remove text from the source code.\n */\nexport class RemoveChange implements Change {\n order: number;\n description: string;\n\n constructor(public path: string, public pos: number, public end: number) {\n if (pos < 0 || end < 0) {\n throw new Error('Negative positions are invalid');\n }\n this.description = `Removed text in position ${pos} to ${end} of ${path}`;\n this.order = pos;\n }\n\n apply(host: Host): Promise {\n return host.read(this.path).then((content) => {\n const prefix = content.substring(0, this.pos);\n const suffix = content.substring(this.end);\n\n // TODO: throw error if toRemove doesn't match removed string.\n return host.write(this.path, `${prefix}${suffix}`);\n });\n }\n}\n\n/**\n * Will replace text from the source code.\n */\nexport class ReplaceChange implements Change {\n order: number;\n description: string;\n\n constructor(\n public path: string,\n public pos: number,\n public oldText: string,\n public newText: string\n ) {\n if (pos < 0) {\n throw new Error('Negative positions are invalid');\n }\n this.description = `Replaced ${oldText} into position ${pos} of ${path} with ${newText}`;\n this.order = pos;\n }\n\n apply(host: Host): Promise {\n return host.read(this.path).then((content) => {\n const prefix = content.substring(0, this.pos);\n const suffix = content.substring(this.pos + this.oldText.length);\n const text = content.substring(this.pos, this.pos + this.oldText.length);\n\n if (text !== this.oldText) {\n return Promise.reject(\n new Error(`Invalid replace: \"${text}\" != \"${this.oldText}\".`)\n );\n }\n\n // TODO: throw error if oldText doesn't match removed string.\n return host.write(this.path, `${prefix}${this.newText}${suffix}`);\n });\n }\n}\n\nexport function createReplaceChange(\n sourceFile: ts.SourceFile,\n node: ts.Node,\n oldText: string,\n newText: string\n): ReplaceChange {\n return new ReplaceChange(\n sourceFile.fileName,\n node.getStart(sourceFile),\n oldText,\n newText\n );\n}\n\nexport function createRemoveChange(\n sourceFile: ts.SourceFile,\n node: ts.Node,\n from = node.getStart(sourceFile),\n to = node.getEnd()\n): RemoveChange {\n return new RemoveChange(sourceFile.fileName, from, to);\n}\n\nexport function createChangeRecorder(\n tree: Tree,\n path: string,\n changes: Change[]\n): UpdateRecorder {\n const recorder = tree.beginUpdate(path);\n for (const change of changes) {\n if (change instanceof InsertChange) {\n recorder.insertLeft(change.pos, change.toAdd);\n } else if (change instanceof RemoveChange) {\n recorder.remove(change.pos, change.end - change.pos);\n } else if (change instanceof ReplaceChange) {\n recorder.remove(change.pos, change.oldText.length);\n recorder.insertLeft(change.pos, change.newText);\n }\n }\n return recorder;\n}\n\nexport function commitChanges(tree: Tree, path: string, changes: Change[]) {\n if (changes.length === 0) {\n return false;\n }\n\n const recorder = createChangeRecorder(tree, path, changes);\n tree.commitUpdate(recorder);\n return true;\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/config.js b/schematics-core/utility/config.js
new file mode 100644
index 0000000..875ad8d
--- /dev/null
+++ b/schematics-core/utility/config.js
@@ -0,0 +1,21 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getWorkspace = exports.getWorkspacePath = void 0;
+var schematics_1 = require("@angular-devkit/schematics");
+function getWorkspacePath(host) {
+ var possibleFiles = ['/angular.json', '/.angular.json', '/workspace.json'];
+ var path = possibleFiles.filter(function (path) { return host.exists(path); })[0];
+ return path;
+}
+exports.getWorkspacePath = getWorkspacePath;
+function getWorkspace(host) {
+ var path = getWorkspacePath(host);
+ var configBuffer = host.read(path);
+ if (configBuffer === null) {
+ throw new schematics_1.SchematicsException("Could not find (".concat(path, ")"));
+ }
+ var config = configBuffer.toString();
+ return JSON.parse(config);
+}
+exports.getWorkspace = getWorkspace;
+//# sourceMappingURL=config.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/config.js.map b/schematics-core/utility/config.js.map
new file mode 100644
index 0000000..55a6be6
--- /dev/null
+++ b/schematics-core/utility/config.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/config.ts"],"names":[],"mappings":";;;AAAA,yDAAuE;AAkIvE,SAAgB,gBAAgB,CAAC,IAAU;IACzC,IAAM,aAAa,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IAC7E,IAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAjB,CAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,OAAO,IAAI,CAAC;AACd,CAAC;AALD,4CAKC;AAED,SAAgB,YAAY,CAAC,IAAU;IACrC,IAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,YAAY,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,gCAAmB,CAAC,0BAAmB,IAAI,MAAG,CAAC,CAAC;KAC3D;IACD,IAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEvC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AATD,oCASC","sourcesContent":["import { SchematicsException, Tree } from '@angular-devkit/schematics';\n\n// The interfaces below are generated from the Angular CLI configuration schema\n// https://github.com/angular/angular-cli/blob/master/packages/@angular/cli/lib/config/schema.json\nexport interface AppConfig {\n /**\n * Name of the app.\n */\n name?: string;\n /**\n * Directory where app files are placed.\n */\n appRoot?: string;\n /**\n * The root directory of the app.\n */\n root?: string;\n /**\n * The output directory for build results.\n */\n outDir?: string;\n /**\n * List of application assets.\n */\n assets?: (\n | string\n | {\n /**\n * The pattern to match.\n */\n glob?: string;\n /**\n * The dir to search within.\n */\n input?: string;\n /**\n * The output path (relative to the outDir).\n */\n output?: string;\n }\n )[];\n /**\n * URL where files will be deployed.\n */\n deployUrl?: string;\n /**\n * Base url for the application being built.\n */\n baseHref?: string;\n /**\n * The runtime platform of the app.\n */\n platform?: 'browser' | 'server';\n /**\n * The name of the start HTML file.\n */\n index?: string;\n /**\n * The name of the main entry-point file.\n */\n main?: string;\n /**\n * The name of the polyfills file.\n */\n polyfills?: string;\n /**\n * The name of the test entry-point file.\n */\n test?: string;\n /**\n * The name of the TypeScript configuration file.\n */\n tsconfig?: string;\n /**\n * The name of the TypeScript configuration file for unit tests.\n */\n testTsconfig?: string;\n /**\n * The prefix to apply to generated selectors.\n */\n prefix?: string;\n /**\n * Experimental support for a service worker from @angular/service-worker.\n */\n serviceWorker?: boolean;\n /**\n * Global styles to be included in the build.\n */\n styles?: (\n | string\n | {\n input?: string;\n [name: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n )[];\n /**\n * Options to pass to style preprocessors\n */\n stylePreprocessorOptions?: {\n /**\n * Paths to include. Paths will be resolved to project root.\n */\n includePaths?: string[];\n };\n /**\n * Global scripts to be included in the build.\n */\n scripts?: (\n | string\n | {\n input: string;\n [name: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n )[];\n /**\n * Source file for environment config.\n */\n environmentSource?: string;\n /**\n * Name and corresponding file for environment config.\n */\n environments?: {\n [name: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n };\n appShell?: {\n app: string;\n route: string;\n };\n}\n\nexport function getWorkspacePath(host: Tree): string {\n const possibleFiles = ['/angular.json', '/.angular.json', '/workspace.json'];\n const path = possibleFiles.filter((path) => host.exists(path))[0];\n\n return path;\n}\n\nexport function getWorkspace(host: Tree) {\n const path = getWorkspacePath(host);\n const configBuffer = host.read(path);\n if (configBuffer === null) {\n throw new SchematicsException(`Could not find (${path})`);\n }\n const config = configBuffer.toString();\n\n return JSON.parse(config);\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/find-component.js b/schematics-core/utility/find-component.js
new file mode 100644
index 0000000..be4b62f
--- /dev/null
+++ b/schematics-core/utility/find-component.js
@@ -0,0 +1,101 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.buildRelativePath = exports.findComponent = exports.findComponentFromOptions = void 0;
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var core_1 = require("@angular-devkit/core");
+/**
+ * Find the component referred by a set of options passed to the schematics.
+ */
+function findComponentFromOptions(host, options) {
+ if (options.hasOwnProperty('skipImport') && options.skipImport) {
+ return undefined;
+ }
+ if (!options.component) {
+ var pathToCheck = (options.path || '') +
+ (options.flat ? '' : '/' + core_1.strings.dasherize(options.name));
+ return (0, core_1.normalize)(findComponent(host, pathToCheck));
+ }
+ else {
+ var componentPath = (0, core_1.normalize)('/' + options.path + '/' + options.component);
+ var componentBaseName = (0, core_1.normalize)(componentPath).split('/').pop();
+ if (host.exists(componentPath)) {
+ return (0, core_1.normalize)(componentPath);
+ }
+ else if (host.exists(componentPath + '.ts')) {
+ return (0, core_1.normalize)(componentPath + '.ts');
+ }
+ else if (host.exists(componentPath + '.component.ts')) {
+ return (0, core_1.normalize)(componentPath + '.component.ts');
+ }
+ else if (host.exists(componentPath + '/' + componentBaseName + '.component.ts')) {
+ return (0, core_1.normalize)(componentPath + '/' + componentBaseName + '.component.ts');
+ }
+ else {
+ throw new Error("Specified component path ".concat(componentPath, " does not exist"));
+ }
+ }
+}
+exports.findComponentFromOptions = findComponentFromOptions;
+/**
+ * Function to find the "closest" component to a generated file's path.
+ */
+function findComponent(host, generateDir) {
+ var dir = host.getDir('/' + generateDir);
+ var componentRe = /\.component\.ts$/;
+ while (dir) {
+ var matches = dir.subfiles.filter(function (p) { return componentRe.test(p); });
+ if (matches.length == 1) {
+ return (0, core_1.join)(dir.path, matches[0]);
+ }
+ else if (matches.length > 1) {
+ throw new Error('More than one component matches. Use skip-import option to skip importing ' +
+ 'the component store into the closest component.');
+ }
+ dir = dir.parent;
+ }
+ throw new Error('Could not find an Component. Use the skip-import ' +
+ 'option to skip importing in Component.');
+}
+exports.findComponent = findComponent;
+/**
+ * Build a relative path from one file path to another file path.
+ */
+function buildRelativePath(from, to) {
+ var _a = parsePath(from), fromPath = _a.path, fromFileName = _a.filename, fromDirectory = _a.directory;
+ var _b = parsePath(to), toPath = _b.path, toFileName = _b.filename, toDirectory = _b.directory;
+ var relativePath = (0, core_1.relative)(fromDirectory, toDirectory);
+ var fixedRelativePath = relativePath.startsWith('.')
+ ? relativePath
+ : "./".concat(relativePath);
+ return !toFileName || toFileName === 'index.ts'
+ ? fixedRelativePath
+ : "".concat(fixedRelativePath.endsWith('/')
+ ? fixedRelativePath
+ : fixedRelativePath + '/').concat(convertToTypeScriptFileName(toFileName));
+}
+exports.buildRelativePath = buildRelativePath;
+function parsePath(path) {
+ var pathNormalized = (0, core_1.normalize)(path);
+ var filename = (0, core_1.extname)(pathNormalized) ? (0, core_1.basename)(pathNormalized) : '';
+ var directory = filename ? (0, core_1.dirname)(pathNormalized) : pathNormalized;
+ return {
+ path: pathNormalized,
+ filename: filename,
+ directory: directory,
+ };
+}
+/**
+ * Strips the typescript extension and clears index filenames
+ * foo.ts -> foo
+ * index.ts -> empty
+ */
+function convertToTypeScriptFileName(filename) {
+ return filename ? filename.replace(/(\.ts)|(index\.ts)$/, '') : '';
+}
+//# sourceMappingURL=find-component.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/find-component.js.map b/schematics-core/utility/find-component.js.map
new file mode 100644
index 0000000..c845be0
--- /dev/null
+++ b/schematics-core/utility/find-component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"find-component.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/find-component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n Path,\n join,\n normalize,\n relative,\n strings,\n basename,\n extname,\n dirname,\n} from '@angular-devkit/core';\nimport { DirEntry, Tree } from '@angular-devkit/schematics';\n\nexport interface ComponentOptions {\n component?: string;\n name: string;\n flat?: boolean;\n path?: string;\n skipImport?: boolean;\n}\n\n/**\n * Find the component referred by a set of options passed to the schematics.\n */\nexport function findComponentFromOptions(\n host: Tree,\n options: ComponentOptions\n): Path | undefined {\n if (options.hasOwnProperty('skipImport') && options.skipImport) {\n return undefined;\n }\n\n if (!options.component) {\n const pathToCheck =\n (options.path || '') +\n (options.flat ? '' : '/' + strings.dasherize(options.name));\n\n return normalize(findComponent(host, pathToCheck));\n } else {\n const componentPath = normalize(\n '/' + options.path + '/' + options.component\n );\n const componentBaseName = normalize(componentPath).split('/').pop();\n\n if (host.exists(componentPath)) {\n return normalize(componentPath);\n } else if (host.exists(componentPath + '.ts')) {\n return normalize(componentPath + '.ts');\n } else if (host.exists(componentPath + '.component.ts')) {\n return normalize(componentPath + '.component.ts');\n } else if (\n host.exists(componentPath + '/' + componentBaseName + '.component.ts')\n ) {\n return normalize(\n componentPath + '/' + componentBaseName + '.component.ts'\n );\n } else {\n throw new Error(\n `Specified component path ${componentPath} does not exist`\n );\n }\n }\n}\n\n/**\n * Function to find the \"closest\" component to a generated file's path.\n */\nexport function findComponent(host: Tree, generateDir: string): Path {\n let dir: DirEntry | null = host.getDir('/' + generateDir);\n\n const componentRe = /\\.component\\.ts$/;\n\n while (dir) {\n const matches = dir.subfiles.filter((p) => componentRe.test(p));\n\n if (matches.length == 1) {\n return join(dir.path, matches[0]);\n } else if (matches.length > 1) {\n throw new Error(\n 'More than one component matches. Use skip-import option to skip importing ' +\n 'the component store into the closest component.'\n );\n }\n\n dir = dir.parent;\n }\n\n throw new Error(\n 'Could not find an Component. Use the skip-import ' +\n 'option to skip importing in Component.'\n );\n}\n\n/**\n * Build a relative path from one file path to another file path.\n */\nexport function buildRelativePath(from: string, to: string): string {\n const {\n path: fromPath,\n filename: fromFileName,\n directory: fromDirectory,\n } = parsePath(from);\n const {\n path: toPath,\n filename: toFileName,\n directory: toDirectory,\n } = parsePath(to);\n const relativePath = relative(fromDirectory, toDirectory);\n const fixedRelativePath = relativePath.startsWith('.')\n ? relativePath\n : `./${relativePath}`;\n\n return !toFileName || toFileName === 'index.ts'\n ? fixedRelativePath\n : `${\n fixedRelativePath.endsWith('/')\n ? fixedRelativePath\n : fixedRelativePath + '/'\n }${convertToTypeScriptFileName(toFileName)}`;\n}\n\nfunction parsePath(path: string) {\n const pathNormalized = normalize(path) as Path;\n const filename = extname(pathNormalized) ? basename(pathNormalized) : '';\n const directory = filename ? dirname(pathNormalized) : pathNormalized;\n return {\n path: pathNormalized,\n filename,\n directory,\n };\n}\n/**\n * Strips the typescript extension and clears index filenames\n * foo.ts -> foo\n * index.ts -> empty\n */\nfunction convertToTypeScriptFileName(filename: string | undefined) {\n return filename ? filename.replace(/(\\.ts)|(index\\.ts)$/, '') : '';\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/find-module.js b/schematics-core/utility/find-module.js
new file mode 100644
index 0000000..0088f70
--- /dev/null
+++ b/schematics-core/utility/find-module.js
@@ -0,0 +1,102 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.buildRelativePath = exports.findModule = exports.findModuleFromOptions = void 0;
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var core_1 = require("@angular-devkit/core");
+/**
+ * Find the module referred by a set of options passed to the schematics.
+ */
+function findModuleFromOptions(host, options) {
+ if (options.hasOwnProperty('skipImport') && options.skipImport) {
+ return undefined;
+ }
+ if (!options.module) {
+ var pathToCheck = (options.path || '') +
+ (options.flat ? '' : '/' + core_1.strings.dasherize(options.name));
+ return (0, core_1.normalize)(findModule(host, pathToCheck));
+ }
+ else {
+ var modulePath = (0, core_1.normalize)('/' + options.path + '/' + options.module);
+ var moduleBaseName = (0, core_1.normalize)(modulePath).split('/').pop();
+ if (host.exists(modulePath)) {
+ return (0, core_1.normalize)(modulePath);
+ }
+ else if (host.exists(modulePath + '.ts')) {
+ return (0, core_1.normalize)(modulePath + '.ts');
+ }
+ else if (host.exists(modulePath + '.module.ts')) {
+ return (0, core_1.normalize)(modulePath + '.module.ts');
+ }
+ else if (host.exists(modulePath + '/' + moduleBaseName + '.module.ts')) {
+ return (0, core_1.normalize)(modulePath + '/' + moduleBaseName + '.module.ts');
+ }
+ else {
+ throw new Error("Specified module path ".concat(modulePath, " does not exist"));
+ }
+ }
+}
+exports.findModuleFromOptions = findModuleFromOptions;
+/**
+ * Function to find the "closest" module to a generated file's path.
+ */
+function findModule(host, generateDir) {
+ var dir = host.getDir('/' + generateDir);
+ var moduleRe = /\.module\.ts$/;
+ var routingModuleRe = /-routing\.module\.ts/;
+ while (dir) {
+ var matches = dir.subfiles.filter(function (p) { return moduleRe.test(p) && !routingModuleRe.test(p); });
+ if (matches.length == 1) {
+ return (0, core_1.join)(dir.path, matches[0]);
+ }
+ else if (matches.length > 1) {
+ throw new Error('More than one module matches. Use skip-import option to skip importing ' +
+ 'the component into the closest module.');
+ }
+ dir = dir.parent;
+ }
+ throw new Error('Could not find an NgModule. Use the skip-import ' +
+ 'option to skip importing in NgModule.');
+}
+exports.findModule = findModule;
+/**
+ * Build a relative path from one file path to another file path.
+ */
+function buildRelativePath(from, to) {
+ var _a = parsePath(from), fromPath = _a.path, fromFileName = _a.filename, fromDirectory = _a.directory;
+ var _b = parsePath(to), toPath = _b.path, toFileName = _b.filename, toDirectory = _b.directory;
+ var relativePath = (0, core_1.relative)(fromDirectory, toDirectory);
+ var fixedRelativePath = relativePath.startsWith('.')
+ ? relativePath
+ : "./".concat(relativePath);
+ return !toFileName || toFileName === 'index.ts'
+ ? fixedRelativePath
+ : "".concat(fixedRelativePath.endsWith('/')
+ ? fixedRelativePath
+ : fixedRelativePath + '/').concat(convertToTypeScriptFileName(toFileName));
+}
+exports.buildRelativePath = buildRelativePath;
+function parsePath(path) {
+ var pathNormalized = (0, core_1.normalize)(path);
+ var filename = (0, core_1.extname)(pathNormalized) ? (0, core_1.basename)(pathNormalized) : '';
+ var directory = filename ? (0, core_1.dirname)(pathNormalized) : pathNormalized;
+ return {
+ path: pathNormalized,
+ filename: filename,
+ directory: directory,
+ };
+}
+/**
+ * Strips the typescript extension and clears index filenames
+ * foo.ts -> foo
+ * index.ts -> empty
+ */
+function convertToTypeScriptFileName(filename) {
+ return filename ? filename.replace(/(\.ts)|(index\.ts)$/, '') : '';
+}
+//# sourceMappingURL=find-module.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/find-module.js.map b/schematics-core/utility/find-module.js.map
new file mode 100644
index 0000000..5128b08
--- /dev/null
+++ b/schematics-core/utility/find-module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"find-module.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/find-module.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n Path,\n join,\n normalize,\n relative,\n strings,\n basename,\n extname,\n dirname,\n} from '@angular-devkit/core';\nimport { DirEntry, Tree } from '@angular-devkit/schematics';\n\nexport interface ModuleOptions {\n module?: string;\n name: string;\n flat?: boolean;\n path?: string;\n skipImport?: boolean;\n}\n\n/**\n * Find the module referred by a set of options passed to the schematics.\n */\nexport function findModuleFromOptions(\n host: Tree,\n options: ModuleOptions\n): Path | undefined {\n if (options.hasOwnProperty('skipImport') && options.skipImport) {\n return undefined;\n }\n\n if (!options.module) {\n const pathToCheck =\n (options.path || '') +\n (options.flat ? '' : '/' + strings.dasherize(options.name));\n\n return normalize(findModule(host, pathToCheck));\n } else {\n const modulePath = normalize('/' + options.path + '/' + options.module);\n const moduleBaseName = normalize(modulePath).split('/').pop();\n\n if (host.exists(modulePath)) {\n return normalize(modulePath);\n } else if (host.exists(modulePath + '.ts')) {\n return normalize(modulePath + '.ts');\n } else if (host.exists(modulePath + '.module.ts')) {\n return normalize(modulePath + '.module.ts');\n } else if (host.exists(modulePath + '/' + moduleBaseName + '.module.ts')) {\n return normalize(modulePath + '/' + moduleBaseName + '.module.ts');\n } else {\n throw new Error(`Specified module path ${modulePath} does not exist`);\n }\n }\n}\n\n/**\n * Function to find the \"closest\" module to a generated file's path.\n */\nexport function findModule(host: Tree, generateDir: string): Path {\n let dir: DirEntry | null = host.getDir('/' + generateDir);\n\n const moduleRe = /\\.module\\.ts$/;\n const routingModuleRe = /-routing\\.module\\.ts/;\n\n while (dir) {\n const matches = dir.subfiles.filter(\n (p) => moduleRe.test(p) && !routingModuleRe.test(p)\n );\n\n if (matches.length == 1) {\n return join(dir.path, matches[0]);\n } else if (matches.length > 1) {\n throw new Error(\n 'More than one module matches. Use skip-import option to skip importing ' +\n 'the component into the closest module.'\n );\n }\n\n dir = dir.parent;\n }\n\n throw new Error(\n 'Could not find an NgModule. Use the skip-import ' +\n 'option to skip importing in NgModule.'\n );\n}\n\n/**\n * Build a relative path from one file path to another file path.\n */\nexport function buildRelativePath(from: string, to: string): string {\n const {\n path: fromPath,\n filename: fromFileName,\n directory: fromDirectory,\n } = parsePath(from);\n const {\n path: toPath,\n filename: toFileName,\n directory: toDirectory,\n } = parsePath(to);\n const relativePath = relative(fromDirectory, toDirectory);\n const fixedRelativePath = relativePath.startsWith('.')\n ? relativePath\n : `./${relativePath}`;\n\n return !toFileName || toFileName === 'index.ts'\n ? fixedRelativePath\n : `${\n fixedRelativePath.endsWith('/')\n ? fixedRelativePath\n : fixedRelativePath + '/'\n }${convertToTypeScriptFileName(toFileName)}`;\n}\n\nfunction parsePath(path: string) {\n const pathNormalized = normalize(path) as Path;\n const filename = extname(pathNormalized) ? basename(pathNormalized) : '';\n const directory = filename ? dirname(pathNormalized) : pathNormalized;\n return {\n path: pathNormalized,\n filename,\n directory,\n };\n}\n/**\n * Strips the typescript extension and clears index filenames\n * foo.ts -> foo\n * index.ts -> empty\n */\nfunction convertToTypeScriptFileName(filename: string | undefined) {\n return filename ? filename.replace(/(\\.ts)|(index\\.ts)$/, '') : '';\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/json-utilts.js b/schematics-core/utility/json-utilts.js
new file mode 100644
index 0000000..0853e8a
--- /dev/null
+++ b/schematics-core/utility/json-utilts.js
@@ -0,0 +1,37 @@
+"use strict";
+var __values = (this && this.__values) || function(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.findPropertyInAstObject = void 0;
+// https://github.com/angular/angular-cli/blob/master/packages/schematics/angular/utility/json-utils.ts
+function findPropertyInAstObject(node, propertyName) {
+ var e_1, _a;
+ var maybeNode = null;
+ try {
+ for (var _b = __values(node.properties), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var property = _c.value;
+ if (property.key.value == propertyName) {
+ maybeNode = property.value;
+ }
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return maybeNode;
+}
+exports.findPropertyInAstObject = findPropertyInAstObject;
+//# sourceMappingURL=json-utilts.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/json-utilts.js.map b/schematics-core/utility/json-utilts.js.map
new file mode 100644
index 0000000..20950ac
--- /dev/null
+++ b/schematics-core/utility/json-utilts.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"json-utilts.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/json-utilts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,uGAAuG;AACvG,SAAgB,uBAAuB,CACrC,IAAS,EACT,YAAoB;;IAEpB,IAAI,SAAS,GAAe,IAAI,CAAC;;QACjC,KAAuB,IAAA,KAAA,SAAA,IAAI,CAAC,UAAU,CAAA,gBAAA,4BAAE;YAAnC,IAAM,QAAQ,WAAA;YACjB,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,EAAE;gBACtC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;aAC5B;SACF;;;;;;;;;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAZD,0DAYC","sourcesContent":["// https://github.com/angular/angular-cli/blob/master/packages/schematics/angular/utility/json-utils.ts\nexport function findPropertyInAstObject(\n node: any,\n propertyName: string\n): any | null {\n let maybeNode: any | null = null;\n for (const property of node.properties) {\n if (property.key.value == propertyName) {\n maybeNode = property.value;\n }\n }\n\n return maybeNode;\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/libs-version.js b/schematics-core/utility/libs-version.js
new file mode 100644
index 0000000..d17bb92
--- /dev/null
+++ b/schematics-core/utility/libs-version.js
@@ -0,0 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.platformVersion = void 0;
+exports.platformVersion = '^17.0.0-beta.0';
+//# sourceMappingURL=libs-version.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/libs-version.js.map b/schematics-core/utility/libs-version.js.map
new file mode 100644
index 0000000..6208aac
--- /dev/null
+++ b/schematics-core/utility/libs-version.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"libs-version.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/libs-version.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,gBAAgB,CAAC","sourcesContent":["export const platformVersion = '^17.0.0-beta.0';\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/ngrx-utils.js b/schematics-core/utility/ngrx-utils.js
new file mode 100644
index 0000000..b3e3f62
--- /dev/null
+++ b/schematics-core/utility/ngrx-utils.js
@@ -0,0 +1,248 @@
+"use strict";
+var __values = (this && this.__values) || function(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+};
+var __read = (this && this.__read) || function (o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+};
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getPrefix = exports.omit = exports.addReducerImportToNgModule = exports.addReducerToActionReducerMap = exports.addReducerToStateInterface = exports.addReducerToState = void 0;
+var ts = require("typescript");
+var stringUtils = require("./strings");
+var change_1 = require("./change");
+var schematics_1 = require("@angular-devkit/schematics");
+var core_1 = require("@angular-devkit/core");
+var find_module_1 = require("./find-module");
+var ast_utils_1 = require("./ast-utils");
+function addReducerToState(options) {
+ return function (host) {
+ var e_1, _a;
+ if (!options.reducers) {
+ return host;
+ }
+ var reducersPath = (0, core_1.normalize)("/".concat(options.path, "/").concat(options.reducers));
+ if (!host.exists(reducersPath)) {
+ throw new Error("Specified reducers path ".concat(reducersPath, " does not exist"));
+ }
+ var text = host.read(reducersPath);
+ if (text === null) {
+ throw new schematics_1.SchematicsException("File ".concat(reducersPath, " does not exist."));
+ }
+ var sourceText = text.toString('utf-8');
+ var source = ts.createSourceFile(reducersPath, sourceText, ts.ScriptTarget.Latest, true);
+ var reducerPath = "/".concat(options.path, "/") +
+ (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +
+ (options.group ? 'reducers/' : '') +
+ stringUtils.dasherize(options.name) +
+ '.reducer';
+ var relativePath = (0, find_module_1.buildRelativePath)(reducersPath, reducerPath);
+ var reducerImport = (0, ast_utils_1.insertImport)(source, reducersPath, "* as from".concat(stringUtils.classify(options.name)), relativePath, true);
+ var stateInterfaceInsert = addReducerToStateInterface(source, reducersPath, options);
+ var reducerMapInsert = addReducerToActionReducerMap(source, reducersPath, options);
+ var changes = [reducerImport, stateInterfaceInsert, reducerMapInsert];
+ var recorder = host.beginUpdate(reducersPath);
+ try {
+ for (var changes_1 = __values(changes), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
+ var change = changes_1_1.value;
+ if (change instanceof change_1.InsertChange) {
+ recorder.insertLeft(change.pos, change.toAdd);
+ }
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (changes_1_1 && !changes_1_1.done && (_a = changes_1.return)) _a.call(changes_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ host.commitUpdate(recorder);
+ return host;
+ };
+}
+exports.addReducerToState = addReducerToState;
+/**
+ * Insert the reducer into the first defined top level interface
+ */
+function addReducerToStateInterface(source, reducersPath, options) {
+ var stateInterface = source.statements.find(function (stm) { return stm.kind === ts.SyntaxKind.InterfaceDeclaration; });
+ var node = stateInterface;
+ if (!node) {
+ return new change_1.NoopChange();
+ }
+ var state = options.plural
+ ? stringUtils.pluralize(options.name)
+ : stringUtils.camelize(options.name);
+ var keyInsert = "[from".concat(stringUtils.classify(options.name), ".").concat(stringUtils.camelize(state), "FeatureKey]: from").concat(stringUtils.classify(options.name), ".State;");
+ var expr = node;
+ var position;
+ var toInsert;
+ if (expr.members.length === 0) {
+ position = expr.getEnd() - 1;
+ toInsert = " ".concat(keyInsert, "\n");
+ }
+ else {
+ node = expr.members[expr.members.length - 1];
+ position = node.getEnd() + 1;
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ var matches = text.match(/^\r?\n+(\s*)/);
+ if (matches && matches.length > 0) {
+ toInsert = "".concat(matches[1]).concat(keyInsert, "\n");
+ }
+ else {
+ toInsert = "\n".concat(keyInsert);
+ }
+ }
+ return new change_1.InsertChange(reducersPath, position, toInsert);
+}
+exports.addReducerToStateInterface = addReducerToStateInterface;
+/**
+ * Insert the reducer into the ActionReducerMap
+ */
+function addReducerToActionReducerMap(source, reducersPath, options) {
+ var initializer;
+ var actionReducerMap = source.statements
+ .filter(function (stm) { return stm.kind === ts.SyntaxKind.VariableStatement; })
+ .filter(function (stm) { return !!stm.declarationList; })
+ .map(function (stm) {
+ var declarations = stm.declarationList.declarations;
+ var variable = declarations.find(function (decl) { return decl.kind === ts.SyntaxKind.VariableDeclaration; });
+ var type = variable ? variable.type : {};
+ return { initializer: variable.initializer, type: type };
+ })
+ .filter(function (initWithType) { return initWithType.type !== undefined; })
+ .find(function (_a) {
+ var type = _a.type;
+ return type.typeName.text === 'ActionReducerMap';
+ });
+ if (!actionReducerMap || !actionReducerMap.initializer) {
+ return new change_1.NoopChange();
+ }
+ var node = actionReducerMap.initializer;
+ var state = options.plural
+ ? stringUtils.pluralize(options.name)
+ : stringUtils.camelize(options.name);
+ var keyInsert = "[from".concat(stringUtils.classify(options.name), ".").concat(stringUtils.camelize(state), "FeatureKey]: from").concat(stringUtils.classify(options.name), ".reducer,");
+ var expr = node;
+ var position;
+ var toInsert;
+ if (expr.properties.length === 0) {
+ position = expr.getEnd() - 1;
+ toInsert = " ".concat(keyInsert, "\n");
+ }
+ else {
+ node = expr.properties[expr.properties.length - 1];
+ position = node.getEnd() + 1;
+ // Get the indentation of the last element, if any.
+ var text = node.getFullText(source);
+ var matches = text.match(/^\r?\n+(\s*)/);
+ if (matches && matches.length > 0) {
+ toInsert = "\n".concat(matches[1]).concat(keyInsert);
+ }
+ else {
+ toInsert = "\n".concat(keyInsert);
+ }
+ }
+ return new change_1.InsertChange(reducersPath, position, toInsert);
+}
+exports.addReducerToActionReducerMap = addReducerToActionReducerMap;
+/**
+ * Add reducer feature to NgModule
+ */
+function addReducerImportToNgModule(options) {
+ return function (host) {
+ var e_2, _a;
+ if (!options.module) {
+ return host;
+ }
+ var modulePath = options.module;
+ if (!host.exists(options.module)) {
+ throw new Error("Specified module path ".concat(modulePath, " does not exist"));
+ }
+ var text = host.read(modulePath);
+ if (text === null) {
+ throw new schematics_1.SchematicsException("File ".concat(modulePath, " does not exist."));
+ }
+ var sourceText = text.toString('utf-8');
+ var source = ts.createSourceFile(modulePath, sourceText, ts.ScriptTarget.Latest, true);
+ var commonImports = [
+ (0, ast_utils_1.insertImport)(source, modulePath, 'StoreModule', '@ngrx/store'),
+ ];
+ var reducerPath = "/".concat(options.path, "/") +
+ (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +
+ (options.group ? 'reducers/' : '') +
+ stringUtils.dasherize(options.name) +
+ '.reducer';
+ var relativePath = (0, find_module_1.buildRelativePath)(modulePath, reducerPath);
+ var reducerImport = (0, ast_utils_1.insertImport)(source, modulePath, "* as from".concat(stringUtils.classify(options.name)), relativePath, true);
+ var state = options.plural
+ ? stringUtils.pluralize(options.name)
+ : stringUtils.camelize(options.name);
+ var _b = __read((0, ast_utils_1.addImportToModule)(source, modulePath, "StoreModule.forFeature(from".concat(stringUtils.classify(options.name), ".").concat(state, "FeatureKey, from").concat(stringUtils.classify(options.name), ".reducer)"), relativePath), 1), storeNgModuleImport = _b[0];
+ var changes = __spreadArray(__spreadArray([], __read(commonImports), false), [reducerImport, storeNgModuleImport], false);
+ var recorder = host.beginUpdate(modulePath);
+ try {
+ for (var changes_2 = __values(changes), changes_2_1 = changes_2.next(); !changes_2_1.done; changes_2_1 = changes_2.next()) {
+ var change = changes_2_1.value;
+ if (change instanceof change_1.InsertChange) {
+ recorder.insertLeft(change.pos, change.toAdd);
+ }
+ }
+ }
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
+ finally {
+ try {
+ if (changes_2_1 && !changes_2_1.done && (_a = changes_2.return)) _a.call(changes_2);
+ }
+ finally { if (e_2) throw e_2.error; }
+ }
+ host.commitUpdate(recorder);
+ return host;
+ };
+}
+exports.addReducerImportToNgModule = addReducerImportToNgModule;
+function omit(object, keyToRemove) {
+ return Object.keys(object)
+ .filter(function (key) { return key !== keyToRemove; })
+ .reduce(function (result, key) {
+ var _a;
+ return Object.assign(result, (_a = {}, _a[key] = object[key], _a));
+ }, {});
+}
+exports.omit = omit;
+function getPrefix(options) {
+ return stringUtils.camelize(options.prefix || 'load');
+}
+exports.getPrefix = getPrefix;
+//# sourceMappingURL=ngrx-utils.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/ngrx-utils.js.map b/schematics-core/utility/ngrx-utils.js.map
new file mode 100644
index 0000000..ac3d31d
--- /dev/null
+++ b/schematics-core/utility/ngrx-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ngrx-utils.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/ngrx-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\nimport * as stringUtils from './strings';\nimport { InsertChange, Change, NoopChange } from './change';\nimport { Tree, SchematicsException, Rule } from '@angular-devkit/schematics';\nimport { normalize } from '@angular-devkit/core';\nimport { buildRelativePath } from './find-module';\nimport { addImportToModule, insertImport } from './ast-utils';\n\nexport function addReducerToState(options: any): Rule {\n return (host: Tree) => {\n if (!options.reducers) {\n return host;\n }\n\n const reducersPath = normalize(`/${options.path}/${options.reducers}`);\n\n if (!host.exists(reducersPath)) {\n throw new Error(`Specified reducers path ${reducersPath} does not exist`);\n }\n\n const text = host.read(reducersPath);\n if (text === null) {\n throw new SchematicsException(`File ${reducersPath} does not exist.`);\n }\n\n const sourceText = text.toString('utf-8');\n\n const source = ts.createSourceFile(\n reducersPath,\n sourceText,\n ts.ScriptTarget.Latest,\n true\n );\n\n const reducerPath =\n `/${options.path}/` +\n (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +\n (options.group ? 'reducers/' : '') +\n stringUtils.dasherize(options.name) +\n '.reducer';\n\n const relativePath = buildRelativePath(reducersPath, reducerPath);\n const reducerImport = insertImport(\n source,\n reducersPath,\n `* as from${stringUtils.classify(options.name)}`,\n relativePath,\n true\n );\n\n const stateInterfaceInsert = addReducerToStateInterface(\n source,\n reducersPath,\n options\n );\n const reducerMapInsert = addReducerToActionReducerMap(\n source,\n reducersPath,\n options\n );\n\n const changes = [reducerImport, stateInterfaceInsert, reducerMapInsert];\n const recorder = host.beginUpdate(reducersPath);\n for (const change of changes) {\n if (change instanceof InsertChange) {\n recorder.insertLeft(change.pos, change.toAdd);\n }\n }\n host.commitUpdate(recorder);\n\n return host;\n };\n}\n\n/**\n * Insert the reducer into the first defined top level interface\n */\nexport function addReducerToStateInterface(\n source: ts.SourceFile,\n reducersPath: string,\n options: { name: string; plural: boolean }\n): Change {\n const stateInterface = source.statements.find(\n (stm) => stm.kind === ts.SyntaxKind.InterfaceDeclaration\n );\n let node = stateInterface as ts.Statement;\n\n if (!node) {\n return new NoopChange();\n }\n\n const state = options.plural\n ? stringUtils.pluralize(options.name)\n : stringUtils.camelize(options.name);\n\n const keyInsert = `[from${stringUtils.classify(\n options.name\n )}.${stringUtils.camelize(state)}FeatureKey]: from${stringUtils.classify(\n options.name\n )}.State;`;\n const expr = node as any;\n let position;\n let toInsert;\n\n if (expr.members.length === 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${keyInsert}\\n`;\n } else {\n node = expr.members[expr.members.length - 1];\n position = node.getEnd() + 1;\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n const matches = text.match(/^\\r?\\n+(\\s*)/);\n\n if (matches && matches.length > 0) {\n toInsert = `${matches[1]}${keyInsert}\\n`;\n } else {\n toInsert = `\\n${keyInsert}`;\n }\n }\n\n return new InsertChange(reducersPath, position, toInsert);\n}\n\n/**\n * Insert the reducer into the ActionReducerMap\n */\nexport function addReducerToActionReducerMap(\n source: ts.SourceFile,\n reducersPath: string,\n options: { name: string; plural: boolean }\n): Change {\n let initializer: any;\n const actionReducerMap: any = source.statements\n .filter((stm) => stm.kind === ts.SyntaxKind.VariableStatement)\n .filter((stm: any) => !!stm.declarationList)\n .map((stm: any) => {\n const {\n declarations,\n }: {\n declarations: ts.SyntaxKind.VariableDeclarationList[];\n } = stm.declarationList;\n const variable: any = declarations.find(\n (decl: any) => decl.kind === ts.SyntaxKind.VariableDeclaration\n );\n const type = variable ? variable.type : {};\n\n return { initializer: variable.initializer, type };\n })\n .filter((initWithType) => initWithType.type !== undefined)\n .find(({ type }) => type.typeName.text === 'ActionReducerMap');\n\n if (!actionReducerMap || !actionReducerMap.initializer) {\n return new NoopChange();\n }\n\n let node = actionReducerMap.initializer;\n\n const state = options.plural\n ? stringUtils.pluralize(options.name)\n : stringUtils.camelize(options.name);\n\n const keyInsert = `[from${stringUtils.classify(\n options.name\n )}.${stringUtils.camelize(state)}FeatureKey]: from${stringUtils.classify(\n options.name\n )}.reducer,`;\n const expr = node as any;\n let position;\n let toInsert;\n\n if (expr.properties.length === 0) {\n position = expr.getEnd() - 1;\n toInsert = ` ${keyInsert}\\n`;\n } else {\n node = expr.properties[expr.properties.length - 1];\n position = node.getEnd() + 1;\n // Get the indentation of the last element, if any.\n const text = node.getFullText(source);\n const matches = text.match(/^\\r?\\n+(\\s*)/);\n\n if (matches && matches.length > 0) {\n toInsert = `\\n${matches[1]}${keyInsert}`;\n } else {\n toInsert = `\\n${keyInsert}`;\n }\n }\n\n return new InsertChange(reducersPath, position, toInsert);\n}\n\n/**\n * Add reducer feature to NgModule\n */\nexport function addReducerImportToNgModule(options: any): Rule {\n return (host: Tree) => {\n if (!options.module) {\n return host;\n }\n\n const modulePath = options.module;\n if (!host.exists(options.module)) {\n throw new Error(`Specified module path ${modulePath} does not exist`);\n }\n\n const text = host.read(modulePath);\n if (text === null) {\n throw new SchematicsException(`File ${modulePath} does not exist.`);\n }\n const sourceText = text.toString('utf-8');\n\n const source = ts.createSourceFile(\n modulePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true\n );\n\n const commonImports = [\n insertImport(source, modulePath, 'StoreModule', '@ngrx/store'),\n ];\n\n const reducerPath =\n `/${options.path}/` +\n (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +\n (options.group ? 'reducers/' : '') +\n stringUtils.dasherize(options.name) +\n '.reducer';\n const relativePath = buildRelativePath(modulePath, reducerPath);\n const reducerImport = insertImport(\n source,\n modulePath,\n `* as from${stringUtils.classify(options.name)}`,\n relativePath,\n true\n );\n const state = options.plural\n ? stringUtils.pluralize(options.name)\n : stringUtils.camelize(options.name);\n const [storeNgModuleImport] = addImportToModule(\n source,\n modulePath,\n `StoreModule.forFeature(from${stringUtils.classify(\n options.name\n )}.${state}FeatureKey, from${stringUtils.classify(\n options.name\n )}.reducer)`,\n relativePath\n );\n const changes = [...commonImports, reducerImport, storeNgModuleImport];\n const recorder = host.beginUpdate(modulePath);\n for (const change of changes) {\n if (change instanceof InsertChange) {\n recorder.insertLeft(change.pos, change.toAdd);\n }\n }\n host.commitUpdate(recorder);\n\n return host;\n };\n}\n\nexport function omit(\n object: T,\n keyToRemove: keyof T\n): Partial {\n return Object.keys(object)\n .filter((key) => key !== keyToRemove)\n .reduce((result, key) => Object.assign(result, { [key]: object[key] }), {});\n}\n\nexport function getPrefix(options: { prefix?: string }) {\n return stringUtils.camelize(options.prefix || 'load');\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/package.js b/schematics-core/utility/package.js
new file mode 100644
index 0000000..f4b00c1
--- /dev/null
+++ b/schematics-core/utility/package.js
@@ -0,0 +1,23 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.addPackageToPackageJson = void 0;
+/**
+ * Adds a package to the package.json
+ */
+function addPackageToPackageJson(host, type, pkg, version) {
+ var _a, _b;
+ if (host.exists('package.json')) {
+ var sourceText = (_b = (_a = host.read('package.json')) === null || _a === void 0 ? void 0 : _a.toString('utf-8')) !== null && _b !== void 0 ? _b : '{}';
+ var json = JSON.parse(sourceText);
+ if (!json[type]) {
+ json[type] = {};
+ }
+ if (!json[type][pkg]) {
+ json[type][pkg] = version;
+ }
+ host.overwrite('package.json', JSON.stringify(json, null, 2));
+ }
+ return host;
+}
+exports.addPackageToPackageJson = addPackageToPackageJson;
+//# sourceMappingURL=package.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/package.js.map b/schematics-core/utility/package.js.map
new file mode 100644
index 0000000..43eb3ab
--- /dev/null
+++ b/schematics-core/utility/package.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/package.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,SAAgB,uBAAuB,CACrC,IAAU,EACV,IAAY,EACZ,GAAW,EACX,OAAe;;IAEf,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;QAC/B,IAAM,UAAU,GAAG,MAAA,MAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,0CAAE,QAAQ,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAC;QACxE,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SACjB;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SAC3B;QAED,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KAC/D;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AArBD,0DAqBC","sourcesContent":["import { Tree } from '@angular-devkit/schematics';\n\n/**\n * Adds a package to the package.json\n */\nexport function addPackageToPackageJson(\n host: Tree,\n type: string,\n pkg: string,\n version: string\n): Tree {\n if (host.exists('package.json')) {\n const sourceText = host.read('package.json')?.toString('utf-8') ?? '{}';\n const json = JSON.parse(sourceText);\n if (!json[type]) {\n json[type] = {};\n }\n\n if (!json[type][pkg]) {\n json[type][pkg] = version;\n }\n\n host.overwrite('package.json', JSON.stringify(json, null, 2));\n }\n\n return host;\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/parse-name.js b/schematics-core/utility/parse-name.js
new file mode 100644
index 0000000..2cfb8e1
--- /dev/null
+++ b/schematics-core/utility/parse-name.js
@@ -0,0 +1,14 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseName = void 0;
+var core_1 = require("@angular-devkit/core");
+function parseName(path, name) {
+ var nameWithoutPath = (0, core_1.basename)(name);
+ var namePath = (0, core_1.dirname)((path + '/' + name));
+ return {
+ name: nameWithoutPath,
+ path: (0, core_1.normalize)('/' + namePath),
+ };
+}
+exports.parseName = parseName;
+//# sourceMappingURL=parse-name.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/parse-name.js.map b/schematics-core/utility/parse-name.js.map
new file mode 100644
index 0000000..0ff9693
--- /dev/null
+++ b/schematics-core/utility/parse-name.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"parse-name.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/parse-name.ts"],"names":[],"mappings":";;;AAAA,6CAA0E;AAO1E,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,IAAM,eAAe,GAAG,IAAA,eAAQ,EAAC,IAAY,CAAC,CAAC;IAC/C,IAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAS,CAAC,CAAC;IAEtD,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,IAAA,gBAAS,EAAC,GAAG,GAAG,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AARD,8BAQC","sourcesContent":["import { Path, basename, dirname, normalize } from '@angular-devkit/core';\n\nexport interface Location {\n name: string;\n path: Path;\n}\n\nexport function parseName(path: string, name: string): Location {\n const nameWithoutPath = basename(name as Path);\n const namePath = dirname((path + '/' + name) as Path);\n\n return {\n name: nameWithoutPath,\n path: normalize('/' + namePath),\n };\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/project.js b/schematics-core/utility/project.js
new file mode 100644
index 0000000..3404503
--- /dev/null
+++ b/schematics-core/utility/project.js
@@ -0,0 +1,48 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getProjectMainFile = exports.isLib = exports.getProjectPath = exports.getProject = void 0;
+var config_1 = require("./config");
+var schematics_1 = require("@angular-devkit/schematics");
+function getProject(host, options) {
+ var workspace = (0, config_1.getWorkspace)(host);
+ if (!options.project) {
+ var defaultProject = workspace
+ .defaultProject;
+ options.project =
+ defaultProject !== undefined
+ ? defaultProject
+ : Object.keys(workspace.projects)[0];
+ }
+ return workspace.projects[options.project];
+}
+exports.getProject = getProject;
+function getProjectPath(host, options) {
+ var project = getProject(host, options);
+ if (project.root.slice(-1) === '/') {
+ project.root = project.root.substring(0, project.root.length - 1);
+ }
+ if (options.path === undefined) {
+ var projectDirName = project.projectType === 'application' ? 'app' : 'lib';
+ return "".concat(project.root ? "/".concat(project.root) : '', "/src/").concat(projectDirName);
+ }
+ return options.path;
+}
+exports.getProjectPath = getProjectPath;
+function isLib(host, options) {
+ var project = getProject(host, options);
+ return project.projectType === 'library';
+}
+exports.isLib = isLib;
+function getProjectMainFile(host, options) {
+ if (isLib(host, options)) {
+ throw new schematics_1.SchematicsException("Invalid project type");
+ }
+ var project = getProject(host, options);
+ var projectOptions = project.architect['build'].options;
+ if (!(projectOptions === null || projectOptions === void 0 ? void 0 : projectOptions.main) && !(projectOptions === null || projectOptions === void 0 ? void 0 : projectOptions.browser)) {
+ throw new schematics_1.SchematicsException("Could not find the main file ".concat(project));
+ }
+ return (projectOptions.browser || projectOptions.main);
+}
+exports.getProjectMainFile = getProjectMainFile;
+//# sourceMappingURL=project.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/project.js.map b/schematics-core/utility/project.js.map
new file mode 100644
index 0000000..d5e87f4
--- /dev/null
+++ b/schematics-core/utility/project.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/project.ts"],"names":[],"mappings":";;;AACA,mCAAwC;AACxC,yDAAuE;AAUvE,SAAgB,UAAU,CACxB,IAAU,EACV,OAAoE;IAEpE,IAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACpB,IAAM,cAAc,GAAI,SAAyC;aAC9D,cAAc,CAAC;QAClB,OAAO,CAAC,OAAO;YACb,cAAc,KAAK,SAAS;gBAC1B,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1C;IAED,OAAO,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAhBD,gCAgBC;AAED,SAAgB,cAAc,CAC5B,IAAU,EACV,OAAoE;IAEpE,IAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QAClC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KACnE;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;QAC9B,IAAM,cAAc,GAClB,OAAO,CAAC,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAExD,OAAO,UAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAI,OAAO,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,EAAE,kBAAQ,cAAc,CAAE,CAAC;KAC1E;IAED,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAlBD,wCAkBC;AAED,SAAgB,KAAK,CACnB,IAAU,EACV,OAAoE;IAEpE,IAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC;AAC3C,CAAC;AAPD,sBAOC;AAED,SAAgB,kBAAkB,CAChC,IAAU,EACV,OAAoE;IAEpE,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;QACxB,MAAM,IAAI,gCAAmB,CAAC,sBAAsB,CAAC,CAAC;KACvD;IACD,IAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IAE1D,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAA,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,OAAO,CAAA,EAAE;QACrD,MAAM,IAAI,gCAAmB,CAAC,uCAAgC,OAAO,CAAE,CAAC,CAAC;KAC1E;IAED,OAAO,CAAC,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,CAAW,CAAC;AACnE,CAAC;AAfD,gDAeC","sourcesContent":["import { TargetDefinition } from '@angular-devkit/core/src/workspace';\nimport { getWorkspace } from './config';\nimport { SchematicsException, Tree } from '@angular-devkit/schematics';\n\nexport interface WorkspaceProject {\n root: string;\n projectType: string;\n architect: {\n [key: string]: TargetDefinition;\n };\n}\n\nexport function getProject(\n host: Tree,\n options: { project?: string | undefined; path?: string | undefined }\n): WorkspaceProject {\n const workspace = getWorkspace(host);\n\n if (!options.project) {\n const defaultProject = (workspace as { defaultProject?: string })\n .defaultProject;\n options.project =\n defaultProject !== undefined\n ? defaultProject\n : Object.keys(workspace.projects)[0];\n }\n\n return workspace.projects[options.project];\n}\n\nexport function getProjectPath(\n host: Tree,\n options: { project?: string | undefined; path?: string | undefined }\n) {\n const project = getProject(host, options);\n\n if (project.root.slice(-1) === '/') {\n project.root = project.root.substring(0, project.root.length - 1);\n }\n\n if (options.path === undefined) {\n const projectDirName =\n project.projectType === 'application' ? 'app' : 'lib';\n\n return `${project.root ? `/${project.root}` : ''}/src/${projectDirName}`;\n }\n\n return options.path;\n}\n\nexport function isLib(\n host: Tree,\n options: { project?: string | undefined; path?: string | undefined }\n) {\n const project = getProject(host, options);\n\n return project.projectType === 'library';\n}\n\nexport function getProjectMainFile(\n host: Tree,\n options: { project?: string | undefined; path?: string | undefined }\n) {\n if (isLib(host, options)) {\n throw new SchematicsException(`Invalid project type`);\n }\n const project = getProject(host, options);\n const projectOptions = project.architect['build'].options;\n\n if (!projectOptions?.main && !projectOptions?.browser) {\n throw new SchematicsException(`Could not find the main file ${project}`);\n }\n\n return (projectOptions.browser || projectOptions.main) as string;\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/strings.js b/schematics-core/utility/strings.js
new file mode 100644
index 0000000..f3ff308
--- /dev/null
+++ b/schematics-core/utility/strings.js
@@ -0,0 +1,138 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.featurePath = exports.group = exports.pluralize = exports.capitalize = exports.underscore = exports.classify = exports.camelize = exports.dasherize = exports.decamelize = void 0;
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var STRING_DASHERIZE_REGEXP = /[ _]/g;
+var STRING_DECAMELIZE_REGEXP = /([a-z\d])([A-Z])/g;
+var STRING_CAMELIZE_REGEXP = /(-|_|\.|\s)+(.)?/g;
+var STRING_UNDERSCORE_REGEXP_1 = /([a-z\d])([A-Z]+)/g;
+var STRING_UNDERSCORE_REGEXP_2 = /-|\s+/g;
+/**
+ * Converts a camelized string into all lower case separated by underscores.
+ *
+ ```javascript
+ decamelize('innerHTML'); // 'inner_html'
+ decamelize('action_name'); // 'action_name'
+ decamelize('css-class-name'); // 'css-class-name'
+ decamelize('my favorite items'); // 'my favorite items'
+ ```
+ */
+function decamelize(str) {
+ return str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
+}
+exports.decamelize = decamelize;
+/**
+ Replaces underscores, spaces, or camelCase with dashes.
+
+ ```javascript
+ dasherize('innerHTML'); // 'inner-html'
+ dasherize('action_name'); // 'action-name'
+ dasherize('css-class-name'); // 'css-class-name'
+ dasherize('my favorite items'); // 'my-favorite-items'
+ ```
+ */
+function dasherize(str) {
+ return decamelize(str || '').replace(STRING_DASHERIZE_REGEXP, '-');
+}
+exports.dasherize = dasherize;
+/**
+ Returns the lowerCamelCase form of a string.
+
+ ```javascript
+ camelize('innerHTML'); // 'innerHTML'
+ camelize('action_name'); // 'actionName'
+ camelize('css-class-name'); // 'cssClassName'
+ camelize('my favorite items'); // 'myFavoriteItems'
+ camelize('My Favorite Items'); // 'myFavoriteItems'
+ ```
+ */
+function camelize(str) {
+ return str
+ .replace(STRING_CAMELIZE_REGEXP, function (_match, _separator, chr) {
+ return chr ? chr.toUpperCase() : '';
+ })
+ .replace(/^([A-Z])/, function (match) { return match.toLowerCase(); });
+}
+exports.camelize = camelize;
+/**
+ Returns the UpperCamelCase form of a string.
+
+ ```javascript
+ 'innerHTML'.classify(); // 'InnerHTML'
+ 'action_name'.classify(); // 'ActionName'
+ 'css-class-name'.classify(); // 'CssClassName'
+ 'my favorite items'.classify(); // 'MyFavoriteItems'
+ ```
+ */
+function classify(str) {
+ return str
+ .split('.')
+ .map(function (part) { return capitalize(camelize(part)); })
+ .join('.');
+}
+exports.classify = classify;
+/**
+ More general than decamelize. Returns the lower\_case\_and\_underscored
+ form of a string.
+
+ ```javascript
+ 'innerHTML'.underscore(); // 'inner_html'
+ 'action_name'.underscore(); // 'action_name'
+ 'css-class-name'.underscore(); // 'css_class_name'
+ 'my favorite items'.underscore(); // 'my_favorite_items'
+ ```
+ */
+function underscore(str) {
+ return str
+ .replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2')
+ .replace(STRING_UNDERSCORE_REGEXP_2, '_')
+ .toLowerCase();
+}
+exports.underscore = underscore;
+/**
+ Returns the Capitalized form of a string
+
+ ```javascript
+ 'innerHTML'.capitalize() // 'InnerHTML'
+ 'action_name'.capitalize() // 'Action_name'
+ 'css-class-name'.capitalize() // 'Css-class-name'
+ 'my favorite items'.capitalize() // 'My favorite items'
+ ```
+ */
+function capitalize(str) {
+ return str.charAt(0).toUpperCase() + str.substring(1);
+}
+exports.capitalize = capitalize;
+/**
+ Returns the plural form of a string
+
+ ```javascript
+ 'innerHTML'.pluralize() // 'innerHTMLs'
+ 'action_name'.pluralize() // 'actionNames'
+ 'css-class-name'.pluralize() // 'cssClassNames'
+ 'regex'.pluralize() // 'regexes'
+ 'user'.pluralize() // 'users'
+ ```
+ */
+function pluralize(str) {
+ return camelize([/([^aeiou])y$/, /()fe?$/, /([^aeiou]o|[sxz]|[cs]h)$/].map(function (c, i) { return (str = str.replace(c, "$1".concat('iv'[i] || '', "e"))); }) && str + 's');
+}
+exports.pluralize = pluralize;
+function group(name, group) {
+ return group ? "".concat(group, "/").concat(name) : name;
+}
+exports.group = group;
+function featurePath(group, flat, path, name) {
+ if (group && !flat) {
+ return "../../".concat(path, "/").concat(name, "/");
+ }
+ return group ? "../".concat(path, "/") : './';
+}
+exports.featurePath = featurePath;
+//# sourceMappingURL=strings.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/strings.js.map b/schematics-core/utility/strings.js.map
new file mode 100644
index 0000000..fee6654
--- /dev/null
+++ b/schematics-core/utility/strings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/strings.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,IAAM,uBAAuB,GAAG,OAAO,CAAC;AACxC,IAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,IAAM,sBAAsB,GAAG,mBAAmB,CAAC;AACnD,IAAM,0BAA0B,GAAG,oBAAoB,CAAC;AACxD,IAAM,0BAA0B,GAAG,QAAQ,CAAC;AAE5C;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACtE,CAAC;AAFD,gCAEC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,GAAY;IACpC,OAAO,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC;AAFD,8BAEC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG;SACP,OAAO,CACN,sBAAsB,EACtB,UAAC,MAAc,EAAE,UAAkB,EAAE,GAAW;QAC9C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC,CACF;SACA,OAAO,CAAC,UAAU,EAAE,UAAC,KAAa,IAAK,OAAA,KAAK,CAAC,WAAW,EAAE,EAAnB,CAAmB,CAAC,CAAC;AACjE,CAAC;AATD,4BASC;AAED;;;;;;;;;GASG;AACH,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAA1B,CAA0B,CAAC;SACzC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AALD,4BAKC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,OAAO,CAAC,0BAA0B,EAAE,OAAO,CAAC;SAC5C,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,WAAW,EAAE,CAAC;AACnB,CAAC;AALD,gCAKC;AAED;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAFD,gCAEC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,QAAQ,CACb,CAAC,cAAc,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC,GAAG,CACxD,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,YAAK,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAG,CAAC,CAAC,EAA7C,CAA6C,CACxD,IAAI,GAAG,GAAG,GAAG,CACf,CAAC;AACJ,CAAC;AAND,8BAMC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,KAAyB;IAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,UAAG,KAAK,cAAI,IAAI,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAFD,sBAEC;AAED,SAAgB,WAAW,CACzB,KAA0B,EAC1B,IAAyB,EACzB,IAAY,EACZ,IAAY;IAEZ,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;QAClB,OAAO,gBAAS,IAAI,cAAI,IAAI,MAAG,CAAC;KACjC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,aAAM,IAAI,MAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAXD,kCAWC","sourcesContent":["/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst STRING_DASHERIZE_REGEXP = /[ _]/g;\nconst STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\nconst STRING_CAMELIZE_REGEXP = /(-|_|\\.|\\s)+(.)?/g;\nconst STRING_UNDERSCORE_REGEXP_1 = /([a-z\\d])([A-Z]+)/g;\nconst STRING_UNDERSCORE_REGEXP_2 = /-|\\s+/g;\n\n/**\n * Converts a camelized string into all lower case separated by underscores.\n *\n ```javascript\n decamelize('innerHTML'); // 'inner_html'\n decamelize('action_name'); // 'action_name'\n decamelize('css-class-name'); // 'css-class-name'\n decamelize('my favorite items'); // 'my favorite items'\n ```\n */\nexport function decamelize(str: string): string {\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase();\n}\n\n/**\n Replaces underscores, spaces, or camelCase with dashes.\n\n ```javascript\n dasherize('innerHTML'); // 'inner-html'\n dasherize('action_name'); // 'action-name'\n dasherize('css-class-name'); // 'css-class-name'\n dasherize('my favorite items'); // 'my-favorite-items'\n ```\n */\nexport function dasherize(str?: string): string {\n return decamelize(str || '').replace(STRING_DASHERIZE_REGEXP, '-');\n}\n\n/**\n Returns the lowerCamelCase form of a string.\n\n ```javascript\n camelize('innerHTML'); // 'innerHTML'\n camelize('action_name'); // 'actionName'\n camelize('css-class-name'); // 'cssClassName'\n camelize('my favorite items'); // 'myFavoriteItems'\n camelize('My Favorite Items'); // 'myFavoriteItems'\n ```\n */\nexport function camelize(str: string): string {\n return str\n .replace(\n STRING_CAMELIZE_REGEXP,\n (_match: string, _separator: string, chr: string) => {\n return chr ? chr.toUpperCase() : '';\n }\n )\n .replace(/^([A-Z])/, (match: string) => match.toLowerCase());\n}\n\n/**\n Returns the UpperCamelCase form of a string.\n\n ```javascript\n 'innerHTML'.classify(); // 'InnerHTML'\n 'action_name'.classify(); // 'ActionName'\n 'css-class-name'.classify(); // 'CssClassName'\n 'my favorite items'.classify(); // 'MyFavoriteItems'\n ```\n */\nexport function classify(str: string): string {\n return str\n .split('.')\n .map((part) => capitalize(camelize(part)))\n .join('.');\n}\n\n/**\n More general than decamelize. Returns the lower\\_case\\_and\\_underscored\n form of a string.\n\n ```javascript\n 'innerHTML'.underscore(); // 'inner_html'\n 'action_name'.underscore(); // 'action_name'\n 'css-class-name'.underscore(); // 'css_class_name'\n 'my favorite items'.underscore(); // 'my_favorite_items'\n ```\n */\nexport function underscore(str: string): string {\n return str\n .replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2')\n .replace(STRING_UNDERSCORE_REGEXP_2, '_')\n .toLowerCase();\n}\n\n/**\n Returns the Capitalized form of a string\n\n ```javascript\n 'innerHTML'.capitalize() // 'InnerHTML'\n 'action_name'.capitalize() // 'Action_name'\n 'css-class-name'.capitalize() // 'Css-class-name'\n 'my favorite items'.capitalize() // 'My favorite items'\n ```\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.substring(1);\n}\n\n/**\n Returns the plural form of a string\n\n ```javascript\n 'innerHTML'.pluralize() // 'innerHTMLs'\n 'action_name'.pluralize() // 'actionNames'\n 'css-class-name'.pluralize() // 'cssClassNames'\n 'regex'.pluralize() // 'regexes'\n 'user'.pluralize() // 'users'\n ```\n */\nexport function pluralize(str: string): string {\n return camelize(\n [/([^aeiou])y$/, /()fe?$/, /([^aeiou]o|[sxz]|[cs]h)$/].map(\n (c, i) => (str = str.replace(c, `$1${'iv'[i] || ''}e`))\n ) && str + 's'\n );\n}\n\nexport function group(name: string, group: string | undefined) {\n return group ? `${group}/${name}` : name;\n}\n\nexport function featurePath(\n group: boolean | undefined,\n flat: boolean | undefined,\n path: string,\n name: string\n) {\n if (group && !flat) {\n return `../../${path}/${name}/`;\n }\n\n return group ? `../${path}/` : './';\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/update.js b/schematics-core/utility/update.js
new file mode 100644
index 0000000..dd0d531
--- /dev/null
+++ b/schematics-core/utility/update.js
@@ -0,0 +1,34 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.updatePackage = void 0;
+var schematics_1 = require("@angular-devkit/schematics");
+function updatePackage(name) {
+ return function (tree, context) {
+ var pkgPath = '/package.json';
+ var buffer = tree.read(pkgPath);
+ if (buffer === null) {
+ throw new schematics_1.SchematicsException('Could not read package.json');
+ }
+ var content = buffer.toString();
+ var pkg = JSON.parse(content);
+ if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) {
+ throw new schematics_1.SchematicsException('Error reading package.json');
+ }
+ var dependencyCategories = ['dependencies', 'devDependencies'];
+ dependencyCategories.forEach(function (category) {
+ var packageName = "@ngrx/".concat(name);
+ if (pkg[category] && pkg[category][packageName]) {
+ var firstChar = pkg[category][packageName][0];
+ var suffix = match(firstChar, '^') || match(firstChar, '~');
+ pkg[category][packageName] = "".concat(suffix, "6.0.0");
+ }
+ });
+ tree.overwrite(pkgPath, JSON.stringify(pkg, null, 2));
+ return tree;
+ };
+}
+exports.updatePackage = updatePackage;
+function match(value, test) {
+ return value === test ? test : '';
+}
+//# sourceMappingURL=update.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/update.js.map b/schematics-core/utility/update.js.map
new file mode 100644
index 0000000..d4499e5
--- /dev/null
+++ b/schematics-core/utility/update.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/update.ts"],"names":[],"mappings":";;;AAAA,yDAKoC;AAEpC,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,UAAC,IAAU,EAAE,OAAyB;QAC3C,IAAM,OAAO,GAAG,eAAe,CAAC;QAChC,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,gCAAmB,CAAC,6BAA6B,CAAC,CAAC;SAC9D;QACD,IAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjE,MAAM,IAAI,gCAAmB,CAAC,4BAA4B,CAAC,CAAC;SAC7D;QAED,IAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAEjE,oBAAoB,CAAC,OAAO,CAAC,UAAC,QAAQ;YACpC,IAAM,WAAW,GAAG,gBAAS,IAAI,CAAE,CAAC;YAEpC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE;gBAC/C,IAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,IAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAE9D,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,GAAG,UAAG,MAAM,UAAO,CAAC;aAC/C;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AA/BD,sCA+BC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAY;IACxC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import {\n Rule,\n SchematicContext,\n Tree,\n SchematicsException,\n} from '@angular-devkit/schematics';\n\nexport function updatePackage(name: string): Rule {\n return (tree: Tree, context: SchematicContext) => {\n const pkgPath = '/package.json';\n const buffer = tree.read(pkgPath);\n if (buffer === null) {\n throw new SchematicsException('Could not read package.json');\n }\n const content = buffer.toString();\n const pkg = JSON.parse(content);\n\n if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) {\n throw new SchematicsException('Error reading package.json');\n }\n\n const dependencyCategories = ['dependencies', 'devDependencies'];\n\n dependencyCategories.forEach((category) => {\n const packageName = `@ngrx/${name}`;\n\n if (pkg[category] && pkg[category][packageName]) {\n const firstChar = pkg[category][packageName][0];\n const suffix = match(firstChar, '^') || match(firstChar, '~');\n\n pkg[category][packageName] = `${suffix}6.0.0`;\n }\n });\n\n tree.overwrite(pkgPath, JSON.stringify(pkg, null, 2));\n\n return tree;\n };\n}\n\nfunction match(value: string, test: string) {\n return value === test ? test : '';\n}\n"]}
\ No newline at end of file
diff --git a/schematics-core/utility/visitors.js b/schematics-core/utility/visitors.js
new file mode 100644
index 0000000..56b6c7f
--- /dev/null
+++ b/schematics-core/utility/visitors.js
@@ -0,0 +1,250 @@
+"use strict";
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+var __values = (this && this.__values) || function(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+};
+var __read = (this && this.__read) || function (o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.visitDecorator = exports.visitNgModules = exports.visitComponents = exports.visitNgModuleExports = exports.visitNgModuleImports = exports.visitTemplates = exports.visitTSSourceFiles = void 0;
+var ts = require("typescript");
+var core_1 = require("@angular-devkit/core");
+function visitTSSourceFiles(tree, visitor) {
+ var e_1, _a;
+ var result = undefined;
+ try {
+ for (var _b = __values(visit(tree.root)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var sourceFile = _c.value;
+ result = visitor(sourceFile, tree, result);
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return result;
+}
+exports.visitTSSourceFiles = visitTSSourceFiles;
+function visitTemplates(tree, visitor) {
+ visitTSSourceFiles(tree, function (source) {
+ visitComponents(source, function (_, decoratorExpressionNode) {
+ ts.forEachChild(decoratorExpressionNode, function findTemplates(n) {
+ if (ts.isPropertyAssignment(n) && ts.isIdentifier(n.name)) {
+ if (n.name.text === 'template' &&
+ ts.isStringLiteralLike(n.initializer)) {
+ // Need to add an offset of one to the start because the template quotes are
+ // not part of the template content.
+ var templateStartIdx = n.initializer.getStart() + 1;
+ visitor({
+ fileName: source.fileName,
+ content: n.initializer.text,
+ inline: true,
+ start: templateStartIdx,
+ }, tree);
+ return;
+ }
+ else if (n.name.text === 'templateUrl' &&
+ ts.isStringLiteralLike(n.initializer)) {
+ var parts = (0, core_1.normalize)(source.fileName).split('/').slice(0, -1);
+ var templatePath = (0, core_1.resolve)((0, core_1.normalize)(parts.join('/')), (0, core_1.normalize)(n.initializer.text));
+ if (!tree.exists(templatePath)) {
+ return;
+ }
+ var fileContent = tree.read(templatePath);
+ if (!fileContent) {
+ return;
+ }
+ visitor({
+ fileName: templatePath,
+ content: fileContent.toString(),
+ inline: false,
+ start: 0,
+ }, tree);
+ return;
+ }
+ }
+ ts.forEachChild(n, findTemplates);
+ });
+ });
+ });
+}
+exports.visitTemplates = visitTemplates;
+function visitNgModuleImports(sourceFile, callback) {
+ visitNgModuleProperty(sourceFile, callback, 'imports');
+}
+exports.visitNgModuleImports = visitNgModuleImports;
+function visitNgModuleExports(sourceFile, callback) {
+ visitNgModuleProperty(sourceFile, callback, 'exports');
+}
+exports.visitNgModuleExports = visitNgModuleExports;
+function visitNgModuleProperty(sourceFile, callback, property) {
+ visitNgModules(sourceFile, function (_, decoratorExpressionNode) {
+ ts.forEachChild(decoratorExpressionNode, function findTemplates(n) {
+ if (ts.isPropertyAssignment(n) &&
+ ts.isIdentifier(n.name) &&
+ n.name.text === property &&
+ ts.isArrayLiteralExpression(n.initializer)) {
+ callback(n, n.initializer.elements);
+ return;
+ }
+ ts.forEachChild(n, findTemplates);
+ });
+ });
+}
+function visitComponents(sourceFile, callback) {
+ visitDecorator(sourceFile, 'Component', callback);
+}
+exports.visitComponents = visitComponents;
+function visitNgModules(sourceFile, callback) {
+ visitDecorator(sourceFile, 'NgModule', callback);
+}
+exports.visitNgModules = visitNgModules;
+function visitDecorator(sourceFile, decoratorName, callback) {
+ ts.forEachChild(sourceFile, function findClassDeclaration(node) {
+ if (!ts.isClassDeclaration(node)) {
+ ts.forEachChild(node, findClassDeclaration);
+ }
+ var classDeclarationNode = node;
+ var decorators = ts.getDecorators(classDeclarationNode);
+ if (!decorators || !decorators.length) {
+ return;
+ }
+ var componentDecorator = decorators.find(function (d) {
+ return (ts.isCallExpression(d.expression) &&
+ ts.isIdentifier(d.expression.expression) &&
+ d.expression.expression.text === decoratorName);
+ });
+ if (!componentDecorator) {
+ return;
+ }
+ var expression = componentDecorator.expression;
+ if (!ts.isCallExpression(expression)) {
+ return;
+ }
+ var _a = __read(expression.arguments, 1), arg = _a[0];
+ if (!arg || !ts.isObjectLiteralExpression(arg)) {
+ return;
+ }
+ callback(classDeclarationNode, arg);
+ });
+}
+exports.visitDecorator = visitDecorator;
+function visit(directory) {
+ var _a, _b, path, entry, content, source, e_2_1, _c, _d, path, e_3_1;
+ var e_2, _e, e_3, _f;
+ return __generator(this, function (_g) {
+ switch (_g.label) {
+ case 0:
+ _g.trys.push([0, 5, 6, 7]);
+ _a = __values(directory.subfiles), _b = _a.next();
+ _g.label = 1;
+ case 1:
+ if (!!_b.done) return [3 /*break*/, 4];
+ path = _b.value;
+ if (!(path.endsWith('.ts') && !path.endsWith('.d.ts'))) return [3 /*break*/, 3];
+ entry = directory.file(path);
+ if (!entry) return [3 /*break*/, 3];
+ content = entry.content;
+ source = ts.createSourceFile(entry.path, content.toString().replace(/^\uFEFF/, ''), ts.ScriptTarget.Latest, true);
+ return [4 /*yield*/, source];
+ case 2:
+ _g.sent();
+ _g.label = 3;
+ case 3:
+ _b = _a.next();
+ return [3 /*break*/, 1];
+ case 4: return [3 /*break*/, 7];
+ case 5:
+ e_2_1 = _g.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 7];
+ case 6:
+ try {
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 7:
+ _g.trys.push([7, 12, 13, 14]);
+ _c = __values(directory.subdirs), _d = _c.next();
+ _g.label = 8;
+ case 8:
+ if (!!_d.done) return [3 /*break*/, 11];
+ path = _d.value;
+ if (path === 'node_modules') {
+ return [3 /*break*/, 10];
+ }
+ return [5 /*yield**/, __values(visit(directory.dir(path)))];
+ case 9:
+ _g.sent();
+ _g.label = 10;
+ case 10:
+ _d = _c.next();
+ return [3 /*break*/, 8];
+ case 11: return [3 /*break*/, 14];
+ case 12:
+ e_3_1 = _g.sent();
+ e_3 = { error: e_3_1 };
+ return [3 /*break*/, 14];
+ case 13:
+ try {
+ if (_d && !_d.done && (_f = _c.return)) _f.call(_c);
+ }
+ finally { if (e_3) throw e_3.error; }
+ return [7 /*endfinally*/];
+ case 14: return [2 /*return*/];
+ }
+ });
+}
+//# sourceMappingURL=visitors.js.map
\ No newline at end of file
diff --git a/schematics-core/utility/visitors.js.map b/schematics-core/utility/visitors.js.map
new file mode 100644
index 0000000..15dad76
--- /dev/null
+++ b/schematics-core/utility/visitors.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics-core/utility/visitors.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\nimport { normalize, resolve } from '@angular-devkit/core';\nimport { Tree, DirEntry } from '@angular-devkit/schematics';\n\nexport function visitTSSourceFiles(\n tree: Tree,\n visitor: (\n sourceFile: ts.SourceFile,\n tree: Tree,\n result?: Result\n ) => Result | undefined\n): Result | undefined {\n let result: Result | undefined = undefined;\n for (const sourceFile of visit(tree.root)) {\n result = visitor(sourceFile, tree, result);\n }\n\n return result;\n}\n\nexport function visitTemplates(\n tree: Tree,\n visitor: (\n template: {\n fileName: string;\n content: string;\n inline: boolean;\n start: number;\n },\n tree: Tree\n ) => void\n): void {\n visitTSSourceFiles(tree, (source) => {\n visitComponents(source, (_, decoratorExpressionNode) => {\n ts.forEachChild(decoratorExpressionNode, function findTemplates(n) {\n if (ts.isPropertyAssignment(n) && ts.isIdentifier(n.name)) {\n if (\n n.name.text === 'template' &&\n ts.isStringLiteralLike(n.initializer)\n ) {\n // Need to add an offset of one to the start because the template quotes are\n // not part of the template content.\n const templateStartIdx = n.initializer.getStart() + 1;\n visitor(\n {\n fileName: source.fileName,\n content: n.initializer.text,\n inline: true,\n start: templateStartIdx,\n },\n tree\n );\n return;\n } else if (\n n.name.text === 'templateUrl' &&\n ts.isStringLiteralLike(n.initializer)\n ) {\n const parts = normalize(source.fileName).split('/').slice(0, -1);\n const templatePath = resolve(\n normalize(parts.join('/')),\n normalize(n.initializer.text)\n );\n if (!tree.exists(templatePath)) {\n return;\n }\n\n const fileContent = tree.read(templatePath);\n if (!fileContent) {\n return;\n }\n\n visitor(\n {\n fileName: templatePath,\n content: fileContent.toString(),\n inline: false,\n start: 0,\n },\n tree\n );\n return;\n }\n }\n\n ts.forEachChild(n, findTemplates);\n });\n });\n });\n}\n\nexport function visitNgModuleImports(\n sourceFile: ts.SourceFile,\n callback: (\n importNode: ts.PropertyAssignment,\n elementExpressions: ts.NodeArray\n ) => void\n) {\n visitNgModuleProperty(sourceFile, callback, 'imports');\n}\n\nexport function visitNgModuleExports(\n sourceFile: ts.SourceFile,\n callback: (\n exportNode: ts.PropertyAssignment,\n elementExpressions: ts.NodeArray\n ) => void\n) {\n visitNgModuleProperty(sourceFile, callback, 'exports');\n}\n\nfunction visitNgModuleProperty(\n sourceFile: ts.SourceFile,\n callback: (\n nodes: ts.PropertyAssignment,\n elementExpressions: ts.NodeArray\n ) => void,\n property: string\n) {\n visitNgModules(sourceFile, (_, decoratorExpressionNode) => {\n ts.forEachChild(decoratorExpressionNode, function findTemplates(n) {\n if (\n ts.isPropertyAssignment(n) &&\n ts.isIdentifier(n.name) &&\n n.name.text === property &&\n ts.isArrayLiteralExpression(n.initializer)\n ) {\n callback(n, n.initializer.elements);\n return;\n }\n\n ts.forEachChild(n, findTemplates);\n });\n });\n}\nexport function visitComponents(\n sourceFile: ts.SourceFile,\n callback: (\n classDeclarationNode: ts.ClassDeclaration,\n decoratorExpressionNode: ts.ObjectLiteralExpression\n ) => void\n) {\n visitDecorator(sourceFile, 'Component', callback);\n}\n\nexport function visitNgModules(\n sourceFile: ts.SourceFile,\n callback: (\n classDeclarationNode: ts.ClassDeclaration,\n decoratorExpressionNode: ts.ObjectLiteralExpression\n ) => void\n) {\n visitDecorator(sourceFile, 'NgModule', callback);\n}\n\nexport function visitDecorator(\n sourceFile: ts.SourceFile,\n decoratorName: string,\n callback: (\n classDeclarationNode: ts.ClassDeclaration,\n decoratorExpressionNode: ts.ObjectLiteralExpression\n ) => void\n) {\n ts.forEachChild(sourceFile, function findClassDeclaration(node) {\n if (!ts.isClassDeclaration(node)) {\n ts.forEachChild(node, findClassDeclaration);\n }\n\n const classDeclarationNode = node as ts.ClassDeclaration;\n const decorators = ts.getDecorators(classDeclarationNode);\n\n if (!decorators || !decorators.length) {\n return;\n }\n\n const componentDecorator = decorators.find((d) => {\n return (\n ts.isCallExpression(d.expression) &&\n ts.isIdentifier(d.expression.expression) &&\n d.expression.expression.text === decoratorName\n );\n });\n\n if (!componentDecorator) {\n return;\n }\n\n const { expression } = componentDecorator;\n if (!ts.isCallExpression(expression)) {\n return;\n }\n\n const [arg] = expression.arguments;\n if (!arg || !ts.isObjectLiteralExpression(arg)) {\n return;\n }\n\n callback(classDeclarationNode, arg);\n });\n}\n\nfunction* visit(directory: DirEntry): IterableIterator {\n for (const path of directory.subfiles) {\n if (path.endsWith('.ts') && !path.endsWith('.d.ts')) {\n const entry = directory.file(path);\n if (entry) {\n const content = entry.content;\n const source = ts.createSourceFile(\n entry.path,\n content.toString().replace(/^\\uFEFF/, ''),\n ts.ScriptTarget.Latest,\n true\n );\n yield source;\n }\n }\n }\n\n for (const path of directory.subdirs) {\n if (path === 'node_modules') {\n continue;\n }\n\n yield* visit(directory.dir(path));\n }\n}\n"]}
\ No newline at end of file
diff --git a/schematics/collection.json b/schematics/collection.json
new file mode 100644
index 0000000..5644cf0
--- /dev/null
+++ b/schematics/collection.json
@@ -0,0 +1,10 @@
+{
+ "schematics": {
+ "ng-add": {
+ "aliases": ["init"],
+ "factory": "./ng-add",
+ "schema": "./ng-add/schema.json",
+ "description": "Add @ngrx/signals to your application"
+ }
+ }
+}
diff --git a/schematics/ng-add/index.js b/schematics/ng-add/index.js
new file mode 100644
index 0000000..dcc0d9b
--- /dev/null
+++ b/schematics/ng-add/index.js
@@ -0,0 +1,21 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var schematics_1 = require("@angular-devkit/schematics");
+var tasks_1 = require("@angular-devkit/schematics/tasks");
+var schematics_core_1 = require("../../schematics-core");
+function addModuleToPackageJson() {
+ return function (host, context) {
+ (0, schematics_core_1.addPackageToPackageJson)(host, 'dependencies', '@ngrx/signals', schematics_core_1.platformVersion);
+ context.addTask(new tasks_1.NodePackageInstallTask());
+ return host;
+ };
+}
+function default_1(options) {
+ return function (host, context) {
+ return (0, schematics_1.chain)([
+ options && options.skipPackageJson ? (0, schematics_1.noop)() : addModuleToPackageJson(),
+ ])(host, context);
+ };
+}
+exports.default = default_1;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/schematics/ng-add/index.js.map b/schematics/ng-add/index.js.map
new file mode 100644
index 0000000..47dd4dc
--- /dev/null
+++ b/schematics/ng-add/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics/ng-add/index.ts"],"names":[],"mappings":";;AAAA,yDAMoC;AACpC,0DAA0E;AAC1E,yDAG+B;AAG/B,SAAS,sBAAsB;IAC7B,OAAO,UAAC,IAAU,EAAE,OAAyB;QAC3C,IAAA,yCAAuB,EACrB,IAAI,EACJ,cAAc,EACd,eAAe,EACf,iCAAe,CAChB,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,8BAAsB,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,mBAAyB,OAAsB;IAC7C,OAAO,UAAC,IAAU,EAAE,OAAyB;QAC3C,OAAO,IAAA,kBAAK,EAAC;YACX,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAA,iBAAI,GAAE,CAAC,CAAC,CAAC,sBAAsB,EAAE;SACvE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAND,4BAMC","sourcesContent":["import {\n Rule,\n SchematicContext,\n Tree,\n chain,\n noop,\n} from '@angular-devkit/schematics';\nimport { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';\nimport {\n addPackageToPackageJson,\n platformVersion,\n} from '../../schematics-core';\nimport { Schema as SchemaOptions } from './schema';\n\nfunction addModuleToPackageJson() {\n return (host: Tree, context: SchematicContext) => {\n addPackageToPackageJson(\n host,\n 'dependencies',\n '@ngrx/signals',\n platformVersion\n );\n context.addTask(new NodePackageInstallTask());\n return host;\n };\n}\n\nexport default function (options: SchemaOptions): Rule {\n return (host: Tree, context: SchematicContext) => {\n return chain([\n options && options.skipPackageJson ? noop() : addModuleToPackageJson(),\n ])(host, context);\n };\n}\n"]}
\ No newline at end of file
diff --git a/schematics/ng-add/schema.js b/schematics/ng-add/schema.js
new file mode 100644
index 0000000..03881cb
--- /dev/null
+++ b/schematics/ng-add/schema.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=schema.js.map
\ No newline at end of file
diff --git a/schematics/ng-add/schema.js.map b/schematics/ng-add/schema.js.map
new file mode 100644
index 0000000..b1ab70a
--- /dev/null
+++ b/schematics/ng-add/schema.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../modules/signals/schematics/ng-add/schema.ts"],"names":[],"mappings":"","sourcesContent":["export interface Schema {\n skipPackageJson?: boolean;\n}\n"]}
\ No newline at end of file
diff --git a/schematics/ng-add/schema.json b/schematics/ng-add/schema.json
new file mode 100644
index 0000000..3425e31
--- /dev/null
+++ b/schematics/ng-add/schema.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/schema",
+ "$id": "SchematicsNgRxSignals",
+ "title": "NgRx Signals Schema",
+ "type": "object",
+ "properties": {
+ "skipPackageJson": {
+ "type": "boolean",
+ "default": false,
+ "description": "Do not add @ngrx/signals as dependency to package.json (e.g., --skipPackageJson)."
+ }
+ },
+ "required": []
+}
diff --git a/src/deep-signal.d.ts b/src/deep-signal.d.ts
new file mode 100644
index 0000000..a88b824
--- /dev/null
+++ b/src/deep-signal.d.ts
@@ -0,0 +1,6 @@
+import { Signal } from '@angular/core';
+import { IsUnknownRecord } from './ts-helpers';
+export type DeepSignal = Signal & (T extends Record ? IsUnknownRecord extends true ? unknown : Readonly<{
+ [K in keyof T]: T[K] extends Record ? IsUnknownRecord extends true ? Signal : DeepSignal : Signal;
+}> : unknown);
+export declare function toDeepSignal(signal: Signal): DeepSignal;
diff --git a/src/helpers.d.ts b/src/helpers.d.ts
new file mode 100644
index 0000000..5b2cfd5
--- /dev/null
+++ b/src/helpers.d.ts
@@ -0,0 +1 @@
+export declare function excludeKeys, Keys extends string[]>(obj: Obj, keys: Keys): Omit;
diff --git a/src/index.d.ts b/src/index.d.ts
new file mode 100644
index 0000000..d0f636c
--- /dev/null
+++ b/src/index.d.ts
@@ -0,0 +1,8 @@
+export { PartialStateUpdater, patchState } from './patch-state';
+export { signalState } from './signal-state';
+export { signalStore } from './signal-store';
+export { signalStoreFeature, type } from './signal-store-feature';
+export { withComputed } from './with-computed';
+export { withHooks } from './with-hooks';
+export { withMethods } from './with-methods';
+export { withState } from './with-state';
diff --git a/src/patch-state.d.ts b/src/patch-state.d.ts
new file mode 100644
index 0000000..904523a
--- /dev/null
+++ b/src/patch-state.d.ts
@@ -0,0 +1,3 @@
+import { SignalStateMeta } from './signal-state';
+export type PartialStateUpdater> = (state: State) => Partial;
+export declare function patchState>(signalState: SignalStateMeta, ...updaters: Array | PartialStateUpdater>): void;
diff --git a/src/signal-state.d.ts b/src/signal-state.d.ts
new file mode 100644
index 0000000..01c0884
--- /dev/null
+++ b/src/signal-state.d.ts
@@ -0,0 +1,11 @@
+import { WritableSignal } from '@angular/core';
+import { DeepSignal } from './deep-signal';
+import { HasFunctionKeys } from './ts-helpers';
+export declare const STATE_SIGNAL: unique symbol;
+export type SignalStateMeta> = {
+ [STATE_SIGNAL]: WritableSignal;
+};
+type SignalStateCheck = HasFunctionKeys extends false | undefined ? unknown : '@ngrx/signals: signal state cannot contain `Function` property or method names';
+type SignalState> = DeepSignal & SignalStateMeta;
+export declare function signalState>(initialState: State & SignalStateCheck): SignalState;
+export {};
diff --git a/src/signal-store-feature.d.ts b/src/signal-store-feature.d.ts
new file mode 100644
index 0000000..44522e8
--- /dev/null
+++ b/src/signal-store-feature.d.ts
@@ -0,0 +1,22 @@
+import { EmptyFeatureResult, MergeFeatureResults, SignalStoreFeature, SignalStoreFeatureResult } from './signal-store-models';
+import { Prettify } from './ts-helpers';
+export declare function signalStoreFeature(f1: SignalStoreFeature): SignalStoreFeature;
+export declare function signalStoreFeature(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>): SignalStoreFeature>;
+export declare function signalStoreFeature(f1: SignalStoreFeature