yaml-language-server 1.10.1-e564235.0 → 1.11.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 (254) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +9 -0
  3. package/eslint-result.sarif +4397 -0
  4. package/lib/esm/languageserver/handlers/languageHandlers.js +4 -1
  5. package/lib/esm/languageserver/handlers/languageHandlers.js.map +1 -1
  6. package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  7. package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  8. package/lib/esm/languageserver/handlers/settingsHandlers.d.ts +1 -1
  9. package/lib/esm/languageserver/handlers/settingsHandlers.js +161 -183
  10. package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
  11. package/lib/esm/languageserver/telemetry.d.ts +2 -12
  12. package/lib/esm/languageserver/telemetry.js +1 -1
  13. package/lib/esm/languageserver/telemetry.js.map +1 -1
  14. package/lib/esm/languageservice/jsonSchema.d.ts +1 -0
  15. package/lib/esm/languageservice/parser/jsonParser07.d.ts +17 -1
  16. package/lib/esm/languageservice/parser/jsonParser07.js +66 -24
  17. package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
  18. package/lib/esm/languageservice/parser/yaml-documents.js +6 -5
  19. package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
  20. package/lib/esm/languageservice/parser/yamlParser07.js +1 -2
  21. package/lib/esm/languageservice/parser/yamlParser07.js.map +1 -1
  22. package/lib/esm/languageservice/services/documentSymbols.d.ts +1 -1
  23. package/lib/esm/languageservice/services/validation/yaml-style.js +2 -3
  24. package/lib/esm/languageservice/services/validation/yaml-style.js.map +1 -1
  25. package/lib/esm/languageservice/services/yamlCodeActions.js +2 -3
  26. package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
  27. package/lib/esm/languageservice/services/yamlCodeLens.d.ts +1 -1
  28. package/lib/esm/languageservice/services/yamlCodeLens.js +23 -34
  29. package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
  30. package/lib/esm/languageservice/services/yamlCommands.js +3 -12
  31. package/lib/esm/languageservice/services/yamlCommands.js.map +1 -1
  32. package/lib/esm/languageservice/services/yamlCompletion.d.ts +4 -3
  33. package/lib/esm/languageservice/services/yamlCompletion.js +444 -418
  34. package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
  35. package/lib/esm/languageservice/services/yamlDefinition.d.ts +1 -1
  36. package/lib/esm/languageservice/services/yamlFolding.js +1 -2
  37. package/lib/esm/languageservice/services/yamlFolding.js.map +1 -1
  38. package/lib/esm/languageservice/services/yamlHover.d.ts +1 -1
  39. package/lib/esm/languageservice/services/yamlHover.js +40 -0
  40. package/lib/esm/languageservice/services/yamlHover.js.map +1 -1
  41. package/lib/esm/languageservice/services/yamlLinks.d.ts +1 -1
  42. package/lib/esm/languageservice/services/yamlOnTypeFormatting.js +0 -1
  43. package/lib/esm/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  44. package/lib/esm/languageservice/services/yamlSchemaService.js +202 -218
  45. package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
  46. package/lib/esm/languageservice/services/yamlValidation.d.ts +1 -1
  47. package/lib/esm/languageservice/services/yamlValidation.js +61 -71
  48. package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
  49. package/lib/esm/languageservice/telemetry.d.ts +16 -0
  50. package/lib/esm/languageservice/telemetry.js +6 -0
  51. package/lib/esm/languageservice/telemetry.js.map +1 -0
  52. package/lib/esm/languageservice/utils/astUtils.js +2 -6
  53. package/lib/esm/languageservice/utils/astUtils.js.map +1 -1
  54. package/lib/esm/languageservice/utils/indentationGuesser.js +0 -1
  55. package/lib/esm/languageservice/utils/indentationGuesser.js.map +1 -1
  56. package/lib/esm/languageservice/utils/objects.js +1 -2
  57. package/lib/esm/languageservice/utils/objects.js.map +1 -1
  58. package/lib/esm/languageservice/utils/schemaUrls.d.ts +1 -1
  59. package/lib/esm/languageservice/utils/schemaUrls.js +2 -4
  60. package/lib/esm/languageservice/utils/schemaUrls.js.map +1 -1
  61. package/lib/esm/languageservice/utils/schemaUtils.d.ts +2 -0
  62. package/lib/esm/languageservice/utils/schemaUtils.js +10 -7
  63. package/lib/esm/languageservice/utils/schemaUtils.js.map +1 -1
  64. package/lib/esm/languageservice/yamlLanguageService.d.ts +2 -3
  65. package/lib/esm/languageservice/yamlLanguageService.js +0 -1
  66. package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
  67. package/lib/esm/server.js +5 -4
  68. package/lib/esm/server.js.map +1 -1
  69. package/lib/esm/webworker/yamlServerMain.js +2 -2
  70. package/lib/esm/webworker/yamlServerMain.js.map +1 -1
  71. package/lib/esm/yamlServerInit.d.ts +1 -1
  72. package/lib/umd/languageserver/handlers/languageHandlers.js +4 -1
  73. package/lib/umd/languageserver/handlers/languageHandlers.js.map +1 -1
  74. package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  75. package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  76. package/lib/umd/languageserver/handlers/settingsHandlers.d.ts +1 -1
  77. package/lib/umd/languageserver/handlers/settingsHandlers.js +161 -183
  78. package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
  79. package/lib/umd/languageserver/telemetry.d.ts +2 -12
  80. package/lib/umd/languageserver/telemetry.js +3 -3
  81. package/lib/umd/languageserver/telemetry.js.map +1 -1
  82. package/lib/umd/languageservice/jsonSchema.d.ts +1 -0
  83. package/lib/umd/languageservice/parser/jsonParser07.d.ts +17 -1
  84. package/lib/umd/languageservice/parser/jsonParser07.js +67 -25
  85. package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
  86. package/lib/umd/languageservice/parser/yaml-documents.js +6 -5
  87. package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
  88. package/lib/umd/languageservice/parser/yamlParser07.js +1 -2
  89. package/lib/umd/languageservice/parser/yamlParser07.js.map +1 -1
  90. package/lib/umd/languageservice/services/documentSymbols.d.ts +1 -1
  91. package/lib/umd/languageservice/services/validation/yaml-style.js +2 -3
  92. package/lib/umd/languageservice/services/validation/yaml-style.js.map +1 -1
  93. package/lib/umd/languageservice/services/yamlCodeActions.js +2 -3
  94. package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
  95. package/lib/umd/languageservice/services/yamlCodeLens.d.ts +1 -1
  96. package/lib/umd/languageservice/services/yamlCodeLens.js +23 -34
  97. package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
  98. package/lib/umd/languageservice/services/yamlCommands.js +3 -12
  99. package/lib/umd/languageservice/services/yamlCommands.js.map +1 -1
  100. package/lib/umd/languageservice/services/yamlCompletion.d.ts +4 -3
  101. package/lib/umd/languageservice/services/yamlCompletion.js +443 -417
  102. package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
  103. package/lib/umd/languageservice/services/yamlDefinition.d.ts +1 -1
  104. package/lib/umd/languageservice/services/yamlFolding.js +1 -2
  105. package/lib/umd/languageservice/services/yamlFolding.js.map +1 -1
  106. package/lib/umd/languageservice/services/yamlHover.d.ts +1 -1
  107. package/lib/umd/languageservice/services/yamlHover.js +40 -0
  108. package/lib/umd/languageservice/services/yamlHover.js.map +1 -1
  109. package/lib/umd/languageservice/services/yamlLinks.d.ts +1 -1
  110. package/lib/umd/languageservice/services/yamlOnTypeFormatting.js +0 -1
  111. package/lib/umd/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  112. package/lib/umd/languageservice/services/yamlSchemaService.js +202 -218
  113. package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
  114. package/lib/umd/languageservice/services/yamlValidation.d.ts +1 -1
  115. package/lib/umd/languageservice/services/yamlValidation.js +61 -71
  116. package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
  117. package/lib/umd/languageservice/telemetry.d.ts +16 -0
  118. package/lib/umd/languageservice/telemetry.js +17 -0
  119. package/lib/umd/languageservice/telemetry.js.map +1 -0
  120. package/lib/umd/languageservice/utils/astUtils.js +2 -6
  121. package/lib/umd/languageservice/utils/astUtils.js.map +1 -1
  122. package/lib/umd/languageservice/utils/indentationGuesser.js +0 -1
  123. package/lib/umd/languageservice/utils/indentationGuesser.js.map +1 -1
  124. package/lib/umd/languageservice/utils/objects.js +1 -2
  125. package/lib/umd/languageservice/utils/objects.js.map +1 -1
  126. package/lib/umd/languageservice/utils/schemaUrls.d.ts +1 -1
  127. package/lib/umd/languageservice/utils/schemaUrls.js +2 -4
  128. package/lib/umd/languageservice/utils/schemaUrls.js.map +1 -1
  129. package/lib/umd/languageservice/utils/schemaUtils.d.ts +2 -0
  130. package/lib/umd/languageservice/utils/schemaUtils.js +13 -8
  131. package/lib/umd/languageservice/utils/schemaUtils.js.map +1 -1
  132. package/lib/umd/languageservice/yamlLanguageService.d.ts +2 -3
  133. package/lib/umd/languageservice/yamlLanguageService.js +0 -1
  134. package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
  135. package/lib/umd/server.js +4 -3
  136. package/lib/umd/server.js.map +1 -1
  137. package/lib/umd/webworker/yamlServerMain.js +1 -1
  138. package/lib/umd/webworker/yamlServerMain.js.map +1 -1
  139. package/lib/umd/yamlServerInit.d.ts +1 -1
  140. package/out/server/src/languageserver/handlers/languageHandlers.js +4 -1
  141. package/out/server/src/languageserver/handlers/languageHandlers.js.map +1 -1
  142. package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  143. package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  144. package/out/server/src/languageserver/handlers/settingsHandlers.d.ts +1 -1
  145. package/out/server/src/languageserver/handlers/settingsHandlers.js +161 -183
  146. package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
  147. package/out/server/src/languageserver/telemetry.d.ts +2 -12
  148. package/out/server/src/languageserver/telemetry.js +3 -3
  149. package/out/server/src/languageserver/telemetry.js.map +1 -1
  150. package/out/server/src/languageservice/jsonSchema.d.ts +1 -0
  151. package/out/server/src/languageservice/parser/jsonParser07.d.ts +17 -1
  152. package/out/server/src/languageservice/parser/jsonParser07.js +66 -24
  153. package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
  154. package/out/server/src/languageservice/parser/yaml-documents.js +6 -5
  155. package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
  156. package/out/server/src/languageservice/parser/yamlParser07.js +1 -2
  157. package/out/server/src/languageservice/parser/yamlParser07.js.map +1 -1
  158. package/out/server/src/languageservice/services/documentSymbols.d.ts +1 -1
  159. package/out/server/src/languageservice/services/validation/yaml-style.js +2 -3
  160. package/out/server/src/languageservice/services/validation/yaml-style.js.map +1 -1
  161. package/out/server/src/languageservice/services/yamlCodeActions.js +2 -3
  162. package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
  163. package/out/server/src/languageservice/services/yamlCodeLens.d.ts +1 -1
  164. package/out/server/src/languageservice/services/yamlCodeLens.js +23 -34
  165. package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
  166. package/out/server/src/languageservice/services/yamlCommands.js +3 -12
  167. package/out/server/src/languageservice/services/yamlCommands.js.map +1 -1
  168. package/out/server/src/languageservice/services/yamlCompletion.d.ts +4 -3
  169. package/out/server/src/languageservice/services/yamlCompletion.js +443 -417
  170. package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
  171. package/out/server/src/languageservice/services/yamlDefinition.d.ts +1 -1
  172. package/out/server/src/languageservice/services/yamlFolding.js +1 -2
  173. package/out/server/src/languageservice/services/yamlFolding.js.map +1 -1
  174. package/out/server/src/languageservice/services/yamlHover.d.ts +1 -1
  175. package/out/server/src/languageservice/services/yamlHover.js +40 -0
  176. package/out/server/src/languageservice/services/yamlHover.js.map +1 -1
  177. package/out/server/src/languageservice/services/yamlLinks.d.ts +1 -1
  178. package/out/server/src/languageservice/services/yamlOnTypeFormatting.js +0 -1
  179. package/out/server/src/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  180. package/out/server/src/languageservice/services/yamlSchemaService.js +202 -218
  181. package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
  182. package/out/server/src/languageservice/services/yamlValidation.d.ts +1 -1
  183. package/out/server/src/languageservice/services/yamlValidation.js +61 -71
  184. package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
  185. package/out/server/src/languageservice/telemetry.d.ts +16 -0
  186. package/out/server/src/languageservice/telemetry.js +7 -0
  187. package/out/server/src/languageservice/telemetry.js.map +1 -0
  188. package/out/server/src/languageservice/utils/astUtils.js +2 -6
  189. package/out/server/src/languageservice/utils/astUtils.js.map +1 -1
  190. package/out/server/src/languageservice/utils/indentationGuesser.js +0 -1
  191. package/out/server/src/languageservice/utils/indentationGuesser.js.map +1 -1
  192. package/out/server/src/languageservice/utils/objects.js +1 -2
  193. package/out/server/src/languageservice/utils/objects.js.map +1 -1
  194. package/out/server/src/languageservice/utils/schemaUrls.d.ts +1 -1
  195. package/out/server/src/languageservice/utils/schemaUrls.js +2 -4
  196. package/out/server/src/languageservice/utils/schemaUrls.js.map +1 -1
  197. package/out/server/src/languageservice/utils/schemaUtils.d.ts +2 -0
  198. package/out/server/src/languageservice/utils/schemaUtils.js +13 -8
  199. package/out/server/src/languageservice/utils/schemaUtils.js.map +1 -1
  200. package/out/server/src/languageservice/yamlLanguageService.d.ts +2 -3
  201. package/out/server/src/languageservice/yamlLanguageService.js +0 -1
  202. package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
  203. package/out/server/src/server.js +4 -3
  204. package/out/server/src/server.js.map +1 -1
  205. package/out/server/src/webworker/yamlServerMain.js +1 -1
  206. package/out/server/src/webworker/yamlServerMain.js.map +1 -1
  207. package/out/server/src/yamlServerInit.d.ts +1 -1
  208. package/out/server/test/autoCompletion.test.js +267 -178
  209. package/out/server/test/autoCompletion.test.js.map +1 -1
  210. package/out/server/test/autoCompletionFix.test.js +380 -119
  211. package/out/server/test/autoCompletionFix.test.js.map +1 -1
  212. package/out/server/test/code-action-schema.test.js +6 -15
  213. package/out/server/test/code-action-schema.test.js.map +1 -1
  214. package/out/server/test/defaultSnippets.test.js +11 -19
  215. package/out/server/test/defaultSnippets.test.js.map +1 -1
  216. package/out/server/test/findLinks.test.js +3 -12
  217. package/out/server/test/findLinks.test.js.map +1 -1
  218. package/out/server/test/hover.test.js +138 -68
  219. package/out/server/test/hover.test.js.map +1 -1
  220. package/out/server/test/integration.test.js +3 -12
  221. package/out/server/test/integration.test.js.map +1 -1
  222. package/out/server/test/jsonParser.test.js +15 -26
  223. package/out/server/test/jsonParser.test.js.map +1 -1
  224. package/out/server/test/multipleDocuments.test.js +3 -12
  225. package/out/server/test/multipleDocuments.test.js.map +1 -1
  226. package/out/server/test/schema.test.js +71 -85
  227. package/out/server/test/schema.test.js.map +1 -1
  228. package/out/server/test/schemaRequestHandler.test.js +9 -18
  229. package/out/server/test/schemaRequestHandler.test.js.map +1 -1
  230. package/out/server/test/schemaSelectionHandlers.test.js +12 -21
  231. package/out/server/test/schemaSelectionHandlers.test.js.map +1 -1
  232. package/out/server/test/schemaValidation.test.js +247 -94
  233. package/out/server/test/schemaValidation.test.js.map +1 -1
  234. package/out/server/test/settingsHandlers.test.js +44 -55
  235. package/out/server/test/settingsHandlers.test.js.map +1 -1
  236. package/out/server/test/telemetry.test.js +1 -1
  237. package/out/server/test/telemetry.test.js.map +1 -1
  238. package/out/server/test/utils/testsTypes.d.ts +3 -2
  239. package/out/server/test/utils/testsTypes.js +1 -1
  240. package/out/server/test/utils/testsTypes.js.map +1 -1
  241. package/out/server/test/utils/verifyError.d.ts +1 -1
  242. package/out/server/test/utils/verifyError.js +22 -20
  243. package/out/server/test/utils/verifyError.js.map +1 -1
  244. package/out/server/test/yamlCodeLens.test.js +34 -31
  245. package/out/server/test/yamlCodeLens.test.js.map +1 -1
  246. package/out/server/test/yamlCommands.test.js +6 -15
  247. package/out/server/test/yamlCommands.test.js.map +1 -1
  248. package/out/server/test/yamlSchema.test.js +9 -18
  249. package/out/server/test/yamlSchema.test.js.map +1 -1
  250. package/out/server/test/yamlSchemaService.test.js +9 -18
  251. package/out/server/test/yamlSchemaService.test.js.map +1 -1
  252. package/out/server/test/yamlValidation.test.js +30 -39
  253. package/out/server/test/yamlValidation.test.js.map +1 -1
  254. package/package.json +10 -9
@@ -3,15 +3,6 @@
3
3
  * Copyright (c) Red Hat, Inc. All rights reserved.
4
4
  * Licensed under the MIT License. See License.txt in the project root for license information.
5
5
  *--------------------------------------------------------------------------------------------*/
6
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
- return new (P || (P = Promise))(function (resolve, reject) {
9
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
- step((generator = generator.apply(thisArg, _arguments || [])).next());
13
- });
14
- };
15
6
  Object.defineProperty(exports, "__esModule", { value: true });
16
7
  exports.YamlCompletion = void 0;
17
8
  const vscode_languageserver_types_1 = require("vscode-languageserver-types");
@@ -49,408 +40,438 @@ class YamlCompletion {
49
40
  this.disableDefaultProperties = languageSettings.disableDefaultProperties;
50
41
  this.parentSkeletonSelectedFirst = languageSettings.parentSkeletonSelectedFirst;
51
42
  }
52
- doComplete(document, position, isKubernetes = false) {
53
- return __awaiter(this, void 0, void 0, function* () {
54
- const result = vscode_languageserver_types_1.CompletionList.create([], false);
55
- if (!this.completionEnabled) {
56
- return result;
57
- }
58
- const doc = this.yamlDocument.getYamlDocument(document, { customTags: this.customTags, yamlVersion: this.yamlVersion }, true);
59
- const textBuffer = new textBuffer_1.TextBuffer(document);
60
- if (!this.configuredIndentation) {
61
- const indent = (0, indentationGuesser_1.guessIndentation)(textBuffer, 2, true);
62
- this.indentation = indent.insertSpaces ? ' '.repeat(indent.tabSize) : '\t';
63
- }
64
- else {
65
- this.indentation = this.configuredIndentation;
66
- }
67
- (0, isKubernetes_1.setKubernetesParserOption)(doc.documents, isKubernetes);
68
- const offset = document.offsetAt(position);
69
- const text = document.getText();
70
- if (text.charAt(offset - 1) === ':') {
71
- return Promise.resolve(result);
72
- }
73
- let currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, doc);
74
- if (currentDoc === null) {
75
- return Promise.resolve(result);
76
- }
77
- // as we modify AST for completion, we need to use copy of original document
78
- currentDoc = currentDoc.clone();
79
- let [node, foundByClosest] = currentDoc.getNodeFromPosition(offset, textBuffer, this.indentation.length);
80
- const currentWord = this.getCurrentWord(document, offset);
81
- let lineContent = textBuffer.getLineContent(position.line);
82
- const lineAfterPosition = lineContent.substring(position.character);
83
- const areOnlySpacesAfterPosition = /^[ ]+\n?$/.test(lineAfterPosition);
84
- this.arrayPrefixIndentation = '';
85
- let overwriteRange = null;
86
- if (areOnlySpacesAfterPosition) {
87
- overwriteRange = vscode_languageserver_types_1.Range.create(position, vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
88
- const isOnlyWhitespace = lineContent.trim().length === 0;
89
- if (node && (0, yaml_1.isScalar)(node) && !isOnlyWhitespace) {
90
- // line contains part of a key with trailing spaces, adjust the overwrite range to include only the text
91
- const matches = lineContent.match(/^([\s-]*)[^:]+[ \t]+\n?$/);
92
- if (matches === null || matches === void 0 ? void 0 : matches.length) {
93
- overwriteRange = vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(position.line, matches[1].length), vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
94
- }
95
- }
96
- }
97
- else if (node && (0, yaml_1.isScalar)(node) && node.value === 'null') {
98
- const nodeStartPos = document.positionAt(node.range[0]);
99
- nodeStartPos.character += 1;
100
- const nodeEndPos = document.positionAt(node.range[2]);
101
- nodeEndPos.character += 1;
102
- overwriteRange = vscode_languageserver_types_1.Range.create(nodeStartPos, nodeEndPos);
103
- }
104
- else if (node && (0, yaml_1.isScalar)(node) && node.value) {
105
- const start = document.positionAt(node.range[0]);
106
- if (offset > 0 && start.character > 0 && text.charAt(offset - 1) === '-') {
107
- start.character -= 1;
43
+ async doComplete(document, position, isKubernetes = false, doComplete = true) {
44
+ const result = vscode_languageserver_types_1.CompletionList.create([], false);
45
+ if (!this.completionEnabled) {
46
+ return result;
47
+ }
48
+ const doc = this.yamlDocument.getYamlDocument(document, { customTags: this.customTags, yamlVersion: this.yamlVersion }, true);
49
+ const textBuffer = new textBuffer_1.TextBuffer(document);
50
+ if (!this.configuredIndentation) {
51
+ const indent = (0, indentationGuesser_1.guessIndentation)(textBuffer, 2, true);
52
+ this.indentation = indent.insertSpaces ? ' '.repeat(indent.tabSize) : '\t';
53
+ }
54
+ else {
55
+ this.indentation = this.configuredIndentation;
56
+ }
57
+ (0, isKubernetes_1.setKubernetesParserOption)(doc.documents, isKubernetes);
58
+ // set parser options
59
+ for (const jsonDoc of doc.documents) {
60
+ jsonDoc.uri = document.uri;
61
+ }
62
+ const offset = document.offsetAt(position);
63
+ const text = document.getText();
64
+ if (text.charAt(offset - 1) === ':') {
65
+ return Promise.resolve(result);
66
+ }
67
+ let currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, doc);
68
+ if (currentDoc === null) {
69
+ return Promise.resolve(result);
70
+ }
71
+ // as we modify AST for completion, we need to use copy of original document
72
+ currentDoc = currentDoc.clone();
73
+ let [node, foundByClosest] = currentDoc.getNodeFromPosition(offset, textBuffer, this.indentation.length);
74
+ const currentWord = this.getCurrentWord(document, offset);
75
+ let lineContent = textBuffer.getLineContent(position.line);
76
+ const lineAfterPosition = lineContent.substring(position.character);
77
+ const areOnlySpacesAfterPosition = /^[ ]+\n?$/.test(lineAfterPosition);
78
+ this.arrayPrefixIndentation = '';
79
+ let overwriteRange = null;
80
+ if (areOnlySpacesAfterPosition) {
81
+ overwriteRange = vscode_languageserver_types_1.Range.create(position, vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
82
+ const isOnlyWhitespace = lineContent.trim().length === 0;
83
+ const isOnlyDash = lineContent.match(/^\s*(-)\s*$/);
84
+ if (node && (0, yaml_1.isScalar)(node) && !isOnlyWhitespace && !isOnlyDash) {
85
+ // line contains part of a key with trailing spaces, adjust the overwrite range to include only the text
86
+ const matches = lineContent.match(/^([\s-]*)[^:]+[ \t]+\n?$/);
87
+ if (matches?.length) {
88
+ overwriteRange = vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(position.line, matches[1].length), vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
108
89
  }
109
- overwriteRange = vscode_languageserver_types_1.Range.create(start, document.positionAt(node.range[1]));
110
90
  }
111
- else if (node && (0, yaml_1.isScalar)(node) && node.value === null && currentWord === '-') {
112
- overwriteRange = vscode_languageserver_types_1.Range.create(position, position);
113
- this.arrayPrefixIndentation = ' ';
91
+ }
92
+ else if (node && (0, yaml_1.isScalar)(node) && node.value === 'null') {
93
+ const nodeStartPos = document.positionAt(node.range[0]);
94
+ nodeStartPos.character += 1;
95
+ const nodeEndPos = document.positionAt(node.range[2]);
96
+ nodeEndPos.character += 1;
97
+ overwriteRange = vscode_languageserver_types_1.Range.create(nodeStartPos, nodeEndPos);
98
+ }
99
+ else if (node && (0, yaml_1.isScalar)(node) && node.value) {
100
+ const start = document.positionAt(node.range[0]);
101
+ if (offset > 0 && start.character > 0 && text.charAt(offset - 1) === '-') {
102
+ start.character -= 1;
114
103
  }
115
- else {
116
- let overwriteStart = document.offsetAt(position) - currentWord.length;
117
- if (overwriteStart > 0 && text[overwriteStart - 1] === '"') {
118
- overwriteStart--;
119
- }
120
- overwriteRange = vscode_languageserver_types_1.Range.create(document.positionAt(overwriteStart), position);
104
+ overwriteRange = vscode_languageserver_types_1.Range.create(start, document.positionAt(node.range[1]));
105
+ }
106
+ else if (node && (0, yaml_1.isScalar)(node) && node.value === null && currentWord === '-') {
107
+ overwriteRange = vscode_languageserver_types_1.Range.create(position, position);
108
+ this.arrayPrefixIndentation = ' ';
109
+ }
110
+ else {
111
+ let overwriteStart = document.offsetAt(position) - currentWord.length;
112
+ if (overwriteStart > 0 && text[overwriteStart - 1] === '"') {
113
+ overwriteStart--;
121
114
  }
122
- const proposed = {};
123
- const existingProposeItem = '__';
124
- const collector = {
125
- add: (completionItem) => {
126
- const addSuggestionForParent = function (completionItem) {
127
- var _a;
128
- const existsInYaml = ((_a = proposed[completionItem.label]) === null || _a === void 0 ? void 0 : _a.label) === existingProposeItem;
129
- //don't put to parent suggestion if already in yaml
130
- if (existsInYaml) {
131
- return;
132
- }
133
- const schema = completionItem.parent.schema;
134
- const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
135
- const schemaDescription = schema.markdownDescription || schema.description;
136
- let parentCompletion = result.items.find((item) => { var _a; return ((_a = item.parent) === null || _a === void 0 ? void 0 : _a.schema) === schema && item.kind === parentCompletionKind; });
137
- if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
138
- // already exists in the parent
139
- return;
140
- }
141
- else if (!parentCompletion) {
142
- // create a new parent
143
- parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, documentation: schemaDescription, sortText: '_' + schemaType, kind: parentCompletionKind });
144
- parentCompletion.parent.insertTexts = [completionItem.insertText];
145
- result.items.push(parentCompletion);
146
- }
147
- else {
148
- // add to the existing parent
149
- parentCompletion.parent.insertTexts.push(completionItem.insertText);
150
- }
151
- };
152
- const isForParentCompletion = !!completionItem.parent;
153
- let label = completionItem.label;
154
- if (!label) {
155
- // we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
156
- console.warn(`Ignoring CompletionItem without label: ${JSON.stringify(completionItem)}`);
115
+ overwriteRange = vscode_languageserver_types_1.Range.create(document.positionAt(overwriteStart), position);
116
+ }
117
+ const proposed = {};
118
+ const existingProposeItem = '__';
119
+ const collector = {
120
+ add: (completionItem, oneOfSchema) => {
121
+ const addSuggestionForParent = function (completionItem) {
122
+ const existsInYaml = proposed[completionItem.label]?.label === existingProposeItem;
123
+ //don't put to parent suggestion if already in yaml
124
+ if (existsInYaml) {
157
125
  return;
158
126
  }
159
- if (!(0, objects_1.isString)(label)) {
160
- label = String(label);
161
- }
162
- label = label.replace(/[\n]/g, '↵');
163
- if (label.length > 60) {
164
- const shortendedLabel = label.substr(0, 57).trim() + '...';
165
- if (!proposed[shortendedLabel]) {
166
- label = shortendedLabel;
167
- }
127
+ const schema = completionItem.parent.schema;
128
+ const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
129
+ const schemaDescription = schema.markdownDescription || schema.description;
130
+ let parentCompletion = result.items.find((item) => item.parent?.schema === schema && item.kind === parentCompletionKind);
131
+ if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
132
+ // already exists in the parent
133
+ return;
168
134
  }
169
- // trim $1 from end of completion
170
- if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
171
- completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
135
+ else if (!parentCompletion) {
136
+ // create a new parent
137
+ parentCompletion = {
138
+ ...completionItem,
139
+ label: schemaType,
140
+ documentation: schemaDescription,
141
+ sortText: '_' + schemaType,
142
+ kind: parentCompletionKind,
143
+ };
144
+ parentCompletion.label = parentCompletion.label || completionItem.label;
145
+ parentCompletion.parent.insertTexts = [completionItem.insertText];
146
+ result.items.push(parentCompletion);
172
147
  }
173
- if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
174
- completionItem.textEdit = vscode_languageserver_types_1.TextEdit.replace(overwriteRange, completionItem.insertText);
148
+ else {
149
+ // add to the existing parent
150
+ parentCompletion.parent.insertTexts.push(completionItem.insertText);
175
151
  }
176
- completionItem.label = label;
177
- if (isForParentCompletion) {
178
- addSuggestionForParent(completionItem);
179
- return;
152
+ };
153
+ const isForParentCompletion = !!completionItem.parent;
154
+ let label = completionItem.label;
155
+ if (!label) {
156
+ // we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
157
+ console.warn(`Ignoring CompletionItem without label: ${JSON.stringify(completionItem)}`);
158
+ return;
159
+ }
160
+ if (!(0, objects_1.isString)(label)) {
161
+ label = String(label);
162
+ }
163
+ label = label.replace(/[\n]/g, '↵');
164
+ if (label.length > 60) {
165
+ const shortendedLabel = label.substr(0, 57).trim() + '...';
166
+ if (!proposed[shortendedLabel]) {
167
+ label = shortendedLabel;
180
168
  }
181
- if (this.arrayPrefixIndentation) {
182
- this.updateCompletionText(completionItem, this.arrayPrefixIndentation + completionItem.insertText);
169
+ }
170
+ // trim $1 from end of completion
171
+ if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
172
+ completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
173
+ }
174
+ if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
175
+ completionItem.textEdit = vscode_languageserver_types_1.TextEdit.replace(overwriteRange, completionItem.insertText);
176
+ }
177
+ completionItem.label = label;
178
+ if (isForParentCompletion) {
179
+ addSuggestionForParent(completionItem);
180
+ return;
181
+ }
182
+ if (this.arrayPrefixIndentation) {
183
+ this.updateCompletionText(completionItem, this.arrayPrefixIndentation + completionItem.insertText);
184
+ }
185
+ const existing = proposed[label];
186
+ const isInsertTextDifferent = existing?.label !== existingProposeItem && existing?.insertText !== completionItem.insertText;
187
+ if (!existing) {
188
+ proposed[label] = completionItem;
189
+ result.items.push(completionItem);
190
+ }
191
+ else if (isInsertTextDifferent) {
192
+ // try to merge simple insert values
193
+ const mergedText = this.mergeSimpleInsertTexts(label, existing.insertText, completionItem.insertText, oneOfSchema);
194
+ if (mergedText) {
195
+ this.updateCompletionText(existing, mergedText);
183
196
  }
184
- const existing = proposed[label];
185
- const isInsertTextDifferent = (existing === null || existing === void 0 ? void 0 : existing.label) !== existingProposeItem && (existing === null || existing === void 0 ? void 0 : existing.insertText) !== completionItem.insertText;
186
- if (!existing) {
197
+ else {
198
+ // add to result when it wasn't able to merge (even if the item is already there but with a different value)
187
199
  proposed[label] = completionItem;
188
200
  result.items.push(completionItem);
189
201
  }
190
- else if (isInsertTextDifferent) {
191
- // try to merge simple insert values
192
- const mergedText = this.mergeSimpleInsertTexts(label, existing.insertText, completionItem.insertText);
193
- if (mergedText) {
194
- this.updateCompletionText(existing, mergedText);
195
- }
196
- else {
197
- // add to result when it wasn't able to merge (even if the item is already there but with a different value)
198
- proposed[label] = completionItem;
199
- result.items.push(completionItem);
200
- }
201
- }
202
- if (existing && !existing.documentation && completionItem.documentation) {
203
- existing.documentation = completionItem.documentation;
204
- }
205
- },
206
- error: (message) => {
207
- this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(message) });
208
- },
209
- log: (message) => {
210
- console.log(message);
211
- },
212
- getNumberOfProposals: () => {
213
- return result.items.length;
214
- },
215
- };
216
- if (this.customTags.length > 0) {
217
- this.getCustomTagValueCompletions(collector);
218
- }
219
- if (lineContent.endsWith('\n')) {
220
- lineContent = lineContent.substr(0, lineContent.length - 1);
202
+ }
203
+ if (existing && !existing.documentation && completionItem.documentation) {
204
+ existing.documentation = completionItem.documentation;
205
+ }
206
+ },
207
+ error: (message) => {
208
+ this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(message) });
209
+ },
210
+ log: (message) => {
211
+ console.log(message);
212
+ },
213
+ getNumberOfProposals: () => {
214
+ return result.items.length;
215
+ },
216
+ result,
217
+ };
218
+ if (this.customTags.length > 0) {
219
+ this.getCustomTagValueCompletions(collector);
220
+ }
221
+ if (lineContent.endsWith('\n')) {
222
+ lineContent = lineContent.substr(0, lineContent.length - 1);
223
+ }
224
+ try {
225
+ const schema = await this.schemaService.getSchemaForResource(document.uri, currentDoc);
226
+ if (!schema || schema.errors.length) {
227
+ if (position.line === 0 && position.character === 0 && !(0, modelineUtil_1.isModeline)(lineContent)) {
228
+ const inlineSchemaCompletion = {
229
+ kind: vscode_languageserver_types_1.CompletionItemKind.Text,
230
+ label: 'Inline schema',
231
+ insertText: '# yaml-language-server: $schema=',
232
+ insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
233
+ };
234
+ result.items.push(inlineSchemaCompletion);
235
+ }
221
236
  }
222
- try {
223
- const schema = yield this.schemaService.getSchemaForResource(document.uri, currentDoc);
224
- if (!schema || schema.errors.length) {
225
- if (position.line === 0 && position.character === 0 && !(0, modelineUtil_1.isModeline)(lineContent)) {
226
- const inlineSchemaCompletion = {
227
- kind: vscode_languageserver_types_1.CompletionItemKind.Text,
228
- label: 'Inline schema',
229
- insertText: '# yaml-language-server: $schema=',
237
+ if ((0, modelineUtil_1.isModeline)(lineContent) || (0, astUtils_1.isInComment)(doc.tokens, offset)) {
238
+ const schemaIndex = lineContent.indexOf('$schema=');
239
+ if (schemaIndex !== -1 && schemaIndex + '$schema='.length <= position.character) {
240
+ this.schemaService.getAllSchemas().forEach((schema) => {
241
+ const schemaIdCompletion = {
242
+ kind: vscode_languageserver_types_1.CompletionItemKind.Constant,
243
+ label: schema.name ?? schema.uri,
244
+ detail: schema.description,
245
+ insertText: schema.uri,
230
246
  insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
247
+ insertTextMode: vscode_languageserver_types_1.InsertTextMode.asIs,
231
248
  };
232
- result.items.push(inlineSchemaCompletion);
233
- }
249
+ result.items.push(schemaIdCompletion);
250
+ });
234
251
  }
235
- if ((0, modelineUtil_1.isModeline)(lineContent) || (0, astUtils_1.isInComment)(doc.tokens, offset)) {
236
- const schemaIndex = lineContent.indexOf('$schema=');
237
- if (schemaIndex !== -1 && schemaIndex + '$schema='.length <= position.character) {
238
- this.schemaService.getAllSchemas().forEach((schema) => {
239
- var _a;
240
- const schemaIdCompletion = {
241
- kind: vscode_languageserver_types_1.CompletionItemKind.Constant,
242
- label: (_a = schema.name) !== null && _a !== void 0 ? _a : schema.uri,
243
- detail: schema.description,
244
- insertText: schema.uri,
245
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
246
- insertTextMode: vscode_languageserver_types_1.InsertTextMode.asIs,
247
- };
248
- result.items.push(schemaIdCompletion);
249
- });
250
- }
251
- return result;
252
+ return result;
253
+ }
254
+ if (!schema || schema.errors.length) {
255
+ return result;
256
+ }
257
+ let currentProperty = null;
258
+ if (!node) {
259
+ if (!currentDoc.internalDocument.contents || (0, yaml_1.isScalar)(currentDoc.internalDocument.contents)) {
260
+ const map = currentDoc.internalDocument.createNode({});
261
+ map.range = [offset, offset + 1, offset + 1];
262
+ currentDoc.internalDocument.contents = map;
263
+ // eslint-disable-next-line no-self-assign
264
+ currentDoc.internalDocument = currentDoc.internalDocument;
265
+ node = map;
252
266
  }
253
- if (!schema || schema.errors.length) {
254
- return result;
267
+ else {
268
+ node = currentDoc.findClosestNode(offset, textBuffer);
269
+ foundByClosest = true;
255
270
  }
256
- let currentProperty = null;
257
- if (!node) {
258
- if (!currentDoc.internalDocument.contents || (0, yaml_1.isScalar)(currentDoc.internalDocument.contents)) {
259
- const map = currentDoc.internalDocument.createNode({});
260
- map.range = [offset, offset + 1, offset + 1];
261
- currentDoc.internalDocument.contents = map;
262
- // eslint-disable-next-line no-self-assign
263
- currentDoc.internalDocument = currentDoc.internalDocument;
264
- node = map;
265
- }
266
- else {
267
- node = currentDoc.findClosestNode(offset, textBuffer);
268
- foundByClosest = true;
269
- }
271
+ }
272
+ const originalNode = node;
273
+ if (node) {
274
+ if (lineContent.length === 0) {
275
+ node = currentDoc.internalDocument.contents;
270
276
  }
271
- const originalNode = node;
272
- if (node) {
273
- if (lineContent.length === 0) {
274
- node = currentDoc.internalDocument.contents;
275
- }
276
- else {
277
- const parent = currentDoc.getParent(node);
278
- if (parent) {
279
- if ((0, yaml_1.isScalar)(node)) {
280
- if (node.value) {
281
- if ((0, yaml_1.isPair)(parent)) {
282
- if (parent.value === node) {
283
- if (lineContent.trim().length > 0 && lineContent.indexOf(':') < 0) {
284
- const map = this.createTempObjNode(currentWord, node, currentDoc);
285
- const parentParent = currentDoc.getParent(parent);
286
- if ((0, yaml_1.isSeq)(currentDoc.internalDocument.contents)) {
287
- const index = (0, astUtils_1.indexOf)(currentDoc.internalDocument.contents, parent);
288
- if (typeof index === 'number') {
289
- currentDoc.internalDocument.set(index, map);
290
- // eslint-disable-next-line no-self-assign
291
- currentDoc.internalDocument = currentDoc.internalDocument;
292
- }
293
- }
294
- else if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
295
- parentParent.set(parent.key, map);
296
- // eslint-disable-next-line no-self-assign
297
- currentDoc.internalDocument = currentDoc.internalDocument;
298
- }
299
- else {
300
- currentDoc.internalDocument.set(parent.key, map);
277
+ else {
278
+ const parent = currentDoc.getParent(node);
279
+ if (parent) {
280
+ if ((0, yaml_1.isScalar)(node)) {
281
+ if (node.value) {
282
+ if ((0, yaml_1.isPair)(parent)) {
283
+ if (parent.value === node) {
284
+ if (lineContent.trim().length > 0 && lineContent.indexOf(':') < 0) {
285
+ const map = this.createTempObjNode(currentWord, node, currentDoc);
286
+ const parentParent = currentDoc.getParent(parent);
287
+ if ((0, yaml_1.isSeq)(currentDoc.internalDocument.contents)) {
288
+ const index = (0, astUtils_1.indexOf)(currentDoc.internalDocument.contents, parent);
289
+ if (typeof index === 'number') {
290
+ currentDoc.internalDocument.set(index, map);
301
291
  // eslint-disable-next-line no-self-assign
302
292
  currentDoc.internalDocument = currentDoc.internalDocument;
303
293
  }
304
- currentProperty = map.items[0];
305
- node = map;
306
294
  }
307
- else if (lineContent.trim().length === 0) {
308
- const parentParent = currentDoc.getParent(parent);
309
- if (parentParent) {
310
- node = parentParent;
311
- }
295
+ else if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
296
+ parentParent.set(parent.key, map);
297
+ // eslint-disable-next-line no-self-assign
298
+ currentDoc.internalDocument = currentDoc.internalDocument;
299
+ }
300
+ else {
301
+ currentDoc.internalDocument.set(parent.key, map);
302
+ // eslint-disable-next-line no-self-assign
303
+ currentDoc.internalDocument = currentDoc.internalDocument;
312
304
  }
305
+ currentProperty = map.items[0];
306
+ node = map;
313
307
  }
314
- else if (parent.key === node) {
308
+ else if (lineContent.trim().length === 0) {
315
309
  const parentParent = currentDoc.getParent(parent);
316
- currentProperty = parent;
317
310
  if (parentParent) {
318
311
  node = parentParent;
319
312
  }
320
313
  }
321
314
  }
322
- else if ((0, yaml_1.isSeq)(parent)) {
323
- if (lineContent.trim().length > 0) {
324
- const map = this.createTempObjNode(currentWord, node, currentDoc);
325
- parent.delete(node);
326
- parent.add(map);
327
- // eslint-disable-next-line no-self-assign
328
- currentDoc.internalDocument = currentDoc.internalDocument;
329
- node = map;
330
- }
331
- else {
332
- node = parent;
315
+ else if (parent.key === node) {
316
+ const parentParent = currentDoc.getParent(parent);
317
+ currentProperty = parent;
318
+ if (parentParent) {
319
+ node = parentParent;
333
320
  }
334
321
  }
335
322
  }
336
- else if (node.value === null) {
337
- if ((0, yaml_1.isPair)(parent)) {
338
- if (parent.key === node) {
339
- node = parent;
340
- }
341
- else {
342
- if ((0, yaml_1.isNode)(parent.key) && parent.key.range) {
343
- const parentParent = currentDoc.getParent(parent);
344
- if (foundByClosest && parentParent && (0, yaml_1.isMap)(parentParent) && (0, astUtils_1.isMapContainsEmptyPair)(parentParent)) {
345
- node = parentParent;
346
- }
347
- else {
348
- const parentPosition = document.positionAt(parent.key.range[0]);
349
- //if cursor has bigger indentation that parent key, then we need to complete new empty object
350
- if (position.character > parentPosition.character && position.line !== parentPosition.line) {
351
- const map = this.createTempObjNode(currentWord, node, currentDoc);
352
- if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
353
- parentParent.set(parent.key, map);
354
- // eslint-disable-next-line no-self-assign
355
- currentDoc.internalDocument = currentDoc.internalDocument;
356
- }
357
- else {
358
- currentDoc.internalDocument.set(parent.key, map);
359
- // eslint-disable-next-line no-self-assign
360
- currentDoc.internalDocument = currentDoc.internalDocument;
361
- }
362
- currentProperty = map.items[0];
363
- node = map;
323
+ else if ((0, yaml_1.isSeq)(parent)) {
324
+ if (lineContent.trim().length > 0) {
325
+ const map = this.createTempObjNode(currentWord, node, currentDoc);
326
+ parent.delete(node);
327
+ parent.add(map);
328
+ // eslint-disable-next-line no-self-assign
329
+ currentDoc.internalDocument = currentDoc.internalDocument;
330
+ node = map;
331
+ }
332
+ else {
333
+ node = parent;
334
+ }
335
+ }
336
+ }
337
+ else if (node.value === null) {
338
+ if ((0, yaml_1.isPair)(parent)) {
339
+ if (parent.key === node) {
340
+ node = parent;
341
+ }
342
+ else {
343
+ if ((0, yaml_1.isNode)(parent.key) && parent.key.range) {
344
+ const parentParent = currentDoc.getParent(parent);
345
+ if (foundByClosest && parentParent && (0, yaml_1.isMap)(parentParent) && (0, astUtils_1.isMapContainsEmptyPair)(parentParent)) {
346
+ node = parentParent;
347
+ }
348
+ else {
349
+ const parentPosition = document.positionAt(parent.key.range[0]);
350
+ //if cursor has bigger indentation that parent key, then we need to complete new empty object
351
+ if (position.character > parentPosition.character && position.line !== parentPosition.line) {
352
+ const map = this.createTempObjNode(currentWord, node, currentDoc);
353
+ if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
354
+ parentParent.set(parent.key, map);
355
+ // eslint-disable-next-line no-self-assign
356
+ currentDoc.internalDocument = currentDoc.internalDocument;
364
357
  }
365
- else if (parentPosition.character === position.character) {
366
- if (parentParent) {
367
- node = parentParent;
368
- }
358
+ else {
359
+ currentDoc.internalDocument.set(parent.key, map);
360
+ // eslint-disable-next-line no-self-assign
361
+ currentDoc.internalDocument = currentDoc.internalDocument;
362
+ }
363
+ currentProperty = map.items[0];
364
+ node = map;
365
+ }
366
+ else if (parentPosition.character === position.character) {
367
+ if (parentParent) {
368
+ node = parentParent;
369
369
  }
370
370
  }
371
371
  }
372
372
  }
373
373
  }
374
- else if ((0, yaml_1.isSeq)(parent)) {
375
- if (lineContent.charAt(position.character - 1) !== '-') {
376
- const map = this.createTempObjNode(currentWord, node, currentDoc);
377
- parent.delete(node);
378
- parent.add(map);
379
- // eslint-disable-next-line no-self-assign
380
- currentDoc.internalDocument = currentDoc.internalDocument;
381
- node = map;
382
- }
383
- else if (lineContent.charAt(position.character - 1) === '-') {
384
- const map = this.createTempObjNode('', node, currentDoc);
385
- parent.delete(node);
386
- parent.add(map);
387
- // eslint-disable-next-line no-self-assign
388
- currentDoc.internalDocument = currentDoc.internalDocument;
389
- node = map;
390
- }
391
- else {
392
- node = parent;
393
- }
394
- }
395
374
  }
396
- }
397
- else if ((0, yaml_1.isMap)(node)) {
398
- if (!foundByClosest && lineContent.trim().length === 0 && (0, yaml_1.isSeq)(parent)) {
399
- const nextLine = textBuffer.getLineContent(position.line + 1);
400
- if (textBuffer.getLineCount() === position.line + 1 || nextLine.trim().length === 0) {
375
+ else if ((0, yaml_1.isSeq)(parent)) {
376
+ if (lineContent.charAt(position.character - 1) !== '-') {
377
+ const map = this.createTempObjNode(currentWord, node, currentDoc);
378
+ parent.delete(node);
379
+ parent.add(map);
380
+ // eslint-disable-next-line no-self-assign
381
+ currentDoc.internalDocument = currentDoc.internalDocument;
382
+ node = map;
383
+ }
384
+ else if (lineContent.charAt(position.character - 1) === '-') {
385
+ const map = this.createTempObjNode('', node, currentDoc);
386
+ parent.delete(node);
387
+ parent.add(map);
388
+ // eslint-disable-next-line no-self-assign
389
+ currentDoc.internalDocument = currentDoc.internalDocument;
390
+ node = map;
391
+ }
392
+ else {
401
393
  node = parent;
402
394
  }
403
395
  }
404
396
  }
405
397
  }
406
- else if ((0, yaml_1.isScalar)(node)) {
398
+ else if ((0, yaml_1.isMap)(node)) {
399
+ if (!foundByClosest && lineContent.trim().length === 0 && (0, yaml_1.isSeq)(parent)) {
400
+ const nextLine = textBuffer.getLineContent(position.line + 1);
401
+ if (textBuffer.getLineCount() === position.line + 1 || nextLine.trim().length === 0) {
402
+ node = parent;
403
+ }
404
+ }
405
+ }
406
+ }
407
+ else if ((0, yaml_1.isScalar)(node)) {
408
+ const map = this.createTempObjNode(currentWord, node, currentDoc);
409
+ currentDoc.internalDocument.contents = map;
410
+ // eslint-disable-next-line no-self-assign
411
+ currentDoc.internalDocument = currentDoc.internalDocument;
412
+ currentProperty = map.items[0];
413
+ node = map;
414
+ }
415
+ else if ((0, yaml_1.isMap)(node)) {
416
+ for (const pair of node.items) {
417
+ if ((0, yaml_1.isNode)(pair.value) && pair.value.range && pair.value.range[0] === offset + 1) {
418
+ node = pair.value;
419
+ }
420
+ }
421
+ }
422
+ else if ((0, yaml_1.isSeq)(node)) {
423
+ if (lineContent.charAt(position.character - 1) !== '-') {
407
424
  const map = this.createTempObjNode(currentWord, node, currentDoc);
408
- currentDoc.internalDocument.contents = map;
425
+ map.items = [];
409
426
  // eslint-disable-next-line no-self-assign
410
427
  currentDoc.internalDocument = currentDoc.internalDocument;
411
- currentProperty = map.items[0];
412
- node = map;
413
- }
414
- else if ((0, yaml_1.isMap)(node)) {
415
428
  for (const pair of node.items) {
416
- if ((0, yaml_1.isNode)(pair.value) && pair.value.range && pair.value.range[0] === offset + 1) {
417
- node = pair.value;
429
+ if ((0, yaml_1.isMap)(pair)) {
430
+ pair.items.forEach((value) => {
431
+ map.items.push(value);
432
+ });
418
433
  }
419
434
  }
435
+ node = map;
420
436
  }
421
437
  }
422
438
  }
423
- // completion for object keys
424
- if (node && (0, yaml_1.isMap)(node)) {
425
- // don't suggest properties that are already present
426
- const properties = node.items;
427
- for (const p of properties) {
428
- if (!currentProperty || currentProperty !== p) {
429
- if ((0, yaml_1.isScalar)(p.key)) {
430
- proposed[p.key.value + ''] = vscode_languageserver_types_1.CompletionItem.create(existingProposeItem);
431
- }
439
+ }
440
+ // completion for object keys
441
+ if (node && (0, yaml_1.isMap)(node)) {
442
+ // don't suggest properties that are already present
443
+ const properties = node.items;
444
+ for (const p of properties) {
445
+ if (!currentProperty || currentProperty !== p) {
446
+ if ((0, yaml_1.isScalar)(p.key)) {
447
+ proposed[p.key.value + ''] = vscode_languageserver_types_1.CompletionItem.create(existingProposeItem);
432
448
  }
433
449
  }
434
- this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange);
435
- if (!schema && currentWord.length > 0 && text.charAt(offset - currentWord.length - 1) !== '"') {
436
- collector.add({
437
- kind: vscode_languageserver_types_1.CompletionItemKind.Property,
438
- label: currentWord,
439
- insertText: this.getInsertTextForProperty(currentWord, null, ''),
440
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
441
- });
442
- }
443
450
  }
444
- // proposals for values
445
- const types = {};
446
- this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types);
447
- }
448
- catch (err) {
449
- this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(err) });
451
+ this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange, doComplete);
452
+ if (!schema && currentWord.length > 0 && text.charAt(offset - currentWord.length - 1) !== '"') {
453
+ collector.add({
454
+ kind: vscode_languageserver_types_1.CompletionItemKind.Property,
455
+ label: currentWord,
456
+ insertText: this.getInsertTextForProperty(currentWord, null, ''),
457
+ insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
458
+ });
459
+ }
450
460
  }
451
- this.finalizeParentCompletion(result);
452
- return result;
453
- });
461
+ // proposals for values
462
+ const types = {};
463
+ this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types, doComplete);
464
+ }
465
+ catch (err) {
466
+ this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(err) });
467
+ }
468
+ this.finalizeParentCompletion(result);
469
+ const uniqueItems = result.items.filter((arr, index, self) => index ===
470
+ self.findIndex((item) => item.label === arr.label && item.insertText === arr.insertText && item.kind === arr.kind));
471
+ if (uniqueItems?.length > 0) {
472
+ result.items = uniqueItems;
473
+ }
474
+ return result;
454
475
  }
455
476
  updateCompletionText(completionItem, text) {
456
477
  completionItem.insertText = text;
@@ -458,11 +479,22 @@ class YamlCompletion {
458
479
  completionItem.textEdit.newText = text;
459
480
  }
460
481
  }
461
- mergeSimpleInsertTexts(label, existingText, addingText) {
482
+ mergeSimpleInsertTexts(label, existingText, addingText, oneOfSchema) {
462
483
  const containsNewLineAfterColon = (value) => {
463
484
  return value.includes('\n');
464
485
  };
486
+ const startWithNewLine = (value) => {
487
+ return value.startsWith('\n');
488
+ };
489
+ const isNullObject = (value) => {
490
+ const index = value.indexOf('\n');
491
+ return index > 0 && value.substring(index, value.length).trim().length === 0;
492
+ };
465
493
  if (containsNewLineAfterColon(existingText) || containsNewLineAfterColon(addingText)) {
494
+ //if the exisiting object null one then replace with the non-null object
495
+ if (oneOfSchema && isNullObject(existingText) && !isNullObject(addingText) && !startWithNewLine(addingText)) {
496
+ return addingText;
497
+ }
466
498
  return undefined;
467
499
  }
468
500
  const existingValues = this.getValuesFromInsertText(existingText);
@@ -542,9 +574,8 @@ class YamlCompletion {
542
574
  map.items[0].value.range = node.range;
543
575
  return map;
544
576
  }
545
- addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange) {
546
- var _a, _b;
547
- const matchingSchemas = doc.getMatchingSchemas(schema.schema);
577
+ addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange, doComplete) {
578
+ const matchingSchemas = doc.getMatchingSchemas(schema.schema, -1, null, doComplete);
548
579
  const existingKey = textBuffer.getText(overwriteRange);
549
580
  const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
550
581
  const hasOnlyWhitespace = lineContent.trim().length === 0;
@@ -552,8 +583,19 @@ class YamlCompletion {
552
583
  const isInArray = lineContent.trimLeft().indexOf('-') === 0;
553
584
  const nodeParent = doc.getParent(node);
554
585
  const matchOriginal = matchingSchemas.find((it) => it.node.internalNode === originalNode && it.schema.properties);
586
+ const oneOfSchema = matchingSchemas.filter((schema) => schema.schema.oneOf).map((oneOfSchema) => oneOfSchema.schema.oneOf)[0];
587
+ let didOneOfSchemaMatches = false;
588
+ if (oneOfSchema?.length < matchingSchemas.length) {
589
+ oneOfSchema?.forEach((property, index) => {
590
+ if (!matchingSchemas[index]?.schema.oneOf && matchingSchemas[index]?.schema.properties === property.properties) {
591
+ didOneOfSchemaMatches = true;
592
+ }
593
+ });
594
+ }
555
595
  for (const schema of matchingSchemas) {
556
- if (((schema.node.internalNode === node && !matchOriginal) || (schema.node.internalNode === originalNode && !hasColon)) &&
596
+ if (((schema.node.internalNode === node && !matchOriginal) ||
597
+ (schema.node.internalNode === originalNode && !hasColon) ||
598
+ (schema.node.parent?.internalNode === originalNode && !hasColon)) &&
557
599
  !schema.inverted) {
558
600
  this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
559
601
  newLineFirst: false,
@@ -596,18 +638,10 @@ class YamlCompletion {
596
638
  textBuffer.getPosition(it.key.range[2]).line === overwriteRange.end.line - 1)) &&
597
639
  pair) {
598
640
  if (Array.isArray(propertySchema.items)) {
599
- this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
641
+ this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {}, 'property');
600
642
  }
601
643
  else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
602
- const insertText = `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`;
603
- const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
604
- collector.add({
605
- kind: this.getSuggestionKind(propertySchema.items.type),
606
- label: '- (array item)',
607
- documentation,
608
- insertText,
609
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
610
- });
644
+ this.addArrayItemValueCompletion(propertySchema.items, separatorAfter, collector);
611
645
  }
612
646
  }
613
647
  let insertText = key;
@@ -616,7 +650,7 @@ class YamlCompletion {
616
650
  }
617
651
  const isNodeNull = ((0, yaml_1.isScalar)(originalNode) && originalNode.value === null) ||
618
652
  ((0, yaml_1.isMap)(originalNode) && originalNode.items.length === 0);
619
- const existsParentCompletion = ((_a = schema.schema.required) === null || _a === void 0 ? void 0 : _a.length) > 0;
653
+ const existsParentCompletion = schema.schema.required?.length > 0;
620
654
  if (!this.parentSkeletonSelectedFirst || !isNodeNull || !existsParentCompletion) {
621
655
  collector.add({
622
656
  kind: vscode_languageserver_types_1.CompletionItemKind.Property,
@@ -624,10 +658,10 @@ class YamlCompletion {
624
658
  insertText,
625
659
  insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
626
660
  documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
627
- });
661
+ }, didOneOfSchemaMatches);
628
662
  }
629
663
  // if the prop is required add it also to parent suggestion
630
- if ((_b = schema.schema.required) === null || _b === void 0 ? void 0 : _b.includes(key)) {
664
+ if (schema.schema.required?.includes(key)) {
631
665
  collector.add({
632
666
  label: key,
633
667
  insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
@@ -649,8 +683,8 @@ class YamlCompletion {
649
683
  // test:
650
684
  // - item1
651
685
  // it will treated as a property key since `:` has been appended
652
- if (nodeParent && (0, yaml_1.isSeq)(nodeParent) && schema.schema.type !== 'object') {
653
- this.addSchemaValueCompletions(schema.schema, separatorAfter, collector, {}, Array.isArray(nodeParent.items));
686
+ if (nodeParent && (0, yaml_1.isSeq)(nodeParent) && (0, schemaUtils_1.isPrimitiveType)(schema.schema)) {
687
+ this.addSchemaValueCompletions(schema.schema, separatorAfter, collector, {}, 'property', Array.isArray(nodeParent.items));
654
688
  }
655
689
  if (schema.schema.propertyNames && schema.schema.additionalProperties && schema.schema.type === 'object') {
656
690
  const propertyNameSchema = (0, jsonParser07_1.asSchema)(schema.schema.propertyNames);
@@ -684,13 +718,13 @@ class YamlCompletion {
684
718
  }
685
719
  }
686
720
  }
687
- getValueCompletions(schema, doc, node, offset, document, collector, types) {
721
+ getValueCompletions(schema, doc, node, offset, document, collector, types, doComplete) {
688
722
  let parentKey = null;
689
723
  if (node && (0, yaml_1.isScalar)(node)) {
690
724
  node = doc.getParent(node);
691
725
  }
692
726
  if (!node) {
693
- this.addSchemaValueCompletions(schema.schema, '', collector, types);
727
+ this.addSchemaValueCompletions(schema.schema, '', collector, types, 'value');
694
728
  return;
695
729
  }
696
730
  if ((0, yaml_1.isPair)(node)) {
@@ -703,7 +737,7 @@ class YamlCompletion {
703
737
  }
704
738
  if (node && (parentKey !== null || (0, yaml_1.isSeq)(node))) {
705
739
  const separatorAfter = '';
706
- const matchingSchemas = doc.getMatchingSchemas(schema.schema);
740
+ const matchingSchemas = doc.getMatchingSchemas(schema.schema, -1, null, doComplete);
707
741
  for (const s of matchingSchemas) {
708
742
  if (s.node.internalNode === node && !s.inverted && s.schema) {
709
743
  if (s.schema.items) {
@@ -716,54 +750,26 @@ class YamlCompletion {
716
750
  if (Array.isArray(s.schema.items)) {
717
751
  const index = this.findItemAtOffset(node, document, offset);
718
752
  if (index < s.schema.items.length) {
719
- this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types);
753
+ this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types, 'value');
720
754
  }
721
755
  }
722
- else if (typeof s.schema.items === 'object' && s.schema.items.type === 'object') {
723
- const insertText = `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`;
724
- const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description ? ' (' + s.schema.description + ')' : ''}`, insertText);
725
- collector.add({
726
- kind: this.getSuggestionKind(s.schema.items.type),
727
- label: '- (array item)',
728
- documentation,
729
- insertText,
730
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
731
- });
732
- this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
733
- }
734
- else if (typeof s.schema.items === 'object' && s.schema.items.anyOf) {
735
- s.schema.items.anyOf
736
- .filter((i) => typeof i === 'object')
737
- .forEach((i, index) => {
738
- const schemaType = (0, schemaUtils_1.getSchemaTypeName)(i);
739
- const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
740
- //append insertText to documentation
741
- const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
742
- const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
743
- const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
744
- collector.add({
745
- kind: this.getSuggestionKind(i.type),
746
- label: '- (array item) ' + (schemaType || index + 1),
747
- documentation: documentation,
748
- insertText: insertText,
749
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
750
- });
751
- });
752
- this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
756
+ else if (typeof s.schema.items === 'object' &&
757
+ (s.schema.items.type === 'object' || (0, schemaUtils_1.isAnyOfAllOfOneOfType)(s.schema.items))) {
758
+ this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types, 'value', true);
753
759
  }
754
760
  else {
755
- this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
761
+ this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types, 'value');
756
762
  }
757
763
  }
758
764
  }
759
765
  if (s.schema.properties) {
760
766
  const propertySchema = s.schema.properties[parentKey];
761
767
  if (propertySchema) {
762
- this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types);
768
+ this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types, 'value');
763
769
  }
764
770
  }
765
771
  else if (s.schema.additionalProperties) {
766
- this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types);
772
+ this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types, 'value');
767
773
  }
768
774
  }
769
775
  }
@@ -776,6 +782,21 @@ class YamlCompletion {
776
782
  }
777
783
  }
778
784
  }
785
+ addArrayItemValueCompletion(schema, separatorAfter, collector, index) {
786
+ const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
787
+ const insertText = `- ${this.getInsertTextForObject(schema, separatorAfter).insertText.trimLeft()}`;
788
+ //append insertText to documentation
789
+ const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
790
+ const schemaDescription = schema.description ? ' (' + schema.description + ')' : '';
791
+ const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
792
+ collector.add({
793
+ kind: this.getSuggestionKind(schema.type),
794
+ label: '- (array item) ' + (schemaType || index),
795
+ documentation: documentation,
796
+ insertText: insertText,
797
+ insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
798
+ });
799
+ }
779
800
  getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
780
801
  const propertyText = this.getInsertTextForValue(key, '', 'string');
781
802
  const resultText = propertyText + ':';
@@ -924,7 +945,7 @@ class YamlCompletion {
924
945
  if (arrayInsertLines.length > 1) {
925
946
  for (let index = 1; index < arrayInsertLines.length; index++) {
926
947
  const element = arrayInsertLines[index];
927
- arrayInsertLines[index] = `${indent}${this.indentation} ${element.trimLeft()}`;
948
+ arrayInsertLines[index] = ` ${element}`;
928
949
  }
929
950
  arrayTemplate = arrayInsertLines.join('\n');
930
951
  }
@@ -946,7 +967,9 @@ class YamlCompletion {
946
967
  case 'boolean':
947
968
  case 'number':
948
969
  case 'integer':
949
- insertText += `${indent}${key}: \${${insertIndex++}:${propertySchema.default}}\n`;
970
+ insertText += `${indent}${
971
+ //added quote if key is null
972
+ key === 'null' ? this.getInsertTextForValue(key, '', 'string') : key}: \${${insertIndex++}:${propertySchema.default}}\n`;
950
973
  break;
951
974
  case 'string':
952
975
  insertText += `${indent}${key}: \${${insertIndex++}:${convertToStringValue(propertySchema.default)}}\n`;
@@ -1075,24 +1098,28 @@ class YamlCompletion {
1075
1098
  }
1076
1099
  return this.getInsertTextForPlainText(value + separatorAfter);
1077
1100
  }
1078
- addSchemaValueCompletions(schema, separatorAfter, collector, types, isArray) {
1101
+ addSchemaValueCompletions(schema, separatorAfter, collector, types, completionType, isArray) {
1079
1102
  if (typeof schema === 'object') {
1080
1103
  this.addEnumValueCompletions(schema, separatorAfter, collector, isArray);
1081
1104
  this.addDefaultValueCompletions(schema, separatorAfter, collector);
1082
1105
  this.collectTypes(schema, types);
1106
+ if (isArray && completionType === 'value' && !(0, schemaUtils_1.isAnyOfAllOfOneOfType)(schema)) {
1107
+ // add array only for final types (no anyOf, allOf, oneOf)
1108
+ this.addArrayItemValueCompletion(schema, separatorAfter, collector);
1109
+ }
1083
1110
  if (Array.isArray(schema.allOf)) {
1084
1111
  schema.allOf.forEach((s) => {
1085
- return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
1112
+ return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
1086
1113
  });
1087
1114
  }
1088
1115
  if (Array.isArray(schema.anyOf)) {
1089
1116
  schema.anyOf.forEach((s) => {
1090
- return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
1117
+ return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
1091
1118
  });
1092
1119
  }
1093
1120
  if (Array.isArray(schema.oneOf)) {
1094
1121
  schema.oneOf.forEach((s) => {
1095
- return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
1122
+ return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
1096
1123
  });
1097
1124
  }
1098
1125
  }
@@ -1265,7 +1292,7 @@ class YamlCompletion {
1265
1292
  }
1266
1293
  return value;
1267
1294
  };
1268
- return (0, json_1.stringifyObject)(value, '', replacer, Object.assign(Object.assign({}, settings), { indentation: this.indentation }), depth) + separatorAfter;
1295
+ return (0, json_1.stringifyObject)(value, '', replacer, { ...settings, indentation: this.indentation }, depth) + separatorAfter;
1269
1296
  }
1270
1297
  addBooleanValueCompletion(value, separatorAfter, collector) {
1271
1298
  collector.add({
@@ -1433,8 +1460,7 @@ function convertToStringValue(param) {
1433
1460
  * simplify `{$1:value}` to `value`
1434
1461
  */
1435
1462
  function evaluateTab1Symbol(value) {
1436
- const result = value.replace(/\$\{1:(.*)\}/, '$1');
1437
- return result;
1463
+ return value.replace(/\$\{1:(.*)\}/, '$1');
1438
1464
  }
1439
1465
  function isParentCompletionItem(item) {
1440
1466
  return 'parent' in item;