@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 @@
1
+ {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../../src/expression-hover/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAyD,MAAM,sBAAsB,CAAC;AACnH,OAAO,EACL,MAAM,EACN,aAAa,EACb,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EAEX,OAAO,EACP,KAAK,EACN,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,4BAA4B,CAAC;AAGtD,MAAM,MAAM,WAAW,GACnB,SAAS,GACT;IACE,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEN,qBAAa,YAAa,YAAW,WAAW,CAAC,WAAW,CAAC;IAIzD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,cAAc,CAAS;gBAGrB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAGpD,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW;IAI3B,YAAY,IAAI,WAAW;IAI3B,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW;IAIrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IAIxC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW;IAW3C,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW;IAI9C,kBAAkB,CAAC,aAAa,EAAE,aAAa,GAAG,WAAW;IAe7D,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW;IAwDvD,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW;CAsB3D"}
@@ -0,0 +1,116 @@
1
+ import { Evaluator, isDescriptionDictionary, wellKnownFunctions } from "@actions/expressions";
2
+ import { Literal } from "@actions/expressions/ast";
3
+ import { posWithinRange } from "./pos-range";
4
+ export class HoverVisitor {
5
+ constructor(pos, context, functions) {
6
+ this.pos = pos;
7
+ this.context = context;
8
+ this.functions = functions;
9
+ this.ignorePosCheck = false;
10
+ }
11
+ hover(n) {
12
+ return n.accept(this);
13
+ }
14
+ visitLiteral() {
15
+ return undefined;
16
+ }
17
+ visitUnary(unary) {
18
+ return this.hover(unary.expr);
19
+ }
20
+ visitBinary(binary) {
21
+ return this.hover(binary.left) || this.hover(binary.right);
22
+ }
23
+ visitLogical(logical) {
24
+ for (const arg of logical.args) {
25
+ const result = this.hover(arg);
26
+ if (result) {
27
+ return result;
28
+ }
29
+ }
30
+ return undefined;
31
+ }
32
+ visitGrouping(grouping) {
33
+ return this.hover(grouping.group);
34
+ }
35
+ visitContextAccess(contextAccess) {
36
+ if (this.ignorePosCheck || posWithinRange(this.pos, contextAccess.name.range)) {
37
+ const contextName = contextAccess.name.lexeme;
38
+ return {
39
+ label: contextName,
40
+ description: this.context.getDescription(contextName),
41
+ function: false,
42
+ range: contextAccess.name.range
43
+ };
44
+ }
45
+ return undefined;
46
+ }
47
+ visitIndexAccess(indexAccess) {
48
+ // Is the position within the index, so for example:
49
+ // github.event.test
50
+ // ^ - pos
51
+ if (!(indexAccess.index instanceof Literal)) {
52
+ // No support for context access of the form github[github.event]
53
+ return undefined;
54
+ }
55
+ if (!posWithinRange(this.pos, indexAccess.index.token.range)) {
56
+ // Try to get hover from the rest of the expression
57
+ return this.hover(indexAccess.expr);
58
+ }
59
+ const ev = new Evaluator(indexAccess.expr, this.context, this.functions);
60
+ const result = ev.evaluate();
61
+ if (!isDescriptionDictionary(result)) {
62
+ // No description to show
63
+ return undefined;
64
+ }
65
+ const key = indexAccess.index.literal.coerceString();
66
+ const description = result.getDescription(key);
67
+ if (!description) {
68
+ return undefined;
69
+ }
70
+ // Calculate context access range for whole expression. For example:
71
+ // github.event.test
72
+ // ^ - pos
73
+ // should return the range:
74
+ // github.event.test
75
+ // ^^^^^^^^^^^^
76
+ this.ignorePosCheck = true;
77
+ try {
78
+ const contextHover = this.hover(indexAccess.expr);
79
+ if (!contextHover) {
80
+ throw new Error("Expected context hover to be defined");
81
+ }
82
+ return {
83
+ label: key,
84
+ description: description,
85
+ function: false,
86
+ range: {
87
+ start: contextHover.range.start,
88
+ end: indexAccess.index.token.range.end
89
+ }
90
+ };
91
+ }
92
+ finally {
93
+ this.ignorePosCheck = false;
94
+ }
95
+ }
96
+ visitFunctionCall(functionCall) {
97
+ if (posWithinRange(this.pos, functionCall.functionName.range)) {
98
+ const functionName = functionCall.functionName.lexeme.toLowerCase();
99
+ const f = this.functions.get(functionName) || wellKnownFunctions[functionName];
100
+ return {
101
+ label: f.name,
102
+ description: f.description,
103
+ function: true,
104
+ range: functionCall.functionName.range
105
+ };
106
+ }
107
+ for (const args of functionCall.args) {
108
+ const result = this.hover(args);
109
+ if (result) {
110
+ return result;
111
+ }
112
+ }
113
+ return undefined;
114
+ }
115
+ }
116
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/expression-hover/visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { data } from "@actions/expressions";
2
+ import { ExpressionData, Pair } from "@actions/expressions/data/expressiondata";
3
+ export declare class AccessError extends Error {
4
+ readonly keyName: string;
5
+ constructor(message: string, keyName: string);
6
+ }
7
+ export declare class ErrorDictionary extends data.Dictionary {
8
+ constructor(...pairs: Pair[]);
9
+ complete: boolean;
10
+ get(key: string): ExpressionData | undefined;
11
+ }
12
+ export declare function wrapDictionary(d: data.Dictionary): ErrorDictionary;
13
+ //# sourceMappingURL=error-dictionary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-dictionary.d.ts","sourceRoot":"","sources":["../../src/expression-validation/error-dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAA0B,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAC,cAAc,EAAE,IAAI,EAAC,MAAM,0CAA0C,CAAC;AAE9E,qBAAa,WAAY,SAAQ,KAAK;aACS,OAAO,EAAE,MAAM;gBAAhD,OAAO,EAAE,MAAM,EAAkB,OAAO,EAAE,MAAM;CAG7D;AAED,qBAAa,eAAgB,SAAQ,IAAI,CAAC,UAAU;gBACtC,GAAG,KAAK,EAAE,IAAI,EAAE;IAGrB,QAAQ,UAAQ;IAEvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;CAU7C;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,eAAe,CAelE"}
@@ -0,0 +1,39 @@
1
+ import { data, isDescriptionDictionary } from "@actions/expressions";
2
+ import { isDictionary } from "@actions/expressions/data/dictionary";
3
+ export class AccessError extends Error {
4
+ constructor(message, keyName) {
5
+ super(message);
6
+ this.keyName = keyName;
7
+ }
8
+ }
9
+ export class ErrorDictionary extends data.Dictionary {
10
+ constructor(...pairs) {
11
+ super(...pairs);
12
+ this.complete = true;
13
+ }
14
+ get(key) {
15
+ const value = super.get(key);
16
+ if (value) {
17
+ return value;
18
+ }
19
+ if (this.complete) {
20
+ throw new AccessError(`Invalid context access: ${key}`, key);
21
+ }
22
+ }
23
+ }
24
+ export function wrapDictionary(d) {
25
+ const e = new ErrorDictionary();
26
+ if (isDescriptionDictionary(d)) {
27
+ e.complete = d.complete;
28
+ }
29
+ for (const { key, value } of d.pairs()) {
30
+ if (isDictionary(value)) {
31
+ e.add(key, wrapDictionary(value));
32
+ }
33
+ else {
34
+ e.add(key, value);
35
+ }
36
+ }
37
+ return e;
38
+ }
39
+ //# sourceMappingURL=error-dictionary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-dictionary.js","sourceRoot":"","sources":["../../src/expression-validation/error-dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAC,YAAY,EAAC,MAAM,sCAAsC,CAAC;AAGlE,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe,EAAkB,OAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,YAAO,GAAP,OAAO,CAAQ;IAE5D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,UAAU;IAClD,YAAY,GAAG,KAAa;QAC1B,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QAEX,aAAQ,GAAG,IAAI,CAAC;IADvB,CAAC;IAGD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,EAAE;YACT,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,WAAW,CAAC,2BAA2B,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;SAC9D;IACH,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,CAAkB;IAC/C,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;IAChC,IAAI,uBAAuB,CAAC,CAAC,CAAC,EAAE;QAC9B,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;KACzB;IAED,KAAK,MAAM,EAAC,GAAG,EAAE,KAAK,EAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YACvB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;SACnC;aAAM;YACL,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACnB;KACF;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { data } from "@actions/expressions";
2
+ export declare const validatorFunctions: Map<string, {
3
+ call: () => data.Dictionary;
4
+ name: string;
5
+ description?: string | undefined;
6
+ minArgs: number;
7
+ maxArgs: number;
8
+ }>;
9
+ //# sourceMappingURL=functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/expression-validation/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAqB,MAAM,sBAAsB,CAAC;AAK9D,eAAO,MAAM,kBAAkB;;;;;;EAO9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { data, wellKnownFunctions } from "@actions/expressions";
2
+ // Custom implementations for standard actions-expression functions used during validation and auto-completion.
3
+ // For example, for fromJson we'll most likely not have a valid input. In order to not throw, we'll always
4
+ // return an empty dictionary.
5
+ export const validatorFunctions = new Map(Object.entries({
6
+ fromjson: {
7
+ ...wellKnownFunctions.fromjson,
8
+ call: () => new data.Dictionary()
9
+ }
10
+ }));
11
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/expression-validation/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAE9D,+GAA+G;AAC/G,0GAA0G;AAC1G,8BAA8B;AAC9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CACvC,MAAM,CAAC,OAAO,CAAC;IACb,QAAQ,EAAE;QACR,GAAG,kBAAkB,CAAC,QAAQ;QAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;KAClC;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/template-token";
2
+ import { FileProvider } from "@actions/workflow-parser/workflows/file-provider";
3
+ import { Position, TextDocument } from "vscode-languageserver-textdocument";
4
+ import { Hover } from "vscode-languageserver-types";
5
+ import { ContextProviderConfig } from "./context-providers/config";
6
+ import { WorkflowContext } from "./context/workflow-context";
7
+ export type HoverConfig = {
8
+ descriptionProvider?: DescriptionProvider;
9
+ contextProviderConfig?: ContextProviderConfig;
10
+ fileProvider?: FileProvider;
11
+ };
12
+ export type DescriptionProvider = {
13
+ getDescription(context: WorkflowContext, token: TemplateToken, path: TemplateToken[]): Promise<string | undefined>;
14
+ };
15
+ export declare function hover(document: TextDocument, position: Position, config?: HoverConfig): Promise<Hover | null>;
16
+ //# sourceMappingURL=hover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,aAAa,EAAC,MAAM,0DAA0D,CAAC;AAGvF,OAAO,EAAC,YAAY,EAAC,MAAM,kDAAkD,CAAC;AAC9E,OAAO,EAAC,QAAQ,EAAE,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAC,KAAK,EAAC,MAAM,6BAA6B,CAAC;AAClD,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAqB,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAa/E,MAAM,MAAM,WAAW,GAAG;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACpH,CAAC;AAEF,wBAAsB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CA+EnH"}
package/dist/hover.js ADDED
@@ -0,0 +1,154 @@
1
+ import { data, Parser } from "@actions/expressions";
2
+ import { Lexer } from "@actions/expressions/lexer";
3
+ import { ErrorPolicy } from "@actions/workflow-parser/model/convert";
4
+ import { getCronDescription } from "@actions/workflow-parser/model/converter/cron";
5
+ import { splitAllowedContext } from "@actions/workflow-parser/templates/allowed-context";
6
+ import { isBasicExpression, isString } from "@actions/workflow-parser/templates/tokens/type-guards";
7
+ import { getContext, Mode } from "./context-providers/default";
8
+ import { getFunctionDescription } from "./context-providers/descriptions";
9
+ import { getWorkflowContext } from "./context/workflow-context";
10
+ import { getReusableWorkflowInputDescription, isReusableWorkflowJobInput } from "./description-providers/reusable-job-inputs";
11
+ import { mapToExpressionPos } from "./expression-hover/expression-pos";
12
+ import { HoverVisitor } from "./expression-hover/visitor";
13
+ import { info } from "./log";
14
+ import { isPotentiallyExpression } from "./utils/expression-detection";
15
+ import { findToken } from "./utils/find-token";
16
+ import { mapRange } from "./utils/range";
17
+ import { fetchOrConvertWorkflowTemplate, fetchOrParseWorkflow } from "./utils/workflow-cache";
18
+ export async function hover(document, position, config) {
19
+ const file = {
20
+ name: document.uri,
21
+ content: document.getText()
22
+ };
23
+ const parsedWorkflow = fetchOrParseWorkflow(file, document.uri);
24
+ if (!parsedWorkflow?.value) {
25
+ return null;
26
+ }
27
+ const template = await fetchOrConvertWorkflowTemplate(parsedWorkflow.context, parsedWorkflow.value, document.uri, config, {
28
+ errorPolicy: ErrorPolicy.TryConversion,
29
+ fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0
30
+ });
31
+ const tokenResult = findToken(position, parsedWorkflow.value);
32
+ const { token, keyToken, parent } = tokenResult;
33
+ const tokenDefinitionInfo = (keyToken || parent || token)?.definitionInfo;
34
+ const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path);
35
+ if (token && tokenDefinitionInfo) {
36
+ if (isBasicExpression(token) || isPotentiallyExpression(token)) {
37
+ info(`Calculating expression hover for token with definition ${tokenDefinitionInfo.definition.key}`);
38
+ const allowedContext = tokenDefinitionInfo.allowedContext || [];
39
+ const { namedContexts, functions } = splitAllowedContext(allowedContext);
40
+ const context = await getContext(namedContexts, config?.contextProviderConfig, workflowContext, Mode.Completion);
41
+ for (const func of functions) {
42
+ func.description = getFunctionDescription(func.name);
43
+ }
44
+ const exprPos = mapToExpressionPos(token, position);
45
+ if (exprPos) {
46
+ return expressionHover(exprPos, context, namedContexts, functions);
47
+ }
48
+ }
49
+ }
50
+ if (!token?.definition) {
51
+ return null;
52
+ }
53
+ info(`Calculating hover for token with definition ${token.definition.key}`);
54
+ if (tokenResult.parent && isCronMappingValue(tokenResult)) {
55
+ const tokenValue = token.value;
56
+ const description = getCronDescription(tokenValue);
57
+ if (description) {
58
+ return {
59
+ contents: description,
60
+ range: mapRange(token.range)
61
+ };
62
+ }
63
+ }
64
+ if (tokenResult.parent && isReusableWorkflowJobInput(tokenResult)) {
65
+ let description = getReusableWorkflowInputDescription(workflowContext, tokenResult);
66
+ description = appendContext(description, token.definitionInfo?.allowedContext);
67
+ return {
68
+ contents: description,
69
+ range: mapRange(token.range)
70
+ };
71
+ }
72
+ let description = await getDescription(config, workflowContext, token, tokenResult.path);
73
+ description = appendContext(description, token.definitionInfo?.allowedContext);
74
+ return {
75
+ contents: description,
76
+ range: mapRange(token.range)
77
+ };
78
+ }
79
+ function appendContext(description, allowedContext) {
80
+ if (!allowedContext || allowedContext.length == 0) {
81
+ return description;
82
+ }
83
+ const { namedContexts, functions } = splitAllowedContext(allowedContext);
84
+ let namedContextsString = "";
85
+ let functionsString = "";
86
+ if (namedContexts.length > 0) {
87
+ namedContextsString = `${description.length > 0 ? `\n\n` : ""}Available expression contexts: ${namedContexts
88
+ .map(x => `\`${x}\``)
89
+ .join(", ")}`;
90
+ }
91
+ if (functions.length > 0) {
92
+ functionsString = `${namedContexts.length > 0 ? `\n\n` : ""}Available expression functions: ${functions
93
+ .map(x => x.name)
94
+ .map(x => `\`${x}\``)
95
+ .join(", ")}`;
96
+ }
97
+ return `${description}${namedContextsString}${functionsString}`;
98
+ }
99
+ async function getDescription(config, workflowContext, token, path) {
100
+ const defaultDescription = token.description || "";
101
+ if (!config?.descriptionProvider) {
102
+ return defaultDescription;
103
+ }
104
+ const description = await config.descriptionProvider.getDescription(workflowContext, token, path);
105
+ return description || defaultDescription;
106
+ }
107
+ function isCronMappingValue(tokenResult) {
108
+ return (tokenResult.parent?.definition?.key === "cron-mapping" &&
109
+ !!tokenResult.token &&
110
+ isString(tokenResult.token) &&
111
+ tokenResult.token.value !== "cron");
112
+ }
113
+ function expressionHover(exprPos, context, namedContexts, functions) {
114
+ const { expression, position, documentRange } = exprPos;
115
+ try {
116
+ const l = new Lexer(expression);
117
+ const lr = l.lex();
118
+ const p = new Parser(lr.tokens, namedContexts, functions);
119
+ const expr = p.parse();
120
+ const functionMap = new Map();
121
+ for (const func of functions) {
122
+ functionMap.set(func.name.toLowerCase(), {
123
+ ...func,
124
+ call: () => new data.Null()
125
+ });
126
+ }
127
+ const hv = new HoverVisitor(position, context, functionMap);
128
+ const hoverResult = hv.hover(expr);
129
+ if (!hoverResult) {
130
+ return null;
131
+ }
132
+ const exprRange = hoverResult.range;
133
+ return {
134
+ contents: hoverResult?.description || hoverResult?.label,
135
+ // Map the expression range back to a document range
136
+ range: {
137
+ start: {
138
+ line: documentRange.start.line + exprRange.start.line,
139
+ character: documentRange.start.character + exprRange.start.column
140
+ },
141
+ end: {
142
+ line: documentRange.start.line + exprRange.end.line,
143
+ character: documentRange.start.character + exprRange.end.column
144
+ }
145
+ }
146
+ };
147
+ }
148
+ catch (e) {
149
+ // Hovering over an invalid expression should not cause an error here
150
+ info(`Encountered error trying to calculate expression hover: ${e.message}`);
151
+ return null;
152
+ }
153
+ }
154
+ //# sourceMappingURL=hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { complete } from "./complete";
2
+ export { ContextProviderConfig } from "./context-providers/config";
3
+ export { documentLinks } from "./document-links";
4
+ export { hover } from "./hover";
5
+ export { Logger, LogLevel, registerLogger, setLogLevel } from "./log";
6
+ export { validate, ValidationConfig } from "./validate";
7
+ export { ValueProviderConfig, ValueProviderKind } from "./value-providers/config";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AACpE,OAAO,EAAC,QAAQ,EAAE,gBAAgB,EAAC,MAAM,YAAY,CAAC;AACtD,OAAO,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { complete } from "./complete";
2
+ export { documentLinks } from "./document-links";
3
+ export { hover } from "./hover";
4
+ export { LogLevel, registerLogger, setLogLevel } from "./log";
5
+ export { validate } from "./validate";
6
+ export { ValueProviderKind } from "./value-providers/config";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAS,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AACpE,OAAO,EAAC,QAAQ,EAAmB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAsB,iBAAiB,EAAC,MAAM,0BAA0B,CAAC"}
package/dist/log.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ export declare enum LogLevel {
2
+ Debug = 0,
3
+ Info = 1,
4
+ Warn = 2,
5
+ Error = 3
6
+ }
7
+ export interface Logger {
8
+ /**
9
+ * Show an error message.
10
+ *
11
+ * @param message The message to show.
12
+ */
13
+ error(message: string): void;
14
+ /**
15
+ * Show a warning message.
16
+ *
17
+ * @param message The message to show.
18
+ */
19
+ warn(message: string): void;
20
+ /**
21
+ * Show an information message.
22
+ *
23
+ * @param message The message to show.
24
+ */
25
+ info(message: string): void;
26
+ /**
27
+ * Log a message.
28
+ *
29
+ * @param message The message to log.
30
+ */
31
+ log(message: string): void;
32
+ }
33
+ export declare function registerLogger(l: Logger): void;
34
+ export declare function setLogLevel(ll: LogLevel): void;
35
+ export declare function log(message: string): void;
36
+ export declare function info(message: string): void;
37
+ export declare function warn(message: string): void;
38
+ export declare function error(message: string): void;
39
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAKD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,QAEvC;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,QAEvC;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQzC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ3C"}
package/dist/log.js ADDED
@@ -0,0 +1,48 @@
1
+ export var LogLevel;
2
+ (function (LogLevel) {
3
+ LogLevel[LogLevel["Debug"] = 0] = "Debug";
4
+ LogLevel[LogLevel["Info"] = 1] = "Info";
5
+ LogLevel[LogLevel["Warn"] = 2] = "Warn";
6
+ LogLevel[LogLevel["Error"] = 3] = "Error";
7
+ })(LogLevel || (LogLevel = {}));
8
+ const loggers = [];
9
+ let logLevel = LogLevel.Warn;
10
+ export function registerLogger(l) {
11
+ loggers.push(l);
12
+ }
13
+ export function setLogLevel(ll) {
14
+ logLevel = ll;
15
+ }
16
+ export function log(message) {
17
+ if (logLevel > LogLevel.Debug) {
18
+ return;
19
+ }
20
+ for (const l of loggers) {
21
+ l.log(message);
22
+ }
23
+ }
24
+ export function info(message) {
25
+ if (logLevel > LogLevel.Info) {
26
+ return;
27
+ }
28
+ for (const l of loggers) {
29
+ l.info(message);
30
+ }
31
+ }
32
+ export function warn(message) {
33
+ if (logLevel > LogLevel.Warn) {
34
+ return;
35
+ }
36
+ for (const l of loggers) {
37
+ l.warn(message);
38
+ }
39
+ }
40
+ export function error(message) {
41
+ if (logLevel > LogLevel.Error) {
42
+ return;
43
+ }
44
+ for (const l of loggers) {
45
+ l.error(message);
46
+ }
47
+ }
48
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,OAAO,GAAa,EAAE,CAAC;AAC7B,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;AA6B7B,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAY;IACtC,QAAQ,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE;QAC7B,OAAO;KACR;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAChB;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE;QAC5B,OAAO;KACR;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACjB;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE;QAC5B,OAAO;KACR;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACjB;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE;QAC7B,OAAO;KACR;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KAClB;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { NoOperationTraceWriter } from "@actions/workflow-parser/templates/trace-writer";
2
+ export declare const nullTrace: NoOperationTraceWriter;
3
+ //# sourceMappingURL=nulltrace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nulltrace.d.ts","sourceRoot":"","sources":["../src/nulltrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,iDAAiD,CAAC;AAEvF,eAAO,MAAM,SAAS,wBAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { NoOperationTraceWriter } from "@actions/workflow-parser/templates/trace-writer";
2
+ export const nullTrace = new NoOperationTraceWriter();
3
+ //# sourceMappingURL=nulltrace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nulltrace.js","sourceRoot":"","sources":["../src/nulltrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,iDAAiD,CAAC;AAEvF,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/index";
2
+ export declare function isPotentiallyExpression(token: TemplateToken): boolean;
3
+ //# sourceMappingURL=expression-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-detection.d.ts","sourceRoot":"","sources":["../../src/utils/expression-detection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,aAAa,EAAC,MAAM,iDAAiD,CAAC;AAE9E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAKrE"}
@@ -0,0 +1,9 @@
1
+ import { isString } from "@actions/workflow-parser";
2
+ import { DefinitionType } from "@actions/workflow-parser/templates/schema/definition-type";
3
+ import { OPEN_EXPRESSION } from "@actions/workflow-parser/templates/template-constants";
4
+ export function isPotentiallyExpression(token) {
5
+ const isAlwaysExpression = token.definition?.definitionType === DefinitionType.String && token.definition.isExpression;
6
+ const containsExpression = isString(token) && token.value != null && token.value.indexOf(OPEN_EXPRESSION) >= 0;
7
+ return isAlwaysExpression || containsExpression;
8
+ }
9
+ //# sourceMappingURL=expression-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-detection.js","sourceRoot":"","sources":["../../src/utils/expression-detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAC,cAAc,EAAC,MAAM,2DAA2D,CAAC;AAEzF,OAAO,EAAC,eAAe,EAAC,MAAM,uDAAuD,CAAC;AAGtF,MAAM,UAAU,uBAAuB,CAAC,KAAoB;IAC1D,MAAM,kBAAkB,GACtB,KAAK,CAAC,UAAU,EAAE,cAAc,KAAK,cAAc,CAAC,MAAM,IAAK,KAAK,CAAC,UAA+B,CAAC,YAAY,CAAC;IACpH,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/G,OAAO,kBAAkB,IAAI,kBAAkB,CAAC;AAClD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/index";
2
+ import { Position } from "vscode-languageserver-textdocument";
3
+ export declare function findInnerToken(pos: Position, root?: TemplateToken): TemplateToken | null;
4
+ export type TokenResult = {
5
+ parent: TemplateToken | null;
6
+ keyToken: TemplateToken | null;
7
+ token: TemplateToken | null;
8
+ path: TemplateToken[];
9
+ };
10
+ /**
11
+ * Find a token at the given position in the document.
12
+ *
13
+ * If the position is within
14
+ * - the key of a mapping, parent will be the mapping, keyToken will be null, and token will be the key.
15
+ * - the value of a mapping, parent will be the mapping, keyToken will be the key for the value, and token will be the value
16
+ * - a sequence item, parent will be the sequence, keyToken will be null, and token will be the item
17
+ *
18
+ * @param pos Position within the document for which to find a token
19
+ * @param root Root node
20
+ * @returns Token result
21
+ */
22
+ export declare function findToken(pos: Position, root?: TemplateToken): TokenResult;
23
+ //# sourceMappingURL=find-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-token.d.ts","sourceRoot":"","sources":["../../src/utils/find-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iDAAiD,CAAC;AAI9E,OAAO,EAAC,QAAQ,EAAC,MAAM,oCAAoC,CAAC;AAE5D,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa,wBAGjE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAE5B,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,WAAW,CAmG1E"}