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
@@ -17,7 +17,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
17
17
  if (v !== undefined) module.exports = v;
18
18
  }
19
19
  else if (typeof define === "function" && define.amd) {
20
- define(["require", "exports", "vscode-languageserver/node", "yaml", "../utils/arrUtils", "../utils/indentationGuesser", "../utils/textBuffer", "../utils/json", "../utils/objects", "vscode-nls", "../parser/isKubernetes", "../utils/astUtils", "../utils/astUtils", "./modelineUtil"], factory);
20
+ define(["require", "exports", "vscode-languageserver/node", "yaml", "../utils/arrUtils", "../utils/indentationGuesser", "../utils/textBuffer", "../utils/json", "../utils/objects", "vscode-nls", "../parser/isKubernetes", "../utils/astUtils", "../utils/astUtils", "./modelineUtil", "../utils/schemaUtils"], factory);
21
21
  }
22
22
  })(function (require, exports) {
23
23
  "use strict";
@@ -35,8 +35,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
35
35
  const astUtils_1 = require("../utils/astUtils");
36
36
  const astUtils_2 = require("../utils/astUtils");
37
37
  const modelineUtil_1 = require("./modelineUtil");
38
+ const schemaUtils_1 = require("../utils/schemaUtils");
38
39
  const localize = nls.loadMessageBundle();
39
40
  const doubleQuotesEscapeRegExp = /[\\]+"/g;
41
+ const parentCompletionKind = node_1.CompletionItemKind.Class;
40
42
  class YamlCompletion {
41
43
  constructor(schemaService, clientCapabilities = {}, yamlDocument, telemetry) {
42
44
  this.schemaService = schemaService;
@@ -52,6 +54,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
52
54
  this.customTags = languageSettings.customTags;
53
55
  this.yamlVersion = languageSettings.yamlVersion;
54
56
  this.configuredIndentation = languageSettings.indentation;
57
+ this.disableDefaultProperties = languageSettings.disableDefaultProperties;
55
58
  }
56
59
  doComplete(document, position, isKubernetes = false) {
57
60
  return __awaiter(this, void 0, void 0, function* () {
@@ -102,8 +105,34 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
102
105
  overwriteRange = node_1.Range.create(document.positionAt(overwriteStart), position);
103
106
  }
104
107
  const proposed = {};
108
+ const existingProposeItem = '__';
105
109
  const collector = {
106
110
  add: (completionItem) => {
111
+ const addSuggestionForParent = function (completionItem) {
112
+ var _a;
113
+ const existsInYaml = ((_a = proposed[completionItem.label]) === null || _a === void 0 ? void 0 : _a.label) === existingProposeItem;
114
+ //don't put to parent suggestion if already in yaml
115
+ if (existsInYaml) {
116
+ return;
117
+ }
118
+ const schemaType = completionItem.parent.schemaType;
119
+ let parentCompletion = result.items.find((item) => item.label === schemaType && item.kind === parentCompletionKind);
120
+ if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
121
+ // already exists in the parent
122
+ return;
123
+ }
124
+ else if (!parentCompletion) {
125
+ // create a new parent
126
+ parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, sortText: '_' + schemaType, kind: parentCompletionKind });
127
+ parentCompletion.parent.insertTexts = [completionItem.insertText];
128
+ result.items.push(parentCompletion);
129
+ }
130
+ else {
131
+ // add to the existing parent
132
+ parentCompletion.parent.insertTexts.push(completionItem.insertText);
133
+ }
134
+ };
135
+ const isForParentCompletion = !!completionItem.parent;
107
136
  let label = completionItem.label;
108
137
  if (!label) {
109
138
  // we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
@@ -114,7 +143,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
114
143
  label = String(label);
115
144
  }
116
145
  const existing = proposed[label];
117
- if (!existing) {
146
+ if (!existing || isForParentCompletion) {
118
147
  label = label.replace(/[\n]/g, '↵');
119
148
  if (label.length > 60) {
120
149
  const shortendedLabel = label.substr(0, 57).trim() + '...';
@@ -122,17 +151,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
122
151
  label = shortendedLabel;
123
152
  }
124
153
  }
154
+ // trim $1 from end of completion
155
+ if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
156
+ completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
157
+ }
125
158
  if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
126
159
  completionItem.textEdit = node_1.TextEdit.replace(overwriteRange, completionItem.insertText);
127
160
  }
128
161
  completionItem.label = label;
129
- proposed[label] = completionItem;
130
- result.items.push(completionItem);
162
+ if (isForParentCompletion) {
163
+ addSuggestionForParent(completionItem);
164
+ }
165
+ if (!existing) {
166
+ proposed[label] = completionItem;
167
+ result.items.push(completionItem);
168
+ }
169
+ }
170
+ else if (!existing.documentation && completionItem.documentation) {
171
+ existing.documentation = completionItem.documentation;
131
172
  }
132
173
  },
133
174
  error: (message) => {
134
- console.error(message);
135
- this.telemetry.sendError('yaml.completion.error', { error: message });
175
+ this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(message) });
136
176
  },
137
177
  log: (message) => {
138
178
  console.log(message);
@@ -197,6 +237,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
197
237
  foundByClosest = true;
198
238
  }
199
239
  }
240
+ const originalNode = node;
200
241
  if (node) {
201
242
  if (lineContent.length === 0) {
202
243
  node = currentDoc.internalDocument.contents;
@@ -341,11 +382,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
341
382
  for (const p of properties) {
342
383
  if (!currentProperty || currentProperty !== p) {
343
384
  if (yaml_1.isScalar(p.key)) {
344
- proposed[p.key.value.toString()] = node_1.CompletionItem.create('__');
385
+ proposed[p.key.value.toString()] = node_1.CompletionItem.create(existingProposeItem);
345
386
  }
346
387
  }
347
388
  }
348
- this.addPropertyCompletions(schema, currentDoc, node, '', collector, textBuffer, overwriteRange);
389
+ this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange);
349
390
  if (!schema && currentWord.length > 0 && document.getText().charAt(offset - currentWord.length - 1) !== '"') {
350
391
  collector.add({
351
392
  kind: node_1.CompletionItemKind.Property,
@@ -360,15 +401,54 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
360
401
  this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types);
361
402
  }
362
403
  catch (err) {
363
- if (err.stack) {
364
- console.error(err.stack);
404
+ this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(err) });
405
+ }
406
+ this.finalizeParentCompletion(result);
407
+ return result;
408
+ });
409
+ }
410
+ finalizeParentCompletion(result) {
411
+ const reindexText = (insertTexts) => {
412
+ //modify added props to have unique $x
413
+ let max$index = 0;
414
+ return insertTexts.map((text) => {
415
+ const match = text.match(/\$([0-9]+)|\${[0-9]+:/g);
416
+ if (!match) {
417
+ return text;
365
418
  }
366
- else {
367
- console.error(err);
419
+ const max$indexLocal = match
420
+ .map((m) => +m.replace(/\${([0-9]+)[:|]/g, '$1').replace('$', '')) // get numbers form $1 or ${1:...}
421
+ .reduce((p, n) => (n > p ? n : p), 0); // find the max one
422
+ const reindexedStr = text
423
+ .replace(/\$([0-9]+)/g, (s, args) => '$' + (+args + max$index)) // increment each by max$index
424
+ .replace(/\${([0-9]+)[:|]/g, (s, args) => '${' + (+args + max$index) + ':'); // increment each by max$index
425
+ max$index += max$indexLocal;
426
+ return reindexedStr;
427
+ });
428
+ };
429
+ result.items.forEach((completionItem) => {
430
+ if (isParentCompletionItem(completionItem)) {
431
+ const indent = completionItem.parent.indent || '';
432
+ const reindexedTexts = reindexText(completionItem.parent.insertTexts);
433
+ // add indent to each object property and join completion item texts
434
+ let insertText = reindexedTexts.join(`\n${indent}`);
435
+ // trim $1 from end of completion
436
+ if (insertText.endsWith('$1')) {
437
+ insertText = insertText.substring(0, insertText.length - 2);
438
+ }
439
+ completionItem.insertText = insertText;
440
+ if (completionItem.textEdit) {
441
+ completionItem.textEdit.newText = insertText;
368
442
  }
369
- this.telemetry.sendError('yaml.completion.error', { error: err });
443
+ // remove $x or use {$x:value} in documentation
444
+ const mdText = insertText.replace(/\${[0-9]+[:|](.*)}/g, (s, arg) => arg).replace(/\$([0-9]+)/g, '');
445
+ const originalDocumentation = completionItem.documentation ? [completionItem.documentation, '', '----', ''] : [];
446
+ completionItem.documentation = {
447
+ kind: node_1.MarkupKind.Markdown,
448
+ value: [...originalDocumentation, '```yaml', indent + mdText, '```'].join('\n'),
449
+ };
450
+ delete completionItem.parent;
370
451
  }
371
- return result;
372
452
  });
373
453
  }
374
454
  createTempObjNode(currentWord, node, currentDoc) {
@@ -380,13 +460,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
380
460
  map.items[0].value.range = node.range;
381
461
  return map;
382
462
  }
383
- addPropertyCompletions(schema, doc, node, separatorAfter, collector, textBuffer, overwriteRange) {
463
+ addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange) {
464
+ var _a;
384
465
  const matchingSchemas = doc.getMatchingSchemas(schema.schema);
385
466
  const existingKey = textBuffer.getText(overwriteRange);
386
- const hasColumn = textBuffer.getLineContent(overwriteRange.start.line).indexOf(':') === -1;
467
+ const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
468
+ const hasOnlyWhitespace = lineContent.trim().length === 0;
469
+ const hasColon = lineContent.indexOf(':') !== -1;
387
470
  const nodeParent = doc.getParent(node);
471
+ const matchOriginal = matchingSchemas.find((it) => it.node.internalNode === originalNode && it.schema.properties);
388
472
  for (const schema of matchingSchemas) {
389
- if (schema.node.internalNode === node && !schema.inverted) {
473
+ if (((schema.node.internalNode === node && !matchOriginal) || schema.node.internalNode === originalNode) &&
474
+ !schema.inverted) {
390
475
  this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
391
476
  newLineFirst: false,
392
477
  indentFirstObject: false,
@@ -398,13 +483,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
398
483
  if (maxProperties === undefined ||
399
484
  node.items === undefined ||
400
485
  node.items.length < maxProperties ||
401
- astUtils_1.isMapContainsEmptyPair(node)) {
486
+ (node.items.length === maxProperties && !hasOnlyWhitespace)) {
402
487
  for (const key in schemaProperties) {
403
488
  if (Object.prototype.hasOwnProperty.call(schemaProperties, key)) {
404
489
  const propertySchema = schemaProperties[key];
405
490
  if (typeof propertySchema === 'object' && !propertySchema.deprecationMessage && !propertySchema['doNotSuggest']) {
406
491
  let identCompensation = '';
407
- if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1) {
492
+ if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1 && !hasOnlyWhitespace) {
408
493
  // because there is a slash '-' to prevent the properties generated to have the correct
409
494
  // indent
410
495
  const sourceText = textBuffer.getText();
@@ -429,17 +514,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
429
514
  this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
430
515
  }
431
516
  else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
517
+ const insertText = `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`;
518
+ const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
432
519
  collector.add({
433
520
  kind: this.getSuggestionKind(propertySchema.items.type),
434
521
  label: '- (array item)',
435
- documentation: `Create an item of an array${propertySchema.description === undefined ? '' : '(' + propertySchema.description + ')'}`,
436
- insertText: `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`,
522
+ documentation,
523
+ insertText,
437
524
  insertTextFormat: node_1.InsertTextFormat.Snippet,
438
525
  });
439
526
  }
440
527
  }
441
528
  let insertText = key;
442
- if (!key.startsWith(existingKey) || hasColumn) {
529
+ if (!key.startsWith(existingKey) || !hasColon) {
443
530
  insertText = this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation);
444
531
  }
445
532
  collector.add({
@@ -449,6 +536,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
449
536
  insertTextFormat: node_1.InsertTextFormat.Snippet,
450
537
  documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
451
538
  });
539
+ // if the prop is required add it also to parent suggestion
540
+ if ((_a = schema.schema.required) === null || _a === void 0 ? void 0 : _a.includes(key)) {
541
+ const schemaType = schemaUtils_1.getSchemaTypeName(schema.schema);
542
+ collector.add({
543
+ label: key,
544
+ insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
545
+ insertTextFormat: node_1.InsertTextFormat.Snippet,
546
+ documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
547
+ parent: {
548
+ schemaType,
549
+ indent: identCompensation,
550
+ },
551
+ });
552
+ }
452
553
  }
453
554
  }
454
555
  }
@@ -519,11 +620,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
519
620
  }
520
621
  }
521
622
  else if (typeof s.schema.items === 'object' && s.schema.items.type === 'object') {
623
+ const insertText = `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`;
624
+ const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description ? ' (' + s.schema.description + ')' : ''}`, insertText);
522
625
  collector.add({
523
626
  kind: this.getSuggestionKind(s.schema.items.type),
524
627
  label: '- (array item)',
525
- documentation: `Create an item of an array${s.schema.description === undefined ? '' : '(' + s.schema.description + ')'}`,
526
- insertText: `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`,
628
+ documentation,
629
+ insertText,
527
630
  insertTextFormat: node_1.InsertTextFormat.Snippet,
528
631
  });
529
632
  this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
@@ -532,12 +635,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
532
635
  s.schema.items.anyOf
533
636
  .filter((i) => typeof i === 'object')
534
637
  .forEach((i, index) => {
638
+ const schemaType = schemaUtils_1.getSchemaTypeName(i);
535
639
  const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
536
640
  //append insertText to documentation
537
- const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description === undefined ? '' : '(' + s.schema.description + ')'}`, insertText);
641
+ const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
642
+ const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
643
+ const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
538
644
  collector.add({
539
645
  kind: this.getSuggestionKind(i.type),
540
- label: '- (array item) ' + (index + 1),
646
+ label: '- (array item) ' + (schemaType || index + 1),
541
647
  documentation: documentation,
542
648
  insertText: insertText,
543
649
  insertTextFormat: node_1.InsertTextFormat.Snippet,
@@ -567,7 +673,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
567
673
  }
568
674
  }
569
675
  }
570
- getInsertTextForProperty(key, propertySchema, separatorAfter, ident = this.indentation) {
676
+ getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
571
677
  const propertyText = this.getInsertTextForValue(key, '', 'string');
572
678
  const resultText = propertyText + ':';
573
679
  let value;
@@ -581,6 +687,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
581
687
  else if (propertySchema.items) {
582
688
  type = 'array';
583
689
  }
690
+ else if (propertySchema.anyOf) {
691
+ type = 'anyOf';
692
+ }
584
693
  }
585
694
  if (Array.isArray(propertySchema.defaultSnippets)) {
586
695
  if (propertySchema.defaultSnippets.length === 1) {
@@ -605,6 +714,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
605
714
  }
606
715
  nValueProposals += propertySchema.enum.length;
607
716
  }
717
+ if (propertySchema.const) {
718
+ if (!value) {
719
+ value = this.getInsertTextForGuessedValue(propertySchema.const, '', type);
720
+ value = evaluateTab1Symbol(value); // prevent const being selected after snippet insert
721
+ value = ' ' + value;
722
+ }
723
+ nValueProposals++;
724
+ }
608
725
  if (objects_1.isDefined(propertySchema.default)) {
609
726
  if (!value) {
610
727
  value = ' ' + this.getInsertTextForGuessedValue(propertySchema.default, '', type);
@@ -618,10 +735,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
618
735
  nValueProposals += propertySchema.examples.length;
619
736
  }
620
737
  if (propertySchema.properties) {
621
- return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter, ident).insertText}`;
738
+ return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter, indent).insertText}`;
622
739
  }
623
740
  else if (propertySchema.items) {
624
- return `${resultText}\n${this.indentation}- ${this.getInsertTextForArray(propertySchema.items, separatorAfter).insertText}`;
741
+ return `${resultText}\n${indent}- ${this.getInsertTextForArray(propertySchema.items, separatorAfter, 1, indent).insertText}`;
625
742
  }
626
743
  if (nValueProposals === 0) {
627
744
  switch (type) {
@@ -632,10 +749,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
632
749
  value = ' $1';
633
750
  break;
634
751
  case 'object':
635
- value = `\n${ident}`;
752
+ value = `\n${indent}`;
636
753
  break;
637
754
  case 'array':
638
- value = `\n${ident}- `;
755
+ value = `\n${indent}- `;
639
756
  break;
640
757
  case 'number':
641
758
  case 'integer':
@@ -644,6 +761,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
644
761
  case 'null':
645
762
  value = ' ${1:null}';
646
763
  break;
764
+ case 'anyOf':
765
+ value = ' $1';
766
+ break;
647
767
  default:
648
768
  return propertyText;
649
769
  }
@@ -664,6 +784,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
664
784
  const propertySchema = schema.properties[key];
665
785
  let type = Array.isArray(propertySchema.type) ? propertySchema.type[0] : propertySchema.type;
666
786
  if (!type) {
787
+ if (propertySchema.anyOf) {
788
+ type = 'anyOf';
789
+ }
667
790
  if (propertySchema.properties) {
668
791
  type = 'object';
669
792
  }
@@ -677,11 +800,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
677
800
  case 'string':
678
801
  case 'number':
679
802
  case 'integer':
680
- insertText += `${indent}${key}: $${insertIndex++}\n`;
803
+ case 'anyOf': {
804
+ let value = propertySchema.default || propertySchema.const;
805
+ if (value) {
806
+ if (type === 'string') {
807
+ value = convertToStringValue(value);
808
+ }
809
+ insertText += `${indent}${key}: \${${insertIndex++}:${value}}\n`;
810
+ }
811
+ else {
812
+ insertText += `${indent}${key}: $${insertIndex++}\n`;
813
+ }
681
814
  break;
815
+ }
682
816
  case 'array':
683
817
  {
684
- const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex++);
818
+ const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex++, indent);
685
819
  const arrayInsertLines = arrayInsertResult.insertText.split('\n');
686
820
  let arrayTemplate = arrayInsertResult.insertText;
687
821
  if (arrayInsertLines.length > 1) {
@@ -704,7 +838,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
704
838
  break;
705
839
  }
706
840
  }
707
- else if (propertySchema.default !== undefined) {
841
+ else if (!this.disableDefaultProperties && propertySchema.default !== undefined) {
708
842
  switch (type) {
709
843
  case 'boolean':
710
844
  case 'number':
@@ -728,7 +862,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
728
862
  return { insertText, insertIndex };
729
863
  }
730
864
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
731
- getInsertTextForArray(schema, separatorAfter, insertIndex = 1) {
865
+ getInsertTextForArray(schema, separatorAfter, insertIndex = 1, indent = this.indentation) {
732
866
  let insertText = '';
733
867
  if (!schema) {
734
868
  insertText = `$${insertIndex++}`;
@@ -756,7 +890,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
756
890
  break;
757
891
  case 'object':
758
892
  {
759
- const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${this.indentation} `, insertIndex++);
893
+ const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${indent} `, insertIndex++);
760
894
  insertText = objectInsertResult.insertText.trimLeft();
761
895
  insertIndex = objectInsertResult.insertIndex;
762
896
  }
@@ -927,7 +1061,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
927
1061
  collector.add({
928
1062
  kind: this.getSuggestionKind(schema.type),
929
1063
  label: this.getLabelForValue(schema.const),
930
- insertText: this.getInsertTextForValue(schema.const, separatorAfter, undefined),
1064
+ insertText: this.getInsertTextForValue(schema.const, separatorAfter, schema.type),
931
1065
  insertTextFormat: node_1.InsertTextFormat.Snippet,
932
1066
  documentation: this.fromMarkup(schema.markdownDescription) || schema.description,
933
1067
  });
@@ -1153,8 +1287,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1153
1287
  if (value === 'true' || value === 'false' || value === 'null' || isNumberExp.test(value)) {
1154
1288
  return `"${value}"`;
1155
1289
  }
1156
- // eslint-disable-next-line prettier/prettier, no-useless-escape
1157
- if (value.indexOf('\"') !== -1) {
1290
+ if (value.indexOf('"') !== -1) {
1158
1291
  value = value.replace(doubleQuotesEscapeRegExp, '"');
1159
1292
  }
1160
1293
  let doQuote = value.charAt(0) === '@';
@@ -1182,5 +1315,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1182
1315
  }
1183
1316
  return value;
1184
1317
  }
1318
+ /**
1319
+ * simplify `{$1:value}` to `value`
1320
+ */
1321
+ function evaluateTab1Symbol(value) {
1322
+ const result = value.replace(/\$\{1:(.*)\}/, '$1');
1323
+ return result;
1324
+ }
1325
+ function isParentCompletionItem(item) {
1326
+ return 'parent' in item;
1327
+ }
1185
1328
  });
1186
1329
  //# sourceMappingURL=yamlCompletion.js.map