yaml-language-server 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +10 -1
- package/lib/esm/languageserver/handlers/settingsHandlers.js +4 -2
- package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/esm/languageservice/parser/ast-converter.js +9 -1
- package/lib/esm/languageservice/parser/ast-converter.js.map +1 -1
- package/lib/esm/languageservice/parser/jsonParser07.d.ts +2 -2
- package/lib/esm/languageservice/parser/jsonParser07.js +74 -25
- package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/esm/languageservice/parser/yaml-documents.d.ts +0 -1
- package/lib/esm/languageservice/parser/yaml-documents.js +11 -11
- package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/esm/languageservice/services/documentSymbols.js +3 -2
- package/lib/esm/languageservice/services/documentSymbols.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/lib/esm/languageservice/services/yamlCodeActions.js +14 -0
- package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeLens.js +2 -1
- package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCompletion.d.ts +2 -0
- package/lib/esm/languageservice/services/yamlCompletion.js +183 -40
- package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/esm/languageservice/services/yamlDefinition.d.ts +6 -1
- package/lib/esm/languageservice/services/yamlDefinition.js +23 -17
- package/lib/esm/languageservice/services/yamlDefinition.js.map +1 -1
- package/lib/esm/languageservice/services/yamlHover.js +2 -1
- package/lib/esm/languageservice/services/yamlHover.js.map +1 -1
- package/lib/esm/languageservice/services/yamlLinks.js +2 -1
- package/lib/esm/languageservice/services/yamlLinks.js.map +1 -1
- package/lib/esm/languageservice/services/yamlSchemaService.js +12 -0
- package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/esm/languageservice/services/yamlValidation.js +2 -1
- package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/esm/languageservice/utils/objects.d.ts +5 -0
- package/lib/esm/languageservice/utils/objects.js +13 -0
- package/lib/esm/languageservice/utils/objects.js.map +1 -1
- package/lib/esm/languageservice/utils/schemaUrls.d.ts +1 -1
- package/lib/esm/languageservice/utils/schemaUrls.js +1 -1
- package/lib/esm/languageservice/yamlLanguageService.d.ts +4 -0
- package/lib/esm/languageservice/yamlLanguageService.js +3 -2
- package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/esm/server.js +5 -0
- package/lib/esm/server.js.map +1 -1
- package/lib/esm/yamlSettings.d.ts +2 -0
- package/lib/esm/yamlSettings.js +1 -0
- package/lib/esm/yamlSettings.js.map +1 -1
- package/lib/umd/languageserver/handlers/settingsHandlers.js +5 -3
- package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/umd/languageservice/parser/ast-converter.js +9 -1
- package/lib/umd/languageservice/parser/ast-converter.js.map +1 -1
- package/lib/umd/languageservice/parser/jsonParser07.d.ts +2 -2
- package/lib/umd/languageservice/parser/jsonParser07.js +77 -28
- package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/umd/languageservice/parser/yaml-documents.d.ts +0 -1
- package/lib/umd/languageservice/parser/yaml-documents.js +10 -10
- package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/umd/languageservice/services/documentSymbols.js +4 -3
- package/lib/umd/languageservice/services/documentSymbols.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/lib/umd/languageservice/services/yamlCodeActions.js +14 -0
- package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeLens.js +3 -2
- package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCompletion.d.ts +2 -0
- package/lib/umd/languageservice/services/yamlCompletion.js +182 -39
- package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/umd/languageservice/services/yamlDefinition.d.ts +6 -1
- package/lib/umd/languageservice/services/yamlDefinition.js +26 -20
- package/lib/umd/languageservice/services/yamlDefinition.js.map +1 -1
- package/lib/umd/languageservice/services/yamlHover.js +3 -2
- package/lib/umd/languageservice/services/yamlHover.js.map +1 -1
- package/lib/umd/languageservice/services/yamlLinks.js +3 -2
- package/lib/umd/languageservice/services/yamlLinks.js.map +1 -1
- package/lib/umd/languageservice/services/yamlSchemaService.js +12 -0
- package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/umd/languageservice/services/yamlValidation.js +3 -2
- package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/umd/languageservice/utils/objects.d.ts +5 -0
- package/lib/umd/languageservice/utils/objects.js +15 -1
- package/lib/umd/languageservice/utils/objects.js.map +1 -1
- package/lib/umd/languageservice/utils/schemaUrls.d.ts +1 -1
- package/lib/umd/languageservice/utils/schemaUrls.js +1 -1
- package/lib/umd/languageservice/yamlLanguageService.d.ts +4 -0
- package/lib/umd/languageservice/yamlLanguageService.js +2 -1
- package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/umd/server.js +6 -1
- package/lib/umd/server.js.map +1 -1
- package/lib/umd/yamlSettings.d.ts +2 -0
- package/lib/umd/yamlSettings.js +1 -0
- package/lib/umd/yamlSettings.js.map +1 -1
- package/out/server/src/languageserver/handlers/settingsHandlers.js +4 -2
- package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/out/server/src/languageservice/parser/ast-converter.js +9 -1
- package/out/server/src/languageservice/parser/ast-converter.js.map +1 -1
- package/out/server/src/languageservice/parser/jsonParser07.d.ts +2 -2
- package/out/server/src/languageservice/parser/jsonParser07.js +76 -27
- package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
- package/out/server/src/languageservice/parser/yaml-documents.d.ts +0 -1
- package/out/server/src/languageservice/parser/yaml-documents.js +10 -10
- package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
- package/out/server/src/languageservice/services/documentSymbols.js +3 -2
- package/out/server/src/languageservice/services/documentSymbols.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/out/server/src/languageservice/services/yamlCodeActions.js +14 -0
- package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeLens.js +2 -1
- package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCompletion.d.ts +2 -0
- package/out/server/src/languageservice/services/yamlCompletion.js +181 -38
- package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
- package/out/server/src/languageservice/services/yamlDefinition.d.ts +6 -1
- package/out/server/src/languageservice/services/yamlDefinition.js +25 -19
- package/out/server/src/languageservice/services/yamlDefinition.js.map +1 -1
- package/out/server/src/languageservice/services/yamlHover.js +2 -1
- package/out/server/src/languageservice/services/yamlHover.js.map +1 -1
- package/out/server/src/languageservice/services/yamlLinks.js +2 -1
- package/out/server/src/languageservice/services/yamlLinks.js.map +1 -1
- package/out/server/src/languageservice/services/yamlSchemaService.js +12 -0
- package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
- package/out/server/src/languageservice/services/yamlValidation.js +2 -1
- package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
- package/out/server/src/languageservice/utils/objects.d.ts +5 -0
- package/out/server/src/languageservice/utils/objects.js +15 -1
- package/out/server/src/languageservice/utils/objects.js.map +1 -1
- package/out/server/src/languageservice/utils/schemaUrls.d.ts +1 -1
- package/out/server/src/languageservice/utils/schemaUrls.js +1 -1
- package/out/server/src/languageservice/yamlLanguageService.d.ts +4 -0
- package/out/server/src/languageservice/yamlLanguageService.js +2 -1
- package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
- package/out/server/src/server.js +5 -0
- package/out/server/src/server.js.map +1 -1
- package/out/server/src/yamlSettings.d.ts +2 -0
- package/out/server/src/yamlSettings.js +1 -0
- package/out/server/src/yamlSettings.js.map +1 -1
- package/out/server/test/autoCompletion.test.js +410 -74
- package/out/server/test/autoCompletion.test.js.map +1 -1
- package/out/server/test/autoCompletionFix.test.js +219 -3
- package/out/server/test/autoCompletionFix.test.js.map +1 -1
- package/out/server/test/code-action-schema.test.d.ts +1 -0
- package/out/server/test/code-action-schema.test.js +99 -0
- package/out/server/test/code-action-schema.test.js.map +1 -0
- package/out/server/test/defaultSnippets.test.js +3 -3
- package/out/server/test/defaultSnippets.test.js.map +1 -1
- package/out/server/test/hover.test.js +70 -0
- package/out/server/test/hover.test.js.map +1 -1
- package/out/server/test/integration.test.js +1 -1
- package/out/server/test/jsonParser.test.js +23 -13
- package/out/server/test/jsonParser.test.js.map +1 -1
- package/out/server/test/objects.test.js +16 -0
- package/out/server/test/objects.test.js.map +1 -1
- package/out/server/test/schema.test.js +18 -0
- package/out/server/test/schema.test.js.map +1 -1
- package/out/server/test/yamlDefinition.test.js +8 -2
- package/out/server/test/yamlDefinition.test.js.map +1 -1
- package/out/server/test/yamlParser.test.js +10 -0
- package/out/server/test/yamlParser.test.js.map +1 -1
- package/out/server/test/yamlSchemaService.test.js +21 -0
- package/out/server/test/yamlSchemaService.test.js.map +1 -1
- package/package.json +8 -6
|
@@ -26,8 +26,10 @@ const isKubernetes_1 = require("../parser/isKubernetes");
|
|
|
26
26
|
const astUtils_1 = require("../utils/astUtils");
|
|
27
27
|
const astUtils_2 = require("../utils/astUtils");
|
|
28
28
|
const modelineUtil_1 = require("./modelineUtil");
|
|
29
|
+
const schemaUtils_1 = require("../utils/schemaUtils");
|
|
29
30
|
const localize = nls.loadMessageBundle();
|
|
30
31
|
const doubleQuotesEscapeRegExp = /[\\]+"/g;
|
|
32
|
+
const parentCompletionKind = node_1.CompletionItemKind.Class;
|
|
31
33
|
class YamlCompletion {
|
|
32
34
|
constructor(schemaService, clientCapabilities = {}, yamlDocument, telemetry) {
|
|
33
35
|
this.schemaService = schemaService;
|
|
@@ -43,6 +45,7 @@ class YamlCompletion {
|
|
|
43
45
|
this.customTags = languageSettings.customTags;
|
|
44
46
|
this.yamlVersion = languageSettings.yamlVersion;
|
|
45
47
|
this.configuredIndentation = languageSettings.indentation;
|
|
48
|
+
this.disableDefaultProperties = languageSettings.disableDefaultProperties;
|
|
46
49
|
}
|
|
47
50
|
doComplete(document, position, isKubernetes = false) {
|
|
48
51
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -93,8 +96,34 @@ class YamlCompletion {
|
|
|
93
96
|
overwriteRange = node_1.Range.create(document.positionAt(overwriteStart), position);
|
|
94
97
|
}
|
|
95
98
|
const proposed = {};
|
|
99
|
+
const existingProposeItem = '__';
|
|
96
100
|
const collector = {
|
|
97
101
|
add: (completionItem) => {
|
|
102
|
+
const addSuggestionForParent = function (completionItem) {
|
|
103
|
+
var _a;
|
|
104
|
+
const existsInYaml = ((_a = proposed[completionItem.label]) === null || _a === void 0 ? void 0 : _a.label) === existingProposeItem;
|
|
105
|
+
//don't put to parent suggestion if already in yaml
|
|
106
|
+
if (existsInYaml) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const schemaType = completionItem.parent.schemaType;
|
|
110
|
+
let parentCompletion = result.items.find((item) => item.label === schemaType && item.kind === parentCompletionKind);
|
|
111
|
+
if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
|
|
112
|
+
// already exists in the parent
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
else if (!parentCompletion) {
|
|
116
|
+
// create a new parent
|
|
117
|
+
parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, sortText: '_' + schemaType, kind: parentCompletionKind });
|
|
118
|
+
parentCompletion.parent.insertTexts = [completionItem.insertText];
|
|
119
|
+
result.items.push(parentCompletion);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// add to the existing parent
|
|
123
|
+
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const isForParentCompletion = !!completionItem.parent;
|
|
98
127
|
let label = completionItem.label;
|
|
99
128
|
if (!label) {
|
|
100
129
|
// we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
|
|
@@ -105,7 +134,7 @@ class YamlCompletion {
|
|
|
105
134
|
label = String(label);
|
|
106
135
|
}
|
|
107
136
|
const existing = proposed[label];
|
|
108
|
-
if (!existing) {
|
|
137
|
+
if (!existing || isForParentCompletion) {
|
|
109
138
|
label = label.replace(/[\n]/g, '↵');
|
|
110
139
|
if (label.length > 60) {
|
|
111
140
|
const shortendedLabel = label.substr(0, 57).trim() + '...';
|
|
@@ -113,17 +142,28 @@ class YamlCompletion {
|
|
|
113
142
|
label = shortendedLabel;
|
|
114
143
|
}
|
|
115
144
|
}
|
|
145
|
+
// trim $1 from end of completion
|
|
146
|
+
if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
|
|
147
|
+
completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
|
|
148
|
+
}
|
|
116
149
|
if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
|
|
117
150
|
completionItem.textEdit = node_1.TextEdit.replace(overwriteRange, completionItem.insertText);
|
|
118
151
|
}
|
|
119
152
|
completionItem.label = label;
|
|
120
|
-
|
|
121
|
-
|
|
153
|
+
if (isForParentCompletion) {
|
|
154
|
+
addSuggestionForParent(completionItem);
|
|
155
|
+
}
|
|
156
|
+
if (!existing) {
|
|
157
|
+
proposed[label] = completionItem;
|
|
158
|
+
result.items.push(completionItem);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (!existing.documentation && completionItem.documentation) {
|
|
162
|
+
existing.documentation = completionItem.documentation;
|
|
122
163
|
}
|
|
123
164
|
},
|
|
124
165
|
error: (message) => {
|
|
125
|
-
|
|
126
|
-
this.telemetry.sendError('yaml.completion.error', { error: message });
|
|
166
|
+
this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(message) });
|
|
127
167
|
},
|
|
128
168
|
log: (message) => {
|
|
129
169
|
console.log(message);
|
|
@@ -188,6 +228,7 @@ class YamlCompletion {
|
|
|
188
228
|
foundByClosest = true;
|
|
189
229
|
}
|
|
190
230
|
}
|
|
231
|
+
const originalNode = node;
|
|
191
232
|
if (node) {
|
|
192
233
|
if (lineContent.length === 0) {
|
|
193
234
|
node = currentDoc.internalDocument.contents;
|
|
@@ -332,11 +373,11 @@ class YamlCompletion {
|
|
|
332
373
|
for (const p of properties) {
|
|
333
374
|
if (!currentProperty || currentProperty !== p) {
|
|
334
375
|
if (yaml_1.isScalar(p.key)) {
|
|
335
|
-
proposed[p.key.value.toString()] = node_1.CompletionItem.create(
|
|
376
|
+
proposed[p.key.value.toString()] = node_1.CompletionItem.create(existingProposeItem);
|
|
336
377
|
}
|
|
337
378
|
}
|
|
338
379
|
}
|
|
339
|
-
this.addPropertyCompletions(schema, currentDoc, node, '', collector, textBuffer, overwriteRange);
|
|
380
|
+
this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange);
|
|
340
381
|
if (!schema && currentWord.length > 0 && document.getText().charAt(offset - currentWord.length - 1) !== '"') {
|
|
341
382
|
collector.add({
|
|
342
383
|
kind: node_1.CompletionItemKind.Property,
|
|
@@ -351,15 +392,54 @@ class YamlCompletion {
|
|
|
351
392
|
this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types);
|
|
352
393
|
}
|
|
353
394
|
catch (err) {
|
|
354
|
-
|
|
355
|
-
|
|
395
|
+
this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(err) });
|
|
396
|
+
}
|
|
397
|
+
this.finalizeParentCompletion(result);
|
|
398
|
+
return result;
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
finalizeParentCompletion(result) {
|
|
402
|
+
const reindexText = (insertTexts) => {
|
|
403
|
+
//modify added props to have unique $x
|
|
404
|
+
let max$index = 0;
|
|
405
|
+
return insertTexts.map((text) => {
|
|
406
|
+
const match = text.match(/\$([0-9]+)|\${[0-9]+:/g);
|
|
407
|
+
if (!match) {
|
|
408
|
+
return text;
|
|
356
409
|
}
|
|
357
|
-
|
|
358
|
-
|
|
410
|
+
const max$indexLocal = match
|
|
411
|
+
.map((m) => +m.replace(/\${([0-9]+)[:|]/g, '$1').replace('$', '')) // get numbers form $1 or ${1:...}
|
|
412
|
+
.reduce((p, n) => (n > p ? n : p), 0); // find the max one
|
|
413
|
+
const reindexedStr = text
|
|
414
|
+
.replace(/\$([0-9]+)/g, (s, args) => '$' + (+args + max$index)) // increment each by max$index
|
|
415
|
+
.replace(/\${([0-9]+)[:|]/g, (s, args) => '${' + (+args + max$index) + ':'); // increment each by max$index
|
|
416
|
+
max$index += max$indexLocal;
|
|
417
|
+
return reindexedStr;
|
|
418
|
+
});
|
|
419
|
+
};
|
|
420
|
+
result.items.forEach((completionItem) => {
|
|
421
|
+
if (isParentCompletionItem(completionItem)) {
|
|
422
|
+
const indent = completionItem.parent.indent || '';
|
|
423
|
+
const reindexedTexts = reindexText(completionItem.parent.insertTexts);
|
|
424
|
+
// add indent to each object property and join completion item texts
|
|
425
|
+
let insertText = reindexedTexts.join(`\n${indent}`);
|
|
426
|
+
// trim $1 from end of completion
|
|
427
|
+
if (insertText.endsWith('$1')) {
|
|
428
|
+
insertText = insertText.substring(0, insertText.length - 2);
|
|
429
|
+
}
|
|
430
|
+
completionItem.insertText = insertText;
|
|
431
|
+
if (completionItem.textEdit) {
|
|
432
|
+
completionItem.textEdit.newText = insertText;
|
|
359
433
|
}
|
|
360
|
-
|
|
434
|
+
// remove $x or use {$x:value} in documentation
|
|
435
|
+
const mdText = insertText.replace(/\${[0-9]+[:|](.*)}/g, (s, arg) => arg).replace(/\$([0-9]+)/g, '');
|
|
436
|
+
const originalDocumentation = completionItem.documentation ? [completionItem.documentation, '', '----', ''] : [];
|
|
437
|
+
completionItem.documentation = {
|
|
438
|
+
kind: node_1.MarkupKind.Markdown,
|
|
439
|
+
value: [...originalDocumentation, '```yaml', indent + mdText, '```'].join('\n'),
|
|
440
|
+
};
|
|
441
|
+
delete completionItem.parent;
|
|
361
442
|
}
|
|
362
|
-
return result;
|
|
363
443
|
});
|
|
364
444
|
}
|
|
365
445
|
createTempObjNode(currentWord, node, currentDoc) {
|
|
@@ -371,13 +451,18 @@ class YamlCompletion {
|
|
|
371
451
|
map.items[0].value.range = node.range;
|
|
372
452
|
return map;
|
|
373
453
|
}
|
|
374
|
-
addPropertyCompletions(schema, doc, node, separatorAfter, collector, textBuffer, overwriteRange) {
|
|
454
|
+
addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange) {
|
|
455
|
+
var _a;
|
|
375
456
|
const matchingSchemas = doc.getMatchingSchemas(schema.schema);
|
|
376
457
|
const existingKey = textBuffer.getText(overwriteRange);
|
|
377
|
-
const
|
|
458
|
+
const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
|
|
459
|
+
const hasOnlyWhitespace = lineContent.trim().length === 0;
|
|
460
|
+
const hasColon = lineContent.indexOf(':') !== -1;
|
|
378
461
|
const nodeParent = doc.getParent(node);
|
|
462
|
+
const matchOriginal = matchingSchemas.find((it) => it.node.internalNode === originalNode && it.schema.properties);
|
|
379
463
|
for (const schema of matchingSchemas) {
|
|
380
|
-
if (schema.node.internalNode === node && !schema.
|
|
464
|
+
if (((schema.node.internalNode === node && !matchOriginal) || schema.node.internalNode === originalNode) &&
|
|
465
|
+
!schema.inverted) {
|
|
381
466
|
this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
|
|
382
467
|
newLineFirst: false,
|
|
383
468
|
indentFirstObject: false,
|
|
@@ -389,13 +474,13 @@ class YamlCompletion {
|
|
|
389
474
|
if (maxProperties === undefined ||
|
|
390
475
|
node.items === undefined ||
|
|
391
476
|
node.items.length < maxProperties ||
|
|
392
|
-
|
|
477
|
+
(node.items.length === maxProperties && !hasOnlyWhitespace)) {
|
|
393
478
|
for (const key in schemaProperties) {
|
|
394
479
|
if (Object.prototype.hasOwnProperty.call(schemaProperties, key)) {
|
|
395
480
|
const propertySchema = schemaProperties[key];
|
|
396
481
|
if (typeof propertySchema === 'object' && !propertySchema.deprecationMessage && !propertySchema['doNotSuggest']) {
|
|
397
482
|
let identCompensation = '';
|
|
398
|
-
if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1) {
|
|
483
|
+
if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1 && !hasOnlyWhitespace) {
|
|
399
484
|
// because there is a slash '-' to prevent the properties generated to have the correct
|
|
400
485
|
// indent
|
|
401
486
|
const sourceText = textBuffer.getText();
|
|
@@ -420,17 +505,19 @@ class YamlCompletion {
|
|
|
420
505
|
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
|
|
421
506
|
}
|
|
422
507
|
else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
|
|
508
|
+
const insertText = `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`;
|
|
509
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
|
|
423
510
|
collector.add({
|
|
424
511
|
kind: this.getSuggestionKind(propertySchema.items.type),
|
|
425
512
|
label: '- (array item)',
|
|
426
|
-
documentation
|
|
427
|
-
insertText
|
|
513
|
+
documentation,
|
|
514
|
+
insertText,
|
|
428
515
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
429
516
|
});
|
|
430
517
|
}
|
|
431
518
|
}
|
|
432
519
|
let insertText = key;
|
|
433
|
-
if (!key.startsWith(existingKey) ||
|
|
520
|
+
if (!key.startsWith(existingKey) || !hasColon) {
|
|
434
521
|
insertText = this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation);
|
|
435
522
|
}
|
|
436
523
|
collector.add({
|
|
@@ -440,6 +527,20 @@ class YamlCompletion {
|
|
|
440
527
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
441
528
|
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
442
529
|
});
|
|
530
|
+
// if the prop is required add it also to parent suggestion
|
|
531
|
+
if ((_a = schema.schema.required) === null || _a === void 0 ? void 0 : _a.includes(key)) {
|
|
532
|
+
const schemaType = schemaUtils_1.getSchemaTypeName(schema.schema);
|
|
533
|
+
collector.add({
|
|
534
|
+
label: key,
|
|
535
|
+
insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
|
|
536
|
+
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
537
|
+
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
538
|
+
parent: {
|
|
539
|
+
schemaType,
|
|
540
|
+
indent: identCompensation,
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
}
|
|
443
544
|
}
|
|
444
545
|
}
|
|
445
546
|
}
|
|
@@ -510,11 +611,13 @@ class YamlCompletion {
|
|
|
510
611
|
}
|
|
511
612
|
}
|
|
512
613
|
else if (typeof s.schema.items === 'object' && s.schema.items.type === 'object') {
|
|
614
|
+
const insertText = `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`;
|
|
615
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description ? ' (' + s.schema.description + ')' : ''}`, insertText);
|
|
513
616
|
collector.add({
|
|
514
617
|
kind: this.getSuggestionKind(s.schema.items.type),
|
|
515
618
|
label: '- (array item)',
|
|
516
|
-
documentation
|
|
517
|
-
insertText
|
|
619
|
+
documentation,
|
|
620
|
+
insertText,
|
|
518
621
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
519
622
|
});
|
|
520
623
|
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
@@ -523,12 +626,15 @@ class YamlCompletion {
|
|
|
523
626
|
s.schema.items.anyOf
|
|
524
627
|
.filter((i) => typeof i === 'object')
|
|
525
628
|
.forEach((i, index) => {
|
|
629
|
+
const schemaType = schemaUtils_1.getSchemaTypeName(i);
|
|
526
630
|
const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
|
|
527
631
|
//append insertText to documentation
|
|
528
|
-
const
|
|
632
|
+
const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
|
|
633
|
+
const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
|
|
634
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
|
|
529
635
|
collector.add({
|
|
530
636
|
kind: this.getSuggestionKind(i.type),
|
|
531
|
-
label: '- (array item) ' + (index + 1),
|
|
637
|
+
label: '- (array item) ' + (schemaType || index + 1),
|
|
532
638
|
documentation: documentation,
|
|
533
639
|
insertText: insertText,
|
|
534
640
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
@@ -558,7 +664,7 @@ class YamlCompletion {
|
|
|
558
664
|
}
|
|
559
665
|
}
|
|
560
666
|
}
|
|
561
|
-
getInsertTextForProperty(key, propertySchema, separatorAfter,
|
|
667
|
+
getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
|
|
562
668
|
const propertyText = this.getInsertTextForValue(key, '', 'string');
|
|
563
669
|
const resultText = propertyText + ':';
|
|
564
670
|
let value;
|
|
@@ -572,6 +678,9 @@ class YamlCompletion {
|
|
|
572
678
|
else if (propertySchema.items) {
|
|
573
679
|
type = 'array';
|
|
574
680
|
}
|
|
681
|
+
else if (propertySchema.anyOf) {
|
|
682
|
+
type = 'anyOf';
|
|
683
|
+
}
|
|
575
684
|
}
|
|
576
685
|
if (Array.isArray(propertySchema.defaultSnippets)) {
|
|
577
686
|
if (propertySchema.defaultSnippets.length === 1) {
|
|
@@ -596,6 +705,14 @@ class YamlCompletion {
|
|
|
596
705
|
}
|
|
597
706
|
nValueProposals += propertySchema.enum.length;
|
|
598
707
|
}
|
|
708
|
+
if (propertySchema.const) {
|
|
709
|
+
if (!value) {
|
|
710
|
+
value = this.getInsertTextForGuessedValue(propertySchema.const, '', type);
|
|
711
|
+
value = evaluateTab1Symbol(value); // prevent const being selected after snippet insert
|
|
712
|
+
value = ' ' + value;
|
|
713
|
+
}
|
|
714
|
+
nValueProposals++;
|
|
715
|
+
}
|
|
599
716
|
if (objects_1.isDefined(propertySchema.default)) {
|
|
600
717
|
if (!value) {
|
|
601
718
|
value = ' ' + this.getInsertTextForGuessedValue(propertySchema.default, '', type);
|
|
@@ -609,10 +726,10 @@ class YamlCompletion {
|
|
|
609
726
|
nValueProposals += propertySchema.examples.length;
|
|
610
727
|
}
|
|
611
728
|
if (propertySchema.properties) {
|
|
612
|
-
return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter,
|
|
729
|
+
return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter, indent).insertText}`;
|
|
613
730
|
}
|
|
614
731
|
else if (propertySchema.items) {
|
|
615
|
-
return `${resultText}\n${
|
|
732
|
+
return `${resultText}\n${indent}- ${this.getInsertTextForArray(propertySchema.items, separatorAfter, 1, indent).insertText}`;
|
|
616
733
|
}
|
|
617
734
|
if (nValueProposals === 0) {
|
|
618
735
|
switch (type) {
|
|
@@ -623,10 +740,10 @@ class YamlCompletion {
|
|
|
623
740
|
value = ' $1';
|
|
624
741
|
break;
|
|
625
742
|
case 'object':
|
|
626
|
-
value = `\n${
|
|
743
|
+
value = `\n${indent}`;
|
|
627
744
|
break;
|
|
628
745
|
case 'array':
|
|
629
|
-
value = `\n${
|
|
746
|
+
value = `\n${indent}- `;
|
|
630
747
|
break;
|
|
631
748
|
case 'number':
|
|
632
749
|
case 'integer':
|
|
@@ -635,6 +752,9 @@ class YamlCompletion {
|
|
|
635
752
|
case 'null':
|
|
636
753
|
value = ' ${1:null}';
|
|
637
754
|
break;
|
|
755
|
+
case 'anyOf':
|
|
756
|
+
value = ' $1';
|
|
757
|
+
break;
|
|
638
758
|
default:
|
|
639
759
|
return propertyText;
|
|
640
760
|
}
|
|
@@ -655,6 +775,9 @@ class YamlCompletion {
|
|
|
655
775
|
const propertySchema = schema.properties[key];
|
|
656
776
|
let type = Array.isArray(propertySchema.type) ? propertySchema.type[0] : propertySchema.type;
|
|
657
777
|
if (!type) {
|
|
778
|
+
if (propertySchema.anyOf) {
|
|
779
|
+
type = 'anyOf';
|
|
780
|
+
}
|
|
658
781
|
if (propertySchema.properties) {
|
|
659
782
|
type = 'object';
|
|
660
783
|
}
|
|
@@ -668,11 +791,22 @@ class YamlCompletion {
|
|
|
668
791
|
case 'string':
|
|
669
792
|
case 'number':
|
|
670
793
|
case 'integer':
|
|
671
|
-
|
|
794
|
+
case 'anyOf': {
|
|
795
|
+
let value = propertySchema.default || propertySchema.const;
|
|
796
|
+
if (value) {
|
|
797
|
+
if (type === 'string') {
|
|
798
|
+
value = convertToStringValue(value);
|
|
799
|
+
}
|
|
800
|
+
insertText += `${indent}${key}: \${${insertIndex++}:${value}}\n`;
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
insertText += `${indent}${key}: $${insertIndex++}\n`;
|
|
804
|
+
}
|
|
672
805
|
break;
|
|
806
|
+
}
|
|
673
807
|
case 'array':
|
|
674
808
|
{
|
|
675
|
-
const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex
|
|
809
|
+
const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex++, indent);
|
|
676
810
|
const arrayInsertLines = arrayInsertResult.insertText.split('\n');
|
|
677
811
|
let arrayTemplate = arrayInsertResult.insertText;
|
|
678
812
|
if (arrayInsertLines.length > 1) {
|
|
@@ -695,7 +829,7 @@ class YamlCompletion {
|
|
|
695
829
|
break;
|
|
696
830
|
}
|
|
697
831
|
}
|
|
698
|
-
else if (propertySchema.default !== undefined) {
|
|
832
|
+
else if (!this.disableDefaultProperties && propertySchema.default !== undefined) {
|
|
699
833
|
switch (type) {
|
|
700
834
|
case 'boolean':
|
|
701
835
|
case 'number':
|
|
@@ -719,7 +853,7 @@ class YamlCompletion {
|
|
|
719
853
|
return { insertText, insertIndex };
|
|
720
854
|
}
|
|
721
855
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
722
|
-
getInsertTextForArray(schema, separatorAfter, insertIndex = 1) {
|
|
856
|
+
getInsertTextForArray(schema, separatorAfter, insertIndex = 1, indent = this.indentation) {
|
|
723
857
|
let insertText = '';
|
|
724
858
|
if (!schema) {
|
|
725
859
|
insertText = `$${insertIndex++}`;
|
|
@@ -747,7 +881,7 @@ class YamlCompletion {
|
|
|
747
881
|
break;
|
|
748
882
|
case 'object':
|
|
749
883
|
{
|
|
750
|
-
const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${
|
|
884
|
+
const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${indent} `, insertIndex++);
|
|
751
885
|
insertText = objectInsertResult.insertText.trimLeft();
|
|
752
886
|
insertIndex = objectInsertResult.insertIndex;
|
|
753
887
|
}
|
|
@@ -918,7 +1052,7 @@ class YamlCompletion {
|
|
|
918
1052
|
collector.add({
|
|
919
1053
|
kind: this.getSuggestionKind(schema.type),
|
|
920
1054
|
label: this.getLabelForValue(schema.const),
|
|
921
|
-
insertText: this.getInsertTextForValue(schema.const, separatorAfter,
|
|
1055
|
+
insertText: this.getInsertTextForValue(schema.const, separatorAfter, schema.type),
|
|
922
1056
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
923
1057
|
documentation: this.fromMarkup(schema.markdownDescription) || schema.description,
|
|
924
1058
|
});
|
|
@@ -1144,8 +1278,7 @@ function convertToStringValue(value) {
|
|
|
1144
1278
|
if (value === 'true' || value === 'false' || value === 'null' || isNumberExp.test(value)) {
|
|
1145
1279
|
return `"${value}"`;
|
|
1146
1280
|
}
|
|
1147
|
-
|
|
1148
|
-
if (value.indexOf('\"') !== -1) {
|
|
1281
|
+
if (value.indexOf('"') !== -1) {
|
|
1149
1282
|
value = value.replace(doubleQuotesEscapeRegExp, '"');
|
|
1150
1283
|
}
|
|
1151
1284
|
let doQuote = value.charAt(0) === '@';
|
|
@@ -1173,4 +1306,14 @@ function convertToStringValue(value) {
|
|
|
1173
1306
|
}
|
|
1174
1307
|
return value;
|
|
1175
1308
|
}
|
|
1309
|
+
/**
|
|
1310
|
+
* simplify `{$1:value}` to `value`
|
|
1311
|
+
*/
|
|
1312
|
+
function evaluateTab1Symbol(value) {
|
|
1313
|
+
const result = value.replace(/\$\{1:(.*)\}/, '$1');
|
|
1314
|
+
return result;
|
|
1315
|
+
}
|
|
1316
|
+
function isParentCompletionItem(item) {
|
|
1317
|
+
return 'parent' in item;
|
|
1318
|
+
}
|
|
1176
1319
|
//# sourceMappingURL=yamlCompletion.js.map
|