@libs-ui/pipes-convert-object-to-signal 0.2.356-41 → 0.2.356-43
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
|
-
>
|
|
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
|
|
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
|
-
|
|
9
|
+
## Tính năng
|
|
12
10
|
|
|
13
|
-
- ✅ Chuyển object thành nested
|
|
14
|
-
- ✅ Chuyển array thành
|
|
15
|
-
- ✅
|
|
16
|
-
- ✅
|
|
17
|
-
- ✅
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 mà 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
|
|
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
|
-
<
|
|
99
|
-
|
|
100
|
-
|
|
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()
|
|
109
|
-
// user().name()
|
|
110
|
-
//
|
|
81
|
+
// Đọc signal: user().name()
|
|
82
|
+
// Set signal: user().name.set('Jane')
|
|
83
|
+
// Thay đổi name KHÔNG trigger re-render cho email và 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
|
|
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()
|
|
129
|
-
// items()[0]()
|
|
130
|
-
// items()[0].set('
|
|
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.
|
|
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
|
-
|
|
158
|
-
// Nhanh hơn nhưng cẩn thận mutate!
|
|
159
|
-
```
|
|
132
|
+
readonly userData = { name: 'John', age: 30 };
|
|
160
133
|
|
|
161
|
-
|
|
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
|
-
###
|
|
138
|
+
### 5. Sử dụng trong TypeScript (inject pipe)
|
|
164
139
|
|
|
165
140
|
```typescript
|
|
166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
+
```typescript
|
|
179
|
+
const signalObj = pipe.transform(data);
|
|
180
|
+
const signalObj = pipe.transform(data, false);
|
|
181
|
+
```
|
|
177
182
|
|
|
178
|
-
|
|
183
|
+
## Kiểu dữ liệu đầu ra
|
|
179
184
|
|
|
180
185
|
```typescript
|
|
181
|
-
//
|
|
182
|
-
|
|
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
|
-
|
|
206
|
+
**Bảng hành vi theo kiểu đầu vào:**
|
|
186
207
|
|
|
187
|
-
|
|
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
|
-
|
|
218
|
+
## Lưu ý quan trọng
|
|
190
219
|
|
|
191
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
216
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
233
|
-
{ name: 'John'
|
|
234
|
-
|
|
235
|
-
|
|
241
|
+
// ❌ Object là 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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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;
|
|
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-
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": ">=18.0.0",
|
|
6
|
-
"@libs-ui/utils": "0.2.356-
|
|
6
|
+
"@libs-ui/utils": "0.2.356-43"
|
|
7
7
|
},
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"module": "fesm2022/libs-ui-pipes-convert-object-to-signal.mjs",
|