@sumaris-net/ngx-components 18.18.30 → 18.18.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,7 +45,7 @@ export function RxStateRegister() {
45
45
  */
46
46
  export function RxStateProperty(statePropertyName, projectValueReducer) {
47
47
  return function (target, key) {
48
- const finalStatePropertyName = statePropertyName || key;
48
+ const finalStatePropertyName = String(statePropertyName || key);
49
49
  const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || DEFAULT_STATE_VAR_NAME;
50
50
  // Define property with getter/setter
51
51
  Object.defineProperty(target, key, {
@@ -69,7 +69,7 @@ export function RxStateProperty(statePropertyName, projectValueReducer) {
69
69
  });
70
70
  // Development logging
71
71
  if (!production) {
72
- console.debug(`[RxStateProperty] ${target.constructor?.name}.${key} -> state.${finalStatePropertyName}`);
72
+ console.debug(`[RxStateProperty] ${target.constructor?.name}.${key} -> state.${String(finalStatePropertyName)}`);
73
73
  }
74
74
  };
75
75
  }
@@ -93,13 +93,15 @@ export function RxStateSelect(statePropertyName, opts) {
93
93
  get: function () {
94
94
  const stateObject = stateVarName ? this[stateVarName] : this;
95
95
  DecoratorUtils.validateStateProperty(target, stateObject);
96
+ // Create observable if not exists
96
97
  if (!this[internalPropertyName]) {
97
98
  if (finalStatePropertyName === '$') {
98
99
  this[internalPropertyName] = stateObject.$;
99
100
  }
100
101
  else if (finalStatePropertyName.includes('.')) {
101
- const path = finalStatePropertyName.split('.');
102
- this[internalPropertyName] = stateObject.select(...path);
102
+ const args = finalStatePropertyName.split('.');
103
+ // @ts-ignore
104
+ this[internalPropertyName] = stateObject.select(...args);
103
105
  }
104
106
  else {
105
107
  this[internalPropertyName] = stateObject.select(finalStatePropertyName);
@@ -132,8 +134,10 @@ export function RxStateComputed(dependencies, computeFn, opts) {
132
134
  get: function () {
133
135
  const stateObject = stateVarName ? this[stateVarName] : this;
134
136
  DecoratorUtils.validateStateProperty(target, stateObject);
137
+ // Create observable if not exists
135
138
  if (!this[cachePropertyName]) {
136
139
  let observable = stateObject.select(dependencies, opts?.keyCompareMap);
140
+ // Apply computeFn if provided
137
141
  if (computeFn) {
138
142
  observable = observable.pipe(map(computeFn));
139
143
  }
@@ -146,7 +150,7 @@ export function RxStateComputed(dependencies, computeFn, opts) {
146
150
  });
147
151
  // Development logging
148
152
  if (!production) {
149
- console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} -> state.select([${dependencies.map((d) => `'${d}'`).join(', ')}])`);
153
+ console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} -> state.select([${dependencies.map((dep) => `'${dep}'`).join(', ')}])`);
150
154
  }
151
155
  };
152
156
  }
@@ -160,21 +164,29 @@ export function RxStateOutput(statePropertyName, opts) {
160
164
  console.warn(`[RxStateOutput] Convention: Property ${target.constructor?.name}.${key} should end with 'Changes' to indicate it's an Output`);
161
165
  }
162
166
  // Determine state property name
163
- const finalStatePropertyName = statePropertyName || String(key).replace(/\$$/, '');
167
+ const finalStatePropertyName = statePropertyName || key.replace(/Changes$/, '');
164
168
  // Determine state object
165
169
  const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;
170
+ const cachePropertyName = `__${key}_cache`;
166
171
  // Define property with getter only
167
- const stateObject = stateVarName ? target[stateVarName] : target;
168
- const observable = finalStatePropertyName === '$' ? stateObject.$ : stateObject.$.pipe(select(finalStatePropertyName));
169
172
  Object.defineProperty(target, key, {
170
- value: observable,
173
+ get: function () {
174
+ const stateObject = stateVarName ? this[stateVarName] : this;
175
+ DecoratorUtils.validateStateProperty(target, stateObject);
176
+ // Create observable if not exists
177
+ // See https://www.rx-angular.io/docs/state/getting-started#output-property-bindings
178
+ if (!this[cachePropertyName]) {
179
+ this[cachePropertyName] = finalStatePropertyName === '$' ? stateObject.$ : stateObject.$.pipe(select(finalStatePropertyName));
180
+ }
181
+ return this[cachePropertyName];
182
+ },
171
183
  enumerable: true,
172
184
  configurable: false,
173
185
  });
174
186
  // Development logging
175
187
  if (!production) {
176
- console.debug(`[RxStateOutput] ${target.constructor?.name}.${key} -> state.$.pipe(select('${finalStatePropertyName}'))`);
188
+ console.debug(`[RxStateOutput] ${target.constructor?.name}.${key} -> state.$.pipe(select('${String(finalStatePropertyName)}'))`);
177
189
  }
178
190
  };
179
191
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3RhdGUuZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3J4LXN0YXRlL3J4LXN0YXRlLmRlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1QixPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUV2QixNQUFNLFVBQVUscUJBQXFCO0lBQ25DLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDcEIsQ0FBQztBQU9ELHlCQUF5QjtBQUN6QixNQUFNLGNBQWM7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLFdBQW1CO1FBQ3pELE9BQU8sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBYyxFQUFFLFdBQW1CO1FBQzNELE9BQU8sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBVyxFQUFFLFdBQWdCO1FBQ3hELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxD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O1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxHQUFhLDRCQUE0QixzQkFBc0IsS0FBSyxDQUFDLENBQUM7UUFDckksQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcm9qZWN0VmFsdWVSZWR1Y2VyLCBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUvc2VsZWN0aW9ucyc7XG5cbmxldCBwcm9kdWN0aW9uID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVSeFN0YXRlUHJvZE1vZGUoKSB7XG4gIHByb2R1Y3Rpb24gPSB0cnVlO1xufVxuXG5kZWNsYXJlIHR5cGUgQ29uc3RydWN0b3I8VCA9IGFueT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG50eXBlIE9ic2VydmFibGVQcm9wZXJ0eURlY29yYXRvcjxUPiA9IDxLIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogSykgPT4gdm9pZDtcbnR5cGUgU3RhdGVQcm9wZXJ0eURlY29yYXRvcjxUPiA9IDxLIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogSykgPT4gdm9pZDtcblxuLy8gVXRpbGl0eSBmb3IgZGVjb3JhdG9yc1xuY2xhc3MgRGVjb3JhdG9yVXRpbHMge1xuICBzdGF0aWMgY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXRob2ROYW1lKHByZWZpeDogc3RyaW5nLCBwcm9wZXJ0eUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7dGhpcy5jYXBpdGFsaXplKHByb3BlcnR5S2V5KX1gO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5TmFtZShwcmVmaXg6IHN0cmluZywgcHJvcGVydHlLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3RoaXMuY2FwaXRhbGl6ZShwcm9wZXJ0eUtleSl9YDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0OiBhbnksIHN0YXRlT2JqZWN0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXByb2R1Y3Rpb24gJiYgIXN0YXRlT2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc3RhdGUhIFBsZWFzZSBhZGQgYSBSeFN0YXRlIGluIGNsYXNzOiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBTVEFURV9WQVJfTkFNRV9LRVkgPSAnX19zdGF0ZU5hbWUnO1xuY29uc3QgREVGQVVMVF9TVEFURV9WQVJfTkFNRSA9ICdfc3RhdGUnO1xuXG4vKipcbiAqIERlY29yYXRvciB0byByZWdpc3RlciB0aGUgUnhTdGF0ZSBwcm9wZXJ0eSBpbiBhIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVJlZ2lzdGVyKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBAUnhTdGF0ZVJlZ2lzdGVyKCkgaW4gY2xhc3MgaGllcmFyY2h5LiBGb3VuZDogJHt0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXX0gYW5kICR7a2V5fWApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFNUQVRFX1ZBUl9OQU1FX0tFWSwge1xuICAgICAgdmFsdWU6IGtleSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIFJ4U3RhdGUgcHJvcGVydGllcyB3aXRoIGdldHRlci9zZXR0ZXIgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlUHJvcGVydHk8VCBleHRlbmRzIE9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQsIFIgZXh0ZW5kcyBUW0tdPihcbiAgc3RhdGVQcm9wZXJ0eU5hbWU/OiBzdHJpbmcgfCBLLFxuICBwcm9qZWN0VmFsdWVSZWR1Y2VyPzogUHJvamVjdFZhbHVlUmVkdWNlcjxULCBLLCBSPlxuKTogU3RhdGVQcm9wZXJ0eURlY29yYXRvcjxSPiB7XG4gIHJldHVybiBmdW5jdGlvbiA8UCBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwga2V5OiBQKSB7XG4gICAgY29uc3QgZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9IChzdGF0ZVByb3BlcnR5TmFtZSBhcyBzdHJpbmcpIHx8IChrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBzdGF0ZVZhck5hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBSeFN0YXRlID8gbnVsbCA6IHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG5cbiAgICAvLyBEZWZpbmUgcHJvcGVydHkgd2l0aCBnZXR0ZXIvc2V0dGVyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3Q6IFJ4U3RhdGU8VD4gPSBzdGF0ZVZhck5hbWUgPyB0aGlzW3N0YXRlVmFyTmFtZV0gOiB0aGlzO1xuICAgICAgICBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG4gICAgICAgIHJldHVybiBzdGF0ZU9iamVjdC5nZXQoZmluYWxTdGF0ZVByb3BlcnR5TmFtZSBhcyBrZXlvZiBUKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZTogUikge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdDogUnhTdGF0ZTxUPiA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcbiAgICAgICAgaWYgKHByb2plY3RWYWx1ZVJlZHVjZXIpIHtcbiAgICAgICAgICBzdGF0ZU9iamVjdC5zZXQoZmluYWxTdGF0ZVByb3BlcnR5TmFtZSBhcyBrZXlvZiBULCAoc3RhdGU6IFQpID0+IHByb2plY3RWYWx1ZVJlZHVjZXIoc3RhdGUsIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGVPYmplY3Quc2V0KDxQYXJ0aWFsPFQ+PnsgW2ZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgYXMga2V5b2YgVF06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtSeFN0YXRlUHJvcGVydHldICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IC0+IHN0YXRlLiR7ZmluYWxTdGF0ZVByb3BlcnR5TmFtZX1gKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBSeFN0YXRlIG9ic2VydmFibGUgc2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlU2VsZWN0PFQgZXh0ZW5kcyBPYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBULCBSIGV4dGVuZHMgVFtLXT4oXG4gIHN0YXRlUHJvcGVydHlOYW1lPzogc3RyaW5nIHwgSyB8ICckJyxcbiAgb3B0cz86IHtcbiAgICBzdGF0ZU5hbWU/OiBzdHJpbmc7XG4gIH1cbik6IE9ic2VydmFibGVQcm9wZXJ0eURlY29yYXRvcjxPYnNlcnZhYmxlPFI+PiB7XG4gIHJldHVybiBmdW5jdGlvbiA8UCBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwga2V5OiBQKSB7XG4gICAgLy8gQ29udmVudGlvbiBjaGVja1xuICAgIGlmICghcHJvZHVjdGlvbiAmJiAhKGtleSBhcyBzdHJpbmcpLmVuZHNXaXRoKCckJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtSeFN0YXRlU2VsZWN0XSBDb252ZW50aW9uOiBQcm9wZXJ0eSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSBzaG91bGQgZW5kIHdpdGggJyQnIHRvIGluZGljYXRlIGl0J3MgYW4gT2JzZXJ2YWJsZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIHByb3BlcnR5IG5hbWVcbiAgICBjb25zdCBmaW5hbFN0YXRlUHJvcGVydHlOYW1lID0gKHN0YXRlUHJvcGVydHlOYW1lIGFzIHN0cmluZykgfHwgKGtleSBhcyBzdHJpbmcpLnJlcGxhY2UoL1xcJCQvLCAnJyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgc3RhdGUgb2JqZWN0XG4gICAgY29uc3Qgc3RhdGVWYXJOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgUnhTdGF0ZSA/IG51bGwgOiB0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXSB8fCBvcHRzPy5zdGF0ZU5hbWUgfHwgREVGQVVMVF9TVEFURV9WQVJfTkFNRTtcblxuICAgIC8vIENyZWF0ZSBjYWNoZSBwcm9wZXJ0eSBuYW1lXG4gICAgY29uc3QgaW50ZXJuYWxQcm9wZXJ0eU5hbWUgPSBgX18ke2tleSBhcyBzdHJpbmd9YDtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlciBvbmx5XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3QgPSBzdGF0ZVZhck5hbWUgPyB0aGlzW3N0YXRlVmFyTmFtZV0gOiB0aGlzO1xuICAgICAgICBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG5cbiAgICAgICAgaWYgKCF0aGlzW2ludGVybmFsUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIGlmIChmaW5hbFN0YXRlUHJvcGVydHlOYW1lID09PSAnJCcpIHtcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxQcm9wZXJ0eU5hbWVdID0gc3RhdGVPYmplY3QuJDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxQcm9wZXJ0eU5hbWVdID0gc3RhdGVPYmplY3Quc2VsZWN0KC4uLnBhdGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2ludGVybmFsUHJvcGVydHlOYW1lXSA9IHN0YXRlT2JqZWN0LnNlbGVjdChmaW5hbFN0YXRlUHJvcGVydHlOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFByb3BlcnR5TmFtZV07XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBEZXZlbG9wbWVudCBsb2dnaW5nXG4gICAgaWYgKCFwcm9kdWN0aW9uKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbUnhTdGF0ZVNlbGVjdF0gJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gLT4gc3RhdGUuc2VsZWN0KCcke2ZpbmFsU3RhdGVQcm9wZXJ0eU5hbWV9JylgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBkZWNvcmF0b3IgdG8gY3JlYXRlIGNvbXB1dGVkIG9ic2VydmFibGVzIGZyb20gc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ4U3RhdGVDb21wdXRlZDxUIGV4dGVuZHMgT2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVCwgUiBleHRlbmRzIFRbS10+KFxuICBkZXBlbmRlbmNpZXM6IEtbXSxcbiAgY29tcHV0ZUZuPzogKHNsaWNlOiBQaWNrPFQsIEs+KSA9PiBSLFxuICBvcHRzPzoge1xuICAgIHN0YXRlTmFtZT86IHN0cmluZztcbiAgICBrZXlDb21wYXJlTWFwPzogYW55O1xuICB9XG4pOiBPYnNlcnZhYmxlUHJvcGVydHlEZWNvcmF0b3I8T2JzZXJ2YWJsZTxSPj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIC8vIENvbnZlbnRpb24gY2hlY2tcbiAgICBpZiAoIXByb2R1Y3Rpb24gJiYgIShrZXkgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbUnhTdGF0ZUNvbXB1dGVkXSBDb252ZW50aW9uOiBQcm9wZXJ0eSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSBzaG91bGQgZW5kIHdpdGggJyQnIHRvIGluZGljYXRlIGl0J3MgYW4gT2JzZXJ2YWJsZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVWYXJOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgUnhTdGF0ZSA/IG51bGwgOiB0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXSB8fCBvcHRzPy5zdGF0ZU5hbWUgfHwgREVGQVVMVF9TVEFURV9WQVJfTkFNRTtcbiAgICBjb25zdCBjYWNoZVByb3BlcnR5TmFtZSA9IGBfXyR7a2V5IGFzIHN0cmluZ31fY2FjaGVgO1xuXG4gICAgLy8gRGVmaW5lIHByb3BlcnR5IHdpdGggZ2V0dGVyIG9ubHlcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdCA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcblxuICAgICAgICBpZiAoIXRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgbGV0IG9ic2VydmFibGUgPSBzdGF0ZU9iamVjdC5zZWxlY3QoZGVwZW5kZW5jaWVzLCBvcHRzPy5rZXlDb21wYXJlTWFwKTtcblxuICAgICAgICAgIGlmIChjb21wdXRlRm4pIHtcbiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlLnBpcGUobWFwKGNvbXB1dGVGbikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdID0gb2JzZXJ2YWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzW2NhY2hlUHJvcGVydHlOYW1lXTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBbUnhTdGF0ZUNvbXB1dGVkXSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSAtPiBzdGF0ZS5zZWxlY3QoWyR7ZGVwZW5kZW5jaWVzLm1hcCgoZCkgPT4gYCcke2QgYXMgc3RyaW5nfSdgKS5qb2luKCcsICcpfV0pYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBSeFN0YXRlIG9ic2VydmFibGUgYXMgb3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSeFN0YXRlT3V0cHV0PFQgZXh0ZW5kcyBPYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBULCBSIGV4dGVuZHMgVFtLXT4oXG4gIHN0YXRlUHJvcGVydHlOYW1lPzogc3RyaW5nIHwgSyB8ICckJyxcbiAgb3B0cz86IHtcbiAgICBzdGF0ZU5hbWU/OiBzdHJpbmc7XG4gIH1cbik6IE9ic2VydmFibGVQcm9wZXJ0eURlY29yYXRvcjxPYnNlcnZhYmxlPFI+PiB7XG4gIHJldHVybiBmdW5jdGlvbiA8UCBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwga2V5OiBQKSB7XG4gICAgLy8gQ29udmVudGlvbiBjaGVja1xuICAgIGlmICghcHJvZHVjdGlvbiAmJiAhKGtleSBhcyBzdHJpbmcpLmVuZHNXaXRoKCdDaGFuZ2VzJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtSeFN0YXRlT3V0cHV0XSBDb252ZW50aW9uOiBQcm9wZXJ0eSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSBzaG91bGQgZW5kIHdpdGggJ0NoYW5nZXMnIHRvIGluZGljYXRlIGl0J3MgYW4gT3V0cHV0YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgc3RhdGUgcHJvcGVydHkgbmFtZVxuICAgIGNvbnN0IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPSAoc3RhdGVQcm9wZXJ0eU5hbWUgYXMgc3RyaW5nKSB8fCBTdHJpbmcoa2V5KS5yZXBsYWNlKC9cXCQkLywgJycpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIG9iamVjdFxuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgb3B0cz8uc3RhdGVOYW1lIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG5cbiAgICAvLyBEZWZpbmUgcHJvcGVydHkgd2l0aCBnZXR0ZXIgb25seVxuICAgIGNvbnN0IHN0YXRlT2JqZWN0OiBSeFN0YXRlPFQ+ID0gc3RhdGVWYXJOYW1lID8gdGFyZ2V0W3N0YXRlVmFyTmFtZV0gOiB0YXJnZXQ7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPT09ICckJyA/IHN0YXRlT2JqZWN0LiQgOiBzdGF0ZU9iamVjdC4kLnBpcGUoc2VsZWN0PFQsIEs+KGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgYXMgSykpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgdmFsdWU6IG9ic2VydmFibGUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtSeFN0YXRlT3V0cHV0XSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSAtPiBzdGF0ZS4kLnBpcGUoc2VsZWN0KCcke2ZpbmFsU3RhdGVQcm9wZXJ0eU5hbWV9JykpYCk7XG4gICAgfVxuICB9O1xufVxuIl19
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3RhdGUuZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3J4LXN0YXRlL3J4LXN0YXRlLmRlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1QixPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUV2QixNQUFNLFVBQVUscUJBQXFCO0lBQ25DLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDcEIsQ0FBQztBQU9ELHlCQUF5QjtBQUN6QixNQUFNLGNBQWM7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLFdBQW1CO1FBQ3pELE9BQU8sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBYyxFQUFFLFdBQW1CO1FBQzNELE9BQU8sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBVyxFQUFFLFdBQWdCO1FBQ3hELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxD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LGlCQUFpQixDQUFDLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsc0JBQXNCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQU8sc0JBQXNCLENBQUMsQ0FBQyxDQUFDO2dCQUN0SSxDQUFDO2dCQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUMsQ0FBQztRQUVILHNCQUFzQjtRQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksR0FBYSw0QkFBNEIsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdJLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJvamVjdFZhbHVlUmVkdWNlciwgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlL3NlbGVjdGlvbnMnO1xuXG5sZXQgcHJvZHVjdGlvbiA9IGZhbHNlO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlUnhTdGF0ZVByb2RNb2RlKCkge1xuICBwcm9kdWN0aW9uID0gdHJ1ZTtcbn1cblxuZGVjbGFyZSB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBPYnNlcnZhYmxlUHJvcGVydHlEZWNvcmF0b3I8VD4gPSA8SyBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IEspID0+IHZvaWQ7XG50eXBlIFN0YXRlUHJvcGVydHlEZWNvcmF0b3I8VD4gPSA8SyBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IEspID0+IHZvaWQ7XG5cbi8vIFV0aWxpdHkgZm9yIGRlY29yYXRvcnNcbmNsYXNzIERlY29yYXRvclV0aWxzIHtcbiAgc3RhdGljIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlTWV0aG9kTmFtZShwcmVmaXg6IHN0cmluZywgcHJvcGVydHlLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3RoaXMuY2FwaXRhbGl6ZShwcm9wZXJ0eUtleSl9YDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU5hbWUocHJlZml4OiBzdHJpbmcsIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHt0aGlzLmNhcGl0YWxpemUocHJvcGVydHlLZXkpfWA7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVTdGF0ZVByb3BlcnR5KHRhcmdldDogYW55LCBzdGF0ZU9iamVjdDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICFzdGF0ZU9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHN0YXRlISBQbGVhc2UgYWRkIGEgUnhTdGF0ZSBpbiBjbGFzczogJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU1RBVEVfVkFSX05BTUVfS0VZID0gJ19fc3RhdGVOYW1lJztcbmNvbnN0IERFRkFVTFRfU1RBVEVfVkFSX05BTUUgPSAnX3N0YXRlJztcblxuLyoqXG4gKiBEZWNvcmF0b3IgdG8gcmVnaXN0ZXIgdGhlIFJ4U3RhdGUgcHJvcGVydHkgaW4gYSBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ4U3RhdGVSZWdpc3RlcigpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZykge1xuICAgIGlmICh0YXJnZXRbU1RBVEVfVkFSX05BTUVfS0VZXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgQFJ4U3RhdGVSZWdpc3RlcigpIGluIGNsYXNzIGhpZXJhcmNoeS4gRm91bmQ6ICR7dGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV19IGFuZCAke2tleX1gKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBTVEFURV9WQVJfTkFNRV9LRVksIHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBSeFN0YXRlIHByb3BlcnRpZXMgd2l0aCBnZXR0ZXIvc2V0dGVyIGFjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVByb3BlcnR5PFQgZXh0ZW5kcyBPYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBULCBSIGV4dGVuZHMgVFtLXT4oXG4gIHN0YXRlUHJvcGVydHlOYW1lPzogc3RyaW5nIHwgSyxcbiAgcHJvamVjdFZhbHVlUmVkdWNlcj86IFByb2plY3RWYWx1ZVJlZHVjZXI8VCwgSywgUj5cbik6IFN0YXRlUHJvcGVydHlEZWNvcmF0b3I8Uj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIGNvbnN0IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUgPSBTdHJpbmcoc3RhdGVQcm9wZXJ0eU5hbWUgfHwga2V5KSBhcyBLO1xuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgREVGQVVMVF9TVEFURV9WQVJfTkFNRTtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlci9zZXR0ZXJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdDogUnhTdGF0ZTxUPiA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHN0YXRlT2JqZWN0LmdldChmaW5hbFN0YXRlUHJvcGVydHlOYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZTogUikge1xuICAgICAgICBjb25zdCBzdGF0ZU9iamVjdDogUnhTdGF0ZTxUPiA9IHN0YXRlVmFyTmFtZSA/IHRoaXNbc3RhdGVWYXJOYW1lXSA6IHRoaXM7XG4gICAgICAgIERlY29yYXRvclV0aWxzLnZhbGlkYXRlU3RhdGVQcm9wZXJ0eSh0YXJnZXQsIHN0YXRlT2JqZWN0KTtcbiAgICAgICAgaWYgKHByb2plY3RWYWx1ZVJlZHVjZXIpIHtcbiAgICAgICAgICBzdGF0ZU9iamVjdC5zZXQoZmluYWxTdGF0ZVByb3BlcnR5TmFtZSwgKHN0YXRlOiBUKSA9PiBwcm9qZWN0VmFsdWVSZWR1Y2VyKHN0YXRlLCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlT2JqZWN0LnNldCg8UGFydGlhbDxUPj57IFtmaW5hbFN0YXRlUHJvcGVydHlOYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gRGV2ZWxvcG1lbnQgbG9nZ2luZ1xuICAgIGlmICghcHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW1J4U3RhdGVQcm9wZXJ0eV0gJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gLT4gc3RhdGUuJHtTdHJpbmcoZmluYWxTdGF0ZVByb3BlcnR5TmFtZSl9YCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIERlY29yYXRvciBmb3IgUnhTdGF0ZSBvYnNlcnZhYmxlIHNlbGVjdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZVNlbGVjdDxUIGV4dGVuZHMgT2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVCwgUiBleHRlbmRzIFRbS10+KFxuICBzdGF0ZVByb3BlcnR5TmFtZT86IHN0cmluZyB8IEsgfCAnJCcsXG4gIG9wdHM/OiB7XG4gICAgc3RhdGVOYW1lPzogc3RyaW5nO1xuICB9XG4pOiBPYnNlcnZhYmxlUHJvcGVydHlEZWNvcmF0b3I8T2JzZXJ2YWJsZTxSPj4ge1xuICByZXR1cm4gZnVuY3Rpb24gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4odGFyZ2V0OiBhbnksIGtleTogUCkge1xuICAgIC8vIENvbnZlbnRpb24gY2hlY2tcbiAgICBpZiAoIXByb2R1Y3Rpb24gJiYgIShrZXkgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbUnhTdGF0ZVNlbGVjdF0gQ29udmVudGlvbjogUHJvcGVydHkgJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gc2hvdWxkIGVuZCB3aXRoICckJyB0byBpbmRpY2F0ZSBpdCdzIGFuIE9ic2VydmFibGVgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBzdGF0ZSBwcm9wZXJ0eSBuYW1lXG4gICAgY29uc3QgZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9IChzdGF0ZVByb3BlcnR5TmFtZSBhcyBzdHJpbmcpIHx8IChrZXkgYXMgc3RyaW5nKS5yZXBsYWNlKC9cXCQkLywgJycpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIG9iamVjdFxuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgb3B0cz8uc3RhdGVOYW1lIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG5cbiAgICAvLyBDcmVhdGUgY2FjaGUgcHJvcGVydHkgbmFtZVxuICAgIGNvbnN0IGludGVybmFsUHJvcGVydHlOYW1lID0gYF9fJHtrZXkgYXMgc3RyaW5nfWA7XG5cbiAgICAvLyBEZWZpbmUgcHJvcGVydHkgd2l0aCBnZXR0ZXIgb25seVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlT2JqZWN0OiBSeFN0YXRlPFQ+ID0gc3RhdGVWYXJOYW1lID8gdGhpc1tzdGF0ZVZhck5hbWVdIDogdGhpcztcbiAgICAgICAgRGVjb3JhdG9yVXRpbHMudmFsaWRhdGVTdGF0ZVByb3BlcnR5KHRhcmdldCwgc3RhdGVPYmplY3QpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBvYnNlcnZhYmxlIGlmIG5vdCBleGlzdHNcbiAgICAgICAgaWYgKCF0aGlzW2ludGVybmFsUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIGlmIChmaW5hbFN0YXRlUHJvcGVydHlOYW1lID09PSAnJCcpIHtcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxQcm9wZXJ0eU5hbWVdID0gc3RhdGVPYmplY3QuJDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxQcm9wZXJ0eU5hbWVdID0gc3RhdGVPYmplY3Quc2VsZWN0KC4uLmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2ludGVybmFsUHJvcGVydHlOYW1lXSA9IHN0YXRlT2JqZWN0LnNlbGVjdChmaW5hbFN0YXRlUHJvcGVydHlOYW1lIGFzIEspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsUHJvcGVydHlOYW1lXTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIERldmVsb3BtZW50IGxvZ2dpbmdcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtSeFN0YXRlU2VsZWN0XSAke3RhcmdldC5jb25zdHJ1Y3Rvcj8ubmFtZX0uJHtrZXkgYXMgc3RyaW5nfSAtPiBzdGF0ZS5zZWxlY3QoJyR7ZmluYWxTdGF0ZVByb3BlcnR5TmFtZX0nKWApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGRlY29yYXRvciB0byBjcmVhdGUgY29tcHV0ZWQgb2JzZXJ2YWJsZXMgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gUnhTdGF0ZUNvbXB1dGVkPFQgZXh0ZW5kcyBPYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBULCBSIGV4dGVuZHMgVFtLXT4oXG4gIGRlcGVuZGVuY2llczogS1tdLFxuICBjb21wdXRlRm4/OiAoc2xpY2U6IFBpY2s8VCwgSz4pID0+IFIsXG4gIG9wdHM/OiB7XG4gICAgc3RhdGVOYW1lPzogc3RyaW5nO1xuICAgIGtleUNvbXBhcmVNYXA/OiBhbnk7XG4gIH1cbik6IE9ic2VydmFibGVQcm9wZXJ0eURlY29yYXRvcjxPYnNlcnZhYmxlPFI+PiB7XG4gIHJldHVybiBmdW5jdGlvbiA8UCBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IGFueSwga2V5OiBQKSB7XG4gICAgLy8gQ29udmVudGlvbiBjaGVja1xuICAgIGlmICghcHJvZHVjdGlvbiAmJiAhKGtleSBhcyBzdHJpbmcpLmVuZHNXaXRoKCckJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtSeFN0YXRlQ29tcHV0ZWRdIENvbnZlbnRpb246IFByb3BlcnR5ICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IHNob3VsZCBlbmQgd2l0aCAnJCcgdG8gaW5kaWNhdGUgaXQncyBhbiBPYnNlcnZhYmxlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZVZhck5hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBSeFN0YXRlID8gbnVsbCA6IHRhcmdldFtTVEFURV9WQVJfTkFNRV9LRVldIHx8IG9wdHM/LnN0YXRlTmFtZSB8fCBERUZBVUxUX1NUQVRFX1ZBUl9OQU1FO1xuICAgIGNvbnN0IGNhY2hlUHJvcGVydHlOYW1lID0gYF9fJHtrZXkgYXMgc3RyaW5nfV9jYWNoZWA7XG5cbiAgICAvLyBEZWZpbmUgcHJvcGVydHkgd2l0aCBnZXR0ZXIgb25seVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlT2JqZWN0OiBSeFN0YXRlPFQ+ID0gc3RhdGVWYXJOYW1lID8gdGhpc1tzdGF0ZVZhck5hbWVdIDogdGhpcztcbiAgICAgICAgRGVjb3JhdG9yVXRpbHMudmFsaWRhdGVTdGF0ZVByb3BlcnR5KHRhcmdldCwgc3RhdGVPYmplY3QpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBvYnNlcnZhYmxlIGlmIG5vdCBleGlzdHNcbiAgICAgICAgaWYgKCF0aGlzW2NhY2hlUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIGxldCBvYnNlcnZhYmxlID0gc3RhdGVPYmplY3Quc2VsZWN0KGRlcGVuZGVuY2llcywgb3B0cz8ua2V5Q29tcGFyZU1hcCk7XG5cbiAgICAgICAgICAvLyBBcHBseSBjb21wdXRlRm4gaWYgcHJvdmlkZWRcbiAgICAgICAgICBpZiAoY29tcHV0ZUZuKSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZS5waXBlKG1hcChjb21wdXRlRm4pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzW2NhY2hlUHJvcGVydHlOYW1lXSA9IG9ic2VydmFibGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1tjYWNoZVByb3BlcnR5TmFtZV07XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBEZXZlbG9wbWVudCBsb2dnaW5nXG4gICAgaWYgKCFwcm9kdWN0aW9uKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICBgW1J4U3RhdGVDb21wdXRlZF0gJHt0YXJnZXQuY29uc3RydWN0b3I/Lm5hbWV9LiR7a2V5IGFzIHN0cmluZ30gLT4gc3RhdGUuc2VsZWN0KFske2RlcGVuZGVuY2llcy5tYXAoKGRlcCkgPT4gYCcke2RlcCBhcyBzdHJpbmd9J2ApLmpvaW4oJywgJyl9XSlgXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIFJ4U3RhdGUgb2JzZXJ2YWJsZSBhcyBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ4U3RhdGVPdXRwdXQ8VCBleHRlbmRzIE9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQsIFIgZXh0ZW5kcyBUW0tdPihcbiAgc3RhdGVQcm9wZXJ0eU5hbWU/OiBzdHJpbmcgfCBLIHwgJyQnLFxuICBvcHRzPzoge1xuICAgIHN0YXRlTmFtZT86IHN0cmluZztcbiAgfVxuKTogT2JzZXJ2YWJsZVByb3BlcnR5RGVjb3JhdG9yPE9ic2VydmFibGU8Uj4+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxQIGV4dGVuZHMgUHJvcGVydHlLZXk+KHRhcmdldDogYW55LCBrZXk6IFApIHtcbiAgICAvLyBDb252ZW50aW9uIGNoZWNrXG4gICAgaWYgKCFwcm9kdWN0aW9uICYmICEoa2V5IGFzIHN0cmluZykuZW5kc1dpdGgoJ0NoYW5nZXMnKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1J4U3RhdGVPdXRwdXRdIENvbnZlbnRpb246IFByb3BlcnR5ICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IHNob3VsZCBlbmQgd2l0aCAnQ2hhbmdlcycgdG8gaW5kaWNhdGUgaXQncyBhbiBPdXRwdXRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBzdGF0ZSBwcm9wZXJ0eSBuYW1lXG4gICAgY29uc3QgZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9IChzdGF0ZVByb3BlcnR5TmFtZSBhcyBLKSB8fCAoKGtleSBhcyBzdHJpbmcpLnJlcGxhY2UoL0NoYW5nZXMkLywgJycpIGFzIEspO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHN0YXRlIG9iamVjdFxuICAgIGNvbnN0IHN0YXRlVmFyTmFtZSA9IHRhcmdldCBpbnN0YW5jZW9mIFJ4U3RhdGUgPyBudWxsIDogdGFyZ2V0W1NUQVRFX1ZBUl9OQU1FX0tFWV0gfHwgb3B0cz8uc3RhdGVOYW1lIHx8IERFRkFVTFRfU1RBVEVfVkFSX05BTUU7XG4gICAgY29uc3QgY2FjaGVQcm9wZXJ0eU5hbWUgPSBgX18ke2tleSBhcyBzdHJpbmd9X2NhY2hlYDtcblxuICAgIC8vIERlZmluZSBwcm9wZXJ0eSB3aXRoIGdldHRlciBvbmx5XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3Q6IFJ4U3RhdGU8VD4gPSBzdGF0ZVZhck5hbWUgPyB0aGlzW3N0YXRlVmFyTmFtZV0gOiB0aGlzO1xuICAgICAgICBEZWNvcmF0b3JVdGlscy52YWxpZGF0ZVN0YXRlUHJvcGVydHkodGFyZ2V0LCBzdGF0ZU9iamVjdCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIG9ic2VydmFibGUgaWYgbm90IGV4aXN0c1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cucngtYW5ndWxhci5pby9kb2NzL3N0YXRlL2dldHRpbmctc3RhcnRlZCNvdXRwdXQtcHJvcGVydHktYmluZGluZ3NcbiAgICAgICAgaWYgKCF0aGlzW2NhY2hlUHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgIHRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdID0gZmluYWxTdGF0ZVByb3BlcnR5TmFtZSA9PT0gJyQnID8gc3RhdGVPYmplY3QuJCA6IHN0YXRlT2JqZWN0LiQucGlwZShzZWxlY3Q8VCwgSz4oZmluYWxTdGF0ZVByb3BlcnR5TmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNbY2FjaGVQcm9wZXJ0eU5hbWVdO1xuICAgICAgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gRGV2ZWxvcG1lbnQgbG9nZ2luZ1xuICAgIGlmICghcHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW1J4U3RhdGVPdXRwdXRdICR7dGFyZ2V0LmNvbnN0cnVjdG9yPy5uYW1lfS4ke2tleSBhcyBzdHJpbmd9IC0+IHN0YXRlLiQucGlwZShzZWxlY3QoJyR7U3RyaW5nKGZpbmFsU3RhdGVQcm9wZXJ0eU5hbWUpfScpKWApO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
@@ -26808,7 +26808,7 @@ function RxStateRegister() {
26808
26808
  */
26809
26809
  function RxStateProperty(statePropertyName, projectValueReducer) {
26810
26810
  return function (target, key) {
26811
- const finalStatePropertyName = statePropertyName || key;
26811
+ const finalStatePropertyName = String(statePropertyName || key);
26812
26812
  const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || DEFAULT_STATE_VAR_NAME;
26813
26813
  // Define property with getter/setter
26814
26814
  Object.defineProperty(target, key, {
@@ -26832,7 +26832,7 @@ function RxStateProperty(statePropertyName, projectValueReducer) {
26832
26832
  });
26833
26833
  // Development logging
26834
26834
  if (!production) {
26835
- console.debug(`[RxStateProperty] ${target.constructor?.name}.${key} -> state.${finalStatePropertyName}`);
26835
+ console.debug(`[RxStateProperty] ${target.constructor?.name}.${key} -> state.${String(finalStatePropertyName)}`);
26836
26836
  }
26837
26837
  };
26838
26838
  }
@@ -26856,13 +26856,15 @@ function RxStateSelect(statePropertyName, opts) {
26856
26856
  get: function () {
26857
26857
  const stateObject = stateVarName ? this[stateVarName] : this;
26858
26858
  DecoratorUtils.validateStateProperty(target, stateObject);
26859
+ // Create observable if not exists
26859
26860
  if (!this[internalPropertyName]) {
26860
26861
  if (finalStatePropertyName === '$') {
26861
26862
  this[internalPropertyName] = stateObject.$;
26862
26863
  }
26863
26864
  else if (finalStatePropertyName.includes('.')) {
26864
- const path = finalStatePropertyName.split('.');
26865
- this[internalPropertyName] = stateObject.select(...path);
26865
+ const args = finalStatePropertyName.split('.');
26866
+ // @ts-ignore
26867
+ this[internalPropertyName] = stateObject.select(...args);
26866
26868
  }
26867
26869
  else {
26868
26870
  this[internalPropertyName] = stateObject.select(finalStatePropertyName);
@@ -26895,8 +26897,10 @@ function RxStateComputed(dependencies, computeFn, opts) {
26895
26897
  get: function () {
26896
26898
  const stateObject = stateVarName ? this[stateVarName] : this;
26897
26899
  DecoratorUtils.validateStateProperty(target, stateObject);
26900
+ // Create observable if not exists
26898
26901
  if (!this[cachePropertyName]) {
26899
26902
  let observable = stateObject.select(dependencies, opts?.keyCompareMap);
26903
+ // Apply computeFn if provided
26900
26904
  if (computeFn) {
26901
26905
  observable = observable.pipe(map(computeFn));
26902
26906
  }
@@ -26909,7 +26913,7 @@ function RxStateComputed(dependencies, computeFn, opts) {
26909
26913
  });
26910
26914
  // Development logging
26911
26915
  if (!production) {
26912
- console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} -> state.select([${dependencies.map((d) => `'${d}'`).join(', ')}])`);
26916
+ console.debug(`[RxStateComputed] ${target.constructor?.name}.${key} -> state.select([${dependencies.map((dep) => `'${dep}'`).join(', ')}])`);
26913
26917
  }
26914
26918
  };
26915
26919
  }
@@ -26923,20 +26927,28 @@ function RxStateOutput(statePropertyName, opts) {
26923
26927
  console.warn(`[RxStateOutput] Convention: Property ${target.constructor?.name}.${key} should end with 'Changes' to indicate it's an Output`);
26924
26928
  }
26925
26929
  // Determine state property name
26926
- const finalStatePropertyName = statePropertyName || String(key).replace(/\$$/, '');
26930
+ const finalStatePropertyName = statePropertyName || key.replace(/Changes$/, '');
26927
26931
  // Determine state object
26928
26932
  const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;
26933
+ const cachePropertyName = `__${key}_cache`;
26929
26934
  // Define property with getter only
26930
- const stateObject = stateVarName ? target[stateVarName] : target;
26931
- const observable = finalStatePropertyName === '$' ? stateObject.$ : stateObject.$.pipe(select(finalStatePropertyName));
26932
26935
  Object.defineProperty(target, key, {
26933
- value: observable,
26936
+ get: function () {
26937
+ const stateObject = stateVarName ? this[stateVarName] : this;
26938
+ DecoratorUtils.validateStateProperty(target, stateObject);
26939
+ // Create observable if not exists
26940
+ // See https://www.rx-angular.io/docs/state/getting-started#output-property-bindings
26941
+ if (!this[cachePropertyName]) {
26942
+ this[cachePropertyName] = finalStatePropertyName === '$' ? stateObject.$ : stateObject.$.pipe(select(finalStatePropertyName));
26943
+ }
26944
+ return this[cachePropertyName];
26945
+ },
26934
26946
  enumerable: true,
26935
26947
  configurable: false,
26936
26948
  });
26937
26949
  // Development logging
26938
26950
  if (!production) {
26939
- console.debug(`[RxStateOutput] ${target.constructor?.name}.${key} -> state.$.pipe(select('${finalStatePropertyName}'))`);
26951
+ console.debug(`[RxStateOutput] ${target.constructor?.name}.${key} -> state.$.pipe(select('${String(finalStatePropertyName)}'))`);
26940
26952
  }
26941
26953
  };
26942
26954
  }