@po-ui/ng-code-editor 5.22.2 → 5.22.3
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 +20 -20
- package/bundles/po-ui-ng-code-editor.umd.js +929 -929
- package/bundles/po-ui-ng-code-editor.umd.js.map +1 -1
- package/esm2015/lib/components/po-code-editor/interfaces/po-code-editor-registerable-options.interface.js +2 -2
- package/esm2015/lib/components/po-code-editor/interfaces/po-code-editor-registerable-suggestion.interface.js +2 -2
- package/esm2015/lib/components/po-code-editor/interfaces/po-code-editor-registerable-tokens.interface.js +2 -2
- package/esm2015/lib/components/po-code-editor/interfaces/po-code-editor-registerable.interface.js +2 -2
- package/esm2015/lib/components/po-code-editor/po-code-editor-base.component.js +248 -248
- package/esm2015/lib/components/po-code-editor/po-code-editor-register.service.js +63 -63
- package/esm2015/lib/components/po-code-editor/po-code-editor-suggestion.service.js +28 -28
- package/esm2015/lib/components/po-code-editor/po-code-editor.component.js +225 -225
- package/esm2015/lib/components/po-code-editor/po-code-editor.module.js +31 -31
- package/esm2015/lib/index.js +4 -4
- package/esm2015/po-ui-ng-code-editor.js +6 -6
- package/esm2015/public-api.js +2 -2
- package/fesm2015/po-ui-ng-code-editor.js +574 -574
- package/fesm2015/po-ui-ng-code-editor.js.map +1 -1
- package/lib/components/po-code-editor/interfaces/po-code-editor-registerable-options.interface.d.ts +22 -22
- package/lib/components/po-code-editor/interfaces/po-code-editor-registerable-suggestion.interface.d.ts +37 -37
- package/lib/components/po-code-editor/interfaces/po-code-editor-registerable-tokens.interface.d.ts +21 -21
- package/lib/components/po-code-editor/interfaces/po-code-editor-registerable.interface.d.ts +17 -17
- package/lib/components/po-code-editor/po-code-editor-base.component.d.ts +191 -191
- package/lib/components/po-code-editor/po-code-editor-register.service.d.ts +67 -67
- package/lib/components/po-code-editor/po-code-editor-suggestion.service.d.ts +7 -7
- package/lib/components/po-code-editor/po-code-editor.component.d.ts +58 -58
- package/lib/components/po-code-editor/po-code-editor.module.d.ts +10 -10
- package/lib/index.d.ts +7 -7
- package/package.json +4 -4
- package/po-ui-ng-code-editor-5.22.3.tgz +0 -0
- package/po-ui-ng-code-editor.d.ts +6 -6
- package/po-ui-ng-code-editor.metadata.json +1 -1
- package/public-api.d.ts +1 -1
- package/schematics/README.md +98 -98
- package/schematics/collection.json +10 -10
- package/schematics/ng-add/index.d.ts +10 -10
- package/schematics/ng-add/index.js +38 -38
- package/schematics/ng-add/index.spec.d.ts +1 -1
- package/schematics/ng-add/index.spec.js +113 -113
- package/schematics/ng-add/schema.json +7 -7
- package/po-ui-ng-code-editor-5.22.2.tgz +0 -0
|
@@ -1,248 +1,248 @@
|
|
|
1
|
-
import { Input, Directive } from '@angular/core';
|
|
2
|
-
const PO_CODE_EDITOR_THEMES = ['vs-dark', 'vs', 'hc-black'];
|
|
3
|
-
const PO_CODE_EDITOR_THEME_DEFAULT = 'vs';
|
|
4
|
-
/**
|
|
5
|
-
* @description
|
|
6
|
-
*
|
|
7
|
-
* O `po-code-editor` é um componente para edição de código fonte baseado no Monaco Editor da Microsoft.
|
|
8
|
-
*
|
|
9
|
-
* Sendo assim, algumas configurações presentes no Monaco podem ser utilizadas aqui, como a escolha da linguagem
|
|
10
|
-
* (utilizando o highlight syntax específico), escolha do tema e opção de diff, além de ser muito similar ao Visual
|
|
11
|
-
* Studio Code, com autocomplete e fechamento automático de brackets.
|
|
12
|
-
*
|
|
13
|
-
* Este componente pode ser usado em qualquer situação que necessite de adição de códigos, como por exemplo, criar
|
|
14
|
-
* receitas utilizando Terraform para gerenciar topologias.
|
|
15
|
-
* É importante ressaltar que este não é um componente para edição de textos comuns.
|
|
16
|
-
*
|
|
17
|
-
* O [(ngModel)] deve ser usado para manipular o conteúdo do po-code-editor, ou seja, tanto para incluir um conteúdo quanto
|
|
18
|
-
* para recuperar o conteúdo do po-code-editor, utiliza-se uma variável passada por [(ngModel)].
|
|
19
|
-
*
|
|
20
|
-
* #### Adicionando o pacote @po-ui/ng-code-editor
|
|
21
|
-
*
|
|
22
|
-
* Para instalar o pacote `po-code-editor` em sua aplicação execute:
|
|
23
|
-
*
|
|
24
|
-
* ```shell
|
|
25
|
-
* ng add @po-ui/ng-code-editor
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* O comando `ng add` do `Angular CLI`:
|
|
29
|
-
* - inclui o `po-code-editor` no seu projeto;
|
|
30
|
-
* - adiciona o módulo `PoCodeEditorModule`:;
|
|
31
|
-
*
|
|
32
|
-
* ```
|
|
33
|
-
* // app.module.ts
|
|
34
|
-
* ...
|
|
35
|
-
* import { PoModule } from '@po-ui/ng-components';
|
|
36
|
-
* import { PoCodeEditorModule } from '@po-ui/ng-code-editor';
|
|
37
|
-
* ...
|
|
38
|
-
* @NgModule({
|
|
39
|
-
* imports: [
|
|
40
|
-
* ...
|
|
41
|
-
* PoModule,
|
|
42
|
-
* PoCodeEditorModule
|
|
43
|
-
* ],
|
|
44
|
-
* ...
|
|
45
|
-
* })
|
|
46
|
-
* export class AppModule { }
|
|
47
|
-
* ```
|
|
48
|
-
*
|
|
49
|
-
* - adiciona o tema PO UI e também o *asset* do Monaco no arquivo `angular.json`, conforme abaixo:
|
|
50
|
-
*
|
|
51
|
-
* <pre ngNonBindable>
|
|
52
|
-
* ...
|
|
53
|
-
* "assets": [
|
|
54
|
-
* { "glob": "**/*", "input": "node_modules/monaco-editor/min", "output": "/assets/monaco/" }
|
|
55
|
-
* ],
|
|
56
|
-
* "styles": [
|
|
57
|
-
* "./node_modules/@po-ui/style/css/po-theme-default.min.css"
|
|
58
|
-
* ]
|
|
59
|
-
* ...
|
|
60
|
-
* </pre>
|
|
61
|
-
*/
|
|
62
|
-
export class PoCodeEditorBaseComponent {
|
|
63
|
-
constructor() {
|
|
64
|
-
this.modifiedValue = '';
|
|
65
|
-
this.value = '';
|
|
66
|
-
this._height = 150;
|
|
67
|
-
this._language = 'plainText';
|
|
68
|
-
this._readonly = false;
|
|
69
|
-
this._showDiff = false;
|
|
70
|
-
this._theme = PO_CODE_EDITOR_THEME_DEFAULT;
|
|
71
|
-
/* istanbul ignore next */
|
|
72
|
-
this.onTouched = (value) => { };
|
|
73
|
-
/* istanbul ignore next */
|
|
74
|
-
this.onChangePropagate = (value) => { };
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* @optional
|
|
78
|
-
*
|
|
79
|
-
* @description
|
|
80
|
-
*
|
|
81
|
-
* Linguagem na qual será apresentado o código fonte.
|
|
82
|
-
* Para saber quais são as linguagens compatíveis, consulte a documentação oficial do
|
|
83
|
-
* [**Monaco Editor**](https://microsoft.github.io/monaco-editor/).
|
|
84
|
-
*
|
|
85
|
-
* Também é possível adicionar uma nova linguagem personalizada utilizando o serviço:
|
|
86
|
-
* [**po-code-editor-register**](https://po-ui.io/documentation/po-code-editor-register?view=doc).
|
|
87
|
-
*
|
|
88
|
-
* @default `plainText`
|
|
89
|
-
*/
|
|
90
|
-
set language(language) {
|
|
91
|
-
this._language = language && language.length ? language.trim() : 'plainText';
|
|
92
|
-
if (this.editor && this._language) {
|
|
93
|
-
this.setLanguage(this._language);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
get language() {
|
|
97
|
-
return this._language;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* @optional
|
|
101
|
-
*
|
|
102
|
-
* @description
|
|
103
|
-
*
|
|
104
|
-
* Indica se o editor será aberto em modo de leitura.
|
|
105
|
-
*
|
|
106
|
-
* Neste caso, não é possível editar o código inserido.
|
|
107
|
-
*
|
|
108
|
-
* Obs: Esta propriedade não refletirá efeito se alterada após o carregamento do componente.
|
|
109
|
-
*
|
|
110
|
-
* @default `false`
|
|
111
|
-
*/
|
|
112
|
-
set readonly(readonly) {
|
|
113
|
-
this._readonly = readonly === '' ? true : this.convertToBoolean(readonly);
|
|
114
|
-
if (this.editor) {
|
|
115
|
-
this.setReadOnly(readonly);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
get readonly() {
|
|
119
|
-
return this._readonly;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* @optional
|
|
123
|
-
*
|
|
124
|
-
* @description
|
|
125
|
-
*
|
|
126
|
-
* Indica se o editor será aberto em modo de comparação.
|
|
127
|
-
*
|
|
128
|
-
* Caso esteja habilitada esta opção, então o [(ngModel)] deverá ser passado como um array, cuja primeira opção deve
|
|
129
|
-
* conter uma string com o código original e na segunda posição uma string código modificado para efeito de
|
|
130
|
-
* comparação. Neste caso, o usuário conseguirá editar apenas o código modificado e isso refletirá na segunda posição
|
|
131
|
-
* do array consequentemente.
|
|
132
|
-
*
|
|
133
|
-
* Obs: Esta propriedade não refletirá efeito se alterada após o carregamento do componente.
|
|
134
|
-
*
|
|
135
|
-
* @default `false`
|
|
136
|
-
*/
|
|
137
|
-
set showDiff(showDiff) {
|
|
138
|
-
this._showDiff = showDiff === '' ? true : this.convertToBoolean(showDiff);
|
|
139
|
-
}
|
|
140
|
-
get showDiff() {
|
|
141
|
-
return this._showDiff;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* @optional
|
|
145
|
-
*
|
|
146
|
-
* @description
|
|
147
|
-
*
|
|
148
|
-
* Lista de sugestões usadas pelo autocomplete dentro do editor.
|
|
149
|
-
*
|
|
150
|
-
* Para visualizar a lista de sugestões use o comando `CTRL + SPACE`.
|
|
151
|
-
*
|
|
152
|
-
* Caso o editor esteja usando uma linguagem que já tenha uma lista de sugestões predefinida, o valor passado será adicionado
|
|
153
|
-
* a lista preexistente, aumentando as opções para o usuário.
|
|
154
|
-
*
|
|
155
|
-
* Caso tenha mais de um editor da mesma linguagem na aplicação, as sugestões serão adicionadas para que todos os editores da mesma linguagem
|
|
156
|
-
* tenham as mesmas sugestões.
|
|
157
|
-
*
|
|
158
|
-
* ```
|
|
159
|
-
* <po-code-editor
|
|
160
|
-
* [p-suggestions]="[{ label: 'po', insertText: 'Portinari UI' }, { label: 'ng', insertText: 'Angular' }]">
|
|
161
|
-
* </po-code-editor>
|
|
162
|
-
* ```
|
|
163
|
-
*
|
|
164
|
-
* Ao fornecer uma lista de sugestões é possível acelerar a escrita de scripts pelos usuários.
|
|
165
|
-
*/
|
|
166
|
-
set suggestions(values) {
|
|
167
|
-
this._suggestions = values;
|
|
168
|
-
if (this.editor && this._suggestions) {
|
|
169
|
-
this.setSuggestions(this._suggestions);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
get suggestions() {
|
|
173
|
-
return this._suggestions;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* @optional
|
|
177
|
-
*
|
|
178
|
-
* @description
|
|
179
|
-
*
|
|
180
|
-
* Define um tema para o editor.
|
|
181
|
-
*
|
|
182
|
-
* Temas válidos:
|
|
183
|
-
* - `vs-dark`
|
|
184
|
-
* - `vs`
|
|
185
|
-
* - `hc-black`
|
|
186
|
-
*
|
|
187
|
-
* É importante salientar que o tema será aplicados a todos os componentes po-code-editor existentes na tela,
|
|
188
|
-
* ou seja, todas as instâncias do componente receberão o último tema atribuído ou o tema da última instância
|
|
189
|
-
* criada.
|
|
190
|
-
*
|
|
191
|
-
* @default `vs`
|
|
192
|
-
*/
|
|
193
|
-
set theme(theme) {
|
|
194
|
-
this._theme = PO_CODE_EDITOR_THEMES.includes(theme) ? theme : PO_CODE_EDITOR_THEME_DEFAULT;
|
|
195
|
-
if (this.editor) {
|
|
196
|
-
this.setTheme(theme);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
get theme() {
|
|
200
|
-
return this._theme;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* @optional
|
|
204
|
-
*
|
|
205
|
-
* @description
|
|
206
|
-
*
|
|
207
|
-
* Define a altura do componente em pixels do po-code-editor.
|
|
208
|
-
* Esta propriedade não poderá ser alterada após o componente ter sido iniciado.
|
|
209
|
-
* A altura mínima é 150 pixels.
|
|
210
|
-
*/
|
|
211
|
-
set height(height) {
|
|
212
|
-
this._height = parseFloat(height) >= 150 ? parseFloat(height) : 150;
|
|
213
|
-
}
|
|
214
|
-
get height() {
|
|
215
|
-
return `${this._height}px`;
|
|
216
|
-
}
|
|
217
|
-
getOptions() {
|
|
218
|
-
return { language: this.language, theme: this.theme, readOnly: this.readonly };
|
|
219
|
-
}
|
|
220
|
-
registerOnChange(fn) {
|
|
221
|
-
this.onChangePropagate = fn;
|
|
222
|
-
}
|
|
223
|
-
registerOnTouched(fn) {
|
|
224
|
-
this.onTouched = fn;
|
|
225
|
-
}
|
|
226
|
-
convertToBoolean(val) {
|
|
227
|
-
if (typeof val === 'string') {
|
|
228
|
-
val = val.toLowerCase().trim();
|
|
229
|
-
return val === 'true' || val === 'on' || val === '';
|
|
230
|
-
}
|
|
231
|
-
if (typeof val === 'number') {
|
|
232
|
-
return val === 1;
|
|
233
|
-
}
|
|
234
|
-
return !!val;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
PoCodeEditorBaseComponent.decorators = [
|
|
238
|
-
{ type: Directive }
|
|
239
|
-
];
|
|
240
|
-
PoCodeEditorBaseComponent.propDecorators = {
|
|
241
|
-
language: [{ type: Input, args: ['p-language',] }],
|
|
242
|
-
readonly: [{ type: Input, args: ['p-readonly',] }],
|
|
243
|
-
showDiff: [{ type: Input, args: ['p-show-diff',] }],
|
|
244
|
-
suggestions: [{ type: Input, args: ['p-suggestions',] }],
|
|
245
|
-
theme: [{ type: Input, args: ['p-theme',] }],
|
|
246
|
-
height: [{ type: Input, args: ['p-height',] }]
|
|
247
|
-
};
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tY29kZS1lZGl0b3ItYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvcG8tY29kZS1lZGl0b3IvcG8tY29kZS1lZGl0b3ItYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLakQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlERztBQUVILE1BQU0sT0FBZ0IseUJBQXlCO0lBRC9DO1FBR0Usa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUVSLFlBQU8sR0FBVyxHQUFHLENBQUM7UUFDdEIsY0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0IsV0FBTSxHQUFHLDRCQUE0QixDQUFDO1FBK0o5QywwQkFBMEI7UUFDMUIsY0FBUyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDL0IsMEJBQTBCO1FBQzFCLHNCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFvQ3pDLENBQUM7SUFwTUM7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQXlCLFFBQVEsQ0FBQyxRQUFnQjtRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxR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QUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxHQUFRO1FBQ2pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsT0FBTyxHQUFHLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUNyRDtRQUVELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNsQjtRQUVELE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7OztZQXRNRixTQUFTOzs7dUJBMkJQLEtBQUssU0FBQyxZQUFZO3VCQXlCbEIsS0FBSyxTQUFDLFlBQVk7dUJBNEJsQixLQUFLLFNBQUMsYUFBYTswQkErQm5CLEtBQUssU0FBQyxlQUFlO29CQThCckIsS0FBSyxTQUFDLFNBQVM7cUJBcUJmLEtBQUssU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5wdXQsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBvQ29kZUVkaXRvclJlZ2lzdGVyYWJsZVN1Z2dlc3Rpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tY29kZS1lZGl0b3ItcmVnaXN0ZXJhYmxlLXN1Z2dlc3Rpb24uaW50ZXJmYWNlJztcblxuY29uc3QgUE9fQ09ERV9FRElUT1JfVEhFTUVTID0gWyd2cy1kYXJrJywgJ3ZzJywgJ2hjLWJsYWNrJ107XG5jb25zdCBQT19DT0RFX0VESVRPUl9USEVNRV9ERUZBVUxUID0gJ3ZzJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGBwby1jb2RlLWVkaXRvcmAgw6kgdW0gY29tcG9uZW50ZSBwYXJhIGVkacOnw6NvIGRlIGPDs2RpZ28gZm9udGUgYmFzZWFkbyBubyBNb25hY28gRWRpdG9yIGRhIE1pY3Jvc29mdC5cbiAqXG4gKiBTZW5kbyBhc3NpbSwgYWxndW1hcyBjb25maWd1cmHDp8O1ZXMgcHJlc2VudGVzIG5vIE1vbmFjbyBwb2RlbSBzZXIgdXRpbGl6YWRhcyBhcXVpLCBjb21vIGEgZXNjb2xoYSBkYSBsaW5ndWFnZW1cbiAqICh1dGlsaXphbmRvIG8gaGlnaGxpZ2h0IHN5bnRheCBlc3BlY8OtZmljbyksIGVzY29saGEgZG8gdGVtYSBlIG9ww6fDo28gZGUgZGlmZiwgYWzDqW0gZGUgc2VyIG11aXRvIHNpbWlsYXIgYW8gVmlzdWFsXG4gKiBTdHVkaW8gQ29kZSwgY29tIGF1dG9jb21wbGV0ZSBlIGZlY2hhbWVudG8gYXV0b23DoXRpY28gZGUgYnJhY2tldHMuXG4gKlxuICogRXN0ZSBjb21wb25lbnRlIHBvZGUgc2VyIHVzYWRvIGVtIHF1YWxxdWVyIHNpdHVhw6fDo28gcXVlIG5lY2Vzc2l0ZSBkZSBhZGnDp8OjbyBkZSBjw7NkaWdvcywgY29tbyBwb3IgZXhlbXBsbywgY3JpYXJcbiAqIHJlY2VpdGFzIHV0aWxpemFuZG8gVGVycmFmb3JtIHBhcmEgZ2VyZW5jaWFyIHRvcG9sb2dpYXMuXG4gKiDDiSBpbXBvcnRhbnRlIHJlc3NhbHRhciBxdWUgZXN0ZSBuw6NvIMOpIHVtIGNvbXBvbmVudGUgcGFyYSBlZGnDp8OjbyBkZSB0ZXh0b3MgY29tdW5zLlxuICpcbiAqIE8gWyhuZ01vZGVsKV0gZGV2ZSBzZXIgdXNhZG8gcGFyYSBtYW5pcHVsYXIgbyBjb250ZcO6ZG8gZG8gcG8tY29kZS1lZGl0b3IsIG91IHNlamEsIHRhbnRvIHBhcmEgaW5jbHVpciB1bSBjb250ZcO6ZG8gcXVhbnRvXG4gKiBwYXJhIHJlY3VwZXJhciBvIGNvbnRlw7pkbyBkbyBwby1jb2RlLWVkaXRvciwgdXRpbGl6YS1zZSB1bWEgdmFyacOhdmVsIHBhc3NhZGEgcG9yIFsobmdNb2RlbCldLlxuICpcbiAqICMjIyMgQWRpY2lvbmFuZG8gbyBwYWNvdGUgQHBvLXVpL25nLWNvZGUtZWRpdG9yXG4gKlxuICogUGFyYSBpbnN0YWxhciBvIHBhY290ZSBgcG8tY29kZS1lZGl0b3JgIGVtIHN1YSBhcGxpY2HDp8OjbyBleGVjdXRlOlxuICpcbiAqIGBgYHNoZWxsXG4gKiBuZyBhZGQgQHBvLXVpL25nLWNvZGUtZWRpdG9yXG4gKiBgYGBcbiAqXG4gKiBPIGNvbWFuZG8gYG5nIGFkZGAgZG8gYEFuZ3VsYXIgQ0xJYDpcbiAqIC0gaW5jbHVpIG8gYHBvLWNvZGUtZWRpdG9yYCBubyBzZXUgcHJvamV0bztcbiAqIC0gYWRpY2lvbmEgbyBtw7NkdWxvIGBQb0NvZGVFZGl0b3JNb2R1bGVgOjtcbiAqXG4gKiBgYGBcbiAqIC8vIGFwcC5tb2R1bGUudHNcbiAqIC4uLlxuICogaW1wb3J0IHsgUG9Nb2R1bGUgfSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XG4gKiBpbXBvcnQgeyBQb0NvZGVFZGl0b3JNb2R1bGUgfSBmcm9tICdAcG8tdWkvbmctY29kZS1lZGl0b3InO1xuICogLi4uXG4gKiBATmdNb2R1bGUoe1xuICogICBpbXBvcnRzOiBbXG4gKiAgICAgLi4uXG4gKiAgICAgUG9Nb2R1bGUsXG4gKiAgICAgUG9Db2RlRWRpdG9yTW9kdWxlXG4gKiAgIF0sXG4gKiAgIC4uLlxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XG4gKiBgYGBcbiAqXG4gKiAtIGFkaWNpb25hIG8gdGVtYSBQTyBVSSBlIHRhbWLDqW0gbyAqYXNzZXQqIGRvIE1vbmFjbyBubyBhcnF1aXZvIGBhbmd1bGFyLmpzb25gLCBjb25mb3JtZSBhYmFpeG86XG4gKlxuICogPHByZSBuZ05vbkJpbmRhYmxlPlxuICogLi4uXG4gKiBcImFzc2V0c1wiOiBbXG4gKiAgICB7IFwiZ2xvYlwiOiBcIiYjNDI7JiM0MjsvJiM0MjtcIiwgXCJpbnB1dFwiOiBcIm5vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL21pblwiLCBcIm91dHB1dFwiOiBcIi9hc3NldHMvbW9uYWNvL1wiIH1cbiAqICBdLFxuICogXCJzdHlsZXNcIjogW1xuICogICAgXCIuL25vZGVfbW9kdWxlcy9AcG8tdWkvc3R5bGUvY3NzL3BvLXRoZW1lLWRlZmF1bHQubWluLmNzc1wiXG4gKiBdXG4gKiAuLi5cbiAqIDwvcHJlPlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb0NvZGVFZGl0b3JCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBlZGl0b3I6IGFueTtcbiAgbW9kaWZpZWRWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHZhbHVlOiBhbnkgPSAnJztcblxuICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlciA9IDE1MDtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSAncGxhaW5UZXh0JztcbiAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd0RpZmY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3VnZ2VzdGlvbnM6IEFycmF5PFBvQ29kZUVkaXRvclJlZ2lzdGVyYWJsZVN1Z2dlc3Rpb24+O1xuICBwcml2YXRlIF90aGVtZSA9IFBPX0NPREVfRURJVE9SX1RIRU1FX0RFRkFVTFQ7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogTGluZ3VhZ2VtIG5hIHF1YWwgc2Vyw6EgYXByZXNlbnRhZG8gbyBjw7NkaWdvIGZvbnRlLlxuICAgKiBQYXJhIHNhYmVyIHF1YWlzIHPDo28gYXMgbGluZ3VhZ2VucyBjb21wYXTDrXZlaXMsIGNvbnN1bHRlIGEgZG9jdW1lbnRhw6fDo28gb2ZpY2lhbCBkb1xuICAgKiBbKipNb25hY28gRWRpdG9yKipdKGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9tb25hY28tZWRpdG9yLykuXG4gICAqXG4gICAqIFRhbWLDqW0gw6kgcG9zc8OtdmVsIGFkaWNpb25hciB1bWEgbm92YSBsaW5ndWFnZW0gcGVyc29uYWxpemFkYSB1dGlsaXphbmRvIG8gc2VydmnDp286XG4gICAqIFsqKnBvLWNvZGUtZWRpdG9yLXJlZ2lzdGVyKipdKGh0dHBzOi8vcG8tdWkuaW8vZG9jdW1lbnRhdGlvbi9wby1jb2RlLWVkaXRvci1yZWdpc3Rlcj92aWV3PWRvYykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBwbGFpblRleHRgXG4gICAqL1xuICBASW5wdXQoJ3AtbGFuZ3VhZ2UnKSBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlID0gbGFuZ3VhZ2UgJiYgbGFuZ3VhZ2UubGVuZ3RoID8gbGFuZ3VhZ2UudHJpbSgpIDogJ3BsYWluVGV4dCc7XG5cbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5fbGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuc2V0TGFuZ3VhZ2UodGhpcy5fbGFuZ3VhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEluZGljYSBzZSBvIGVkaXRvciBzZXLDoSBhYmVydG8gZW0gbW9kbyBkZSBsZWl0dXJhLlxuICAgKlxuICAgKiBOZXN0ZSBjYXNvLCBuw6NvIMOpIHBvc3PDrXZlbCBlZGl0YXIgbyBjw7NkaWdvIGluc2VyaWRvLlxuICAgKlxuICAgKiBPYnM6IEVzdGEgcHJvcHJpZWRhZGUgbsOjbyByZWZsZXRpcsOhIGVmZWl0byBzZSBhbHRlcmFkYSBhcMOzcyBvIGNhcnJlZ2FtZW50byBkbyBjb21wb25lbnRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoJ3AtcmVhZG9ubHknKSBzZXQgcmVhZG9ubHkocmVhZG9ubHk6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IDxhbnk+cmVhZG9ubHkgPT09ICcnID8gdHJ1ZSA6IHRoaXMuY29udmVydFRvQm9vbGVhbihyZWFkb25seSk7XG5cbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuc2V0UmVhZE9ubHkocmVhZG9ubHkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJbmRpY2Egc2UgbyBlZGl0b3Igc2Vyw6EgYWJlcnRvIGVtIG1vZG8gZGUgY29tcGFyYcOnw6NvLlxuICAgKlxuICAgKiBDYXNvIGVzdGVqYSBoYWJpbGl0YWRhIGVzdGEgb3DDp8OjbywgZW50w6NvIG8gWyhuZ01vZGVsKV0gZGV2ZXLDoSBzZXIgcGFzc2FkbyBjb21vIHVtIGFycmF5LCBjdWphIHByaW1laXJhIG9ww6fDo28gZGV2ZVxuICAgKiBjb250ZXIgdW1hIHN0cmluZyBjb20gbyBjw7NkaWdvIG9yaWdpbmFsIGUgbmEgc2VndW5kYSBwb3Npw6fDo28gdW1hIHN0cmluZyBjw7NkaWdvIG1vZGlmaWNhZG8gcGFyYSBlZmVpdG8gZGVcbiAgICogY29tcGFyYcOnw6NvLiBOZXN0ZSBjYXNvLCBvIHVzdcOhcmlvIGNvbnNlZ3VpcsOhIGVkaXRhciBhcGVuYXMgbyBjw7NkaWdvIG1vZGlmaWNhZG8gZSBpc3NvIHJlZmxldGlyw6EgbmEgc2VndW5kYSBwb3Npw6fDo29cbiAgICogZG8gYXJyYXkgY29uc2VxdWVudGVtZW50ZS5cbiAgICpcbiAgICogT2JzOiBFc3RhIHByb3ByaWVkYWRlIG7Do28gcmVmbGV0aXLDoSBlZmVpdG8gc2UgYWx0ZXJhZGEgYXDDs3MgbyBjYXJyZWdhbWVudG8gZG8gY29tcG9uZW50ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KCdwLXNob3ctZGlmZicpIHNldCBzaG93RGlmZihzaG93RGlmZjogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dEaWZmID0gPGFueT5zaG93RGlmZiA9PT0gJycgPyB0cnVlIDogdGhpcy5jb252ZXJ0VG9Cb29sZWFuKHNob3dEaWZmKTtcbiAgfVxuXG4gIGdldCBzaG93RGlmZigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0RpZmY7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBMaXN0YSBkZSBzdWdlc3TDtWVzIHVzYWRhcyBwZWxvIGF1dG9jb21wbGV0ZSBkZW50cm8gZG8gZWRpdG9yLlxuICAgKlxuICAgKiBQYXJhIHZpc3VhbGl6YXIgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHVzZSBvIGNvbWFuZG8gYENUUkwgKyBTUEFDRWAuXG4gICAqXG4gICAqIENhc28gbyBlZGl0b3IgZXN0ZWphIHVzYW5kbyB1bWEgbGluZ3VhZ2VtIHF1ZSBqw6EgdGVuaGEgdW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgcHJlZGVmaW5pZGEsIG8gdmFsb3IgcGFzc2FkbyBzZXLDoSBhZGljaW9uYWRvXG4gICAqIGEgbGlzdGEgcHJlZXhpc3RlbnRlLCBhdW1lbnRhbmRvIGFzIG9ww6fDtWVzIHBhcmEgbyB1c3XDoXJpby5cbiAgICpcbiAgICogQ2FzbyB0ZW5oYSBtYWlzIGRlIHVtIGVkaXRvciBkYSBtZXNtYSBsaW5ndWFnZW0gbmEgYXBsaWNhw6fDo28sIGFzIHN1Z2VzdMO1ZXMgc2Vyw6NvIGFkaWNpb25hZGFzIHBhcmEgcXVlIHRvZG9zIG9zIGVkaXRvcmVzIGRhIG1lc21hIGxpbmd1YWdlbVxuICAgKiB0ZW5oYW0gYXMgbWVzbWFzIHN1Z2VzdMO1ZXMuXG4gICAqXG4gICAqIGBgYFxuICAgKiAgPHBvLWNvZGUtZWRpdG9yXG4gICAqICAgIFtwLXN1Z2dlc3Rpb25zXT1cIlt7IGxhYmVsOiAncG8nLCBpbnNlcnRUZXh0OiAnUG9ydGluYXJpIFVJJyB9LCB7IGxhYmVsOiAnbmcnLCBpbnNlcnRUZXh0OiAnQW5ndWxhcicgfV1cIj5cbiAgICogIDwvcG8tY29kZS1lZGl0b3I+XG4gICAqIGBgYFxuICAgKlxuICAgKiBBbyBmb3JuZWNlciB1bWEgbGlzdGEgZGUgc3VnZXN0w7VlcyDDqSBwb3Nzw612ZWwgYWNlbGVyYXIgYSBlc2NyaXRhIGRlIHNjcmlwdHMgcGVsb3MgdXN1w6FyaW9zLlxuICAgKi9cbiAgQElucHV0KCdwLXN1Z2dlc3Rpb25zJykgc2V0IHN1Z2dlc3Rpb25zKHZhbHVlczogQXJyYXk8UG9Db2RlRWRpdG9yUmVnaXN0ZXJhYmxlU3VnZ2VzdGlvbj4pIHtcbiAgICB0aGlzLl9zdWdnZXN0aW9ucyA9IHZhbHVlcztcblxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLl9zdWdnZXN0aW9ucykge1xuICAgICAgdGhpcy5zZXRTdWdnZXN0aW9ucyh0aGlzLl9zdWdnZXN0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN1Z2dlc3Rpb25zKCk6IEFycmF5PFBvQ29kZUVkaXRvclJlZ2lzdGVyYWJsZVN1Z2dlc3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fc3VnZ2VzdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBEZWZpbmUgdW0gdGVtYSBwYXJhIG8gZWRpdG9yLlxuICAgKlxuICAgKiBUZW1hcyB2w6FsaWRvczpcbiAgICogIC0gYHZzLWRhcmtgXG4gICAqICAtIGB2c2BcbiAgICogIC0gYGhjLWJsYWNrYFxuICAgKlxuICAgKiDDiSBpbXBvcnRhbnRlIHNhbGllbnRhciBxdWUgbyB0ZW1hIHNlcsOhIGFwbGljYWRvcyBhIHRvZG9zIG9zIGNvbXBvbmVudGVzIHBvLWNvZGUtZWRpdG9yIGV4aXN0ZW50ZXMgbmEgdGVsYSxcbiAgICogb3Ugc2VqYSwgdG9kYXMgYXMgaW5zdMOibmNpYXMgZG8gY29tcG9uZW50ZSByZWNlYmVyw6NvIG8gw7psdGltbyB0ZW1hIGF0cmlidcOtZG8gb3UgbyB0ZW1hIGRhIMO6bHRpbWEgaW5zdMOibmNpYVxuICAgKiBjcmlhZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB2c2BcbiAgICovXG4gIEBJbnB1dCgncC10aGVtZScpIHNldCB0aGVtZSh0aGVtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhlbWUgPSBQT19DT0RFX0VESVRPUl9USEVNRVMuaW5jbHVkZXModGhlbWUpID8gdGhlbWUgOiBQT19DT0RFX0VESVRPUl9USEVNRV9ERUZBVUxUO1xuXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLnNldFRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGhlbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGhlbWU7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBEZWZpbmUgYSBhbHR1cmEgZG8gY29tcG9uZW50ZSBlbSBwaXhlbHMgZG8gcG8tY29kZS1lZGl0b3IuXG4gICAqIEVzdGEgcHJvcHJpZWRhZGUgbsOjbyBwb2RlcsOhIHNlciBhbHRlcmFkYSBhcMOzcyBvIGNvbXBvbmVudGUgdGVyIHNpZG8gaW5pY2lhZG8uXG4gICAqIEEgYWx0dXJhIG3DrW5pbWEgw6kgMTUwIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgncC1oZWlnaHQnKSBzZXQgaGVpZ2h0KGhlaWdodDogc3RyaW5nKSB7XG4gICAgdGhpcy5faGVpZ2h0ID0gcGFyc2VGbG9hdChoZWlnaHQpID49IDE1MCA/IHBhcnNlRmxvYXQoaGVpZ2h0KSA6IDE1MDtcbiAgfVxuXG4gIGdldCBoZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5faGVpZ2h0fXB4YDtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIG9uVG91Y2hlZCA9ICh2YWx1ZTogYW55KSA9PiB7fTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgb25DaGFuZ2VQcm9wYWdhdGUgPSAodmFsdWU6IGFueSkgPT4ge307XG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4geyBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSwgdGhlbWU6IHRoaXMudGhlbWUsIHJlYWRPbmx5OiB0aGlzLnJlYWRvbmx5IH07XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlUHJvcGFnYXRlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb252ZXJ0VG9Cb29sZWFuKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICByZXR1cm4gdmFsID09PSAndHJ1ZScgfHwgdmFsID09PSAnb24nIHx8IHZhbCA9PT0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsID09PSAxO1xuICAgIH1cblxuICAgIHJldHVybiAhIXZhbDtcbiAgfVxuXG4gIGFic3RyYWN0IHdyaXRlVmFsdWUodmFsdWU6IGFueSk7XG5cbiAgYWJzdHJhY3Qgc2V0TGFuZ3VhZ2UodmFsdWU6IGFueSk7XG5cbiAgYWJzdHJhY3Qgc2V0VGhlbWUodmFsdWU6IGFueSk7XG5cbiAgYWJzdHJhY3Qgc2V0UmVhZE9ubHkodmFsdWU6IGFueSk7XG5cbiAgYWJzdHJhY3Qgc2V0U3VnZ2VzdGlvbnModmFsdWU6IGFueSk7XG59XG4iXX0=
|
|
1
|
+
import { Input, Directive } from '@angular/core';
|
|
2
|
+
const PO_CODE_EDITOR_THEMES = ['vs-dark', 'vs', 'hc-black'];
|
|
3
|
+
const PO_CODE_EDITOR_THEME_DEFAULT = 'vs';
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
*
|
|
7
|
+
* O `po-code-editor` é um componente para edição de código fonte baseado no Monaco Editor da Microsoft.
|
|
8
|
+
*
|
|
9
|
+
* Sendo assim, algumas configurações presentes no Monaco podem ser utilizadas aqui, como a escolha da linguagem
|
|
10
|
+
* (utilizando o highlight syntax específico), escolha do tema e opção de diff, além de ser muito similar ao Visual
|
|
11
|
+
* Studio Code, com autocomplete e fechamento automático de brackets.
|
|
12
|
+
*
|
|
13
|
+
* Este componente pode ser usado em qualquer situação que necessite de adição de códigos, como por exemplo, criar
|
|
14
|
+
* receitas utilizando Terraform para gerenciar topologias.
|
|
15
|
+
* É importante ressaltar que este não é um componente para edição de textos comuns.
|
|
16
|
+
*
|
|
17
|
+
* O [(ngModel)] deve ser usado para manipular o conteúdo do po-code-editor, ou seja, tanto para incluir um conteúdo quanto
|
|
18
|
+
* para recuperar o conteúdo do po-code-editor, utiliza-se uma variável passada por [(ngModel)].
|
|
19
|
+
*
|
|
20
|
+
* #### Adicionando o pacote @po-ui/ng-code-editor
|
|
21
|
+
*
|
|
22
|
+
* Para instalar o pacote `po-code-editor` em sua aplicação execute:
|
|
23
|
+
*
|
|
24
|
+
* ```shell
|
|
25
|
+
* ng add @po-ui/ng-code-editor
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* O comando `ng add` do `Angular CLI`:
|
|
29
|
+
* - inclui o `po-code-editor` no seu projeto;
|
|
30
|
+
* - adiciona o módulo `PoCodeEditorModule`:;
|
|
31
|
+
*
|
|
32
|
+
* ```
|
|
33
|
+
* // app.module.ts
|
|
34
|
+
* ...
|
|
35
|
+
* import { PoModule } from '@po-ui/ng-components';
|
|
36
|
+
* import { PoCodeEditorModule } from '@po-ui/ng-code-editor';
|
|
37
|
+
* ...
|
|
38
|
+
* @NgModule({
|
|
39
|
+
* imports: [
|
|
40
|
+
* ...
|
|
41
|
+
* PoModule,
|
|
42
|
+
* PoCodeEditorModule
|
|
43
|
+
* ],
|
|
44
|
+
* ...
|
|
45
|
+
* })
|
|
46
|
+
* export class AppModule { }
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* - adiciona o tema PO UI e também o *asset* do Monaco no arquivo `angular.json`, conforme abaixo:
|
|
50
|
+
*
|
|
51
|
+
* <pre ngNonBindable>
|
|
52
|
+
* ...
|
|
53
|
+
* "assets": [
|
|
54
|
+
* { "glob": "**/*", "input": "node_modules/monaco-editor/min", "output": "/assets/monaco/" }
|
|
55
|
+
* ],
|
|
56
|
+
* "styles": [
|
|
57
|
+
* "./node_modules/@po-ui/style/css/po-theme-default.min.css"
|
|
58
|
+
* ]
|
|
59
|
+
* ...
|
|
60
|
+
* </pre>
|
|
61
|
+
*/
|
|
62
|
+
export class PoCodeEditorBaseComponent {
|
|
63
|
+
constructor() {
|
|
64
|
+
this.modifiedValue = '';
|
|
65
|
+
this.value = '';
|
|
66
|
+
this._height = 150;
|
|
67
|
+
this._language = 'plainText';
|
|
68
|
+
this._readonly = false;
|
|
69
|
+
this._showDiff = false;
|
|
70
|
+
this._theme = PO_CODE_EDITOR_THEME_DEFAULT;
|
|
71
|
+
/* istanbul ignore next */
|
|
72
|
+
this.onTouched = (value) => { };
|
|
73
|
+
/* istanbul ignore next */
|
|
74
|
+
this.onChangePropagate = (value) => { };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @optional
|
|
78
|
+
*
|
|
79
|
+
* @description
|
|
80
|
+
*
|
|
81
|
+
* Linguagem na qual será apresentado o código fonte.
|
|
82
|
+
* Para saber quais são as linguagens compatíveis, consulte a documentação oficial do
|
|
83
|
+
* [**Monaco Editor**](https://microsoft.github.io/monaco-editor/).
|
|
84
|
+
*
|
|
85
|
+
* Também é possível adicionar uma nova linguagem personalizada utilizando o serviço:
|
|
86
|
+
* [**po-code-editor-register**](https://po-ui.io/documentation/po-code-editor-register?view=doc).
|
|
87
|
+
*
|
|
88
|
+
* @default `plainText`
|
|
89
|
+
*/
|
|
90
|
+
set language(language) {
|
|
91
|
+
this._language = language && language.length ? language.trim() : 'plainText';
|
|
92
|
+
if (this.editor && this._language) {
|
|
93
|
+
this.setLanguage(this._language);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
get language() {
|
|
97
|
+
return this._language;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* @optional
|
|
101
|
+
*
|
|
102
|
+
* @description
|
|
103
|
+
*
|
|
104
|
+
* Indica se o editor será aberto em modo de leitura.
|
|
105
|
+
*
|
|
106
|
+
* Neste caso, não é possível editar o código inserido.
|
|
107
|
+
*
|
|
108
|
+
* Obs: Esta propriedade não refletirá efeito se alterada após o carregamento do componente.
|
|
109
|
+
*
|
|
110
|
+
* @default `false`
|
|
111
|
+
*/
|
|
112
|
+
set readonly(readonly) {
|
|
113
|
+
this._readonly = readonly === '' ? true : this.convertToBoolean(readonly);
|
|
114
|
+
if (this.editor) {
|
|
115
|
+
this.setReadOnly(readonly);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
get readonly() {
|
|
119
|
+
return this._readonly;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @optional
|
|
123
|
+
*
|
|
124
|
+
* @description
|
|
125
|
+
*
|
|
126
|
+
* Indica se o editor será aberto em modo de comparação.
|
|
127
|
+
*
|
|
128
|
+
* Caso esteja habilitada esta opção, então o [(ngModel)] deverá ser passado como um array, cuja primeira opção deve
|
|
129
|
+
* conter uma string com o código original e na segunda posição uma string código modificado para efeito de
|
|
130
|
+
* comparação. Neste caso, o usuário conseguirá editar apenas o código modificado e isso refletirá na segunda posição
|
|
131
|
+
* do array consequentemente.
|
|
132
|
+
*
|
|
133
|
+
* Obs: Esta propriedade não refletirá efeito se alterada após o carregamento do componente.
|
|
134
|
+
*
|
|
135
|
+
* @default `false`
|
|
136
|
+
*/
|
|
137
|
+
set showDiff(showDiff) {
|
|
138
|
+
this._showDiff = showDiff === '' ? true : this.convertToBoolean(showDiff);
|
|
139
|
+
}
|
|
140
|
+
get showDiff() {
|
|
141
|
+
return this._showDiff;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @optional
|
|
145
|
+
*
|
|
146
|
+
* @description
|
|
147
|
+
*
|
|
148
|
+
* Lista de sugestões usadas pelo autocomplete dentro do editor.
|
|
149
|
+
*
|
|
150
|
+
* Para visualizar a lista de sugestões use o comando `CTRL + SPACE`.
|
|
151
|
+
*
|
|
152
|
+
* Caso o editor esteja usando uma linguagem que já tenha uma lista de sugestões predefinida, o valor passado será adicionado
|
|
153
|
+
* a lista preexistente, aumentando as opções para o usuário.
|
|
154
|
+
*
|
|
155
|
+
* Caso tenha mais de um editor da mesma linguagem na aplicação, as sugestões serão adicionadas para que todos os editores da mesma linguagem
|
|
156
|
+
* tenham as mesmas sugestões.
|
|
157
|
+
*
|
|
158
|
+
* ```
|
|
159
|
+
* <po-code-editor
|
|
160
|
+
* [p-suggestions]="[{ label: 'po', insertText: 'Portinari UI' }, { label: 'ng', insertText: 'Angular' }]">
|
|
161
|
+
* </po-code-editor>
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* Ao fornecer uma lista de sugestões é possível acelerar a escrita de scripts pelos usuários.
|
|
165
|
+
*/
|
|
166
|
+
set suggestions(values) {
|
|
167
|
+
this._suggestions = values;
|
|
168
|
+
if (this.editor && this._suggestions) {
|
|
169
|
+
this.setSuggestions(this._suggestions);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
get suggestions() {
|
|
173
|
+
return this._suggestions;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* @optional
|
|
177
|
+
*
|
|
178
|
+
* @description
|
|
179
|
+
*
|
|
180
|
+
* Define um tema para o editor.
|
|
181
|
+
*
|
|
182
|
+
* Temas válidos:
|
|
183
|
+
* - `vs-dark`
|
|
184
|
+
* - `vs`
|
|
185
|
+
* - `hc-black`
|
|
186
|
+
*
|
|
187
|
+
* É importante salientar que o tema será aplicados a todos os componentes po-code-editor existentes na tela,
|
|
188
|
+
* ou seja, todas as instâncias do componente receberão o último tema atribuído ou o tema da última instância
|
|
189
|
+
* criada.
|
|
190
|
+
*
|
|
191
|
+
* @default `vs`
|
|
192
|
+
*/
|
|
193
|
+
set theme(theme) {
|
|
194
|
+
this._theme = PO_CODE_EDITOR_THEMES.includes(theme) ? theme : PO_CODE_EDITOR_THEME_DEFAULT;
|
|
195
|
+
if (this.editor) {
|
|
196
|
+
this.setTheme(theme);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
get theme() {
|
|
200
|
+
return this._theme;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* @optional
|
|
204
|
+
*
|
|
205
|
+
* @description
|
|
206
|
+
*
|
|
207
|
+
* Define a altura do componente em pixels do po-code-editor.
|
|
208
|
+
* Esta propriedade não poderá ser alterada após o componente ter sido iniciado.
|
|
209
|
+
* A altura mínima é 150 pixels.
|
|
210
|
+
*/
|
|
211
|
+
set height(height) {
|
|
212
|
+
this._height = parseFloat(height) >= 150 ? parseFloat(height) : 150;
|
|
213
|
+
}
|
|
214
|
+
get height() {
|
|
215
|
+
return `${this._height}px`;
|
|
216
|
+
}
|
|
217
|
+
getOptions() {
|
|
218
|
+
return { language: this.language, theme: this.theme, readOnly: this.readonly };
|
|
219
|
+
}
|
|
220
|
+
registerOnChange(fn) {
|
|
221
|
+
this.onChangePropagate = fn;
|
|
222
|
+
}
|
|
223
|
+
registerOnTouched(fn) {
|
|
224
|
+
this.onTouched = fn;
|
|
225
|
+
}
|
|
226
|
+
convertToBoolean(val) {
|
|
227
|
+
if (typeof val === 'string') {
|
|
228
|
+
val = val.toLowerCase().trim();
|
|
229
|
+
return val === 'true' || val === 'on' || val === '';
|
|
230
|
+
}
|
|
231
|
+
if (typeof val === 'number') {
|
|
232
|
+
return val === 1;
|
|
233
|
+
}
|
|
234
|
+
return !!val;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
PoCodeEditorBaseComponent.decorators = [
|
|
238
|
+
{ type: Directive }
|
|
239
|
+
];
|
|
240
|
+
PoCodeEditorBaseComponent.propDecorators = {
|
|
241
|
+
language: [{ type: Input, args: ['p-language',] }],
|
|
242
|
+
readonly: [{ type: Input, args: ['p-readonly',] }],
|
|
243
|
+
showDiff: [{ type: Input, args: ['p-show-diff',] }],
|
|
244
|
+
suggestions: [{ type: Input, args: ['p-suggestions',] }],
|
|
245
|
+
theme: [{ type: Input, args: ['p-theme',] }],
|
|
246
|
+
height: [{ type: Input, args: ['p-height',] }]
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tY29kZS1lZGl0b3ItYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvcG8tY29kZS1lZGl0b3IvcG8tY29kZS1lZGl0b3ItYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLakQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlERztBQUVILE1BQU0sT0FBZ0IseUJBQXlCO0lBRC9DO1FBR0Usa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUVSLFlBQU8sR0FBVyxHQUFHLENBQUM7UUFDdEIsY0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0IsV0FBTSxHQUFHLDRCQUE0QixDQUFDO1FBK0o5QywwQkFBMEI7UUFDMUIsY0FBUyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDL0IsMEJBQTBCO1FBQzFCLHNCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFvQ3pDLENBQUM7SUFwTUM7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQXlCLFFBQVEsQ0FBQyxRQUFnQjtRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxR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QUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxHQUFRO1FBQ2pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsT0FBTyxHQUFHLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUNyRDtRQUVELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNsQjtRQUVELE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7OztZQXRNRixTQUFTOzs7dUJBMkJQLEtBQUssU0FBQyxZQUFZO3VCQXlCbEIsS0FBSyxTQUFDLFlBQVk7dUJBNEJsQixLQUFLLFNBQUMsYUFBYTswQkErQm5CLEtBQUssU0FBQyxlQUFlO29CQThCckIsS0FBSyxTQUFDLFNBQVM7cUJBcUJmLEtBQUssU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5wdXQsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IFBvQ29kZUVkaXRvclJlZ2lzdGVyYWJsZVN1Z2dlc3Rpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tY29kZS1lZGl0b3ItcmVnaXN0ZXJhYmxlLXN1Z2dlc3Rpb24uaW50ZXJmYWNlJztcclxuXHJcbmNvbnN0IFBPX0NPREVfRURJVE9SX1RIRU1FUyA9IFsndnMtZGFyaycsICd2cycsICdoYy1ibGFjayddO1xyXG5jb25zdCBQT19DT0RFX0VESVRPUl9USEVNRV9ERUZBVUxUID0gJ3ZzJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogTyBgcG8tY29kZS1lZGl0b3JgIMOpIHVtIGNvbXBvbmVudGUgcGFyYSBlZGnDp8OjbyBkZSBjw7NkaWdvIGZvbnRlIGJhc2VhZG8gbm8gTW9uYWNvIEVkaXRvciBkYSBNaWNyb3NvZnQuXHJcbiAqXHJcbiAqIFNlbmRvIGFzc2ltLCBhbGd1bWFzIGNvbmZpZ3VyYcOnw7VlcyBwcmVzZW50ZXMgbm8gTW9uYWNvIHBvZGVtIHNlciB1dGlsaXphZGFzIGFxdWksIGNvbW8gYSBlc2NvbGhhIGRhIGxpbmd1YWdlbVxyXG4gKiAodXRpbGl6YW5kbyBvIGhpZ2hsaWdodCBzeW50YXggZXNwZWPDrWZpY28pLCBlc2NvbGhhIGRvIHRlbWEgZSBvcMOnw6NvIGRlIGRpZmYsIGFsw6ltIGRlIHNlciBtdWl0byBzaW1pbGFyIGFvIFZpc3VhbFxyXG4gKiBTdHVkaW8gQ29kZSwgY29tIGF1dG9jb21wbGV0ZSBlIGZlY2hhbWVudG8gYXV0b23DoXRpY28gZGUgYnJhY2tldHMuXHJcbiAqXHJcbiAqIEVzdGUgY29tcG9uZW50ZSBwb2RlIHNlciB1c2FkbyBlbSBxdWFscXVlciBzaXR1YcOnw6NvIHF1ZSBuZWNlc3NpdGUgZGUgYWRpw6fDo28gZGUgY8OzZGlnb3MsIGNvbW8gcG9yIGV4ZW1wbG8sIGNyaWFyXHJcbiAqIHJlY2VpdGFzIHV0aWxpemFuZG8gVGVycmFmb3JtIHBhcmEgZ2VyZW5jaWFyIHRvcG9sb2dpYXMuXHJcbiAqIMOJIGltcG9ydGFudGUgcmVzc2FsdGFyIHF1ZSBlc3RlIG7Do28gw6kgdW0gY29tcG9uZW50ZSBwYXJhIGVkacOnw6NvIGRlIHRleHRvcyBjb211bnMuXHJcbiAqXHJcbiAqIE8gWyhuZ01vZGVsKV0gZGV2ZSBzZXIgdXNhZG8gcGFyYSBtYW5pcHVsYXIgbyBjb250ZcO6ZG8gZG8gcG8tY29kZS1lZGl0b3IsIG91IHNlamEsIHRhbnRvIHBhcmEgaW5jbHVpciB1bSBjb250ZcO6ZG8gcXVhbnRvXHJcbiAqIHBhcmEgcmVjdXBlcmFyIG8gY29udGXDumRvIGRvIHBvLWNvZGUtZWRpdG9yLCB1dGlsaXphLXNlIHVtYSB2YXJpw6F2ZWwgcGFzc2FkYSBwb3IgWyhuZ01vZGVsKV0uXHJcbiAqXHJcbiAqICMjIyMgQWRpY2lvbmFuZG8gbyBwYWNvdGUgQHBvLXVpL25nLWNvZGUtZWRpdG9yXHJcbiAqXHJcbiAqIFBhcmEgaW5zdGFsYXIgbyBwYWNvdGUgYHBvLWNvZGUtZWRpdG9yYCBlbSBzdWEgYXBsaWNhw6fDo28gZXhlY3V0ZTpcclxuICpcclxuICogYGBgc2hlbGxcclxuICogbmcgYWRkIEBwby11aS9uZy1jb2RlLWVkaXRvclxyXG4gKiBgYGBcclxuICpcclxuICogTyBjb21hbmRvIGBuZyBhZGRgIGRvIGBBbmd1bGFyIENMSWA6XHJcbiAqIC0gaW5jbHVpIG8gYHBvLWNvZGUtZWRpdG9yYCBubyBzZXUgcHJvamV0bztcclxuICogLSBhZGljaW9uYSBvIG3Ds2R1bG8gYFBvQ29kZUVkaXRvck1vZHVsZWA6O1xyXG4gKlxyXG4gKiBgYGBcclxuICogLy8gYXBwLm1vZHVsZS50c1xyXG4gKiAuLi5cclxuICogaW1wb3J0IHsgUG9Nb2R1bGUgfSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XHJcbiAqIGltcG9ydCB7IFBvQ29kZUVkaXRvck1vZHVsZSB9IGZyb20gJ0Bwby11aS9uZy1jb2RlLWVkaXRvcic7XHJcbiAqIC4uLlxyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICAgIC4uLlxyXG4gKiAgICAgUG9Nb2R1bGUsXHJcbiAqICAgICBQb0NvZGVFZGl0b3JNb2R1bGVcclxuICogICBdLFxyXG4gKiAgIC4uLlxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogLSBhZGljaW9uYSBvIHRlbWEgUE8gVUkgZSB0YW1iw6ltIG8gKmFzc2V0KiBkbyBNb25hY28gbm8gYXJxdWl2byBgYW5ndWxhci5qc29uYCwgY29uZm9ybWUgYWJhaXhvOlxyXG4gKlxyXG4gKiA8cHJlIG5nTm9uQmluZGFibGU+XHJcbiAqIC4uLlxyXG4gKiBcImFzc2V0c1wiOiBbXHJcbiAqICAgIHsgXCJnbG9iXCI6IFwiJiM0MjsmIzQyOy8mIzQyO1wiLCBcImlucHV0XCI6IFwibm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvbWluXCIsIFwib3V0cHV0XCI6IFwiL2Fzc2V0cy9tb25hY28vXCIgfVxyXG4gKiAgXSxcclxuICogXCJzdHlsZXNcIjogW1xyXG4gKiAgICBcIi4vbm9kZV9tb2R1bGVzL0Bwby11aS9zdHlsZS9jc3MvcG8tdGhlbWUtZGVmYXVsdC5taW4uY3NzXCJcclxuICogXVxyXG4gKiAuLi5cclxuICogPC9wcmU+XHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvQ29kZUVkaXRvckJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgZWRpdG9yOiBhbnk7XHJcbiAgbW9kaWZpZWRWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgdmFsdWU6IGFueSA9ICcnO1xyXG5cclxuICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlciA9IDE1MDtcclxuICBwcml2YXRlIF9sYW5ndWFnZSA9ICdwbGFpblRleHQnO1xyXG4gIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc2hvd0RpZmY6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9zdWdnZXN0aW9uczogQXJyYXk8UG9Db2RlRWRpdG9yUmVnaXN0ZXJhYmxlU3VnZ2VzdGlvbj47XHJcbiAgcHJpdmF0ZSBfdGhlbWUgPSBQT19DT0RFX0VESVRPUl9USEVNRV9ERUZBVUxUO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogTGluZ3VhZ2VtIG5hIHF1YWwgc2Vyw6EgYXByZXNlbnRhZG8gbyBjw7NkaWdvIGZvbnRlLlxyXG4gICAqIFBhcmEgc2FiZXIgcXVhaXMgc8OjbyBhcyBsaW5ndWFnZW5zIGNvbXBhdMOtdmVpcywgY29uc3VsdGUgYSBkb2N1bWVudGHDp8OjbyBvZmljaWFsIGRvXHJcbiAgICogWyoqTW9uYWNvIEVkaXRvcioqXShodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbW9uYWNvLWVkaXRvci8pLlxyXG4gICAqXHJcbiAgICogVGFtYsOpbSDDqSBwb3Nzw612ZWwgYWRpY2lvbmFyIHVtYSBub3ZhIGxpbmd1YWdlbSBwZXJzb25hbGl6YWRhIHV0aWxpemFuZG8gbyBzZXJ2acOnbzpcclxuICAgKiBbKipwby1jb2RlLWVkaXRvci1yZWdpc3RlcioqXShodHRwczovL3BvLXVpLmlvL2RvY3VtZW50YXRpb24vcG8tY29kZS1lZGl0b3ItcmVnaXN0ZXI/dmlldz1kb2MpLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYHBsYWluVGV4dGBcclxuICAgKi9cclxuICBASW5wdXQoJ3AtbGFuZ3VhZ2UnKSBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZSAmJiBsYW5ndWFnZS5sZW5ndGggPyBsYW5ndWFnZS50cmltKCkgOiAncGxhaW5UZXh0JztcclxuXHJcbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5fbGFuZ3VhZ2UpIHtcclxuICAgICAgdGhpcy5zZXRMYW5ndWFnZSh0aGlzLl9sYW5ndWFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBJbmRpY2Egc2UgbyBlZGl0b3Igc2Vyw6EgYWJlcnRvIGVtIG1vZG8gZGUgbGVpdHVyYS5cclxuICAgKlxyXG4gICAqIE5lc3RlIGNhc28sIG7Do28gw6kgcG9zc8OtdmVsIGVkaXRhciBvIGPDs2RpZ28gaW5zZXJpZG8uXHJcbiAgICpcclxuICAgKiBPYnM6IEVzdGEgcHJvcHJpZWRhZGUgbsOjbyByZWZsZXRpcsOhIGVmZWl0byBzZSBhbHRlcmFkYSBhcMOzcyBvIGNhcnJlZ2FtZW50byBkbyBjb21wb25lbnRlLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1yZWFkb25seScpIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcmVhZG9ubHkgPSA8YW55PnJlYWRvbmx5ID09PSAnJyA/IHRydWUgOiB0aGlzLmNvbnZlcnRUb0Jvb2xlYW4ocmVhZG9ubHkpO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLnNldFJlYWRPbmx5KHJlYWRvbmx5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBJbmRpY2Egc2UgbyBlZGl0b3Igc2Vyw6EgYWJlcnRvIGVtIG1vZG8gZGUgY29tcGFyYcOnw6NvLlxyXG4gICAqXHJcbiAgICogQ2FzbyBlc3RlamEgaGFiaWxpdGFkYSBlc3RhIG9ww6fDo28sIGVudMOjbyBvIFsobmdNb2RlbCldIGRldmVyw6Egc2VyIHBhc3NhZG8gY29tbyB1bSBhcnJheSwgY3VqYSBwcmltZWlyYSBvcMOnw6NvIGRldmVcclxuICAgKiBjb250ZXIgdW1hIHN0cmluZyBjb20gbyBjw7NkaWdvIG9yaWdpbmFsIGUgbmEgc2VndW5kYSBwb3Npw6fDo28gdW1hIHN0cmluZyBjw7NkaWdvIG1vZGlmaWNhZG8gcGFyYSBlZmVpdG8gZGVcclxuICAgKiBjb21wYXJhw6fDo28uIE5lc3RlIGNhc28sIG8gdXN1w6FyaW8gY29uc2VndWlyw6EgZWRpdGFyIGFwZW5hcyBvIGPDs2RpZ28gbW9kaWZpY2FkbyBlIGlzc28gcmVmbGV0aXLDoSBuYSBzZWd1bmRhIHBvc2nDp8Ojb1xyXG4gICAqIGRvIGFycmF5IGNvbnNlcXVlbnRlbWVudGUuXHJcbiAgICpcclxuICAgKiBPYnM6IEVzdGEgcHJvcHJpZWRhZGUgbsOjbyByZWZsZXRpcsOhIGVmZWl0byBzZSBhbHRlcmFkYSBhcMOzcyBvIGNhcnJlZ2FtZW50byBkbyBjb21wb25lbnRlLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1zaG93LWRpZmYnKSBzZXQgc2hvd0RpZmYoc2hvd0RpZmY6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dEaWZmID0gPGFueT5zaG93RGlmZiA9PT0gJycgPyB0cnVlIDogdGhpcy5jb252ZXJ0VG9Cb29sZWFuKHNob3dEaWZmKTtcclxuICB9XHJcblxyXG4gIGdldCBzaG93RGlmZigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaG93RGlmZjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBMaXN0YSBkZSBzdWdlc3TDtWVzIHVzYWRhcyBwZWxvIGF1dG9jb21wbGV0ZSBkZW50cm8gZG8gZWRpdG9yLlxyXG4gICAqXHJcbiAgICogUGFyYSB2aXN1YWxpemFyIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyB1c2UgbyBjb21hbmRvIGBDVFJMICsgU1BBQ0VgLlxyXG4gICAqXHJcbiAgICogQ2FzbyBvIGVkaXRvciBlc3RlamEgdXNhbmRvIHVtYSBsaW5ndWFnZW0gcXVlIGrDoSB0ZW5oYSB1bWEgbGlzdGEgZGUgc3VnZXN0w7VlcyBwcmVkZWZpbmlkYSwgbyB2YWxvciBwYXNzYWRvIHNlcsOhIGFkaWNpb25hZG9cclxuICAgKiBhIGxpc3RhIHByZWV4aXN0ZW50ZSwgYXVtZW50YW5kbyBhcyBvcMOnw7VlcyBwYXJhIG8gdXN1w6FyaW8uXHJcbiAgICpcclxuICAgKiBDYXNvIHRlbmhhIG1haXMgZGUgdW0gZWRpdG9yIGRhIG1lc21hIGxpbmd1YWdlbSBuYSBhcGxpY2HDp8OjbywgYXMgc3VnZXN0w7VlcyBzZXLDo28gYWRpY2lvbmFkYXMgcGFyYSBxdWUgdG9kb3Mgb3MgZWRpdG9yZXMgZGEgbWVzbWEgbGluZ3VhZ2VtXHJcbiAgICogdGVuaGFtIGFzIG1lc21hcyBzdWdlc3TDtWVzLlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogIDxwby1jb2RlLWVkaXRvclxyXG4gICAqICAgIFtwLXN1Z2dlc3Rpb25zXT1cIlt7IGxhYmVsOiAncG8nLCBpbnNlcnRUZXh0OiAnUG9ydGluYXJpIFVJJyB9LCB7IGxhYmVsOiAnbmcnLCBpbnNlcnRUZXh0OiAnQW5ndWxhcicgfV1cIj5cclxuICAgKiAgPC9wby1jb2RlLWVkaXRvcj5cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIEFvIGZvcm5lY2VyIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIMOpIHBvc3PDrXZlbCBhY2VsZXJhciBhIGVzY3JpdGEgZGUgc2NyaXB0cyBwZWxvcyB1c3XDoXJpb3MuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXN1Z2dlc3Rpb25zJykgc2V0IHN1Z2dlc3Rpb25zKHZhbHVlczogQXJyYXk8UG9Db2RlRWRpdG9yUmVnaXN0ZXJhYmxlU3VnZ2VzdGlvbj4pIHtcclxuICAgIHRoaXMuX3N1Z2dlc3Rpb25zID0gdmFsdWVzO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLl9zdWdnZXN0aW9ucykge1xyXG4gICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zKHRoaXMuX3N1Z2dlc3Rpb25zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzdWdnZXN0aW9ucygpOiBBcnJheTxQb0NvZGVFZGl0b3JSZWdpc3RlcmFibGVTdWdnZXN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3VnZ2VzdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRGVmaW5lIHVtIHRlbWEgcGFyYSBvIGVkaXRvci5cclxuICAgKlxyXG4gICAqIFRlbWFzIHbDoWxpZG9zOlxyXG4gICAqICAtIGB2cy1kYXJrYFxyXG4gICAqICAtIGB2c2BcclxuICAgKiAgLSBgaGMtYmxhY2tgXHJcbiAgICpcclxuICAgKiDDiSBpbXBvcnRhbnRlIHNhbGllbnRhciBxdWUgbyB0ZW1hIHNlcsOhIGFwbGljYWRvcyBhIHRvZG9zIG9zIGNvbXBvbmVudGVzIHBvLWNvZGUtZWRpdG9yIGV4aXN0ZW50ZXMgbmEgdGVsYSxcclxuICAgKiBvdSBzZWphLCB0b2RhcyBhcyBpbnN0w6JuY2lhcyBkbyBjb21wb25lbnRlIHJlY2ViZXLDo28gbyDDumx0aW1vIHRlbWEgYXRyaWJ1w61kbyBvdSBvIHRlbWEgZGEgw7psdGltYSBpbnN0w6JuY2lhXHJcbiAgICogY3JpYWRhLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYHZzYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC10aGVtZScpIHNldCB0aGVtZSh0aGVtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90aGVtZSA9IFBPX0NPREVfRURJVE9SX1RIRU1FUy5pbmNsdWRlcyh0aGVtZSkgPyB0aGVtZSA6IFBPX0NPREVfRURJVE9SX1RIRU1FX0RFRkFVTFQ7XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuc2V0VGhlbWUodGhlbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRoZW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGhlbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRGVmaW5lIGEgYWx0dXJhIGRvIGNvbXBvbmVudGUgZW0gcGl4ZWxzIGRvIHBvLWNvZGUtZWRpdG9yLlxyXG4gICAqIEVzdGEgcHJvcHJpZWRhZGUgbsOjbyBwb2RlcsOhIHNlciBhbHRlcmFkYSBhcMOzcyBvIGNvbXBvbmVudGUgdGVyIHNpZG8gaW5pY2lhZG8uXHJcbiAgICogQSBhbHR1cmEgbcOtbmltYSDDqSAxNTAgcGl4ZWxzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1oZWlnaHQnKSBzZXQgaGVpZ2h0KGhlaWdodDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9oZWlnaHQgPSBwYXJzZUZsb2F0KGhlaWdodCkgPj0gMTUwID8gcGFyc2VGbG9hdChoZWlnaHQpIDogMTUwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuX2hlaWdodH1weGA7XHJcbiAgfVxyXG5cclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIG9uVG91Y2hlZCA9ICh2YWx1ZTogYW55KSA9PiB7fTtcclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIG9uQ2hhbmdlUHJvcGFnYXRlID0gKHZhbHVlOiBhbnkpID0+IHt9O1xyXG5cclxuICBnZXRPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHsgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsIHRoZW1lOiB0aGlzLnRoZW1lLCByZWFkT25seTogdGhpcy5yZWFkb25seSB9O1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlUHJvcGFnYXRlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNvbnZlcnRUb0Jvb2xlYW4odmFsOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xyXG4gICAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgIHJldHVybiB2YWwgPT09ICd0cnVlJyB8fCB2YWwgPT09ICdvbicgfHwgdmFsID09PSAnJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHZhbCA9PT0gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gISF2YWw7XHJcbiAgfVxyXG5cclxuICBhYnN0cmFjdCB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpO1xyXG5cclxuICBhYnN0cmFjdCBzZXRMYW5ndWFnZSh2YWx1ZTogYW55KTtcclxuXHJcbiAgYWJzdHJhY3Qgc2V0VGhlbWUodmFsdWU6IGFueSk7XHJcblxyXG4gIGFic3RyYWN0IHNldFJlYWRPbmx5KHZhbHVlOiBhbnkpO1xyXG5cclxuICBhYnN0cmFjdCBzZXRTdWdnZXN0aW9ucyh2YWx1ZTogYW55KTtcclxufVxyXG4iXX0=
|