@libs-ui/pipes-convert-object-to-signal 0.2.356-8 → 0.2.357-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,73 +1,27 @@
1
1
  # @libs-ui/pipes-convert-object-to-signal
2
2
 
3
- > Version: `0.2.355-15`
4
- >
5
- > Pipe chuyển đổi object/array thành cấu trúc Signals lồng nhau để tận dụng fine-grained reactivity.
3
+ > Pipe chuyển đổi object/array thành cấu trúc Signals lồng nhau để tận dụng fine-grained reactivity của Angular.
6
4
 
7
5
  ## Giới thiệu
8
6
 
9
- `LibsUiPipesConvertObjectToSignalPipe` chuyển đổi một object hoặc array thành cấu trúc Signals lồng nhau (nested signals). Mỗi property của object trở thành một Signal riêng biệt, cho phép Angular chỉ re-render các phần UI thực sự thay đổi thay vì cả component.
7
+ `LibsUiPipesConvertObjectToSignalPipe` chuyển đổi một plain object hoặc array thành cấu trúc nested `WritableSignal`. Mỗi property của object trở thành một `WritableSignal` riêng biệt, cho phép Angular chỉ re-render đúng phần UI phụ thuộc vào property đó thay vì toàn bộ component. Pipe ủy quyền xử lý cho hàm tiện ích `convertObjectToSignal` từ `@libs-ui/utils`.
10
8
 
11
- ### Tính năng
9
+ ## Tính năng
12
10
 
13
- - ✅ Chuyển object thành nested WritableSignals
14
- - ✅ Chuyển array thành Signal chứa các Signal items
15
- - ✅ Deep clone mặc định (an toàn)
16
- - ✅ Hỗ trợ nested objects (multi-level)
17
- - ✅ Fine-grained reactivity - tối ưu performance
11
+ - ✅ Chuyển object thành nested `WritableSignal` — mỗi property là một signal độc lập
12
+ - ✅ Chuyển array thành `WritableSignal<WritableSignal<T>[]>` mỗi phần tử là một signal
13
+ - ✅ Hỗ trợ nested objects đa cấp (multi-level)
14
+ - ✅ Deep clone mặc định — an toàn, không mutate data gốc
15
+ - ✅ Tùy chọn shallow (no-clone) để tăng performance khi cần thiết
16
+ - ✅ Fine-grained reactivity — tối ưu hiệu năng cho form/table phức tạp
17
+ - ✅ Trả về nguyên nếu input là `null` hoặc `undefined`
18
18
 
19
19
  ## Khi nào sử dụng
20
20
 
21
- ### 📝 Form với nhiều fields
22
-
23
- Khi form nhiều field, dùng nested signals để thay đổi một field không ảnh hưởng đến các field khác:
24
-
25
- ```typescript
26
- // ❌ Nguyên object là Signal - không hiệu quả
27
- user = signal({ name: 'John', email: 'john@example.com' });
28
- // user.set({ ...user(), name: 'Jane' }) => Cả name và email đều trigger re-render!
29
-
30
- // ✅ Nested Signals - hiệu quả
31
- user = { name: 'John', email: 'john@example.com' } | LibsUiPipesConvertObjectToSignalPipe;
32
- user().name.set('Jane'); // => Chỉ name trigger re-render
33
- ```
34
-
35
- ### 📊 Data table lớn
36
-
37
- Trong bảng dữ liệu lớn, chỉ re-render cell thay đổi thay vì cả row:
38
-
39
- ```typescript
40
- rows = data | LibsUiPipesConvertObjectToSignalPipe;
41
-
42
- // Trong template
43
- @for (row of rows(); track row().id) {
44
- <tr>
45
- <td>{{ row().name() }}</td> <!-- Chỉ re-render khi name thay đổi -->
46
- <td>{{ row().email() }}</td> <!-- Không re-render khi name thay đổi -->
47
- </tr>
48
- }
49
- ```
50
-
51
- ### 🔄 Two-way binding tối ưu
52
-
53
- Dễ dàng bind từng property đến component con:
54
-
55
- ```typescript
56
- <app-input-field
57
- [value]="user().name()"
58
- (change)="user().name.set($event)"
59
- />
60
- <app-input-field
61
- [value]="user().email()"
62
- (change)="user().email.set($event)"
63
- />
64
- ```
65
-
66
- ## ⚠️ Important Notes
67
-
68
- - **🔄 Nested Signals**: Mỗi property của object trở thành một Signal. Thay đổi một property chỉ trigger re-render ở component sử dụng property đó.
69
- - **🔀 Shallow vs Deep Clone**: Mặc định deep clone để tránh mutate data gốc. Dùng `isCloneDeep = false` để giữ nguyên reference.
70
- - **⚡ Fine-grained Reactivity**: Hiệu quả hơn so với nguyên object làm Signal vì chỉ re-render khi property cụ thể thay đổi.
21
+ - **Form nhiều fields**: Thay đổi một field không trigger re-render các field khác — mỗi `<input>` bind vào signal riêng.
22
+ - **Data table lớn**: Chỉ re-render cell thay đổi thay vì cả row khi cập nhật một giá trị.
23
+ - **Two-way binding tối ưu**: Bind từng property đến component con không cần spread cả object.
24
+ - **Performance-critical UI**: Giảm tối đa số lần re-render trong component phức tạp có nhiều phần tử phụ thuộc cùng một nguồn dữ liệu.
71
25
 
72
26
  ## Cài đặt
73
27
 
@@ -85,29 +39,48 @@ import { LibsUiPipesConvertObjectToSignalPipe } from '@libs-ui/pipes-convert-obj
85
39
  imports: [LibsUiPipesConvertObjectToSignalPipe],
86
40
  // ...
87
41
  })
88
- export class YourComponent {}
42
+ export class MyComponent {}
43
+ ```
44
+
45
+ Khi cần dùng trong class TypeScript (inject trực tiếp):
46
+
47
+ ```typescript
48
+ import { LibsUiPipesConvertObjectToSignalPipe } from '@libs-ui/pipes-convert-object-to-signal';
49
+
50
+ @Component({
51
+ standalone: true,
52
+ imports: [LibsUiPipesConvertObjectToSignalPipe],
53
+ providers: [LibsUiPipesConvertObjectToSignalPipe],
54
+ })
55
+ export class MyComponent {
56
+ private readonly convertPipe = inject(LibsUiPipesConvertObjectToSignalPipe);
57
+
58
+ constructor() {
59
+ this.userSig = this.convertPipe.transform({ name: 'John', age: 30 });
60
+ }
61
+ }
89
62
  ```
90
63
 
91
- ## Ví dụ
64
+ ## Ví dụ sử dụng
92
65
 
93
- ### 1. Object thành Nested Signals
66
+ ### 1. Object thành Nested Signals (Template)
94
67
 
95
68
  ```html
96
69
  @let user = ({ name: 'John', email: 'john@example.com', age: 30 } | LibsUiPipesConvertObjectToSignalPipe);
97
70
 
98
- <div>
99
- <input [value]="user().name()" (input)="user().name.set($event.target.value)" />
100
- <input [value]="user().email()" (input)="user().email.set($event.target.value)" />
101
- </div>
71
+ <input [value]="user().name()" (input)="user().name.set($any($event.target).value)" />
72
+ <input [value]="user().email()" (input)="user().email.set($any($event.target).value)" />
73
+ <input type="number" [value]="user().age()" (input)="user().age.set(+$any($event.target).value)" />
102
74
 
103
75
  <p>Name: {{ user().name() }}</p>
104
76
  <p>Email: {{ user().email() }}</p>
77
+ <p>Age: {{ user().age() }}</p>
105
78
  ```
106
79
 
107
80
  ```typescript
108
- // user() trả về object với mỗi property là WritableSignal
109
- // user().name() - lấy giá trị
110
- // user().name.set('Jane') - set giá trị mới
81
+ // Đọc signal: user().name()
82
+ // Set signal: user().name.set('Jane')
83
+ // Thay đổi name KHÔNG trigger re-render cho email age
111
84
  ```
112
85
 
113
86
  ### 2. Array thành Signal của Signals
@@ -116,21 +89,22 @@ export class YourComponent {}
116
89
  @let items = (['apple', 'banana', 'orange'] | LibsUiPipesConvertObjectToSignalPipe);
117
90
 
118
91
  <ul>
119
- @for (item of items(); track $index) {
92
+ @for (item of items(); track item) {
120
93
  <li>
121
- <input [value]="item()" (input)="item.set($event.target.value)" />
94
+ <input [value]="item()" (input)="item.set($any($event.target).value)" />
95
+ <span>{{ item() }}</span>
122
96
  </li>
123
97
  }
124
98
  </ul>
125
99
  ```
126
100
 
127
101
  ```typescript
128
- // items() WritableSignal<WritableSignal<string>[]>
129
- // items()[0]() - lấy giá trị item đầu tiên
130
- // items()[0].set('new') - set giá trị mới
102
+ // items() WritableSignal<WritableSignal<string>[]>
103
+ // items()[0]() 'apple'
104
+ // items()[0].set('grape') chỉ re-render item[0]
131
105
  ```
132
106
 
133
- ### 3. Nested Object
107
+ ### 3. Nested Object (Multi-level)
134
108
 
135
109
  ```html
136
110
  @let company = ({
@@ -138,14 +112,15 @@ export class YourComponent {}
138
112
  ceo: { name: 'John', age: 45 }
139
113
  } | LibsUiPipesConvertObjectToSignalPipe);
140
114
 
141
- <input [value]="company().name()" (input)="company().name.set($event.target.value)" />
142
- <input [value]="company().ceo().name()" (input)="company().ceo().name.set($event.target.value)" />
115
+ <input [value]="company().name()" (input)="company().name.set($any($event.target).value)" />
116
+ <input [value]="company().ceo().name()" (input)="company().ceo().name.set($any($event.target).value)" />
117
+ <input type="number" [value]="company().ceo().age()" (input)="company().ceo().age.set(+$any($event.target).value)" />
143
118
 
144
119
  <p>Company: {{ company().name() }}</p>
145
- <p>CEO: {{ company().ceo().name() }}</p>
120
+ <p>CEO: {{ company().ceo().name() }}, tuổi {{ company().ceo().age() }}</p>
146
121
  ```
147
122
 
148
- ### 4. Giữ nguyên Reference (nhanh hơn)
123
+ ### 4. Shallow (No-clone) giữ nguyên reference
149
124
 
150
125
  ```html
151
126
  @let user = (userData | LibsUiPipesConvertObjectToSignalPipe : false);
@@ -154,95 +129,135 @@ export class YourComponent {}
154
129
  ```
155
130
 
156
131
  ```typescript
157
- // isCloneDeep = false: Giữ nguyên reference đến data gốc
158
- // Nhanh hơn nhưng cẩn thận mutate!
159
- ```
132
+ readonly userData = { name: 'John', age: 30 };
160
133
 
161
- ## API
134
+ // isCloneDeep = false: nhanh hơn, nhưng mutate userData cũng ảnh hưởng signal
135
+ // isCloneDeep = true (default): an toàn, data được deep clone trước khi convert
136
+ ```
162
137
 
163
- ### LibsUiPipesConvertObjectToSignalPipe
138
+ ### 5. Sử dụng trong TypeScript (inject pipe)
164
139
 
165
140
  ```typescript
166
- data | LibsUiPipesConvertObjectToSignalPipe : isCloneDeep?
141
+ import { LibsUiPipesConvertObjectToSignalPipe } from '@libs-ui/pipes-convert-object-to-signal';
142
+
143
+ @Component({
144
+ standalone: true,
145
+ imports: [LibsUiPipesConvertObjectToSignalPipe],
146
+ providers: [LibsUiPipesConvertObjectToSignalPipe],
147
+ changeDetection: ChangeDetectionStrategy.OnPush,
148
+ })
149
+ export class UserFormComponent {
150
+ private readonly convertPipe = inject(LibsUiPipesConvertObjectToSignalPipe);
151
+
152
+ protected userSig = this.convertPipe.transform({ name: 'John', email: 'john@example.com' });
153
+
154
+ protected handlerSaveName(event: Event): void {
155
+ event.stopPropagation();
156
+ const value = (event.target as HTMLInputElement).value;
157
+ this.userSig().name.set(value);
158
+ }
159
+ }
167
160
  ```
168
161
 
169
- #### Parameters
162
+ ## Transform
163
+
164
+ | Tham số | Type | Bắt buộc | Default | Mô tả | Ví dụ |
165
+ |---|---|---|---|---|---|
166
+ | `data` | `any` | Có | — | Object hoặc array cần chuyển đổi thành nested Signals. Trả về nguyên nếu là `null`/`undefined`. | `{ name: 'John' }` |
167
+ | `isCloneDeep` | `boolean \| undefined` | Không | `true` | `true`: deep clone data trước khi convert (an toàn). `false`: giữ nguyên reference (nhanh hơn, cẩn thận mutate). | `false` |
168
+
169
+ **Cú pháp template:**
170
+
171
+ ```html
172
+ {{ data | LibsUiPipesConvertObjectToSignalPipe }}
173
+ {{ data | LibsUiPipesConvertObjectToSignalPipe : false }}
174
+ ```
170
175
 
171
- | Property | Type | Default | Description |
172
- | ------------- | ----------------------- | -------- | --------------------------------------------------------- |
173
- | `data` | `any` | - | Object/array cần chuyển đổi thành Signals. |
174
- | `isCloneDeep` | `boolean \| undefined` | `true` | `true` để deep clone (an toàn), `false` để giữ reference. |
176
+ **Cú pháp standalone (TypeScript):**
175
177
 
176
- #### Returns
178
+ ```typescript
179
+ const signalObj = pipe.transform(data);
180
+ const signalObj = pipe.transform(data, false);
181
+ ```
177
182
 
178
- Nested structure với WritableSignals:
183
+ ## Kiểu dữ liệu đầu ra
179
184
 
180
185
  ```typescript
181
- // Object -> WritableSignal<{ prop: WritableSignal<...> }>
182
- // Array -> WritableSignal<WritableSignal<T>[]>
186
+ // Pipe transform signature
187
+ transform<T>(data: T, isCloneDeep?: boolean): T
188
+
189
+ // Object → Nested WritableSignals
190
+ { name: 'John', age: 30 }
191
+ =>
192
+ WritableSignal<{
193
+ name: WritableSignal<string>,
194
+ age: WritableSignal<number>
195
+ }>
196
+
197
+ // Array → WritableSignal<WritableSignal<T>[]>
198
+ ['apple', 'banana']
199
+ =>
200
+ WritableSignal<[
201
+ WritableSignal<string>,
202
+ WritableSignal<string>
203
+ ]>
183
204
  ```
184
205
 
185
- ## Hidden Logic
206
+ **Bảng hành vi theo kiểu đầu vào:**
186
207
 
187
- ### 1. 🔄 Fine-grained Reactivity
208
+ | Kiểu dữ liệu | Kết quả |
209
+ |---|---|
210
+ | `null` / `undefined` | Trả về nguyên (không convert) |
211
+ | Primitive (`string`, `number`, `boolean`) | Wrapped trong `WritableSignal<T>` |
212
+ | Plain object | `WritableSignal<{ [key]: WritableSignal<V> }>` — mỗi property là signal |
213
+ | Array | `WritableSignal<WritableSignal<T>[]>` — mỗi phần tử là signal |
214
+ | Nested object | Đệ quy — mọi cấp độ đều được convert |
215
+ | `Promise` / `Observable` | Trả về nguyên (async objects không convert) |
216
+ | `Map` / `Set` | Được xử lý đặc biệt theo logic trong `convertObjectToSignal` |
188
217
 
189
- Khác với nguyên object làm Signal, nested signals chỉ re-render component khi property cụ thể thay đổi:
218
+ ## Lưu ý quan trọng
190
219
 
191
- ```typescript
192
- // ❌ Object là signal
193
- user = signal({ name: 'John', email: 'john@example.com' });
194
- user.set({ ...user(), name: 'Jane' });
195
- // => Cả name và email đều trigger re-render!
220
+ ⚠️ **Fine-grained Reactivity**: Khác với `signal({ name, email })` — khi dùng pipe này, thay đổi `name` không trigger re-render phần template dùng `email`. Đây là lợi thế chính để tối ưu hiệu năng.
196
221
 
197
- // Nested signals
198
- user = object | LibsUiPipesConvertObjectToSignalPipe;
199
- user().name.set('Jane');
200
- // => Chỉ name trigger re-render, email không!
201
- ```
222
+ ⚠️ **isCloneDeep = false**: Khi tắt deep clone, mutate object gốc (data nguồn) cũng ảnh hưởng trực tiếp đến các signal. Chỉ dùng khi chắc chắn không có side effect từ code khác.
202
223
 
203
- ### 2. 🔀 Shallow vs Deep Clone
224
+ ⚠️ **@let trong template**: Dùng `@let` để khai báo biến từ pipe trong template (Angular 18+). Với Angular < 18, cần dùng `as` trong `*ngIf` hoặc chuyển sang inject pipe trong TS.
204
225
 
205
- | Tùy chọn | Behavior | Khi nào dùng |
206
- | -------- | -------- | ------------ |
207
- | `true` (default) | Deep clone data trước khi convert | Luôn an toàn, không mutate gốc |
208
- | `false` | Giữ nguyên reference | Performance critical, chắc chắn không mutate |
226
+ ⚠️ **track trong @for với Array Signals**: Khi dùng pipe với array, BẮT BUỘC `track item` (track signal reference bất biến) — KHÔNG dùng `track $index`.
209
227
 
210
- ```typescript
211
- // Deep clone (default) - An toàn
212
- user = userData | LibsUiPipesConvertObjectToSignalPipe;
213
- user().name.set('Jane'); // Không ảnh hưởng userData
228
+ ```html
229
+ <!-- ĐÚNG track signal reference -->
230
+ @for (item of items(); track item) { ... }
214
231
 
215
- // No clone - Nhanh hơn
216
- user = userData | LibsUiPipesConvertObjectToSignalPipe : false;
217
- user().name.set('Jane'); // Cẩn thận: ảnh hưởng userData!
232
+ <!-- SAI BLOCKER -->
233
+ @for (item of items(); track $index) { ... }
218
234
  ```
219
235
 
220
- ### 3. 📦 Các kiểu dữ liệu được hỗ trợ
236
+ ⚠️ **Không dùng trong computed()**: Pipe gọi `convertObjectToSignal` là stateful. Không nên wrap kết quả pipe trong `computed()` vì mỗi lần computed chạy lại sẽ tạo signal mới, mất state đã set trước đó.
221
237
 
222
- | Kiểu dữ liệu | Kết quả |
223
- | ------------ | ------- |
224
- | Primitives (string, number, boolean) | Trả về nguyên (không convert) |
225
- | Object | WritableSignal với mỗi property là Signal |
226
- | Array | WritableSignal chứa array của Signals |
227
- | Map/Set | Được xử lý đặc biệt |
228
- | Promise/Observer | Trả về nguyên (async objects) |
229
- | null/undefined | Trả về nguyên |
238
+ ## So sánh: Object Signal vs Nested Signals
230
239
 
231
240
  ```typescript
232
- 123 | pipe => 123 (primitive)
233
- { name: 'John' } | pipe => WritableSignal<...> (object)
234
- ['a', 'b'] | pipe => WritableSignal<WritableSignal<string>[]> (array)
235
- Promise/Observer | pipe => Trả về nguyên (async)
241
+ // Object một signal duy nhất — không hiệu quả
242
+ protected user = signal({ name: 'John', email: 'john@example.com' });
243
+ // Khi thay đổi name:
244
+ this.user.set({ ...this.user(), name: 'Jane' });
245
+ // => Cả name VÀ email đều trigger re-render!
246
+
247
+ // ✅ Nested Signals — fine-grained
248
+ // Trong template:
249
+ // @let user = (userData | LibsUiPipesConvertObjectToSignalPipe)
250
+ // Hoặc trong TS:
251
+ protected userSig = this.convertPipe.transform({ name: 'John', email: 'john@example.com' });
252
+ // Khi thay đổi name:
253
+ this.userSig().name.set('Jane');
254
+ // => Chỉ phần template dùng user().name() re-render, email() KHÔNG re-render
236
255
  ```
237
256
 
238
257
  ## Demo
239
258
 
240
- - **Local Development**: [http://localhost:4500/pipes/convert-object-to-signal](http://localhost:4500/pipes/convert-object-to-signal)
241
-
242
- ## Unit Tests
243
-
244
- Xem file `test-commands.md` để biết cách chạy unit tests.
245
-
246
- ## License
259
+ ```bash
260
+ npx nx serve core-ui
261
+ ```
247
262
 
248
- MIT
263
+ Truy cập: [http://localhost:4500/pipes/convert-object-to-signal](http://localhost:4500/pipes/convert-object-to-signal)
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-pipes-convert-object-to-signal.mjs","sources":["../../../../../libs-ui/pipes/convert-object-to-signal/src/convert-object-to-signal.pipe.ts","../../../../../libs-ui/pipes/convert-object-to-signal/src/libs-ui-pipes-convert-object-to-signal.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { convertObjectToSignal } from '@libs-ui/utils';\n@Pipe({\n name: 'LibsUiPipesConvertObjectToSignalPipe',\n standalone: true,\n})\nexport class LibsUiPipesConvertObjectToSignalPipe implements PipeTransform {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transform(data: any, isCloneDeep?: boolean): any {\n if (!data) {\n return data;\n }\n\n return convertObjectToSignal(data, isCloneDeep);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAMa,oCAAoC,CAAA;;IAE/C,SAAS,CAAC,IAAS,EAAE,WAAqB,EAAA;QACxC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC;IACjD;wGARW,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAApC,oCAAoC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sCAAA,EAAA,CAAA;;4FAApC,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBAJhD,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sCAAsC;AAC5C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACLD;;AAEG;;;;"}
1
+ {"version":3,"file":"libs-ui-pipes-convert-object-to-signal.mjs","sources":["../../../../../libs-ui/pipes/convert-object-to-signal/src/convert-object-to-signal.pipe.ts","../../../../../libs-ui/pipes/convert-object-to-signal/src/libs-ui-pipes-convert-object-to-signal.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { convertObjectToSignal } from '@libs-ui/utils';\n@Pipe({\n name: 'LibsUiPipesConvertObjectToSignalPipe',\n standalone: true,\n})\nexport class LibsUiPipesConvertObjectToSignalPipe implements PipeTransform {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transform(data: any, isCloneDeep?: boolean): any {\n if (!data) {\n return data;\n }\n\n return convertObjectToSignal(data, isCloneDeep);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAMa,oCAAoC,CAAA;;IAE/C,SAAS,CAAC,IAAS,EAAE,WAAqB,EAAA;QACxC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,OAAO,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;KACjD;wGARU,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;sGAApC,oCAAoC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sCAAA,EAAA,CAAA,CAAA;;4FAApC,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBAJhD,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sCAAsC;AAC5C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACLD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@libs-ui/pipes-convert-object-to-signal",
3
- "version": "0.2.356-8",
3
+ "version": "0.2.357-0",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/utils": "0.2.356-8"
6
+ "@libs-ui/utils": "0.2.357-0"
7
7
  },
8
8
  "sideEffects": false,
9
9
  "module": "fesm2022/libs-ui-pipes-convert-object-to-signal.mjs",