@actions/languageservice 0.2.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 (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/action.d.ts +28 -0
  4. package/dist/action.d.ts.map +1 -0
  5. package/dist/action.js +36 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/complete.d.ts +15 -0
  8. package/dist/complete.d.ts.map +1 -0
  9. package/dist/complete.js +203 -0
  10. package/dist/complete.js.map +1 -0
  11. package/dist/context/workflow-context.d.ts +15 -0
  12. package/dist/context/workflow-context.d.ts.map +1 -0
  13. package/dist/context/workflow-context.js +64 -0
  14. package/dist/context/workflow-context.js.map +1 -0
  15. package/dist/context-providers/config.d.ts +7 -0
  16. package/dist/context-providers/config.d.ts.map +1 -0
  17. package/dist/context-providers/config.js +2 -0
  18. package/dist/context-providers/config.js.map +1 -0
  19. package/dist/context-providers/default.d.ts +11 -0
  20. package/dist/context-providers/default.d.ts.map +1 -0
  21. package/dist/context-providers/default.js +88 -0
  22. package/dist/context-providers/default.js.map +1 -0
  23. package/dist/context-providers/descriptions.d.ts +15 -0
  24. package/dist/context-providers/descriptions.d.ts.map +1 -0
  25. package/dist/context-providers/descriptions.js +23 -0
  26. package/dist/context-providers/descriptions.js.map +1 -0
  27. package/dist/context-providers/descriptions.json +241 -0
  28. package/dist/context-providers/env.d.ts +4 -0
  29. package/dist/context-providers/env.d.ts.map +1 -0
  30. package/dist/context-providers/env.js +29 -0
  31. package/dist/context-providers/env.js.map +1 -0
  32. package/dist/context-providers/events/eventPayloads.d.ts +4 -0
  33. package/dist/context-providers/events/eventPayloads.d.ts.map +1 -0
  34. package/dist/context-providers/events/eventPayloads.js +111 -0
  35. package/dist/context-providers/events/eventPayloads.js.map +1 -0
  36. package/dist/context-providers/events/objects.json +26220 -0
  37. package/dist/context-providers/events/schedule.json +102 -0
  38. package/dist/context-providers/events/webhooks.json +124811 -0
  39. package/dist/context-providers/events/workflow_call.json +134 -0
  40. package/dist/context-providers/github.d.ts +5 -0
  41. package/dist/context-providers/github.d.ts.map +1 -0
  42. package/dist/context-providers/github.js +139 -0
  43. package/dist/context-providers/github.js.map +1 -0
  44. package/dist/context-providers/inputs.d.ts +4 -0
  45. package/dist/context-providers/inputs.d.ts.map +1 -0
  46. package/dist/context-providers/inputs.js +52 -0
  47. package/dist/context-providers/inputs.js.map +1 -0
  48. package/dist/context-providers/job.d.ts +4 -0
  49. package/dist/context-providers/job.d.ts.map +1 -0
  50. package/dist/context-providers/job.js +61 -0
  51. package/dist/context-providers/job.js.map +1 -0
  52. package/dist/context-providers/jobs.d.ts +4 -0
  53. package/dist/context-providers/jobs.d.ts.map +1 -0
  54. package/dist/context-providers/jobs.js +30 -0
  55. package/dist/context-providers/jobs.js.map +1 -0
  56. package/dist/context-providers/matrix.d.ts +4 -0
  57. package/dist/context-providers/matrix.d.ts.map +1 -0
  58. package/dist/context-providers/matrix.js +163 -0
  59. package/dist/context-providers/matrix.js.map +1 -0
  60. package/dist/context-providers/needs.d.ts +4 -0
  61. package/dist/context-providers/needs.d.ts.map +1 -0
  62. package/dist/context-providers/needs.js +56 -0
  63. package/dist/context-providers/needs.js.map +1 -0
  64. package/dist/context-providers/secrets.d.ts +5 -0
  65. package/dist/context-providers/secrets.d.ts.map +1 -0
  66. package/dist/context-providers/secrets.js +23 -0
  67. package/dist/context-providers/secrets.js.map +1 -0
  68. package/dist/context-providers/steps.d.ts +4 -0
  69. package/dist/context-providers/steps.d.ts.map +1 -0
  70. package/dist/context-providers/steps.js +35 -0
  71. package/dist/context-providers/steps.js.map +1 -0
  72. package/dist/context-providers/strategy.d.ts +4 -0
  73. package/dist/context-providers/strategy.d.ts.map +1 -0
  74. package/dist/context-providers/strategy.js +31 -0
  75. package/dist/context-providers/strategy.js.map +1 -0
  76. package/dist/description-providers/reusable-job-inputs.d.ts +5 -0
  77. package/dist/description-providers/reusable-job-inputs.d.ts.map +1 -0
  78. package/dist/description-providers/reusable-job-inputs.js +29 -0
  79. package/dist/description-providers/reusable-job-inputs.js.map +1 -0
  80. package/dist/document-links.d.ts +4 -0
  81. package/dist/document-links.d.ts.map +1 -0
  82. package/dist/document-links.js +73 -0
  83. package/dist/document-links.js.map +1 -0
  84. package/dist/expression-hover/expression-pos.d.ts +13 -0
  85. package/dist/expression-hover/expression-pos.d.ts.map +1 -0
  86. package/dist/expression-hover/expression-pos.js +41 -0
  87. package/dist/expression-hover/expression-pos.js.map +1 -0
  88. package/dist/expression-hover/pos-range.d.ts +3 -0
  89. package/dist/expression-hover/pos-range.d.ts.map +1 -0
  90. package/dist/expression-hover/pos-range.js +7 -0
  91. package/dist/expression-hover/pos-range.js.map +1 -0
  92. package/dist/expression-hover/visitor.d.ts +27 -0
  93. package/dist/expression-hover/visitor.d.ts.map +1 -0
  94. package/dist/expression-hover/visitor.js +116 -0
  95. package/dist/expression-hover/visitor.js.map +1 -0
  96. package/dist/expression-validation/error-dictionary.d.ts +13 -0
  97. package/dist/expression-validation/error-dictionary.d.ts.map +1 -0
  98. package/dist/expression-validation/error-dictionary.js +39 -0
  99. package/dist/expression-validation/error-dictionary.js.map +1 -0
  100. package/dist/expression-validation/functions.d.ts +9 -0
  101. package/dist/expression-validation/functions.d.ts.map +1 -0
  102. package/dist/expression-validation/functions.js +11 -0
  103. package/dist/expression-validation/functions.js.map +1 -0
  104. package/dist/hover.d.ts +16 -0
  105. package/dist/hover.d.ts.map +1 -0
  106. package/dist/hover.js +154 -0
  107. package/dist/hover.js.map +1 -0
  108. package/dist/index.d.ts +8 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +7 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/log.d.ts +39 -0
  113. package/dist/log.d.ts.map +1 -0
  114. package/dist/log.js +48 -0
  115. package/dist/log.js.map +1 -0
  116. package/dist/nulltrace.d.ts +3 -0
  117. package/dist/nulltrace.d.ts.map +1 -0
  118. package/dist/nulltrace.js +3 -0
  119. package/dist/nulltrace.js.map +1 -0
  120. package/dist/utils/expression-detection.d.ts +3 -0
  121. package/dist/utils/expression-detection.d.ts.map +1 -0
  122. package/dist/utils/expression-detection.js +9 -0
  123. package/dist/utils/expression-detection.js.map +1 -0
  124. package/dist/utils/find-token.d.ts +23 -0
  125. package/dist/utils/find-token.d.ts.map +1 -0
  126. package/dist/utils/find-token.js +159 -0
  127. package/dist/utils/find-token.js.map +1 -0
  128. package/dist/utils/indentation-guesser.d.ts +16 -0
  129. package/dist/utils/indentation-guesser.d.ts.map +1 -0
  130. package/dist/utils/indentation-guesser.js +214 -0
  131. package/dist/utils/indentation-guesser.js.map +1 -0
  132. package/dist/utils/range.d.ts +5 -0
  133. package/dist/utils/range.d.ts.map +1 -0
  134. package/dist/utils/range.js +25 -0
  135. package/dist/utils/range.js.map +1 -0
  136. package/dist/utils/rel-char-pos.d.ts +4 -0
  137. package/dist/utils/rel-char-pos.d.ts.map +1 -0
  138. package/dist/utils/rel-char-pos.js +14 -0
  139. package/dist/utils/rel-char-pos.js.map +1 -0
  140. package/dist/utils/scalar-to-data.d.ts +4 -0
  141. package/dist/utils/scalar-to-data.d.ts.map +1 -0
  142. package/dist/utils/scalar-to-data.js +19 -0
  143. package/dist/utils/scalar-to-data.js.map +1 -0
  144. package/dist/utils/transform.d.ts +6 -0
  145. package/dist/utils/transform.d.ts.map +1 -0
  146. package/dist/utils/transform.js +66 -0
  147. package/dist/utils/transform.js.map +1 -0
  148. package/dist/utils/workflow-cache.d.ts +21 -0
  149. package/dist/utils/workflow-cache.d.ts.map +1 -0
  150. package/dist/utils/workflow-cache.js +52 -0
  151. package/dist/utils/workflow-cache.js.map +1 -0
  152. package/dist/validate-action.d.ts +6 -0
  153. package/dist/validate-action.d.ts.map +1 -0
  154. package/dist/validate-action.js +71 -0
  155. package/dist/validate-action.js.map +1 -0
  156. package/dist/validate.d.ts +20 -0
  157. package/dist/validate.d.ts.map +1 -0
  158. package/dist/validate.js +162 -0
  159. package/dist/validate.js.map +1 -0
  160. package/dist/value-providers/config.d.ts +24 -0
  161. package/dist/value-providers/config.d.ts.map +1 -0
  162. package/dist/value-providers/config.js +6 -0
  163. package/dist/value-providers/config.js.map +1 -0
  164. package/dist/value-providers/default.d.ts +4 -0
  165. package/dist/value-providers/default.d.ts.map +1 -0
  166. package/dist/value-providers/default.js +38 -0
  167. package/dist/value-providers/default.js.map +1 -0
  168. package/dist/value-providers/definition.d.ts +4 -0
  169. package/dist/value-providers/definition.d.ts.map +1 -0
  170. package/dist/value-providers/definition.js +82 -0
  171. package/dist/value-providers/definition.js.map +1 -0
  172. package/dist/value-providers/needs.d.ts +4 -0
  173. package/dist/value-providers/needs.d.ts.map +1 -0
  174. package/dist/value-providers/needs.js +10 -0
  175. package/dist/value-providers/needs.js.map +1 -0
  176. package/dist/value-providers/reusable-job-inputs.d.ts +4 -0
  177. package/dist/value-providers/reusable-job-inputs.d.ts.map +1 -0
  178. package/dist/value-providers/reusable-job-inputs.js +29 -0
  179. package/dist/value-providers/reusable-job-inputs.js.map +1 -0
  180. package/dist/value-providers/reusable-job-secrets.d.ts +4 -0
  181. package/dist/value-providers/reusable-job-secrets.d.ts.map +1 -0
  182. package/dist/value-providers/reusable-job-secrets.js +41 -0
  183. package/dist/value-providers/reusable-job-secrets.js.map +1 -0
  184. package/dist/value-providers/strings-to-values.d.ts +3 -0
  185. package/dist/value-providers/strings-to-values.d.ts.map +1 -0
  186. package/dist/value-providers/strings-to-values.js +4 -0
  187. package/dist/value-providers/strings-to-values.js.map +1 -0
  188. package/package.json +77 -0
@@ -0,0 +1,159 @@
1
+ import { isString } from "@actions/workflow-parser";
2
+ import { TokenType } from "@actions/workflow-parser/templates/tokens/types";
3
+ export function findInnerToken(pos, root) {
4
+ const { token } = findToken(pos, root);
5
+ return token;
6
+ }
7
+ /**
8
+ * Find a token at the given position in the document.
9
+ *
10
+ * If the position is within
11
+ * - the key of a mapping, parent will be the mapping, keyToken will be null, and token will be the key.
12
+ * - the value of a mapping, parent will be the mapping, keyToken will be the key for the value, and token will be the value
13
+ * - a sequence item, parent will be the sequence, keyToken will be null, and token will be the item
14
+ *
15
+ * @param pos Position within the document for which to find a token
16
+ * @param root Root node
17
+ * @returns Token result
18
+ */
19
+ export function findToken(pos, root) {
20
+ if (!root) {
21
+ return {
22
+ token: null,
23
+ keyToken: null,
24
+ parent: null,
25
+ path: []
26
+ };
27
+ }
28
+ let lastMatching = null;
29
+ const s = [
30
+ {
31
+ token: root,
32
+ keyToken: null,
33
+ parent: null,
34
+ path: []
35
+ }
36
+ ];
37
+ while (s.length > 0) {
38
+ const result = s.shift(); // eslint-disable-line @typescript-eslint/no-non-null-assertion
39
+ const { parent, token, keyToken, path } = result;
40
+ if (!token) {
41
+ break;
42
+ }
43
+ if (!posInToken(pos, token)) {
44
+ continue;
45
+ }
46
+ // Pos is in token, remember this token
47
+ lastMatching = result;
48
+ // Position is in token, enqueue children if there are any
49
+ switch (token.templateTokenType) {
50
+ case TokenType.Mapping: {
51
+ const mappingToken = token;
52
+ for (const { key, value } of mappingToken) {
53
+ // If the position is within the key, immediately return it as the token.
54
+ if (posInToken(pos, key)) {
55
+ return {
56
+ parent: mappingToken,
57
+ keyToken: null,
58
+ token: key,
59
+ path: [...path, mappingToken]
60
+ };
61
+ }
62
+ // If pos, key, and value are on the same line, and value is an empty node (null, empty string) return early
63
+ // we cannot reliably check the position in that empty node
64
+ if (onSameLine(pos, key, value) && emptyNode(value)) {
65
+ return {
66
+ parent: mappingToken,
67
+ keyToken: key,
68
+ token: value,
69
+ path: [...path, mappingToken]
70
+ };
71
+ }
72
+ s.push({
73
+ parent: mappingToken,
74
+ keyToken: key,
75
+ token: value,
76
+ path: [...path, mappingToken, key]
77
+ });
78
+ }
79
+ continue;
80
+ }
81
+ case TokenType.Sequence: {
82
+ const sequenceToken = token;
83
+ for (const token of sequenceToken) {
84
+ s.push({
85
+ parent: sequenceToken,
86
+ keyToken: null,
87
+ token: token,
88
+ path: [...path, sequenceToken]
89
+ });
90
+ }
91
+ continue;
92
+ }
93
+ }
94
+ return {
95
+ token,
96
+ keyToken,
97
+ parent,
98
+ path
99
+ };
100
+ }
101
+ // Did not find a matching token, return the last matching token as parent
102
+ return {
103
+ token: null,
104
+ parent: lastMatching?.token ?? null,
105
+ keyToken: null,
106
+ path: lastMatching?.token ? [...lastMatching.path, lastMatching.token] : []
107
+ };
108
+ }
109
+ function posInToken(pos, token) {
110
+ if (!token.range) {
111
+ return false;
112
+ }
113
+ const r = token.range;
114
+ // TokenRange is one-based, Position is zero-based
115
+ const tokenLine = pos.line + 1;
116
+ const tokenChar = pos.character + 1;
117
+ // Check lines
118
+ if (r.start.line > tokenLine || tokenLine > r.end.line) {
119
+ return false;
120
+ }
121
+ // Position is within the token lines. Check character/column if pos line matches
122
+ // start or end
123
+ if ((r.start.line === tokenLine && tokenChar < r.start.column) ||
124
+ (r.end.line === tokenLine && tokenChar > r.end.column)) {
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ function onSameLine(pos, key, value) {
130
+ if (!value.range) {
131
+ return false;
132
+ }
133
+ if (!key.range) {
134
+ return false;
135
+ }
136
+ if (value.range.start.line !== value.range.end.line) {
137
+ // Token occupies multiple lines, can't be an empty node
138
+ return false;
139
+ }
140
+ // TokenRange is one-based, Position is zero-based
141
+ const posLine = pos.line + 1;
142
+ if (posLine != value.range.start.line) {
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+ function emptyNode(token) {
148
+ if (!token) {
149
+ return false;
150
+ }
151
+ if (token.templateTokenType === TokenType.Null) {
152
+ return true;
153
+ }
154
+ if (isString(token)) {
155
+ return token.value === "";
156
+ }
157
+ return false;
158
+ }
159
+ //# sourceMappingURL=find-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-token.js","sourceRoot":"","sources":["../../src/utils/find-token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { TextDocument } from "vscode-languageserver-textdocument";
2
+ /**
3
+ * Result for a guessIndentation
4
+ */
5
+ export interface IGuessedIndentation {
6
+ /**
7
+ * If indentation is based on spaces (`insertSpaces` = true), then what is the number of spaces that make an indent?
8
+ */
9
+ tabSize: number;
10
+ /**
11
+ * Is indentation based on spaces?
12
+ */
13
+ insertSpaces: boolean;
14
+ }
15
+ export declare function guessIndentation(source: TextDocument, defaultTabSize: number, defaultInsertSpaces: boolean): IGuessedIndentation;
16
+ //# sourceMappingURL=indentation-guesser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indentation-guesser.d.ts","sourceRoot":"","sources":["../../src/utils/indentation-guesser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AA4HhE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,EACtB,mBAAmB,EAAE,OAAO,GAC3B,mBAAmB,CA2HrB"}
@@ -0,0 +1,214 @@
1
+ // Copied from https://github.com/microsoft/vscode/blob/c3b617f9b058e01cbc5cf00ec3813a7047326503/src/vs/editor/common/model/indentationGuesser.ts
2
+ // And adapted to work with languageserver-textdocument types
3
+ var CharCode;
4
+ (function (CharCode) {
5
+ CharCode[CharCode["Space"] = 32] = "Space";
6
+ CharCode[CharCode["Tab"] = 9] = "Tab";
7
+ CharCode[CharCode["Comma"] = 44] = "Comma";
8
+ })(CharCode || (CharCode = {}));
9
+ function getLineContent(doc, lineNumber) {
10
+ return doc.getText({
11
+ start: {
12
+ line: lineNumber - 1,
13
+ character: 0
14
+ },
15
+ end: {
16
+ line: lineNumber - 1,
17
+ character: Number.MAX_SAFE_INTEGER
18
+ }
19
+ });
20
+ }
21
+ function getLineCharCode(doc, lineNumber, index) {
22
+ return doc
23
+ .getText({
24
+ start: {
25
+ line: lineNumber - 1,
26
+ character: index
27
+ },
28
+ end: {
29
+ line: lineNumber - 1,
30
+ character: index + 1
31
+ }
32
+ })
33
+ .charCodeAt(0);
34
+ }
35
+ /*---------------------------------------------------------------------------------------------
36
+ * Copyright (c) Microsoft Corporation. All rights reserved.
37
+ * Licensed under the MIT License. See License.txt in the project root for license information.
38
+ *--------------------------------------------------------------------------------------------*/
39
+ class SpacesDiffResult {
40
+ constructor() {
41
+ this.spacesDiff = 0;
42
+ this.looksLikeAlignment = false;
43
+ }
44
+ }
45
+ /**
46
+ * Compute the diff in spaces between two line's indentation.
47
+ */
48
+ function spacesDiff(a, aLength, b, bLength, result) {
49
+ result.spacesDiff = 0;
50
+ result.looksLikeAlignment = false;
51
+ // This can go both ways (e.g.):
52
+ // - a: "\t"
53
+ // - b: "\t "
54
+ // => This should count 1 tab and 4 spaces
55
+ let i;
56
+ for (i = 0; i < aLength && i < bLength; i++) {
57
+ const aCharCode = a.charCodeAt(i);
58
+ const bCharCode = b.charCodeAt(i);
59
+ if (aCharCode !== bCharCode) {
60
+ break;
61
+ }
62
+ }
63
+ let aSpacesCnt = 0, aTabsCount = 0;
64
+ for (let j = i; j < aLength; j++) {
65
+ const aCharCode = a.charCodeAt(j);
66
+ if (aCharCode === CharCode.Space) {
67
+ aSpacesCnt++;
68
+ }
69
+ else {
70
+ aTabsCount++;
71
+ }
72
+ }
73
+ let bSpacesCnt = 0, bTabsCount = 0;
74
+ for (let j = i; j < bLength; j++) {
75
+ const bCharCode = b.charCodeAt(j);
76
+ if (bCharCode === CharCode.Space) {
77
+ bSpacesCnt++;
78
+ }
79
+ else {
80
+ bTabsCount++;
81
+ }
82
+ }
83
+ if (aSpacesCnt > 0 && aTabsCount > 0) {
84
+ return;
85
+ }
86
+ if (bSpacesCnt > 0 && bTabsCount > 0) {
87
+ return;
88
+ }
89
+ const tabsDiff = Math.abs(aTabsCount - bTabsCount);
90
+ const spacesDiff = Math.abs(aSpacesCnt - bSpacesCnt);
91
+ if (tabsDiff === 0) {
92
+ // check if the indentation difference might be caused by alignment reasons
93
+ // sometime folks like to align their code, but this should not be used as a hint
94
+ result.spacesDiff = spacesDiff;
95
+ if (spacesDiff > 0 && 0 <= bSpacesCnt - 1 && bSpacesCnt - 1 < a.length && bSpacesCnt < b.length) {
96
+ if (b.charCodeAt(bSpacesCnt) !== CharCode.Space && a.charCodeAt(bSpacesCnt - 1) === CharCode.Space) {
97
+ if (a.charCodeAt(a.length - 1) === CharCode.Comma) {
98
+ // This looks like an alignment desire: e.g.
99
+ // const a = b + c,
100
+ // d = b - c;
101
+ result.looksLikeAlignment = true;
102
+ }
103
+ }
104
+ }
105
+ return;
106
+ }
107
+ if (spacesDiff % tabsDiff === 0) {
108
+ result.spacesDiff = spacesDiff / tabsDiff;
109
+ return;
110
+ }
111
+ }
112
+ export function guessIndentation(source, defaultTabSize, defaultInsertSpaces) {
113
+ // Look at most at the first 10k lines
114
+ const linesCount = Math.min(source.lineCount, 10000);
115
+ let linesIndentedWithTabsCount = 0; // number of lines that contain at least one tab in indentation
116
+ let linesIndentedWithSpacesCount = 0; // number of lines that contain only spaces in indentation
117
+ let previousLineText = ""; // content of latest line that contained non-whitespace chars
118
+ let previousLineIndentation = 0; // index at which latest line contained the first non-whitespace char
119
+ const ALLOWED_TAB_SIZE_GUESSES = [2, 4, 6, 8, 3, 5, 7]; // prefer even guesses for `tabSize`, limit to [2, 8].
120
+ const MAX_ALLOWED_TAB_SIZE_GUESS = 8; // max(ALLOWED_TAB_SIZE_GUESSES) = 8
121
+ const spacesDiffCount = [0, 0, 0, 0, 0, 0, 0, 0, 0]; // `tabSize` scores
122
+ const tmp = new SpacesDiffResult();
123
+ for (let lineNumber = 1; lineNumber <= linesCount; lineNumber++) {
124
+ const currentLineText = getLineContent(source, lineNumber);
125
+ const currentLineLength = currentLineText.length;
126
+ // if the text buffer is chunk based, so long lines are cons-string, v8 will flattern the string when we check charCode.
127
+ // checking charCode on chunks directly is cheaper.
128
+ const useCurrentLineText = currentLineLength <= 65536;
129
+ let currentLineHasContent = false; // does `currentLineText` contain non-whitespace chars
130
+ let currentLineIndentation = 0; // index at which `currentLineText` contains the first non-whitespace char
131
+ let currentLineSpacesCount = 0; // count of spaces found in `currentLineText` indentation
132
+ let currentLineTabsCount = 0; // count of tabs found in `currentLineText` indentation
133
+ for (let j = 0, lenJ = currentLineLength; j < lenJ; j++) {
134
+ const charCode = useCurrentLineText ? currentLineText.charCodeAt(j) : getLineCharCode(source, lineNumber, j);
135
+ if (charCode === CharCode.Tab) {
136
+ currentLineTabsCount++;
137
+ }
138
+ else if (charCode === CharCode.Space) {
139
+ currentLineSpacesCount++;
140
+ }
141
+ else {
142
+ // Hit non whitespace character on this line
143
+ currentLineHasContent = true;
144
+ currentLineIndentation = j;
145
+ break;
146
+ }
147
+ }
148
+ // Ignore empty or only whitespace lines
149
+ if (!currentLineHasContent) {
150
+ continue;
151
+ }
152
+ if (currentLineTabsCount > 0) {
153
+ linesIndentedWithTabsCount++;
154
+ }
155
+ else if (currentLineSpacesCount > 1) {
156
+ linesIndentedWithSpacesCount++;
157
+ }
158
+ spacesDiff(previousLineText, previousLineIndentation, currentLineText, currentLineIndentation, tmp);
159
+ if (tmp.looksLikeAlignment) {
160
+ // if defaultInsertSpaces === true && the spaces count == tabSize, we may want to count it as valid indentation
161
+ //
162
+ // - item1
163
+ // - item2
164
+ //
165
+ // otherwise skip this line entirely
166
+ //
167
+ // const a = 1,
168
+ // b = 2;
169
+ if (!(defaultInsertSpaces && defaultTabSize === tmp.spacesDiff)) {
170
+ continue;
171
+ }
172
+ }
173
+ const currentSpacesDiff = tmp.spacesDiff;
174
+ if (currentSpacesDiff <= MAX_ALLOWED_TAB_SIZE_GUESS) {
175
+ spacesDiffCount[currentSpacesDiff]++;
176
+ }
177
+ previousLineText = currentLineText;
178
+ previousLineIndentation = currentLineIndentation;
179
+ }
180
+ let insertSpaces = defaultInsertSpaces;
181
+ if (linesIndentedWithTabsCount !== linesIndentedWithSpacesCount) {
182
+ insertSpaces = linesIndentedWithTabsCount < linesIndentedWithSpacesCount;
183
+ }
184
+ let tabSize = defaultTabSize;
185
+ // Guess tabSize only if inserting spaces...
186
+ if (insertSpaces) {
187
+ let tabSizeScore = insertSpaces ? 0 : 0.1 * linesCount;
188
+ // console.log("score threshold: " + tabSizeScore);
189
+ ALLOWED_TAB_SIZE_GUESSES.forEach(possibleTabSize => {
190
+ const possibleTabSizeScore = spacesDiffCount[possibleTabSize];
191
+ if (possibleTabSizeScore > tabSizeScore) {
192
+ tabSizeScore = possibleTabSizeScore;
193
+ tabSize = possibleTabSize;
194
+ }
195
+ });
196
+ // Let a tabSize of 2 win even if it is not the maximum
197
+ // (only in case 4 was guessed)
198
+ if (tabSize === 4 &&
199
+ spacesDiffCount[4] > 0 &&
200
+ spacesDiffCount[2] > 0 &&
201
+ spacesDiffCount[2] >= spacesDiffCount[4] / 2) {
202
+ tabSize = 2;
203
+ }
204
+ }
205
+ // console.log('--------------------------');
206
+ // console.log('linesIndentedWithTabsCount: ' + linesIndentedWithTabsCount + ', linesIndentedWithSpacesCount: ' + linesIndentedWithSpacesCount);
207
+ // console.log('spacesDiffCount: ' + spacesDiffCount);
208
+ // console.log('tabSize: ' + tabSize + ', tabSizeScore: ' + tabSizeScore);
209
+ return {
210
+ insertSpaces: insertSpaces,
211
+ tabSize: tabSize
212
+ };
213
+ }
214
+ //# sourceMappingURL=indentation-guesser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indentation-guesser.js","sourceRoot":"","sources":["../../src/utils/indentation-guesser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Position as TokenPosition, TokenRange } from "@actions/workflow-parser/templates/tokens/token-range";
2
+ import { Position, Range } from "vscode-languageserver-types";
3
+ export declare function mapRange(range: TokenRange | undefined): Range;
4
+ export declare function mapPosition(position: TokenPosition): Position;
5
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/utils/range.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,IAAI,aAAa,EAAE,UAAU,EAAC,MAAM,uDAAuD,CAAC;AAC5G,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,6BAA6B,CAAC;AAE5D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,CAkB7D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,CAK7D"}
@@ -0,0 +1,25 @@
1
+ export function mapRange(range) {
2
+ if (!range) {
3
+ return {
4
+ start: {
5
+ line: 1,
6
+ character: 1
7
+ },
8
+ end: {
9
+ line: 1,
10
+ character: 1
11
+ }
12
+ };
13
+ }
14
+ return {
15
+ start: mapPosition(range.start),
16
+ end: mapPosition(range.end)
17
+ };
18
+ }
19
+ export function mapPosition(position) {
20
+ return {
21
+ line: position.line - 1,
22
+ character: position.column - 1
23
+ };
24
+ }
25
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/utils/range.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,QAAQ,CAAC,KAA6B;IACpD,IAAI,CAAC,KAAK,EAAE;QACV,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,CAAC;aACb;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,CAAC;aACb;SACF,CAAC;KACH;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAuB;IACjD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;QACvB,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { TokenRange } from "@actions/workflow-parser/templates/tokens/token-range";
2
+ import { Position } from "vscode-languageserver-textdocument";
3
+ export declare function getRelCharOffset(tokenRange: TokenRange, currentInput: string, pos: Position): number;
4
+ //# sourceMappingURL=rel-char-pos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rel-char-pos.d.ts","sourceRoot":"","sources":["../../src/utils/rel-char-pos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,uDAAuD,CAAC;AACjF,OAAO,EAAC,QAAQ,EAAC,MAAM,oCAAoC,CAAC;AAG5D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAUpG"}
@@ -0,0 +1,14 @@
1
+ import { mapRange } from "./range";
2
+ export function getRelCharOffset(tokenRange, currentInput, pos) {
3
+ const range = mapRange(tokenRange);
4
+ if (range.start.line !== range.end.line) {
5
+ const lines = currentInput.split("\n");
6
+ const lineDiff = pos.line - range.start.line - 1;
7
+ const linesBeforeCusor = lines.slice(0, lineDiff);
8
+ return linesBeforeCusor.join("\n").length + pos.character + 1;
9
+ }
10
+ else {
11
+ return pos.character - range.start.character;
12
+ }
13
+ }
14
+ //# sourceMappingURL=rel-char-pos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rel-char-pos.js","sourceRoot":"","sources":["../../src/utils/rel-char-pos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,UAAsB,EAAE,YAAoB,EAAE,GAAa;IAC1F,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;QACvC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;KAC/D;SAAM;QACL,OAAO,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;KAC9C;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { data } from "@actions/expressions";
2
+ import { ScalarToken } from "@actions/workflow-parser/templates/tokens/scalar-token";
3
+ export declare function scalarToData(scalar: ScalarToken): data.ExpressionData;
4
+ //# sourceMappingURL=scalar-to-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar-to-data.d.ts","sourceRoot":"","sources":["../../src/utils/scalar-to-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,WAAW,EAAC,MAAM,wDAAwD,CAAC;AAGnF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,cAAc,CAkBrE"}
@@ -0,0 +1,19 @@
1
+ import { data } from "@actions/expressions";
2
+ import { isBoolean, isNumber, isString } from "@actions/workflow-parser";
3
+ import { TokenType } from "@actions/workflow-parser/templates/tokens/types";
4
+ export function scalarToData(scalar) {
5
+ if (isNumber(scalar)) {
6
+ return new data.NumberData(scalar.value);
7
+ }
8
+ if (isString(scalar)) {
9
+ return new data.StringData(scalar.value);
10
+ }
11
+ if (isBoolean(scalar)) {
12
+ return new data.BooleanData(scalar.value);
13
+ }
14
+ if (scalar.templateTokenType === TokenType.Null) {
15
+ return new data.Null();
16
+ }
17
+ return new data.StringData(scalar.toDisplayString());
18
+ }
19
+ //# sourceMappingURL=scalar-to-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar-to-data.js","sourceRoot":"","sources":["../../src/utils/scalar-to-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAC,SAAS,EAAC,MAAM,iDAAiD,CAAC;AAE1E,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;QACpB,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1C;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;QACpB,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1C;IAED,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE;QACrB,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3C;IAED,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAC,IAAI,EAAE;QAC/C,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;KACxB;IAED,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { StringToken } from "@actions/workflow-parser/templates/tokens/string-token";
2
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/template-token";
3
+ import { Position, TextDocument } from "vscode-languageserver-textdocument";
4
+ export declare function transform(doc: TextDocument, pos: Position): [TextDocument, Position];
5
+ export declare function isPlaceholder(key: StringToken, value: TemplateToken): boolean;
6
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utils/transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,wDAAwD,CAAC;AACnF,OAAO,EAAC,aAAa,EAAC,MAAM,0DAA0D,CAAC;AACvF,OAAO,EAAC,QAAQ,EAAE,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAO1E,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAkEpF;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,WAMnE"}
@@ -0,0 +1,66 @@
1
+ import { isString } from "@actions/workflow-parser";
2
+ import { TextDocument } from "vscode-languageserver-textdocument";
3
+ const PLACEHOLDER_KEY = "key";
4
+ // Transform a document to work around YAML parsing issues
5
+ // Based on `_transform` in https://github.com/cschleiden/github-actions-parser/blob/main/src/lib/parser/complete.ts#L311
6
+ export function transform(doc, pos) {
7
+ let offset = doc.offsetAt(pos);
8
+ const lineRange = {
9
+ start: { line: pos.line, character: 0 },
10
+ end: { line: pos.line, character: Number.MAX_SAFE_INTEGER }
11
+ };
12
+ let line = doc.getText(lineRange);
13
+ // If the line includes a new-line char, strip that out
14
+ const newLinePos = line.indexOf("\n");
15
+ if (newLinePos >= 0) {
16
+ line = line.substring(0, newLinePos);
17
+ }
18
+ lineRange.end.character = line.length;
19
+ const linePos = pos.character;
20
+ // Special case for Actions, if this line contains an expression marker, do _not_ transform. This is
21
+ // an ugly fix for auto-completion in multi-line YAML strings. At this point in the process, we cannot
22
+ // determine if a line is in such a multi-line string.
23
+ if (line.indexOf("${{") !== -1) {
24
+ return [doc, pos];
25
+ }
26
+ const containsColon = line.indexOf(":") !== -1;
27
+ if (!containsColon) {
28
+ const trimmedLine = line.trim();
29
+ if (trimmedLine === "" || trimmedLine === "-") {
30
+ // Pos in sequence or empty line
31
+ let spacer = "";
32
+ if (trimmedLine === "-" && !line.endsWith(" ")) {
33
+ spacer = " ";
34
+ offset++;
35
+ }
36
+ line =
37
+ line.substring(0, linePos) +
38
+ spacer +
39
+ PLACEHOLDER_KEY +
40
+ (trimmedLine === "-" ? "" : ":") +
41
+ line.substring(linePos);
42
+ // Adjust pos by one to prevent a sequence node being marked as active
43
+ offset++;
44
+ }
45
+ else if (!trimmedLine.startsWith("-")) {
46
+ // Add `:` to end of line
47
+ line = line + ":";
48
+ }
49
+ }
50
+ const newDoc = TextDocument.create(doc.uri, doc.languageId, doc.version, doc.getText());
51
+ TextDocument.update(newDoc, [
52
+ {
53
+ range: lineRange,
54
+ text: line
55
+ }
56
+ ], newDoc.version + 1);
57
+ return [newDoc, newDoc.positionAt(offset)];
58
+ }
59
+ // Detect placeholder key and value added by transform
60
+ export function isPlaceholder(key, value) {
61
+ if (key.value === PLACEHOLDER_KEY && isString(value) && value.value == "") {
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/utils/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ParseWorkflowResult, WorkflowTemplate } from "@actions/workflow-parser";
2
+ import { WorkflowTemplateConverterOptions } from "@actions/workflow-parser/model/convert";
3
+ import { TemplateContext } from "@actions/workflow-parser/templates/template-context";
4
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/template-token";
5
+ import { File } from "@actions/workflow-parser/workflows/file";
6
+ import { CompletionConfig } from "../complete";
7
+ export declare function clearCacheEntry(uri: string): void;
8
+ export declare function clearCache(): void;
9
+ /**
10
+ * Parses a workflow file and caches the result
11
+ * @param transformed Indicates whether the workflow has been transformed before parsing
12
+ * @returns the {@link ParseWorkflowResult}
13
+ */
14
+ export declare function fetchOrParseWorkflow(file: File, uri: string, transformed?: boolean): ParseWorkflowResult;
15
+ /**
16
+ * Converts a workflow template and caches the result
17
+ * @param transformed Indicates whether the workflow has been transformed before parsing
18
+ * @returns the converted {@link WorkflowTemplate}
19
+ */
20
+ export declare function fetchOrConvertWorkflowTemplate(context: TemplateContext, template: TemplateToken, uri: string, config?: CompletionConfig, options?: WorkflowTemplateConverterOptions, transformed?: boolean): Promise<WorkflowTemplate>;
21
+ //# sourceMappingURL=workflow-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-cache.d.ts","sourceRoot":"","sources":["../../src/utils/workflow-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,mBAAmB,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AACvH,OAAO,EAAC,gCAAgC,EAAC,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAC,eAAe,EAAC,MAAM,qDAAqD,CAAC;AACpF,OAAO,EAAC,aAAa,EAAC,MAAM,0DAA0D,CAAC;AACvF,OAAO,EAAC,IAAI,EAAC,MAAM,yCAAyC,CAAC;AAE7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAM7C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,QAK1C;AAED,wBAAgB,UAAU,SAGzB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,mBAAmB,CAStG;AAED;;;;GAIG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,gBAAgB,EACzB,OAAO,CAAC,EAAE,gCAAgC,EAC1C,WAAW,UAAQ,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAS3B"}