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":"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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 */\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, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>): SignalStoreFeature>; +export declare function signalStoreFeature(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>): SignalStoreFeature>; +export declare function signalStoreFeature(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>): SignalStoreFeature>; +export declare function signalStoreFeature(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>): SignalStoreFeature>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult>(input: Input, f1: SignalStoreFeature, F1>): SignalStoreFeature, F1>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult, F2 extends SignalStoreFeatureResult>(input: Input, f1: SignalStoreFeature, F1>, f2: SignalStoreFeature, F1]>, F2>): SignalStoreFeature, MergeFeatureResults<[F1, F2]>>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult, F2 extends SignalStoreFeatureResult, F3 extends SignalStoreFeatureResult>(input: Input, f1: SignalStoreFeature, F1>, f2: SignalStoreFeature, F1]>, F2>, f3: SignalStoreFeature, F1, F2]>, F3>): SignalStoreFeature, MergeFeatureResults<[F1, F2, F3]>>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult, F2 extends SignalStoreFeatureResult, F3 extends SignalStoreFeatureResult, F4 extends SignalStoreFeatureResult>(Input: Input, f1: SignalStoreFeature, F1>, f2: SignalStoreFeature, F1]>, F2>, f3: SignalStoreFeature, F1, F2]>, F3>, f4: SignalStoreFeature, F1, F2, F3]>, F4>): SignalStoreFeature, MergeFeatureResults<[F1, F2, F3, F4]>>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult, F2 extends SignalStoreFeatureResult, F3 extends SignalStoreFeatureResult, F4 extends SignalStoreFeatureResult, F5 extends SignalStoreFeatureResult>(input: Input, f1: SignalStoreFeature, F1>, f2: SignalStoreFeature, F1]>, F2>, f3: SignalStoreFeature, F1, F2]>, F3>, f4: SignalStoreFeature, F1, F2, F3]>, F4>, f5: SignalStoreFeature, F1, F2, F3, F4]>, F5>): SignalStoreFeature, MergeFeatureResults<[F1, F2, F3, F4, F5]>>; +export declare function signalStoreFeature, F1 extends SignalStoreFeatureResult, F2 extends SignalStoreFeatureResult, F3 extends SignalStoreFeatureResult, F4 extends SignalStoreFeatureResult, F5 extends SignalStoreFeatureResult, F6 extends SignalStoreFeatureResult>(input: Input, f1: SignalStoreFeature, F1>, f2: SignalStoreFeature, F1]>, F2>, f3: SignalStoreFeature, F1, F2]>, F3>, f4: SignalStoreFeature, F1, F2, F3]>, F4>, f5: SignalStoreFeature, F1, F2, F3, F4]>, F5>, f6: SignalStoreFeature, + F1, + F2, + F3, + F4, + F5 +]>, F6>): SignalStoreFeature, MergeFeatureResults<[F1, F2, F3, F4, F5, F6]>>; +export declare function type(): T; diff --git a/src/signal-store-models.d.ts b/src/signal-store-models.d.ts new file mode 100644 index 0000000..3228ea1 --- /dev/null +++ b/src/signal-store-models.d.ts @@ -0,0 +1,49 @@ +import { Signal } from '@angular/core'; +import { DeepSignal } from './deep-signal'; +import { SignalStateMeta } from './signal-state'; +import { IsUnknownRecord, Prettify } from './ts-helpers'; +export type SignalStoreConfig = { + providedIn: 'root'; +}; +export type SignalStoreSlices = { + [Key in keyof State]: State[Key] extends Record ? IsUnknownRecord extends true ? Signal : DeepSignal : Signal; +}; +export type SignalStore = Prettify & FeatureResult['signals'] & FeatureResult['methods'] & SignalStateMeta>>; +export type SignalsDictionary = Record>; +export type MethodsDictionary = Record unknown>; +export type SignalStoreHooks = { + onInit?: () => void; + onDestroy?: () => void; +}; +export type InnerSignalStore = Record, Signals extends SignalsDictionary = SignalsDictionary, Methods extends MethodsDictionary = MethodsDictionary> = { + slices: SignalStoreSlices; + signals: Signals; + methods: Methods; + hooks: SignalStoreHooks; +} & SignalStateMeta; +export type SignalStoreFeatureResult = { + state: Record; + signals: SignalsDictionary; + methods: MethodsDictionary; +}; +export type EmptyFeatureResult = { + state: {}; + signals: {}; + methods: {}; +}; +export type SignalStoreFeature = (store: InnerSignalStore) => InnerSignalStore; +export type MergeFeatureResults = FeatureResults extends [] ? {} : FeatureResults extends [infer First extends SignalStoreFeatureResult] ? First : FeatureResults extends [ + infer First extends SignalStoreFeatureResult, + infer Second extends SignalStoreFeatureResult +] ? MergeTwoFeatureResults : FeatureResults extends [ + infer First extends SignalStoreFeatureResult, + infer Second extends SignalStoreFeatureResult, + ...infer Rest extends SignalStoreFeatureResult[] +] ? MergeFeatureResults<[MergeTwoFeatureResults, ...Rest]> : never; +type FeatureResultKeys = keyof FeatureResult['state'] | keyof FeatureResult['signals'] | keyof FeatureResult['methods']; +type MergeTwoFeatureResults = { + state: Omit>; + signals: Omit>; + methods: Omit>; +} & Second; +export {}; diff --git a/src/signal-store.d.ts b/src/signal-store.d.ts new file mode 100644 index 0000000..02ad001 --- /dev/null +++ b/src/signal-store.d.ts @@ -0,0 +1,21 @@ +import { Type } from '@angular/core'; +import { EmptyFeatureResult, InnerSignalStore, MergeFeatureResults, SignalStore, SignalStoreConfig, SignalStoreFeature, SignalStoreFeatureResult } from './signal-store-models'; +export declare function signalStore(f1: SignalStoreFeature): Type>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>, f8: SignalStoreFeature, F8>): Type>>; +export declare function signalStore(f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>, f8: SignalStoreFeature, F8>, f9: SignalStoreFeature, F9>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature): Type>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>, f8: SignalStoreFeature, F8>): Type>>; +export declare function signalStore(config: SignalStoreConfig, f1: SignalStoreFeature, f2: SignalStoreFeature<{} & F1, F2>, f3: SignalStoreFeature, F3>, f4: SignalStoreFeature, F4>, f5: SignalStoreFeature, F5>, f6: SignalStoreFeature, F6>, f7: SignalStoreFeature, F7>, f8: SignalStoreFeature, F8>, f9: SignalStoreFeature, F9>): Type>>; +export declare function getInitialInnerStore(): InnerSignalStore; diff --git a/src/ts-helpers.d.ts b/src/ts-helpers.d.ts new file mode 100644 index 0000000..890519a --- /dev/null +++ b/src/ts-helpers.d.ts @@ -0,0 +1,11 @@ +export type Prettify = { + [K in keyof T]: T[K]; +} & {}; +export type IsUnknownRecord = string extends keyof T ? true : number extends keyof T ? true : false; +export type HasOptionalProps = T extends Required ? false : true; +export type HasFunctionKeys = T extends Record ? { + [K in keyof T]: K extends keyof Function ? true : HasFunctionKeys; +}[keyof T] : false; +export type HasNestedFunctionKeys = { + [K in keyof T]: HasFunctionKeys; +}[keyof T]; diff --git a/src/with-computed.d.ts b/src/with-computed.d.ts new file mode 100644 index 0000000..a36e762 --- /dev/null +++ b/src/with-computed.d.ts @@ -0,0 +1,5 @@ +import { EmptyFeatureResult, SignalsDictionary, SignalStoreFeature, SignalStoreFeatureResult, SignalStoreSlices } from './signal-store-models'; +import { Prettify } from './ts-helpers'; +export declare function withComputed(signalsFactory: (store: Prettify & Input['signals']>) => Signals): SignalStoreFeature; diff --git a/src/with-hooks.d.ts b/src/with-hooks.d.ts new file mode 100644 index 0000000..f27529c --- /dev/null +++ b/src/with-hooks.d.ts @@ -0,0 +1,9 @@ +import { SignalStateMeta } from './signal-state'; +import { EmptyFeatureResult, SignalStoreFeature, SignalStoreSlices, SignalStoreFeatureResult } from './signal-store-models'; +import { Prettify } from './ts-helpers'; +type HooksFactory = (store: Prettify & Input['signals'] & Input['methods'] & SignalStateMeta>>) => void; +export declare function withHooks(hooks: { + onInit?: HooksFactory; + onDestroy?: HooksFactory; +}): SignalStoreFeature; +export {}; diff --git a/src/with-methods.d.ts b/src/with-methods.d.ts new file mode 100644 index 0000000..18ed0cf --- /dev/null +++ b/src/with-methods.d.ts @@ -0,0 +1,6 @@ +import { SignalStateMeta } from './signal-state'; +import { EmptyFeatureResult, MethodsDictionary, SignalStoreFeature, SignalStoreFeatureResult, SignalStoreSlices } from './signal-store-models'; +import { Prettify } from './ts-helpers'; +export declare function withMethods(methodsFactory: (store: Prettify & Input['signals'] & Input['methods'] & SignalStateMeta>>) => Methods): SignalStoreFeature; diff --git a/src/with-state.d.ts b/src/with-state.d.ts new file mode 100644 index 0000000..c76f091 --- /dev/null +++ b/src/with-state.d.ts @@ -0,0 +1,10 @@ +import { EmptyFeatureResult, SignalStoreFeature } from './signal-store-models'; +import { HasNestedFunctionKeys, HasOptionalProps, IsUnknownRecord } from './ts-helpers'; +type WithStateCheck = IsUnknownRecord extends true ? '@ngrx/signals: root state keys must be string literals' : HasOptionalProps extends true ? '@ngrx/signals: root state slices cannot be optional' : HasNestedFunctionKeys extends false | undefined ? unknown : '@ngrx/signals: nested state slices cannot contain `Function` property or method names'; +export declare function withState>(state: State & WithStateCheck): SignalStoreFeature; +export declare function withState>(stateFactory: () => State & WithStateCheck): SignalStoreFeature; +export {};