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.
Files changed (159) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +10 -1
  3. package/lib/esm/languageserver/handlers/settingsHandlers.js +4 -2
  4. package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
  5. package/lib/esm/languageservice/parser/ast-converter.js +9 -1
  6. package/lib/esm/languageservice/parser/ast-converter.js.map +1 -1
  7. package/lib/esm/languageservice/parser/jsonParser07.d.ts +2 -2
  8. package/lib/esm/languageservice/parser/jsonParser07.js +74 -25
  9. package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
  10. package/lib/esm/languageservice/parser/yaml-documents.d.ts +0 -1
  11. package/lib/esm/languageservice/parser/yaml-documents.js +11 -11
  12. package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
  13. package/lib/esm/languageservice/services/documentSymbols.js +3 -2
  14. package/lib/esm/languageservice/services/documentSymbols.js.map +1 -1
  15. package/lib/esm/languageservice/services/yamlCodeActions.d.ts +1 -0
  16. package/lib/esm/languageservice/services/yamlCodeActions.js +14 -0
  17. package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
  18. package/lib/esm/languageservice/services/yamlCodeLens.js +2 -1
  19. package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
  20. package/lib/esm/languageservice/services/yamlCompletion.d.ts +2 -0
  21. package/lib/esm/languageservice/services/yamlCompletion.js +183 -40
  22. package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
  23. package/lib/esm/languageservice/services/yamlDefinition.d.ts +6 -1
  24. package/lib/esm/languageservice/services/yamlDefinition.js +23 -17
  25. package/lib/esm/languageservice/services/yamlDefinition.js.map +1 -1
  26. package/lib/esm/languageservice/services/yamlHover.js +2 -1
  27. package/lib/esm/languageservice/services/yamlHover.js.map +1 -1
  28. package/lib/esm/languageservice/services/yamlLinks.js +2 -1
  29. package/lib/esm/languageservice/services/yamlLinks.js.map +1 -1
  30. package/lib/esm/languageservice/services/yamlSchemaService.js +12 -0
  31. package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
  32. package/lib/esm/languageservice/services/yamlValidation.js +2 -1
  33. package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
  34. package/lib/esm/languageservice/utils/objects.d.ts +5 -0
  35. package/lib/esm/languageservice/utils/objects.js +13 -0
  36. package/lib/esm/languageservice/utils/objects.js.map +1 -1
  37. package/lib/esm/languageservice/utils/schemaUrls.d.ts +1 -1
  38. package/lib/esm/languageservice/utils/schemaUrls.js +1 -1
  39. package/lib/esm/languageservice/yamlLanguageService.d.ts +4 -0
  40. package/lib/esm/languageservice/yamlLanguageService.js +3 -2
  41. package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
  42. package/lib/esm/server.js +5 -0
  43. package/lib/esm/server.js.map +1 -1
  44. package/lib/esm/yamlSettings.d.ts +2 -0
  45. package/lib/esm/yamlSettings.js +1 -0
  46. package/lib/esm/yamlSettings.js.map +1 -1
  47. package/lib/umd/languageserver/handlers/settingsHandlers.js +5 -3
  48. package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
  49. package/lib/umd/languageservice/parser/ast-converter.js +9 -1
  50. package/lib/umd/languageservice/parser/ast-converter.js.map +1 -1
  51. package/lib/umd/languageservice/parser/jsonParser07.d.ts +2 -2
  52. package/lib/umd/languageservice/parser/jsonParser07.js +77 -28
  53. package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
  54. package/lib/umd/languageservice/parser/yaml-documents.d.ts +0 -1
  55. package/lib/umd/languageservice/parser/yaml-documents.js +10 -10
  56. package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
  57. package/lib/umd/languageservice/services/documentSymbols.js +4 -3
  58. package/lib/umd/languageservice/services/documentSymbols.js.map +1 -1
  59. package/lib/umd/languageservice/services/yamlCodeActions.d.ts +1 -0
  60. package/lib/umd/languageservice/services/yamlCodeActions.js +14 -0
  61. package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
  62. package/lib/umd/languageservice/services/yamlCodeLens.js +3 -2
  63. package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
  64. package/lib/umd/languageservice/services/yamlCompletion.d.ts +2 -0
  65. package/lib/umd/languageservice/services/yamlCompletion.js +182 -39
  66. package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
  67. package/lib/umd/languageservice/services/yamlDefinition.d.ts +6 -1
  68. package/lib/umd/languageservice/services/yamlDefinition.js +26 -20
  69. package/lib/umd/languageservice/services/yamlDefinition.js.map +1 -1
  70. package/lib/umd/languageservice/services/yamlHover.js +3 -2
  71. package/lib/umd/languageservice/services/yamlHover.js.map +1 -1
  72. package/lib/umd/languageservice/services/yamlLinks.js +3 -2
  73. package/lib/umd/languageservice/services/yamlLinks.js.map +1 -1
  74. package/lib/umd/languageservice/services/yamlSchemaService.js +12 -0
  75. package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
  76. package/lib/umd/languageservice/services/yamlValidation.js +3 -2
  77. package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
  78. package/lib/umd/languageservice/utils/objects.d.ts +5 -0
  79. package/lib/umd/languageservice/utils/objects.js +15 -1
  80. package/lib/umd/languageservice/utils/objects.js.map +1 -1
  81. package/lib/umd/languageservice/utils/schemaUrls.d.ts +1 -1
  82. package/lib/umd/languageservice/utils/schemaUrls.js +1 -1
  83. package/lib/umd/languageservice/yamlLanguageService.d.ts +4 -0
  84. package/lib/umd/languageservice/yamlLanguageService.js +2 -1
  85. package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
  86. package/lib/umd/server.js +6 -1
  87. package/lib/umd/server.js.map +1 -1
  88. package/lib/umd/yamlSettings.d.ts +2 -0
  89. package/lib/umd/yamlSettings.js +1 -0
  90. package/lib/umd/yamlSettings.js.map +1 -1
  91. package/out/server/src/languageserver/handlers/settingsHandlers.js +4 -2
  92. package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
  93. package/out/server/src/languageservice/parser/ast-converter.js +9 -1
  94. package/out/server/src/languageservice/parser/ast-converter.js.map +1 -1
  95. package/out/server/src/languageservice/parser/jsonParser07.d.ts +2 -2
  96. package/out/server/src/languageservice/parser/jsonParser07.js +76 -27
  97. package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
  98. package/out/server/src/languageservice/parser/yaml-documents.d.ts +0 -1
  99. package/out/server/src/languageservice/parser/yaml-documents.js +10 -10
  100. package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
  101. package/out/server/src/languageservice/services/documentSymbols.js +3 -2
  102. package/out/server/src/languageservice/services/documentSymbols.js.map +1 -1
  103. package/out/server/src/languageservice/services/yamlCodeActions.d.ts +1 -0
  104. package/out/server/src/languageservice/services/yamlCodeActions.js +14 -0
  105. package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
  106. package/out/server/src/languageservice/services/yamlCodeLens.js +2 -1
  107. package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
  108. package/out/server/src/languageservice/services/yamlCompletion.d.ts +2 -0
  109. package/out/server/src/languageservice/services/yamlCompletion.js +181 -38
  110. package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
  111. package/out/server/src/languageservice/services/yamlDefinition.d.ts +6 -1
  112. package/out/server/src/languageservice/services/yamlDefinition.js +25 -19
  113. package/out/server/src/languageservice/services/yamlDefinition.js.map +1 -1
  114. package/out/server/src/languageservice/services/yamlHover.js +2 -1
  115. package/out/server/src/languageservice/services/yamlHover.js.map +1 -1
  116. package/out/server/src/languageservice/services/yamlLinks.js +2 -1
  117. package/out/server/src/languageservice/services/yamlLinks.js.map +1 -1
  118. package/out/server/src/languageservice/services/yamlSchemaService.js +12 -0
  119. package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
  120. package/out/server/src/languageservice/services/yamlValidation.js +2 -1
  121. package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
  122. package/out/server/src/languageservice/utils/objects.d.ts +5 -0
  123. package/out/server/src/languageservice/utils/objects.js +15 -1
  124. package/out/server/src/languageservice/utils/objects.js.map +1 -1
  125. package/out/server/src/languageservice/utils/schemaUrls.d.ts +1 -1
  126. package/out/server/src/languageservice/utils/schemaUrls.js +1 -1
  127. package/out/server/src/languageservice/yamlLanguageService.d.ts +4 -0
  128. package/out/server/src/languageservice/yamlLanguageService.js +2 -1
  129. package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
  130. package/out/server/src/server.js +5 -0
  131. package/out/server/src/server.js.map +1 -1
  132. package/out/server/src/yamlSettings.d.ts +2 -0
  133. package/out/server/src/yamlSettings.js +1 -0
  134. package/out/server/src/yamlSettings.js.map +1 -1
  135. package/out/server/test/autoCompletion.test.js +410 -74
  136. package/out/server/test/autoCompletion.test.js.map +1 -1
  137. package/out/server/test/autoCompletionFix.test.js +219 -3
  138. package/out/server/test/autoCompletionFix.test.js.map +1 -1
  139. package/out/server/test/code-action-schema.test.d.ts +1 -0
  140. package/out/server/test/code-action-schema.test.js +99 -0
  141. package/out/server/test/code-action-schema.test.js.map +1 -0
  142. package/out/server/test/defaultSnippets.test.js +3 -3
  143. package/out/server/test/defaultSnippets.test.js.map +1 -1
  144. package/out/server/test/hover.test.js +70 -0
  145. package/out/server/test/hover.test.js.map +1 -1
  146. package/out/server/test/integration.test.js +1 -1
  147. package/out/server/test/jsonParser.test.js +23 -13
  148. package/out/server/test/jsonParser.test.js.map +1 -1
  149. package/out/server/test/objects.test.js +16 -0
  150. package/out/server/test/objects.test.js.map +1 -1
  151. package/out/server/test/schema.test.js +18 -0
  152. package/out/server/test/schema.test.js.map +1 -1
  153. package/out/server/test/yamlDefinition.test.js +8 -2
  154. package/out/server/test/yamlDefinition.test.js.map +1 -1
  155. package/out/server/test/yamlParser.test.js +10 -0
  156. package/out/server/test/yamlParser.test.js.map +1 -1
  157. package/out/server/test/yamlSchemaService.test.js +21 -0
  158. package/out/server/test/yamlSchemaService.test.js.map +1 -1
  159. 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
- proposed[label] = completionItem;
121
- result.items.push(completionItem);
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
- console.error(message);
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
- if (err.stack) {
355
- console.error(err.stack);
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
- else {
358
- console.error(err);
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
- this.telemetry.sendError('yaml.completion.error', { error: err });
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 hasColumn = textBuffer.getLineContent(overwriteRange.start.line).indexOf(':') === -1;
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.inverted) {
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
- astUtils_1.isMapContainsEmptyPair(node)) {
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: `Create an item of an array${propertySchema.description === undefined ? '' : '(' + propertySchema.description + ')'}`,
427
- insertText: `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`,
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) || hasColumn) {
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: `Create an item of an array${s.schema.description === undefined ? '' : '(' + s.schema.description + ')'}`,
517
- insertText: `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`,
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 documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description === undefined ? '' : '(' + s.schema.description + ')'}`, insertText);
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, ident = this.indentation) {
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, ident).insertText}`;
729
+ return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter, indent).insertText}`;
613
730
  }
614
731
  else if (propertySchema.items) {
615
- return `${resultText}\n${this.indentation}- ${this.getInsertTextForArray(propertySchema.items, separatorAfter).insertText}`;
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${ident}`;
743
+ value = `\n${indent}`;
627
744
  break;
628
745
  case 'array':
629
- value = `\n${ident}- `;
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
- insertText += `${indent}${key}: $${insertIndex++}\n`;
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, `${this.indentation} `, insertIndex++);
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, undefined),
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
- // eslint-disable-next-line prettier/prettier, no-useless-escape
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