@libs-ui/components-preview-text-data 0.2.356-3 → 0.2.356-30
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/esm2022/preview-text-data.component.mjs +291 -18
- package/esm2022/preview-text-data.define.mjs +21 -1
- package/esm2022/preview-text-data.interfaces.mjs +1 -1
- package/fesm2022/libs-ui-components-preview-text-data.mjs +311 -18
- package/fesm2022/libs-ui-components-preview-text-data.mjs.map +1 -1
- package/package.json +27 -5
- package/preview-text-data.component.d.ts +45 -4
- package/preview-text-data.define.d.ts +6 -1
- package/preview-text-data.interfaces.d.ts +29 -0
|
@@ -97,6 +97,7 @@ export const languageRegistry = {
|
|
|
97
97
|
const { python } = await import('@codemirror/lang-python');
|
|
98
98
|
return python();
|
|
99
99
|
},
|
|
100
|
+
linter: async (component) => component.createPythonLinter(),
|
|
100
101
|
},
|
|
101
102
|
java: {
|
|
102
103
|
loader: async () => {
|
|
@@ -123,6 +124,25 @@ export const languageRegistry = {
|
|
|
123
124
|
},
|
|
124
125
|
},
|
|
125
126
|
};
|
|
127
|
+
/**
|
|
128
|
+
* Bộ pattern bảo mật mặc định cho low-code platform.
|
|
129
|
+
* Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...
|
|
130
|
+
*/
|
|
131
|
+
export const DEFAULT_SECURITY_PATTERNS = [
|
|
132
|
+
/eval\s*\(/i,
|
|
133
|
+
/new\s+Function\s*\(/i,
|
|
134
|
+
/document\.cookie/i,
|
|
135
|
+
/localStorage/i,
|
|
136
|
+
/sessionStorage/i,
|
|
137
|
+
/fetch\s*\(/i,
|
|
138
|
+
/new\s+XMLHttpRequest/i,
|
|
139
|
+
/require\s*\(/i,
|
|
140
|
+
/import\s*\(/i,
|
|
141
|
+
/process\.env/i,
|
|
142
|
+
/<script/i,
|
|
143
|
+
/document\.write\s*\(/i,
|
|
144
|
+
/window\.location\s*=/i,
|
|
145
|
+
];
|
|
126
146
|
/**
|
|
127
147
|
* Tạo default language extension cho plain text
|
|
128
148
|
* Sử dụng khi ngôn ngữ không được hỗ trợ
|
|
@@ -136,4 +156,4 @@ export const createDefaultLanguage = async () => {
|
|
|
136
156
|
},
|
|
137
157
|
});
|
|
138
158
|
};
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2QyxPQUFPLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE0QjtJQUN0RCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUNuQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO0lBQ3BELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsRUFBRSxFQUFFLE1BQU0s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aEIsQ0FBQztLQUNGO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDZixDQUFDO0tBQ0Y7SUFDRCxHQUFHLEVBQUU7UUFDSCxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckQsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNmLENBQUM7S0FDRjtJQUNELEVBQUUsRUFBRTtRQUNGLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqQixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNuRCxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2QsQ0FBQztLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssSUFBd0IsRUFBRTtJQUNsRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNoRSxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE1BQU07WUFDVixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCByZXR1cm5MaXN0T2JqZWN0IH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRGFuaCBzw6FjaCBjw6FjIG5nw7RuIG5n4buvIMSRxrDhu6NjIGjhu5cgdHLhu6NcbiAqIFPhu60gZOG7pW5nIGNvbnN0IGFycmF5IMSR4buDIHRyw6FuaCB04bqhbyBt4bubaSBt4buXaSBs4bqnbiB0cnV5IGPhuq1wXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25zTGFuZ0RhdGE6IEFycmF5PElMYW5ndWFnZU9wdGlvbnM+ID0gW1xuICB7IGlkOiAndGV4dCcsIGxhYmVsOiAnUGxhaW4gVGV4dCcgfSxcbiAgeyBpZDogJ2phdmFzY3JpcHQnLCBsYWJlbDogJ0phdmFTY3JpcHQvVHlwZVNjcmlwdCcgfSxcbiAgeyBpZDogJ2h0bWwnLCBsYWJlbDogJ0hUTUwnIH0sXG4gIHsgaWQ6ICdjc3MnLCBsYWJlbDogJ0NTUy9TQ1NTL1NBU1MnIH0sXG4gIHsgaWQ6ICdtYXJrZG93bicsIGxhYmVsOiAnTWFya2Rvd24nIH0sXG4gIHsgaWQ6ICdqc29uJywgbGFiZWw6ICdKU09OJyB9LFxuICB7IGlkOiAnc3FsJywgbGFiZWw6ICdTUUwnIH0sXG4gIHsgaWQ6ICd4bWwnLCBsYWJlbDogJ1hNTCcgfSxcbiAgeyBpZDogJ3lhbWwnLCBsYWJlbDogJ1lBTUwnIH0sXG4gIHsgaWQ6ICdweXRob24nLCBsYWJlbDogJ1B5dGhvbicgfSxcbiAgeyBpZDogJ2phdmEnLCBsYWJlbDogJ0phdmEnIH0sXG4gIHsgaWQ6ICdjcHAnLCBsYWJlbDogJ0MvQysrJyB9LFxuICB7IGlkOiAncGhwJywgbGFiZWw6ICdQSFAnIH0sXG4gIHsgaWQ6ICdnbycsIGxhYmVsOiAnR28nIH0sXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZyA9IChsYW5nc0FjY2VwdD86IEFycmF5PFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+LCBsYW5nc0NoYW5nZUxhYmVsPzogSUxhbmd1YWdlT3B0aW9ucyk6IElMaXN0Q29uZmlnSXRlbSA9PiB7XG4gIGNvbnN0IGxhbmdzID0gWy4uLm9wdGlvbnNMYW5nRGF0YV0uZmlsdGVyKChpdGVtKSA9PiAhbGFuZ3NBY2NlcHQgfHwgIWxhbmdzQWNjZXB0Lmxlbmd0aCB8fCBsYW5nc0FjY2VwdC5pbmNsdWRlcyhpdGVtLmlkIGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpKTtcblxuICBsYW5ncy5mb3JFYWNoKChpdGVtKSA9PiAoe1xuICAgIGlkOiBpdGVtLmlkLFxuICAgIGxhYmVsOiBsYW5nc0NoYW5nZUxhYmVsPy5sYWJlbCB8fCBpdGVtLmxhYmVsLFxuICB9KSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndGV4dCcsXG4gICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPih7XG4gICAgICBvYmplY3RJbnN0YW5jZTogcmV0dXJuTGlzdE9iamVjdChsYW5ncyksXG4gICAgICBmdW5jdGlvbk5hbWU6ICdsaXN0JyxcbiAgICAgIGFyZ3VtZW50c1ZhbHVlOiBbbmV3IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QoeyBmcm9tT2JqZWN0OiB7IHBhZ2U6IDEsIHBlcl9wYWdlOiA0MCB9IH0pXSxcbiAgICB9KSxcbiAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHNpZ25hbCh7XG4gICAgICBmaWVsZEtleTogJ2lkJyxcbiAgICAgIG5vdFVzZVZpcnR1YWxTY3JvbGw6IHRydWUsXG4gICAgfSksXG4gIH07XG59O1xuXG50eXBlIFRfTGFuZ3VhZ2VMb2FkZXIgPSAoKSA9PiBQcm9taXNlPEV4dGVuc2lvbj47XG50eXBlIFRfTGludGVyTG9hZGVyID0gKGNvbXBvbmVudDogTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCkgPT4gUHJvbWlzZTxFeHRlbnNpb24+O1xuaW50ZXJmYWNlIElfTGFuZ3VhZ2VSZWdpc3RyeUl0ZW0ge1xuICBsb2FkZXI6IFRfTGFuZ3VhZ2VMb2FkZXI7XG4gIGxpbnRlcj86IFRfTGludGVyTG9hZGVyO1xufVxuXG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgSV9MYW5ndWFnZVJlZ2lzdHJ5SXRlbT4gPSB7XG4gIGphdmFzY3JpcHQ6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgamF2YXNjcmlwdCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWphdmFzY3JpcHQnKTtcbiAgICAgIHJldHVybiBqYXZhc2NyaXB0KHsganN4OiB0cnVlLCB0eXBlc2NyaXB0OiB0cnVlIH0pO1xuICAgIH0sXG4gICAgbGludGVyOiBhc3luYyAoY29tcG9uZW50KSA9PiBjb21wb25lbnQuY3JlYXRlSnNMaW50ZXIoKSxcbiAgfSxcbiAgaHRtbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBodG1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctaHRtbCcpO1xuICAgICAgcmV0dXJuIGh0bWwoKTtcbiAgICB9LFxuICB9LFxuICBjc3M6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY3NzIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctY3NzJyk7XG4gICAgICByZXR1cm4gY3NzKCk7XG4gICAgfSxcbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbWFya2Rvd24gfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93bicpO1xuICAgICAgcmV0dXJuIG1hcmtkb3duKCk7XG4gICAgfSxcbiAgfSxcbiAganNvbjoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBqc29uIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctanNvbicpO1xuICAgICAgcmV0dXJuIGpzb24oKTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZUpzb25MaW50ZXIoKSxcbiAgfSxcbiAgc3FsOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IHNxbCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLXNxbCcpO1xuICAgICAgcmV0dXJuIHNxbCgpO1xuICAgIH0sXG4gICAgbGludGVyOiBhc3luYyAoY29tcG9uZW50KSA9PiBjb21wb25lbnQuY3JlYXRlU3FsTGludGVyKCksXG4gIH0sXG4gIHhtbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyB4bWwgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy14bWwnKTtcbiAgICAgIHJldHVybiB4bWwoKTtcbiAgICB9LFxuICB9LFxuICB5YW1sOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IHlhbWwgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy15YW1sJyk7XG4gICAgICByZXR1cm4geWFtbCgpO1xuICAgIH0sXG4gIH0sXG4gIHB5dGhvbjoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBweXRob24gfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1weXRob24nKTtcbiAgICAgIHJldHVybiBweXRob24oKTtcbiAgICB9LFxuICB9LFxuICBqYXZhOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGphdmEgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1qYXZhJyk7XG4gICAgICByZXR1cm4gamF2YSgpO1xuICAgIH0sXG4gIH0sXG4gIGNwcDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjcHAgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1jcHAnKTtcbiAgICAgIHJldHVybiBjcHAoKTtcbiAgICB9LFxuICB9LFxuICBwaHA6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcGhwIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctcGhwJyk7XG4gICAgICByZXR1cm4gcGhwKCk7XG4gICAgfSxcbiAgfSxcbiAgZ286IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ28gfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1nbycpO1xuICAgICAgcmV0dXJuIGdvKCk7XG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogVOG6oW8gZGVmYXVsdCBsYW5ndWFnZSBleHRlbnNpb24gY2hvIHBsYWluIHRleHRcbiAqIFPhu60gZOG7pW5nIGtoaSBuZ8O0biBuZ+G7ryBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7o1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdExhbmd1YWdlID0gYXN5bmMgKCk6IFByb21pc2U8RXh0ZW5zaW9uPiA9PiB7XG4gIGNvbnN0IHsgU3RyZWFtTGFuZ3VhZ2UgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnKTtcbiAgcmV0dXJuIFN0cmVhbUxhbmd1YWdlLmRlZmluZSh7XG4gICAgdG9rZW4oc3RyZWFtKSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG4iXX0=
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2QyxPQUFPLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE0QjtJQUN0RCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUNuQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO0lBQ3BELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsRUFBRSxFQUFFLE1BQU0s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QixLQUFLLENBQUMsTUFBTTtZQUNWLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTGFuZ3VhZ2VPcHRpb25zLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG4vKipcbiAqIERhbmggc8OhY2ggY8OhYyBuZ8O0biBuZ+G7ryDEkcaw4bujYyBo4buXIHRy4bujXG4gKiBT4butIGThu6VuZyBjb25zdCBhcnJheSDEkeG7gyB0csOhbmggdOG6oW8gbeG7m2kgbeG7l2kgbOG6p24gdHJ1eSBj4bqtcFxuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uc0xhbmdEYXRhOiBBcnJheTxJTGFuZ3VhZ2VPcHRpb25zPiA9IFtcbiAgeyBpZDogJ3RleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gIHsgaWQ6ICdqYXZhc2NyaXB0JywgbGFiZWw6ICdKYXZhU2NyaXB0L1R5cGVTY3JpcHQnIH0sXG4gIHsgaWQ6ICdodG1sJywgbGFiZWw6ICdIVE1MJyB9LFxuICB7IGlkOiAnY3NzJywgbGFiZWw6ICdDU1MvU0NTUy9TQVNTJyB9LFxuICB7IGlkOiAnbWFya2Rvd24nLCBsYWJlbDogJ01hcmtkb3duJyB9LFxuICB7IGlkOiAnanNvbicsIGxhYmVsOiAnSlNPTicgfSxcbiAgeyBpZDogJ3NxbCcsIGxhYmVsOiAnU1FMJyB9LFxuICB7IGlkOiAneG1sJywgbGFiZWw6ICdYTUwnIH0sXG4gIHsgaWQ6ICd5YW1sJywgbGFiZWw6ICdZQU1MJyB9LFxuICB7IGlkOiAncHl0aG9uJywgbGFiZWw6ICdQeXRob24nIH0sXG4gIHsgaWQ6ICdqYXZhJywgbGFiZWw6ICdKYXZhJyB9LFxuICB7IGlkOiAnY3BwJywgbGFiZWw6ICdDL0MrKycgfSxcbiAgeyBpZDogJ3BocCcsIGxhYmVsOiAnUEhQJyB9LFxuICB7IGlkOiAnZ28nLCBsYWJlbDogJ0dvJyB9LFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcgPSAobGFuZ3NBY2NlcHQ/OiBBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiwgbGFuZ3NDaGFuZ2VMYWJlbD86IElMYW5ndWFnZU9wdGlvbnMpOiBJTGlzdENvbmZpZ0l0ZW0gPT4ge1xuICBjb25zdCBsYW5ncyA9IFsuLi5vcHRpb25zTGFuZ0RhdGFdLmZpbHRlcigoaXRlbSkgPT4gIWxhbmdzQWNjZXB0IHx8ICFsYW5nc0FjY2VwdC5sZW5ndGggfHwgbGFuZ3NBY2NlcHQuaW5jbHVkZXMoaXRlbS5pZCBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKSk7XG5cbiAgbGFuZ3MuZm9yRWFjaCgoaXRlbSkgPT4gKHtcbiAgICBpZDogaXRlbS5pZCxcbiAgICBsYWJlbDogbGFuZ3NDaGFuZ2VMYWJlbD8ubGFiZWwgfHwgaXRlbS5sYWJlbCxcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3RleHQnLFxuICAgIGh0dHBSZXF1ZXN0RGF0YTogc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oe1xuICAgICAgb2JqZWN0SW5zdGFuY2U6IHJldHVybkxpc3RPYmplY3QobGFuZ3MpLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICBhcmd1bWVudHNWYWx1ZTogW25ldyBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0KHsgZnJvbU9iamVjdDogeyBwYWdlOiAxLCBwZXJfcGFnZTogNDAgfSB9KV0sXG4gICAgfSksXG4gICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgZmllbGRLZXk6ICdpZCcsXG4gICAgICBub3RVc2VWaXJ0dWFsU2Nyb2xsOiB0cnVlLFxuICAgIH0pLFxuICB9O1xufTtcblxudHlwZSBUX0xhbmd1YWdlTG9hZGVyID0gKCkgPT4gUHJvbWlzZTxFeHRlbnNpb24+O1xudHlwZSBUX0xpbnRlckxvYWRlciA9IChjb21wb25lbnQ6IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQpID0+IFByb21pc2U8RXh0ZW5zaW9uPjtcbmludGVyZmFjZSBJX0xhbmd1YWdlUmVnaXN0cnlJdGVtIHtcbiAgbG9hZGVyOiBUX0xhbmd1YWdlTG9hZGVyO1xuICBsaW50ZXI/OiBUX0xpbnRlckxvYWRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIElfTGFuZ3VhZ2VSZWdpc3RyeUl0ZW0+ID0ge1xuICBqYXZhc2NyaXB0OiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGphdmFzY3JpcHQgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1qYXZhc2NyaXB0Jyk7XG4gICAgICByZXR1cm4gamF2YXNjcmlwdCh7IGpzeDogdHJ1ZSwgdHlwZXNjcmlwdDogdHJ1ZSB9KTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZUpzTGludGVyKCksXG4gIH0sXG4gIGh0bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaHRtbCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWh0bWwnKTtcbiAgICAgIHJldHVybiBodG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgY3NzOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNzcyB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWNzcycpO1xuICAgICAgcmV0dXJuIGNzcygpO1xuICAgIH0sXG4gIH0sXG4gIG1hcmtkb3duOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtkb3duIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctbWFya2Rvd24nKTtcbiAgICAgIHJldHVybiBtYXJrZG93bigpO1xuICAgIH0sXG4gIH0sXG4gIGpzb246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsganNvbiB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWpzb24nKTtcbiAgICAgIHJldHVybiBqc29uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVKc29uTGludGVyKCksXG4gIH0sXG4gIHNxbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBzcWwgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1zcWwnKTtcbiAgICAgIHJldHVybiBzcWwoKTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZVNxbExpbnRlcigpLFxuICB9LFxuICB4bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgeG1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteG1sJyk7XG4gICAgICByZXR1cm4geG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgeWFtbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyB5YW1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteWFtbCcpO1xuICAgICAgcmV0dXJuIHlhbWwoKTtcbiAgICB9LFxuICB9LFxuICBweXRob246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHl0aG9uIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctcHl0aG9uJyk7XG4gICAgICByZXR1cm4gcHl0aG9uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVQeXRob25MaW50ZXIoKSxcbiAgfSxcbiAgamF2YToge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBqYXZhIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctamF2YScpO1xuICAgICAgcmV0dXJuIGphdmEoKTtcbiAgICB9LFxuICB9LFxuICBjcHA6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY3BwIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctY3BwJyk7XG4gICAgICByZXR1cm4gY3BwKCk7XG4gICAgfSxcbiAgfSxcbiAgcGhwOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBocCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLXBocCcpO1xuICAgICAgcmV0dXJuIHBocCgpO1xuICAgIH0sXG4gIH0sXG4gIGdvOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdvIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctZ28nKTtcbiAgICAgIHJldHVybiBnbygpO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIELhu5kgcGF0dGVybiBi4bqjbyBt4bqtdCBt4bq3YyDEkeG7i25oIGNobyBsb3ctY29kZSBwbGF0Zm9ybS5cbiAqIENo4bq3biBjw6FjIEFQSSBuZ3V5IGhp4buDbTogZXZhbCwgbmV0d29yayBjYWxscywgc3RvcmFnZSwgRE9NIGluamVjdGlvbi4uLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRUNVUklUWV9QQVRURVJOUzogVF9Gb3JiaWRkZW5QYXR0ZXJuW10gPSBbXG4gIC9ldmFsXFxzKlxcKC9pLFxuICAvbmV3XFxzK0Z1bmN0aW9uXFxzKlxcKC9pLFxuICAvZG9jdW1lbnRcXC5jb29raWUvaSxcbiAgL2xvY2FsU3RvcmFnZS9pLFxuICAvc2Vzc2lvblN0b3JhZ2UvaSxcbiAgL2ZldGNoXFxzKlxcKC9pLFxuICAvbmV3XFxzK1hNTEh0dHBSZXF1ZXN0L2ksXG4gIC9yZXF1aXJlXFxzKlxcKC9pLFxuICAvaW1wb3J0XFxzKlxcKC9pLFxuICAvcHJvY2Vzc1xcLmVudi9pLFxuICAvPHNjcmlwdC9pLFxuICAvZG9jdW1lbnRcXC53cml0ZVxccypcXCgvaSxcbiAgL3dpbmRvd1xcLmxvY2F0aW9uXFxzKj0vaSxcbl07XG5cbi8qKlxuICogVOG6oW8gZGVmYXVsdCBsYW5ndWFnZSBleHRlbnNpb24gY2hvIHBsYWluIHRleHRcbiAqIFPhu60gZOG7pW5nIGtoaSBuZ8O0biBuZ+G7ryBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7o1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdExhbmd1YWdlID0gYXN5bmMgKCk6IFByb21pc2U8RXh0ZW5zaW9uPiA9PiB7XG4gIGNvbnN0IHsgU3RyZWFtTGFuZ3VhZ2UgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnKTtcbiAgcmV0dXJuIFN0cmVhbUxhbmd1YWdlLmRlZmluZSh7XG4gICAgdG9rZW4oc3RyZWFtKSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wcmV2aWV3LXRleHQtZGF0YS9zcmMvcHJldmlldy10ZXh0LWRhdGEuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCA9ICdqYXZhc2NyaXB0JyB8ICdodG1sJyB8ICdjc3MnIHwgJ21hcmtkb3duJyB8ICdqc29uJyB8ICdzcWwnIHwgJ3htbCcgfCAneWFtbCcgfCAncHl0aG9uJyB8ICdqYXZhJyB8ICdjcHAnIHwgJ3BocCcgfCAnZ28nIHwgJ3RleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcmV2aWV3VGV4dERhdGFDaGFuZ2Uge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGlzV3JhcDogYm9vbGVhbjtcbiAgbGFuZ3VhZ2U6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gIGNvbnRleHRDaGFuZ2U6ICdjb250ZW50JyB8ICdsYW5ndWFnZScgfCAnaXNXcmFwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGFuZ3VhZ2VPcHRpb25zIHtcbiAgaWQ6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIEBkZWZhdWx0ICd2YXJpYWJsZScgKi9cbiAgdHlwZT86ICd2YXJpYWJsZScgfCAncHJvcGVydHknIHwgJ2Z1bmN0aW9uJyB8ICdjbGFzcycgfCAnbWV0aG9kJyB8ICdrZXl3b3JkJyB8ICd0ZXh0JyB8ICdjb25zdGFudCcgfCAnaW50ZXJmYWNlJyB8ICd0eXBlJyB8ICdlbnVtJyB8ICdmaWVsZCcgfCAnbmFtZXNwYWNlJyB8ICdtb2R1bGUnO1xuICAvKiogU2hvcnQgdHlwZSBoaW50IHNob3duIG5leHQgdG8gdGhlIGxhYmVsLCBlLmcuIGBzdHJpbmdgLCBgKCkgPT4gdm9pZGAgKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xuICAvKiogTG9uZ2VyIGRvY3VtZW50YXRpb24gc2hvd24gaW4gdGhlIHRvb2x0aXAgKi9cbiAgaW5mbz86IHN0cmluZztcbiAgLyoqIE5lc3RlZCBwcm9wZXJ0aWVzIOKAlCBhY2Nlc3NlZCB2aWEgZG90IG5vdGF0aW9uIChlLmcuIGBvYmoucHJvcGApICovXG4gIHByb3BlcnRpZXM/OiBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXTtcbn1cblxuLyoqXG4gKiBQYXR0ZXJuIGPhuqVtIOKAlCBjaHXhu5dpIGxpdGVyYWwgKHNvIGto4bubcCBjYXNlLWluc2Vuc2l0aXZlKSBob+G6t2MgUmVnRXhwIHTDuXkgY2jhu4luaC5cbiAqIETDuW5nIHbhu5tpIGlucHV0IGBbZm9yYmlkZGVuUGF0dGVybnNdYCDEkeG7gyBuZ8SDbiB1c2VyIG5o4bqtcCBtw6MgdmkgcGjhuqFtIGLhuqNvIG3huq10LlxuICovXG5leHBvcnQgdHlwZSBUX0ZvcmJpZGRlblBhdHRlcm4gPSBzdHJpbmcgfCBSZWdFeHA7XG5cbi8qKiBWaSBwaOG6oW0gxJHGsOG7o2MgcGjDoXQgaGnhu4duIHRyb25nIGVkaXRvciwgcGjDoXQgcmEgcXVhIG91dHB1dCBgKG91dFZpb2xhdGlvbnMpYCAqL1xuZXhwb3J0IGludGVyZmFjZSBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uIHtcbiAgLyoqIFbhu4sgdHLDrSBi4bqvdCDEkeG6p3UgKGNoYXJhY3RlciBvZmZzZXQpICovXG4gIGZyb206IG51bWJlcjtcbiAgLyoqIFbhu4sgdHLDrSBr4bq/dCB0aMO6YyAoY2hhcmFjdGVyIG9mZnNldCkgKi9cbiAgdG86IG51bWJlcjtcbiAgLyoqIFPhu5EgZMOybmcgKDEtaW5kZXhlZCkgKi9cbiAgbGluZTogbnVtYmVyO1xuICAvKiogVMOqbi9tw7QgdOG6oyBj4bunYSBwYXR0ZXJuIMSRw6MgYuG7iyB2aSBwaOG6oW0gKi9cbiAgcGF0dGVybjogc3RyaW5nO1xuICAvKiogxJBv4bqhbiB0ZXh0IHRo4buxYyB04bq/IGLhu4sgbWF0Y2ggKi9cbiAgbWF0Y2hlZDogc3RyaW5nO1xufVxuIl19
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, inject, DestroyRef, computed, input, model, output, viewChild, effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { autocompletion } from '@codemirror/autocomplete';
|
|
3
4
|
import { syntaxTree } from '@codemirror/language';
|
|
4
5
|
import { lintGutter, linter } from '@codemirror/lint';
|
|
5
|
-
import { Compartment } from '@codemirror/state';
|
|
6
|
+
import { Compartment, Prec, EditorState, Transaction } from '@codemirror/state';
|
|
6
7
|
import { EditorView, lineNumbers } from '@codemirror/view';
|
|
7
8
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
8
9
|
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
@@ -107,6 +108,7 @@ const languageRegistry = {
|
|
|
107
108
|
const { python } = await import('@codemirror/lang-python');
|
|
108
109
|
return python();
|
|
109
110
|
},
|
|
111
|
+
linter: async (component) => component.createPythonLinter(),
|
|
110
112
|
},
|
|
111
113
|
java: {
|
|
112
114
|
loader: async () => {
|
|
@@ -133,6 +135,25 @@ const languageRegistry = {
|
|
|
133
135
|
},
|
|
134
136
|
},
|
|
135
137
|
};
|
|
138
|
+
/**
|
|
139
|
+
* Bộ pattern bảo mật mặc định cho low-code platform.
|
|
140
|
+
* Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...
|
|
141
|
+
*/
|
|
142
|
+
const DEFAULT_SECURITY_PATTERNS = [
|
|
143
|
+
/eval\s*\(/i,
|
|
144
|
+
/new\s+Function\s*\(/i,
|
|
145
|
+
/document\.cookie/i,
|
|
146
|
+
/localStorage/i,
|
|
147
|
+
/sessionStorage/i,
|
|
148
|
+
/fetch\s*\(/i,
|
|
149
|
+
/new\s+XMLHttpRequest/i,
|
|
150
|
+
/require\s*\(/i,
|
|
151
|
+
/import\s*\(/i,
|
|
152
|
+
/process\.env/i,
|
|
153
|
+
/<script/i,
|
|
154
|
+
/document\.write\s*\(/i,
|
|
155
|
+
/window\.location\s*=/i,
|
|
156
|
+
];
|
|
136
157
|
/**
|
|
137
158
|
* Tạo default language extension cho plain text
|
|
138
159
|
* Sử dụng khi ngôn ngữ không được hỗ trợ
|
|
@@ -156,6 +177,8 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
156
177
|
languageCompartment = new Compartment();
|
|
157
178
|
lineNumberCompartment = new Compartment();
|
|
158
179
|
linterCompartment = new Compartment();
|
|
180
|
+
completionsCompartment = new Compartment();
|
|
181
|
+
forbiddenCompartment = new Compartment();
|
|
159
182
|
contentStateNoWrap = signal('');
|
|
160
183
|
/** Cache để tránh load lại language đã load */
|
|
161
184
|
languageCache = new Map();
|
|
@@ -191,6 +214,26 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
191
214
|
lintIgnorePatterns = input(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {
|
|
192
215
|
transform: (value) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],
|
|
193
216
|
});
|
|
217
|
+
/**
|
|
218
|
+
* Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.
|
|
219
|
+
* Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`
|
|
220
|
+
* @example
|
|
221
|
+
* [completions]="[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]"
|
|
222
|
+
*/
|
|
223
|
+
completions = input([], {
|
|
224
|
+
transform: (value) => value ?? [],
|
|
225
|
+
});
|
|
226
|
+
/**
|
|
227
|
+
* Danh sách pattern cấm — chuỗi literal hoặc RegExp.
|
|
228
|
+
* Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.
|
|
229
|
+
* Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.
|
|
230
|
+
* @example
|
|
231
|
+
* [forbiddenPatterns]="defaultSecurityPatterns"
|
|
232
|
+
* [forbiddenPatterns]="[/eval\s*\(/, 'localStorage']"
|
|
233
|
+
*/
|
|
234
|
+
forbiddenPatterns = input([], {
|
|
235
|
+
transform: (value) => value ?? [],
|
|
236
|
+
});
|
|
194
237
|
background = input('#f8f9fa', {
|
|
195
238
|
transform: (value) => value ?? '#f8f9fa',
|
|
196
239
|
});
|
|
@@ -199,6 +242,7 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
199
242
|
// ==========================================================================
|
|
200
243
|
outChange = output();
|
|
201
244
|
syntaxErrors = output();
|
|
245
|
+
outViolations = output();
|
|
202
246
|
// ==========================================================================
|
|
203
247
|
// VIEW CHILDREN
|
|
204
248
|
// ==========================================================================
|
|
@@ -223,6 +267,24 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
223
267
|
}
|
|
224
268
|
}
|
|
225
269
|
});
|
|
270
|
+
// Effect để cập nhật custom completions khi input thay đổi
|
|
271
|
+
effect(() => {
|
|
272
|
+
const items = this.completions();
|
|
273
|
+
if (!this.isInitialized || !this.editorViewInstance)
|
|
274
|
+
return;
|
|
275
|
+
this.editorViewInstance.dispatch({
|
|
276
|
+
effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
// Effect để cập nhật forbidden patterns khi input thay đổi
|
|
280
|
+
effect(() => {
|
|
281
|
+
const patterns = this.forbiddenPatterns();
|
|
282
|
+
if (!this.isInitialized || !this.editorViewInstance)
|
|
283
|
+
return;
|
|
284
|
+
this.editorViewInstance.dispatch({
|
|
285
|
+
effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),
|
|
286
|
+
});
|
|
287
|
+
});
|
|
226
288
|
// Cleanup khi component bị destroy
|
|
227
289
|
this.destroyRef.onDestroy(() => {
|
|
228
290
|
this.editorViewInstance?.destroy();
|
|
@@ -261,10 +323,15 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
261
323
|
* Tạo danh sách extensions cho editor
|
|
262
324
|
*/
|
|
263
325
|
createExtensions(languageExtension, linterExtension) {
|
|
326
|
+
const initialCompletions = this.completions();
|
|
327
|
+
const initialPatterns = this.forbiddenPatterns();
|
|
264
328
|
return [
|
|
265
329
|
basicSetup,
|
|
266
330
|
this.languageCompartment.of(languageExtension),
|
|
267
331
|
this.linterCompartment.of(linterExtension),
|
|
332
|
+
// Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion
|
|
333
|
+
Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),
|
|
334
|
+
this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),
|
|
268
335
|
this.createLightTheme(),
|
|
269
336
|
EditorView.editable.of(this.editable()),
|
|
270
337
|
this.wrapCompartment.of(EditorView.lineWrapping),
|
|
@@ -345,32 +412,83 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
345
412
|
// PUBLIC METHODS - Linter factories (được gọi từ registry)
|
|
346
413
|
// ==========================================================================
|
|
347
414
|
/**
|
|
348
|
-
* Tạo JavaScript linter
|
|
349
|
-
*
|
|
415
|
+
* Tạo JavaScript linter với 2-pass detection:
|
|
416
|
+
* 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)
|
|
417
|
+
* 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot
|
|
350
418
|
*/
|
|
351
419
|
createJsLinter() {
|
|
352
420
|
return linter((view) => {
|
|
353
|
-
const text = view.state.doc.toString();
|
|
354
421
|
const diagnostics = [];
|
|
355
|
-
|
|
356
|
-
|
|
422
|
+
const doc = view.state.doc;
|
|
423
|
+
// Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm
|
|
424
|
+
const trailingDotLines = new Set();
|
|
425
|
+
for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {
|
|
426
|
+
const line = doc.line(lineNum);
|
|
427
|
+
const trimmed = line.text.trimEnd();
|
|
428
|
+
const match = trimmed.match(/(\w+)\.\s*$/);
|
|
429
|
+
if (!match)
|
|
430
|
+
continue;
|
|
431
|
+
trailingDotLines.add(lineNum);
|
|
432
|
+
const dotPos = line.from + trimmed.lastIndexOf('.');
|
|
433
|
+
diagnostics.push({
|
|
434
|
+
from: dotPos,
|
|
435
|
+
to: dotPos + 1,
|
|
436
|
+
severity: 'error',
|
|
437
|
+
message: `Incomplete property access on "${match[1]}"`,
|
|
438
|
+
});
|
|
357
439
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
440
|
+
// Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)
|
|
441
|
+
// để lọc cascading errors từ syntaxTree
|
|
442
|
+
const taintedLines = new Set();
|
|
443
|
+
for (const lineNum of trailingDotLines) {
|
|
444
|
+
for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {
|
|
445
|
+
taintedLines.add(i);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)
|
|
449
|
+
const tree = syntaxTree(view.state);
|
|
450
|
+
tree.iterate({
|
|
451
|
+
enter: (node) => {
|
|
452
|
+
if (!node.type.isError)
|
|
453
|
+
return;
|
|
454
|
+
if (node.from === node.to)
|
|
455
|
+
return; // Bỏ qua empty-range node (cascading error)
|
|
456
|
+
const errorLineNum = doc.lineAt(node.from).number;
|
|
457
|
+
if (taintedLines.has(errorLineNum))
|
|
458
|
+
return;
|
|
362
459
|
diagnostics.push({
|
|
363
|
-
from:
|
|
364
|
-
to:
|
|
460
|
+
from: node.from,
|
|
461
|
+
to: Math.min(node.to, doc.length),
|
|
365
462
|
severity: 'error',
|
|
366
|
-
message,
|
|
463
|
+
message: this.buildJsErrorMessage(doc, node),
|
|
367
464
|
});
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
this.syntaxErrors.emit(diagnostics);
|
|
371
468
|
return diagnostics;
|
|
372
469
|
});
|
|
373
470
|
}
|
|
471
|
+
buildJsErrorMessage(doc, node) {
|
|
472
|
+
const text = doc.sliceString(node.from, node.to).trim();
|
|
473
|
+
if (text)
|
|
474
|
+
return `JavaScript syntax error near "${text}"`;
|
|
475
|
+
const prevToken = this.getTokenBefore(doc, node.from);
|
|
476
|
+
if (!prevToken)
|
|
477
|
+
return 'JavaScript syntax error';
|
|
478
|
+
if (/\($/.test(prevToken))
|
|
479
|
+
return 'Missing closing ")"';
|
|
480
|
+
if (/\[$/.test(prevToken))
|
|
481
|
+
return 'Missing closing "]"';
|
|
482
|
+
if (/^function$/i.test(prevToken))
|
|
483
|
+
return 'Expected function name or "("';
|
|
484
|
+
if (/^return$/i.test(prevToken))
|
|
485
|
+
return 'Invalid expression after "return"';
|
|
486
|
+
if (/^=>$/.test(prevToken))
|
|
487
|
+
return 'Expected function body after "=>"';
|
|
488
|
+
if (/^const$|^let$|^var$/i.test(prevToken))
|
|
489
|
+
return 'Expected variable name';
|
|
490
|
+
return `JavaScript syntax error near "${prevToken}"`;
|
|
491
|
+
}
|
|
374
492
|
/**
|
|
375
493
|
* Tạo JSON linter
|
|
376
494
|
* Sử dụng JSON.parse để validate
|
|
@@ -447,6 +565,181 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
447
565
|
const match = text.match(/(\S+)\s*$/);
|
|
448
566
|
return match?.[1] ?? '';
|
|
449
567
|
}
|
|
568
|
+
/**
|
|
569
|
+
* Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.
|
|
570
|
+
* Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.
|
|
571
|
+
*/
|
|
572
|
+
createPythonLinter() {
|
|
573
|
+
return linter((view) => {
|
|
574
|
+
const diagnostics = [];
|
|
575
|
+
const doc = view.state.doc;
|
|
576
|
+
const tree = syntaxTree(view.state);
|
|
577
|
+
tree.iterate({
|
|
578
|
+
enter: (node) => {
|
|
579
|
+
if (!node.type.isError)
|
|
580
|
+
return;
|
|
581
|
+
const from = Math.max(0, node.from - 1);
|
|
582
|
+
const to = node.from === node.to ? node.from + 1 : node.to;
|
|
583
|
+
diagnostics.push({
|
|
584
|
+
from,
|
|
585
|
+
to: Math.min(to, doc.length),
|
|
586
|
+
severity: 'error',
|
|
587
|
+
message: this.buildPythonErrorMessage(doc, node),
|
|
588
|
+
});
|
|
589
|
+
},
|
|
590
|
+
});
|
|
591
|
+
this.syntaxErrors.emit(diagnostics);
|
|
592
|
+
return diagnostics;
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
buildPythonErrorMessage(doc, node) {
|
|
596
|
+
if (node.from !== node.to) {
|
|
597
|
+
const text = doc.sliceString(node.from, node.to).trim();
|
|
598
|
+
return `Python syntax error${text ? ` near "${text}"` : ''}`;
|
|
599
|
+
}
|
|
600
|
+
const prevToken = this.getTokenBefore(doc, node.from);
|
|
601
|
+
if (!prevToken) {
|
|
602
|
+
return 'Python syntax error';
|
|
603
|
+
}
|
|
604
|
+
if (/^def$/i.test(prevToken))
|
|
605
|
+
return 'Expected function name after "def"';
|
|
606
|
+
if (/^class$/i.test(prevToken))
|
|
607
|
+
return 'Expected class name after "class"';
|
|
608
|
+
if (/^return$/i.test(prevToken))
|
|
609
|
+
return 'Invalid expression after "return"';
|
|
610
|
+
if (/^import$/i.test(prevToken))
|
|
611
|
+
return 'Expected module name after "import"';
|
|
612
|
+
if (/^from$/i.test(prevToken))
|
|
613
|
+
return 'Expected module name after "from"';
|
|
614
|
+
if (/^if$/i.test(prevToken))
|
|
615
|
+
return 'Expected condition after "if"';
|
|
616
|
+
if (/^elif$/i.test(prevToken))
|
|
617
|
+
return 'Expected condition after "elif"';
|
|
618
|
+
if (/^while$/i.test(prevToken))
|
|
619
|
+
return 'Expected condition after "while"';
|
|
620
|
+
if (/^for$/i.test(prevToken))
|
|
621
|
+
return 'Expected variable after "for"';
|
|
622
|
+
if (/\.$/.test(prevToken))
|
|
623
|
+
return `Incomplete attribute access on "${prevToken.slice(0, -1)}"`;
|
|
624
|
+
if (/\($/.test(prevToken))
|
|
625
|
+
return 'Missing closing ")"';
|
|
626
|
+
if (/\[$/.test(prevToken))
|
|
627
|
+
return 'Missing closing "]"';
|
|
628
|
+
return `Python syntax error near "${prevToken}"`;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Tạo CodeMirror extension cho custom completions từ danh sách input.
|
|
632
|
+
* Hỗ trợ 2 chế độ:
|
|
633
|
+
* 1. Gõ tên biến → gợi ý top-level items
|
|
634
|
+
* 2. Gõ `obj.` → gợi ý properties của obj
|
|
635
|
+
*/
|
|
636
|
+
buildCompletionExtension(items) {
|
|
637
|
+
const completionSource = (context) => {
|
|
638
|
+
// Chế độ dot-notation: gõ "obj.prop" → gợi ý properties của obj
|
|
639
|
+
const dotMatch = context.matchBefore(/\w+\.\w*/);
|
|
640
|
+
if (dotMatch) {
|
|
641
|
+
const dotPos = dotMatch.text.indexOf('.');
|
|
642
|
+
const objectName = dotMatch.text.slice(0, dotPos);
|
|
643
|
+
const parent = items.find((i) => i.label === objectName);
|
|
644
|
+
if (parent?.properties?.length) {
|
|
645
|
+
return {
|
|
646
|
+
from: dotMatch.from + dotPos + 1,
|
|
647
|
+
options: parent.properties.map((p) => ({
|
|
648
|
+
label: p.label,
|
|
649
|
+
type: p.type ?? 'property',
|
|
650
|
+
detail: p.detail ?? '',
|
|
651
|
+
info: p.info ?? '',
|
|
652
|
+
})),
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
// Chế độ top-level: gợi ý tên biến/object khi gõ ký tự
|
|
657
|
+
const word = context.matchBefore(/\w*/);
|
|
658
|
+
if (!word || (word.from === word.to && !context.explicit))
|
|
659
|
+
return null;
|
|
660
|
+
return {
|
|
661
|
+
from: word.from,
|
|
662
|
+
options: items.map((item) => ({
|
|
663
|
+
label: item.label,
|
|
664
|
+
type: item.type ?? 'variable',
|
|
665
|
+
detail: item.detail ?? '',
|
|
666
|
+
info: item.info ?? '',
|
|
667
|
+
})),
|
|
668
|
+
};
|
|
669
|
+
};
|
|
670
|
+
return autocompletion({ override: [completionSource] });
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Tạo extension bảo mật gồm 2 layer:
|
|
674
|
+
* 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations
|
|
675
|
+
* 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm
|
|
676
|
+
*/
|
|
677
|
+
buildForbiddenExtension(patterns) {
|
|
678
|
+
const toGlobalRegex = (p) => {
|
|
679
|
+
if (p instanceof RegExp) {
|
|
680
|
+
const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;
|
|
681
|
+
return new RegExp(p.source, flags);
|
|
682
|
+
}
|
|
683
|
+
return new RegExp(this.escapeRegex(p), 'gi');
|
|
684
|
+
};
|
|
685
|
+
const forbiddenLinter = linter((view) => {
|
|
686
|
+
const diagnostics = [];
|
|
687
|
+
const violations = [];
|
|
688
|
+
const text = view.state.doc.toString();
|
|
689
|
+
const tree = syntaxTree(view.state);
|
|
690
|
+
// Build a Set of comment ranges từ AST để skip match nằm trong comment
|
|
691
|
+
const commentRanges = [];
|
|
692
|
+
tree.iterate({
|
|
693
|
+
enter: (node) => {
|
|
694
|
+
if (node.type.name.toLowerCase().includes('comment')) {
|
|
695
|
+
commentRanges.push({ from: node.from, to: node.to });
|
|
696
|
+
}
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
const isInComment = (from, to) => commentRanges.some((r) => from >= r.from && to <= r.to);
|
|
700
|
+
for (const pattern of patterns) {
|
|
701
|
+
const re = toGlobalRegex(pattern);
|
|
702
|
+
re.lastIndex = 0;
|
|
703
|
+
let match;
|
|
704
|
+
while ((match = re.exec(text)) !== null) {
|
|
705
|
+
const from = match.index;
|
|
706
|
+
const to = from + match[0].length;
|
|
707
|
+
if (isInComment(from, to))
|
|
708
|
+
continue;
|
|
709
|
+
const line = view.state.doc.lineAt(from).number;
|
|
710
|
+
const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;
|
|
711
|
+
diagnostics.push({
|
|
712
|
+
from,
|
|
713
|
+
to,
|
|
714
|
+
severity: 'error',
|
|
715
|
+
message: `Mã bị cấm: "${match[0]}" — vi phạm chính sách bảo mật`,
|
|
716
|
+
});
|
|
717
|
+
violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
this.outViolations.emit(violations);
|
|
721
|
+
return diagnostics;
|
|
722
|
+
});
|
|
723
|
+
// Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào
|
|
724
|
+
const pasteFilter = EditorState.transactionFilter.of((tr) => {
|
|
725
|
+
if (!tr.docChanged)
|
|
726
|
+
return tr;
|
|
727
|
+
if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste'))
|
|
728
|
+
return tr;
|
|
729
|
+
const newText = tr.newDoc.toString();
|
|
730
|
+
for (const pattern of patterns) {
|
|
731
|
+
const re = toGlobalRegex(pattern);
|
|
732
|
+
re.lastIndex = 0;
|
|
733
|
+
if (re.test(newText))
|
|
734
|
+
return []; // [] = block transaction
|
|
735
|
+
}
|
|
736
|
+
return tr;
|
|
737
|
+
});
|
|
738
|
+
return [forbiddenLinter, pasteFilter];
|
|
739
|
+
}
|
|
740
|
+
escapeRegex(str) {
|
|
741
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
742
|
+
}
|
|
450
743
|
// ==========================================================================
|
|
451
744
|
// PROTECTED METHODS - Event handlers
|
|
452
745
|
// ==========================================================================
|
|
@@ -492,7 +785,7 @@ class LibsUiComponentsPreviewTextDataComponent {
|
|
|
492
785
|
});
|
|
493
786
|
}
|
|
494
787
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
495
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<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", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
788
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<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", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
496
789
|
}
|
|
497
790
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
|
|
498
791
|
type: Component,
|
|
@@ -503,5 +796,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
503
796
|
* Generated bundle index. Do not edit.
|
|
504
797
|
*/
|
|
505
798
|
|
|
506
|
-
export { LibsUiComponentsPreviewTextDataComponent, createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData };
|
|
799
|
+
export { DEFAULT_SECURITY_PATTERNS, LibsUiComponentsPreviewTextDataComponent, createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData };
|
|
507
800
|
//# sourceMappingURL=libs-ui-components-preview-text-data.mjs.map
|