@libs-ui/components-preview-text-data 0.2.356-42 → 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,37 +1,36 @@
|
|
|
1
1
|
# @libs-ui/components-preview-text-data
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Code editor/viewer mạnh mẽ dựa trên CodeMirror 6, hỗ trợ highlight cú pháp đa ngôn ngữ, linter thời gian thực, IntelliSense và bảo mật pattern.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsPreviewTextDataComponent` cung cấp một trình soạn thảo mã nguồn
|
|
7
|
+
`LibsUiComponentsPreviewTextDataComponent` cung cấp một trình soạn thảo/xem mã nguồn tích hợp sẵn vào Angular với kiến trúc Signals và OnPush. Component hỗ trợ highlight cú pháp cho 14 ngôn ngữ lập trình, kiểm tra lỗi cú pháp thời gian thực (linter) cho JavaScript, JSON, SQL và Python, gợi ý code thông minh (IntelliSense với dot-notation), cùng cơ chế bảo mật chặn pattern nguy hiểm cả khi gõ lẫn paste.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
11
|
+
- Highlight cú pháp cho 14 ngôn ngữ: JavaScript/TypeScript, HTML, CSS/SCSS, JSON, SQL, XML, YAML, Python, Java, C/C++, PHP, Go, Markdown, Plain Text
|
|
12
|
+
- Linter tích hợp phát hiện lỗi cú pháp thời gian thực cho JavaScript, JSON, SQL, Python
|
|
13
|
+
- IntelliSense với dot-notation: định nghĩa object/biến sẵn, gợi ý properties/methods khi gõ dấu chấm (giống IDE)
|
|
14
|
+
- Security policy: chặn pattern nguy hiểm (string hoặc RegExp) ngay khi gõ, chặn paste chứa vi phạm, emit danh sách vi phạm qua `(outViolations)`
|
|
15
|
+
- Lazy load ngôn ngữ: chỉ tải extension khi cần, tối ưu bundle size
|
|
16
|
+
- Non-destructive update: đổi ngôn ngữ, wrap, completions không làm mất nội dung hay vị trí con trỏ
|
|
17
|
+
- Chế độ editable/readonly linh hoạt
|
|
18
|
+
- Thanh công cụ tích hợp: copy nội dung, toggle line wrap, dropdown chọn ngôn ngữ
|
|
19
|
+
- Two-way binding cho `langSelected` qua `model()`
|
|
20
|
+
- Standalone component, ChangeDetectionStrategy.OnPush, Angular Signals
|
|
19
21
|
|
|
20
22
|
## Khi nào sử dụng
|
|
21
23
|
|
|
22
|
-
- Hiển thị
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- Kiểm tra
|
|
24
|
+
- Hiển thị cấu hình JSON, YAML hoặc đoạn mã mẫu trong tài liệu hoặc dashboard
|
|
25
|
+
- Cho phép người dùng biên tập câu lệnh SQL hoặc mã JavaScript trong các công cụ quản trị
|
|
26
|
+
- Xây dựng low-code/no-code editor cần kiểm soát bảo mật (chặn eval, fetch, localStorage...)
|
|
27
|
+
- Kiểm tra và xem log hoặc raw data từ API với highlight cú pháp rõ ràng
|
|
28
|
+
- Tích hợp IntelliSense cho đối tượng domain cụ thể (biến, API object, schema) trong form nhập mã
|
|
26
29
|
|
|
27
30
|
## Cài đặt
|
|
28
31
|
|
|
29
32
|
```bash
|
|
30
|
-
# npm
|
|
31
33
|
npm install @libs-ui/components-preview-text-data
|
|
32
|
-
|
|
33
|
-
# yarn
|
|
34
|
-
yarn add @libs-ui/components-preview-text-data
|
|
35
34
|
```
|
|
36
35
|
|
|
37
36
|
## Import
|
|
@@ -44,89 +43,403 @@ import { LibsUiComponentsPreviewTextDataComponent } from '@libs-ui/components-pr
|
|
|
44
43
|
imports: [LibsUiComponentsPreviewTextDataComponent],
|
|
45
44
|
// ...
|
|
46
45
|
})
|
|
47
|
-
export class
|
|
46
|
+
export class MyComponent {}
|
|
48
47
|
```
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
Import thêm types, constants khi cần:
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
```typescript
|
|
52
|
+
import {
|
|
53
|
+
LibsUiComponentsPreviewTextDataComponent,
|
|
54
|
+
PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT,
|
|
55
|
+
IPreviewTextDataChange,
|
|
56
|
+
IPreviewTextDataCompletionItem,
|
|
57
|
+
IPreviewTextDataViolation,
|
|
58
|
+
ILanguageOptions,
|
|
59
|
+
DEFAULT_SECURITY_PATTERNS,
|
|
60
|
+
} from '@libs-ui/components-preview-text-data';
|
|
61
|
+
```
|
|
53
62
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
## Ví dụ sử dụng
|
|
64
|
+
|
|
65
|
+
### 1. Chế độ xem (Read-only) — ẩn thanh công cụ
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// my-viewer.component.ts
|
|
69
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
70
|
+
import { LibsUiComponentsPreviewTextDataComponent } from '@libs-ui/components-preview-text-data';
|
|
71
|
+
|
|
72
|
+
@Component({
|
|
73
|
+
selector: 'app-my-viewer',
|
|
74
|
+
standalone: true,
|
|
75
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
76
|
+
imports: [LibsUiComponentsPreviewTextDataComponent],
|
|
77
|
+
template: `
|
|
78
|
+
<libs_ui-components-preview_text_data
|
|
79
|
+
[content]="configCode"
|
|
80
|
+
[langSelected]="'json'"
|
|
81
|
+
[hiddenAction]="true"
|
|
82
|
+
background="#fcfcfc" />
|
|
83
|
+
`,
|
|
84
|
+
})
|
|
85
|
+
export class MyViewerComponent {
|
|
86
|
+
readonly configCode = `{
|
|
87
|
+
"projectName": "Libs UI",
|
|
88
|
+
"version": "2.0.0",
|
|
89
|
+
"features": ["Signals", "CodeMirror", "OnPush"]
|
|
90
|
+
}`;
|
|
91
|
+
}
|
|
58
92
|
```
|
|
59
93
|
|
|
60
|
-
### Chế độ chỉnh sửa với Linter
|
|
94
|
+
### 2. Chế độ chỉnh sửa với Linter và đổi ngôn ngữ
|
|
61
95
|
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
96
|
+
```typescript
|
|
97
|
+
// sql-editor.component.ts
|
|
98
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
99
|
+
import {
|
|
100
|
+
LibsUiComponentsPreviewTextDataComponent,
|
|
101
|
+
IPreviewTextDataChange,
|
|
102
|
+
PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT,
|
|
103
|
+
} from '@libs-ui/components-preview-text-data';
|
|
104
|
+
import { Diagnostic } from '@codemirror/lint';
|
|
105
|
+
|
|
106
|
+
@Component({
|
|
107
|
+
selector: 'app-sql-editor',
|
|
108
|
+
standalone: true,
|
|
109
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
110
|
+
imports: [LibsUiComponentsPreviewTextDataComponent],
|
|
111
|
+
template: `
|
|
112
|
+
<libs_ui-components-preview_text_data
|
|
113
|
+
[content]="sqlQuery"
|
|
114
|
+
[(langSelected)]="currentLang"
|
|
115
|
+
[editable]="true"
|
|
116
|
+
[langsAccept]="['sql', 'javascript', 'json']"
|
|
117
|
+
(outChange)="handlerChange($event)"
|
|
118
|
+
(syntaxErrors)="handlerSyntaxErrors($event)" />
|
|
119
|
+
|
|
120
|
+
@if (lintErrors().length) {
|
|
121
|
+
<div class="p-3 bg-red-50 text-red-600 text-xs font-mono mt-2 rounded">
|
|
122
|
+
Lỗi cú pháp: {{ lintErrors()[0].message }}
|
|
123
|
+
</div>
|
|
124
|
+
}
|
|
125
|
+
`,
|
|
126
|
+
})
|
|
127
|
+
export class SqlEditorComponent {
|
|
128
|
+
readonly currentLang = signal<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>('sql');
|
|
129
|
+
readonly lintErrors = signal<Diagnostic[]>([]);
|
|
130
|
+
readonly sqlQuery = `SELECT id, name, email
|
|
131
|
+
FROM users
|
|
132
|
+
WHERE status = 'active'
|
|
133
|
+
ORDER BY created_at DESC
|
|
134
|
+
LIMIT 50;`;
|
|
135
|
+
|
|
136
|
+
handlerChange(event: IPreviewTextDataChange): void {
|
|
137
|
+
event.stopPropagation?.();
|
|
138
|
+
console.log('Nội dung thay đổi:', event.content, '— ngôn ngữ:', event.language);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
handlerSyntaxErrors(errors: Diagnostic[]): void {
|
|
142
|
+
this.lintErrors.set(errors);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
69
145
|
```
|
|
70
146
|
|
|
71
|
-
|
|
147
|
+
### 3. IntelliSense với dot-notation (giống IDE)
|
|
72
148
|
|
|
73
|
-
|
|
149
|
+
```typescript
|
|
150
|
+
// js-intellisense.component.ts
|
|
151
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
152
|
+
import {
|
|
153
|
+
LibsUiComponentsPreviewTextDataComponent,
|
|
154
|
+
IPreviewTextDataCompletionItem,
|
|
155
|
+
PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT,
|
|
156
|
+
} from '@libs-ui/components-preview-text-data';
|
|
74
157
|
|
|
75
|
-
|
|
158
|
+
@Component({
|
|
159
|
+
selector: 'app-js-intellisense',
|
|
160
|
+
standalone: true,
|
|
161
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
162
|
+
imports: [LibsUiComponentsPreviewTextDataComponent],
|
|
163
|
+
template: `
|
|
164
|
+
<libs_ui-components-preview_text_data
|
|
165
|
+
[content]="starterCode"
|
|
166
|
+
[(langSelected)]="lang"
|
|
167
|
+
[editable]="true"
|
|
168
|
+
[completions]="completions"
|
|
169
|
+
background="#fafbfc" />
|
|
170
|
+
`,
|
|
171
|
+
})
|
|
172
|
+
export class JsIntelliSenseComponent {
|
|
173
|
+
readonly lang = signal<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>('javascript');
|
|
174
|
+
|
|
175
|
+
readonly starterCode = `// Gõ "user." hoặc "config." để xem gợi ý
|
|
176
|
+
function process() {
|
|
177
|
+
const name = user.
|
|
178
|
+
const url = config.
|
|
179
|
+
}`;
|
|
180
|
+
|
|
181
|
+
readonly completions: IPreviewTextDataCompletionItem[] = [
|
|
182
|
+
{
|
|
183
|
+
label: 'user',
|
|
184
|
+
type: 'variable',
|
|
185
|
+
detail: 'object',
|
|
186
|
+
info: 'User object — thông tin người dùng hiện tại',
|
|
187
|
+
properties: [
|
|
188
|
+
{ label: 'id', type: 'property', detail: 'number', info: 'Unique user ID' },
|
|
189
|
+
{ label: 'name', type: 'property', detail: 'string', info: 'Họ và tên đầy đủ' },
|
|
190
|
+
{ label: 'email', type: 'property', detail: 'string', info: 'Địa chỉ email' },
|
|
191
|
+
{ label: 'role', type: 'property', detail: "'admin' | 'user'", info: 'Vai trò trong hệ thống' },
|
|
192
|
+
{ label: 'logout', type: 'method', detail: '() => Promise<void>', info: 'Đăng xuất tài khoản' },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
label: 'config',
|
|
197
|
+
type: 'variable',
|
|
198
|
+
detail: 'object',
|
|
199
|
+
info: 'Application configuration',
|
|
200
|
+
properties: [
|
|
201
|
+
{ label: 'apiUrl', type: 'property', detail: 'string', info: 'Base URL của API server' },
|
|
202
|
+
{ label: 'timeout', type: 'property', detail: 'number', info: 'Request timeout (ms)' },
|
|
203
|
+
{ label: 'debug', type: 'property', detail: 'boolean', info: 'Bật debug logging' },
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 4. Security policy — chặn pattern nguy hiểm
|
|
76
211
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
| `[lintIgnorePatterns]` | `string[]` | `[...]` | Các mẫu thông báo lỗi linter JS sẽ bỏ qua. |
|
|
212
|
+
```typescript
|
|
213
|
+
// secure-editor.component.ts
|
|
214
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
215
|
+
import {
|
|
216
|
+
LibsUiComponentsPreviewTextDataComponent,
|
|
217
|
+
DEFAULT_SECURITY_PATTERNS,
|
|
218
|
+
IPreviewTextDataViolation,
|
|
219
|
+
PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT,
|
|
220
|
+
} from '@libs-ui/components-preview-text-data';
|
|
87
221
|
|
|
88
|
-
|
|
222
|
+
@Component({
|
|
223
|
+
selector: 'app-secure-editor',
|
|
224
|
+
standalone: true,
|
|
225
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
226
|
+
imports: [LibsUiComponentsPreviewTextDataComponent],
|
|
227
|
+
template: `
|
|
228
|
+
<libs_ui-components-preview_text_data
|
|
229
|
+
[content]="starterCode"
|
|
230
|
+
[(langSelected)]="lang"
|
|
231
|
+
[editable]="true"
|
|
232
|
+
[forbiddenPatterns]="securityPatterns"
|
|
233
|
+
(outViolations)="handlerViolations($event)"
|
|
234
|
+
background="#fafbfc" />
|
|
235
|
+
|
|
236
|
+
@if (violations().length) {
|
|
237
|
+
<div class="p-3 bg-red-50 border border-red-200 rounded mt-2">
|
|
238
|
+
<p class="text-sm font-semibold text-red-700 mb-1">
|
|
239
|
+
Phát hiện {{ violations().length }} vi phạm bảo mật:
|
|
240
|
+
</p>
|
|
241
|
+
@for (v of violations(); track v.from) {
|
|
242
|
+
<p class="text-xs text-red-600 font-mono">
|
|
243
|
+
Dòng {{ v.line }}: "{{ v.matched }}" — vi phạm pattern {{ v.pattern }}
|
|
244
|
+
</p>
|
|
245
|
+
}
|
|
246
|
+
</div>
|
|
247
|
+
}
|
|
248
|
+
`,
|
|
249
|
+
})
|
|
250
|
+
export class SecureEditorComponent {
|
|
251
|
+
readonly lang = signal<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>('javascript');
|
|
252
|
+
readonly violations = signal<IPreviewTextDataViolation[]>([]);
|
|
253
|
+
readonly securityPatterns = DEFAULT_SECURITY_PATTERNS;
|
|
254
|
+
|
|
255
|
+
readonly starterCode = `// Code thuần — không gọi API hay truy cập storage
|
|
256
|
+
function calculateTotal(items) {
|
|
257
|
+
return items.reduce((sum, item) => sum + item.price * item.qty, 0);
|
|
258
|
+
}
|
|
259
|
+
// Thử gõ: eval("test") hoặc localStorage.getItem('key')
|
|
260
|
+
// → sẽ bị highlight đỏ và chặn paste`;
|
|
261
|
+
|
|
262
|
+
handlerViolations(violations: IPreviewTextDataViolation[]): void {
|
|
263
|
+
this.violations.set(violations);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 5. Chỉ cho phép một ngôn ngữ cố định (không hiển thị dropdown)
|
|
269
|
+
|
|
270
|
+
```html
|
|
271
|
+
<!-- Khi langsAccept có đúng 1 phần tử trùng với langSelected → dropdown bị ẩn -->
|
|
272
|
+
<libs_ui-components-preview_text_data
|
|
273
|
+
[content]="jsonData"
|
|
274
|
+
[(langSelected)]="lang"
|
|
275
|
+
[editable]="true"
|
|
276
|
+
[langsAccept]="['json']" />
|
|
277
|
+
```
|
|
89
278
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
|
93
|
-
|
|
279
|
+
## @Input()
|
|
280
|
+
|
|
281
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
282
|
+
|---|---|---|---|---|
|
|
283
|
+
| `[content]` | `string` | `''` | Nội dung code cần hiển thị hoặc chỉnh sửa | `[content]="myCode"` |
|
|
284
|
+
| `[(langSelected)]` | `PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT` | **Bắt buộc** | Ngôn ngữ highlight hiện tại. Hỗ trợ two-way binding qua `model()` | `[(langSelected)]="currentLang"` |
|
|
285
|
+
| `[editable]` | `boolean` | `false` | Cho phép người dùng chỉnh sửa nội dung trong editor | `[editable]="true"` |
|
|
286
|
+
| `[hiddenAction]` | `boolean` | `false` | Ẩn toàn bộ thanh công cụ (Copy, Wrap, dropdown ngôn ngữ) | `[hiddenAction]="true"` |
|
|
287
|
+
| `[langsAccept]` | `PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT[]` | `undefined` | Danh sách ngôn ngữ được phép chọn trong dropdown. Nếu chỉ có 1 phần tử trùng `langSelected` → dropdown bị ẩn | `[langsAccept]="['json', 'sql']"` |
|
|
288
|
+
| `[langsChangeLabel]` | `ILanguageOptions` | `undefined` | Tùy chỉnh nhãn hiển thị của một ngôn ngữ trong dropdown | `[langsChangeLabel]="{ id: 'json', label: 'Cấu hình JSON' }"` |
|
|
289
|
+
| `[completions]` | `IPreviewTextDataCompletionItem[]` | `[]` | Danh sách object/biến gợi ý khi gõ — hỗ trợ dot-notation cho properties lồng nhau (IntelliSense) | `[completions]="myCompletions"` |
|
|
290
|
+
| `[forbiddenPatterns]` | `T_ForbiddenPattern[]` | `[]` | Danh sách pattern bị cấm (string hoặc RegExp). Highlight đỏ khi gõ, chặn paste chứa vi phạm, phát ra `(outViolations)` | `[forbiddenPatterns]="DEFAULT_SECURITY_PATTERNS"` |
|
|
291
|
+
| `[lintIgnorePatterns]` | `string[]` | `['Cannot use import statement...', 'Unexpected token export', 'import ', '@angular/core']` | Danh sách chuỗi lỗi linter JS sẽ bị bỏ qua (ignore) trong quá trình kiểm tra | `[lintIgnorePatterns]="['import ']"` |
|
|
292
|
+
| `[background]` | `string` | `'#f8f9fa'` | Màu nền của vùng soạn thảo (CSS color value) | `background="#ffffff"` |
|
|
293
|
+
|
|
294
|
+
## @Output()
|
|
295
|
+
|
|
296
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
297
|
+
|---|---|---|---|---|
|
|
298
|
+
| `(outChange)` | `IPreviewTextDataChange` | Phát ra khi nội dung thay đổi, người dùng đổi ngôn ngữ hoặc toggle line wrap | `handlerChange(event: IPreviewTextDataChange): void { event.stopPropagation?.(); this.code.set(event.content); }` | `(outChange)="handlerChange($event)"` |
|
|
299
|
+
| `(syntaxErrors)` | `Diagnostic[]` | Phát ra mảng lỗi cú pháp mỗi khi linter chạy. Mảng rỗng khi không có lỗi | `handlerSyntaxErrors(errors: Diagnostic[]): void { this.errors.set(errors); }` | `(syntaxErrors)="handlerSyntaxErrors($event)"` |
|
|
300
|
+
| `(outViolations)` | `IPreviewTextDataViolation[]` | Phát ra danh sách vi phạm (vị trí, dòng, pattern, chuỗi bị match) mỗi khi nội dung thay đổi khi có `forbiddenPatterns`. Mảng rỗng khi không có vi phạm | `handlerViolations(violations: IPreviewTextDataViolation[]): void { this.violations.set(violations); }` | `(outViolations)="handlerViolations($event)"` |
|
|
94
301
|
|
|
95
302
|
## Types & Interfaces
|
|
96
303
|
|
|
97
304
|
```typescript
|
|
98
|
-
|
|
305
|
+
import {
|
|
306
|
+
PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT,
|
|
307
|
+
IPreviewTextDataChange,
|
|
308
|
+
IPreviewTextDataCompletionItem,
|
|
309
|
+
IPreviewTextDataViolation,
|
|
310
|
+
ILanguageOptions,
|
|
311
|
+
T_ForbiddenPattern,
|
|
312
|
+
DEFAULT_SECURITY_PATTERNS,
|
|
313
|
+
} from '@libs-ui/components-preview-text-data';
|
|
314
|
+
```
|
|
99
315
|
|
|
316
|
+
```typescript
|
|
317
|
+
/** Tất cả ngôn ngữ được hỗ trợ */
|
|
318
|
+
export type PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT =
|
|
319
|
+
| 'javascript'
|
|
320
|
+
| 'html'
|
|
321
|
+
| 'css'
|
|
322
|
+
| 'markdown'
|
|
323
|
+
| 'json'
|
|
324
|
+
| 'sql'
|
|
325
|
+
| 'xml'
|
|
326
|
+
| 'yaml'
|
|
327
|
+
| 'python'
|
|
328
|
+
| 'java'
|
|
329
|
+
| 'cpp'
|
|
330
|
+
| 'php'
|
|
331
|
+
| 'go'
|
|
332
|
+
| 'text';
|
|
333
|
+
|
|
334
|
+
/** Payload phát ra qua (outChange) */
|
|
100
335
|
export interface IPreviewTextDataChange {
|
|
101
336
|
content: string;
|
|
102
337
|
isWrap: boolean;
|
|
103
338
|
language: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;
|
|
104
|
-
|
|
339
|
+
/** Loại thay đổi: nội dung / ngôn ngữ / line wrap */
|
|
340
|
+
contextChange: 'content' | 'language' | 'isWrap';
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/** Một item trong danh sách completions — hỗ trợ dot-notation qua properties[] */
|
|
344
|
+
export interface IPreviewTextDataCompletionItem {
|
|
345
|
+
label: string;
|
|
346
|
+
/** @default 'variable' */
|
|
347
|
+
type?: 'variable' | 'property' | 'function' | 'class' | 'method' | 'keyword' | 'text' | 'constant' | 'interface' | 'type' | 'enum' | 'field' | 'namespace' | 'module';
|
|
348
|
+
/** Gợi ý type ngắn hiển thị cạnh label, VD: 'string', '() => void' */
|
|
349
|
+
detail?: string;
|
|
350
|
+
/** Mô tả dài hiển thị trong tooltip */
|
|
351
|
+
info?: string;
|
|
352
|
+
/** Properties lồng nhau — được gợi ý sau dấu chấm (dot-notation) */
|
|
353
|
+
properties?: IPreviewTextDataCompletionItem[];
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** Vi phạm được phát hiện trong editor, phát ra qua (outViolations) */
|
|
357
|
+
export interface IPreviewTextDataViolation {
|
|
358
|
+
/** Vị trí bắt đầu (character offset) */
|
|
359
|
+
from: number;
|
|
360
|
+
/** Vị trí kết thúc (character offset) */
|
|
361
|
+
to: number;
|
|
362
|
+
/** Số dòng (1-indexed) */
|
|
363
|
+
line: number;
|
|
364
|
+
/** Tên/mô tả của pattern đã bị vi phạm */
|
|
365
|
+
pattern: string;
|
|
366
|
+
/** Đoạn text thực tế bị match */
|
|
367
|
+
matched: string;
|
|
105
368
|
}
|
|
106
369
|
|
|
370
|
+
/** Tùy chỉnh label hiển thị của một ngôn ngữ trong dropdown */
|
|
107
371
|
export interface ILanguageOptions {
|
|
108
|
-
|
|
372
|
+
id: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;
|
|
373
|
+
label: string;
|
|
109
374
|
}
|
|
375
|
+
|
|
376
|
+
/** Pattern cấm: string literal (case-insensitive) hoặc RegExp tùy chỉnh */
|
|
377
|
+
export type T_ForbiddenPattern = string | RegExp;
|
|
110
378
|
```
|
|
111
379
|
|
|
112
|
-
##
|
|
380
|
+
## Constants
|
|
381
|
+
|
|
382
|
+
### DEFAULT_SECURITY_PATTERNS
|
|
113
383
|
|
|
114
|
-
|
|
384
|
+
Bộ pattern bảo mật mặc định cho low-code platform — chặn các API nguy hiểm:
|
|
115
385
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
| `.cm-editor` | Class gốc của editor CodeMirror. |
|
|
119
|
-
| `.cm-scroller` | Vùng cuộn của editor. |
|
|
120
|
-
| `.cm-content` | Vùng chứa nội dung chữ. |
|
|
386
|
+
```typescript
|
|
387
|
+
import { DEFAULT_SECURITY_PATTERNS } from '@libs-ui/components-preview-text-data';
|
|
121
388
|
|
|
122
|
-
|
|
389
|
+
// Sử dụng trực tiếp
|
|
390
|
+
[forbiddenPatterns]="DEFAULT_SECURITY_PATTERNS"
|
|
391
|
+
```
|
|
123
392
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
|
127
|
-
|
|
128
|
-
|
|
|
129
|
-
|
|
|
393
|
+
Các pattern được chặn:
|
|
394
|
+
|
|
395
|
+
| Pattern | Lý do |
|
|
396
|
+
|---|---|
|
|
397
|
+
| `/eval\s*\(/i` | Thực thi code động |
|
|
398
|
+
| `/new\s+Function\s*\(/i` | Tạo hàm từ string |
|
|
399
|
+
| `/document\.cookie/i` | Đọc cookie nhạy cảm |
|
|
400
|
+
| `/localStorage/i` | Truy cập local storage |
|
|
401
|
+
| `/sessionStorage/i` | Truy cập session storage |
|
|
402
|
+
| `/fetch\s*\(/i` | Gọi HTTP request |
|
|
403
|
+
| `/new\s+XMLHttpRequest/i` | Gọi HTTP request cũ |
|
|
404
|
+
| `/require\s*\(/i` | Load module Node.js |
|
|
405
|
+
| `/import\s*\(/i` | Dynamic import |
|
|
406
|
+
| `/process\.env/i` | Đọc biến môi trường |
|
|
407
|
+
| `/<script/i` | Chèn thẻ script |
|
|
408
|
+
| `/document\.write\s*\(/i` | Ghi trực tiếp vào DOM |
|
|
409
|
+
| `/window\.location\s*=/i` | Chuyển hướng trang |
|
|
410
|
+
|
|
411
|
+
## Ngôn ngữ được hỗ trợ
|
|
412
|
+
|
|
413
|
+
| ID | Nhãn hiển thị | Linter |
|
|
414
|
+
|---|---|---|
|
|
415
|
+
| `text` | Plain Text | Không |
|
|
416
|
+
| `javascript` | JavaScript/TypeScript | Có (JS syntax + trailing dot detection) |
|
|
417
|
+
| `html` | HTML | Không |
|
|
418
|
+
| `css` | CSS/SCSS/SASS | Không |
|
|
419
|
+
| `markdown` | Markdown | Không |
|
|
420
|
+
| `json` | JSON | Có (JSON.parse validation) |
|
|
421
|
+
| `sql` | SQL | Có (syntaxTree parse errors) |
|
|
422
|
+
| `xml` | XML | Không |
|
|
423
|
+
| `yaml` | YAML | Không |
|
|
424
|
+
| `python` | Python | Có (syntaxTree parse errors) |
|
|
425
|
+
| `java` | Java | Không |
|
|
426
|
+
| `cpp` | C/C++ | Không |
|
|
427
|
+
| `php` | PHP | Không |
|
|
428
|
+
| `go` | Go | Không |
|
|
429
|
+
|
|
430
|
+
## Lưu ý quan trọng
|
|
431
|
+
|
|
432
|
+
⚠️ **langSelected là bắt buộc**: Input `[(langSelected)]` là `model.required()` — PHẢI truyền giá trị, không có default. Thiếu giá trị sẽ gây lỗi Angular runtime.
|
|
433
|
+
|
|
434
|
+
⚠️ **Lazy load ngôn ngữ**: Component lazy-load extension của từng ngôn ngữ khi cần. Lần đầu tiên chọn một ngôn ngữ mới có thể có độ trễ nhỏ (vài trăm ms) để tải thư viện từ bundle.
|
|
435
|
+
|
|
436
|
+
⚠️ **Linter chỉ hoạt động khi editable**: Linter phát hiện lỗi cú pháp ngay cả khi `[editable]="false"`, nhưng người dùng chỉ nhập được khi `[editable]="true"`. Output `(syntaxErrors)` và `(outViolations)` luôn phát ra dù ở chế độ nào.
|
|
437
|
+
|
|
438
|
+
⚠️ **forbiddenPatterns chặn paste hoàn toàn**: Khi `[forbiddenPatterns]` được cấu hình, mọi thao tác paste chứa pattern bị cấm sẽ bị hủy toàn bộ (không paste được phần nào). Người dùng cần paste từng phần hoặc nhập thủ công.
|
|
439
|
+
|
|
440
|
+
⚠️ **Dropdown ngôn ngữ bị ẩn tự động**: Khi `[langsAccept]` chứa đúng 1 ngôn ngữ trùng với `langSelected` hiện tại, dropdown chọn ngôn ngữ sẽ bị ẩn tự động (computed `acceptChangeLang = false`).
|
|
441
|
+
|
|
442
|
+
⚠️ **Cleanup tự động**: Component tự hủy EditorView instance và xóa cache ngôn ngữ khi bị destroy (qua `DestroyRef`). Không cần thao tác cleanup thủ công từ phía consumer.
|
|
130
443
|
|
|
131
444
|
## Demo
|
|
132
445
|
|
|
@@ -134,18 +447,17 @@ export interface ILanguageOptions {
|
|
|
134
447
|
npx nx serve core-ui
|
|
135
448
|
```
|
|
136
449
|
|
|
137
|
-
Truy cập:
|
|
450
|
+
Truy cập: http://localhost:4500/preview-text-data
|
|
138
451
|
|
|
139
452
|
## Unit Tests
|
|
140
453
|
|
|
141
454
|
```bash
|
|
142
|
-
# Chạy
|
|
455
|
+
# Chạy test cho lib
|
|
143
456
|
npx nx test components-preview-text-data
|
|
144
457
|
|
|
458
|
+
# Chạy test một file cụ thể
|
|
459
|
+
npx nx test components-preview-text-data --testFile=libs-ui/components/preview-text-data/src/preview-text-data.component.spec.ts
|
|
460
|
+
|
|
145
461
|
# Coverage
|
|
146
462
|
npx nx test components-preview-text-data --coverage
|
|
147
463
|
```
|
|
148
|
-
|
|
149
|
-
## License
|
|
150
|
-
|
|
151
|
-
MIT
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, inject, DestroyRef, computed, input, model, output, viewChild, effect,
|
|
2
|
+
import { signal, inject, DestroyRef, computed, input, model, output, viewChild, effect, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
3
|
import { autocompletion } from '@codemirror/autocomplete';
|
|
4
4
|
import { syntaxTree } from '@codemirror/language';
|
|
5
5
|
import { lintGutter, linter } from '@codemirror/lint';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept?.length || (langsAccept as string[]).includes(item.id));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, EditorState, Extension, Prec, Text, Transaction } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private readonly contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang());\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter với 2-pass detection:\n * 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)\n * 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n\n // Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm\n const trailingDotLines = new Set<number>();\n for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {\n const line = doc.line(lineNum);\n const trimmed = line.text.trimEnd();\n const match = /(\\w+)\\.\\s*$/.exec(trimmed);\n if (!match) continue;\n\n trailingDotLines.add(lineNum);\n const dotPos = line.from + trimmed.lastIndexOf('.');\n diagnostics.push({\n from: dotPos,\n to: dotPos + 1,\n severity: 'error',\n message: `Incomplete property access on \"${match[1]}\"`,\n });\n }\n\n // Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)\n // để lọc cascading errors từ syntaxTree\n const taintedLines = new Set<number>();\n for (const lineNum of trailingDotLines) {\n for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {\n taintedLines.add(i);\n }\n }\n\n // Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)\n const tree = syntaxTree(view.state);\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n if (node.from === node.to) return; // Bỏ qua empty-range node (cascading error)\n\n const errorLineNum = doc.lineAt(node.from).number;\n if (taintedLines.has(errorLineNum)) return;\n\n diagnostics.push({\n from: node.from,\n to: Math.min(node.to, doc.length),\n severity: 'error',\n message: this.buildJsErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildJsErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n const text = doc.sliceString(node.from, node.to).trim();\n if (text) return `JavaScript syntax error near \"${text}\"`;\n\n const prevToken = this.getTokenBefore(doc, node.from);\n if (!prevToken) return 'JavaScript syntax error';\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n\n return `JavaScript syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n diagnostics.push({\n from: Math.max(0, node.from - 1),\n to: node.from,\n severity: 'error',\n message: this.buildSqlErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildSqlErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'SQL syntax error at beginning of statement';\n }\n\n if (/FROM$/i.test(prevToken)) {\n return 'Expected table name after FROM';\n }\n\n if (/SELECT$/i.test(prevToken)) {\n return 'Expected column list after SELECT';\n }\n\n if (/WHERE$/i.test(prevToken)) {\n return 'Expected condition after WHERE';\n }\n\n if (prevToken.endsWith('(')) {\n return 'Missing closing \")\"';\n }\n\n return `Unexpected end of SQL after \"${prevToken}\"`;\n }\n\n private getTokenBefore(doc: Text, pos: number): string {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n\n const match = /(\\S+)\\s*$/.exec(text);\n return match?.[1] ?? '';\n }\n\n /**\n * Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.\n * Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.\n */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n\n diagnostics.push({\n from,\n to: Math.min(to, doc.length),\n severity: 'error',\n message: this.buildPythonErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildPythonErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n const textSuffix = text ? ` near \"${text}\"` : '';\n return `Python syntax error${textSuffix}`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'Python syntax error';\n }\n\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (prevToken.endsWith('.')) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n\n return `Python syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo CodeMirror extension cho custom completions từ danh sách input.\n * Hỗ trợ 2 chế độ:\n * 1. Gõ tên biến → gợi ý top-level items\n * 2. Gõ `obj.` → gợi ý properties của obj\n */\n private buildCompletionExtension(items: IPreviewTextDataCompletionItem[]): Extension {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Chế độ dot-notation: gõ \"obj.prop\" → gợi ý properties của obj\n const dotMatch = context.matchBefore(/\\w+\\.\\w*/);\n if (dotMatch) {\n const dotPos = dotMatch.text.indexOf('.');\n const objectName = dotMatch.text.slice(0, dotPos);\n const parent = items.find((i) => i.label === objectName);\n if (parent?.properties?.length) {\n return {\n from: dotMatch.from + dotPos + 1,\n options: parent.properties.map((p) => ({\n label: p.label,\n type: p.type ?? 'property',\n detail: p.detail ?? '',\n info: p.info ?? '',\n })),\n };\n }\n }\n\n // Chế độ top-level: gợi ý tên biến/object khi gõ ký tự\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({\n label: item.label,\n type: item.type ?? 'variable',\n detail: item.detail ?? '',\n info: item.info ?? '',\n })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n }\n\n /**\n * Tạo extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm\n */\n private buildForbiddenExtension(patterns: T_ForbiddenPattern[]): Extension {\n const toGlobalRegex = (p: T_ForbiddenPattern): RegExp => {\n if (p instanceof RegExp) {\n const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;\n return new RegExp(p.source, flags);\n }\n return new RegExp(this.escapeRegex(p), 'gi');\n };\n\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n const tree = syntaxTree(view.state);\n\n // Build a Set of comment ranges từ AST để skip match nằm trong comment\n const commentRanges: { from: number; to: number }[] = [];\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n\n const isInComment = (from: number, to: number): boolean => commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n\n if (isInComment(from, to)) continue;\n\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n\n diagnostics.push({\n from,\n to,\n severity: 'error',\n message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật`,\n });\n\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n this.outViolations.emit(violations);\n return diagnostics;\n });\n\n // Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return []; // [] = block transaction\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept?.length || (langsAccept as string[]).includes(item.id));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, EditorState, Extension, Prec, Text, Transaction } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private readonly contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang());\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter với 2-pass detection:\n * 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)\n * 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n\n // Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm\n const trailingDotLines = new Set<number>();\n for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {\n const line = doc.line(lineNum);\n const trimmed = line.text.trimEnd();\n const match = /(\\w+)\\.\\s*$/.exec(trimmed);\n if (!match) continue;\n\n trailingDotLines.add(lineNum);\n const dotPos = line.from + trimmed.lastIndexOf('.');\n diagnostics.push({\n from: dotPos,\n to: dotPos + 1,\n severity: 'error',\n message: `Incomplete property access on \"${match[1]}\"`,\n });\n }\n\n // Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)\n // để lọc cascading errors từ syntaxTree\n const taintedLines = new Set<number>();\n for (const lineNum of trailingDotLines) {\n for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {\n taintedLines.add(i);\n }\n }\n\n // Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)\n const tree = syntaxTree(view.state);\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n if (node.from === node.to) return; // Bỏ qua empty-range node (cascading error)\n\n const errorLineNum = doc.lineAt(node.from).number;\n if (taintedLines.has(errorLineNum)) return;\n\n diagnostics.push({\n from: node.from,\n to: Math.min(node.to, doc.length),\n severity: 'error',\n message: this.buildJsErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildJsErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n const text = doc.sliceString(node.from, node.to).trim();\n if (text) return `JavaScript syntax error near \"${text}\"`;\n\n const prevToken = this.getTokenBefore(doc, node.from);\n if (!prevToken) return 'JavaScript syntax error';\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n\n return `JavaScript syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n diagnostics.push({\n from: Math.max(0, node.from - 1),\n to: node.from,\n severity: 'error',\n message: this.buildSqlErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildSqlErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'SQL syntax error at beginning of statement';\n }\n\n if (/FROM$/i.test(prevToken)) {\n return 'Expected table name after FROM';\n }\n\n if (/SELECT$/i.test(prevToken)) {\n return 'Expected column list after SELECT';\n }\n\n if (/WHERE$/i.test(prevToken)) {\n return 'Expected condition after WHERE';\n }\n\n if (prevToken.endsWith('(')) {\n return 'Missing closing \")\"';\n }\n\n return `Unexpected end of SQL after \"${prevToken}\"`;\n }\n\n private getTokenBefore(doc: Text, pos: number): string {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n\n const match = /(\\S+)\\s*$/.exec(text);\n return match?.[1] ?? '';\n }\n\n /**\n * Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.\n * Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.\n */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n\n diagnostics.push({\n from,\n to: Math.min(to, doc.length),\n severity: 'error',\n message: this.buildPythonErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildPythonErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n const textSuffix = text ? ` near \"${text}\"` : '';\n return `Python syntax error${textSuffix}`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'Python syntax error';\n }\n\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (prevToken.endsWith('.')) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n\n return `Python syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo CodeMirror extension cho custom completions từ danh sách input.\n * Hỗ trợ 2 chế độ:\n * 1. Gõ tên biến → gợi ý top-level items\n * 2. Gõ `obj.` → gợi ý properties của obj\n */\n private buildCompletionExtension(items: IPreviewTextDataCompletionItem[]): Extension {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Chế độ dot-notation: gõ \"obj.prop\" → gợi ý properties của obj\n const dotMatch = context.matchBefore(/\\w+\\.\\w*/);\n if (dotMatch) {\n const dotPos = dotMatch.text.indexOf('.');\n const objectName = dotMatch.text.slice(0, dotPos);\n const parent = items.find((i) => i.label === objectName);\n if (parent?.properties?.length) {\n return {\n from: dotMatch.from + dotPos + 1,\n options: parent.properties.map((p) => ({\n label: p.label,\n type: p.type ?? 'property',\n detail: p.detail ?? '',\n info: p.info ?? '',\n })),\n };\n }\n }\n\n // Chế độ top-level: gợi ý tên biến/object khi gõ ký tự\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({\n label: item.label,\n type: item.type ?? 'variable',\n detail: item.detail ?? '',\n info: item.info ?? '',\n })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n }\n\n /**\n * Tạo extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm\n */\n private buildForbiddenExtension(patterns: T_ForbiddenPattern[]): Extension {\n const toGlobalRegex = (p: T_ForbiddenPattern): RegExp => {\n if (p instanceof RegExp) {\n const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;\n return new RegExp(p.source, flags);\n }\n return new RegExp(this.escapeRegex(p), 'gi');\n };\n\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n const tree = syntaxTree(view.state);\n\n // Build a Set of comment ranges từ AST để skip match nằm trong comment\n const commentRanges: { from: number; to: number }[] = [];\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n\n const isInComment = (from: number, to: number): boolean => commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n\n if (isInComment(from, to)) continue;\n\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n\n diagnostics.push({\n from,\n to,\n severity: 'error',\n message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật`,\n });\n\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n this.outViolations.emit(violations);\n return diagnostics;\n });\n\n // Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return []; // [] = block transaction\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-preview-text-data",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": ">=18.0.0",
|
|
6
|
-
"@libs-ui/components-buttons-button": "0.2.356-
|
|
7
|
-
"@libs-ui/components-dropdown": "0.2.356-
|
|
8
|
-
"@libs-ui/services-notification": "0.2.356-
|
|
9
|
-
"@libs-ui/utils": "0.2.356-
|
|
10
|
-
"@codemirror/autocomplete": "6.20.
|
|
11
|
-
"@codemirror/language": "6.
|
|
6
|
+
"@libs-ui/components-buttons-button": "0.2.356-43",
|
|
7
|
+
"@libs-ui/components-dropdown": "0.2.356-43",
|
|
8
|
+
"@libs-ui/services-notification": "0.2.356-43",
|
|
9
|
+
"@libs-ui/utils": "0.2.356-43",
|
|
10
|
+
"@codemirror/autocomplete": "6.20.2",
|
|
11
|
+
"@codemirror/language": "6.12.3",
|
|
12
12
|
"@codemirror/lint": "6.9.1",
|
|
13
13
|
"@codemirror/state": "6.5.2",
|
|
14
14
|
"@codemirror/view": "6.38.6",
|
|
15
|
-
"@lezer/common": "1.
|
|
16
|
-
"@libs-ui/components-list": "0.2.356-
|
|
15
|
+
"@lezer/common": "1.5.2",
|
|
16
|
+
"@libs-ui/components-list": "0.2.356-43",
|
|
17
17
|
"codemirror6": "npm:codemirror@6.0.2",
|
|
18
|
-
"@libs-ui/services-http-request": "0.2.356-
|
|
18
|
+
"@libs-ui/services-http-request": "0.2.356-43",
|
|
19
19
|
"@codemirror/lang-javascript": "6.2.4",
|
|
20
20
|
"@codemirror/lang-html": "6.4.11",
|
|
21
21
|
"@codemirror/lang-css": "6.3.1",
|