@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright GitHub
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # actions/languageservice
2
+
3
+ This package contains the logic for the GitHub Actions workflows language server.
4
+
5
+ ## Installation
6
+
7
+ The [package](https://www.npmjs.com/package/@actions/languageservice) contains TypeScript types and compiled ECMAScript modules.
8
+
9
+ ```bash
10
+ npm install @actions/languageservice
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ### Basic usage
16
+
17
+ #### Concepts
18
+
19
+ The language service features use three sources of information:
20
+
21
+ * a built-in static schema for the workflow YAML file
22
+ * _value providers_ which can dynamically add values to the schema, for example, the list of available labels for a repository when validating `runs-on`.
23
+ * _context providers_ which can dynamically provide available contexts used in [expressions](https://docs.github.com/actions/reference/context-and-expression-syntax-for-github-actions#about-contexts-and-expressions). For example, the contents of the `github.event` context for a given workflow file.
24
+
25
+ #### Validation
26
+
27
+ Validate a workflow file, returns an array of [`Diagnostic`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#diagnostic) objects.
28
+
29
+ ```typescript
30
+ const config: ValidationConfig = {
31
+ valueProviderConfig: valueProviders(sessionToken, repoContext, cache),
32
+ contextProviderConfig: contextProviders(sessionToken, repoContext, cache),
33
+ };
34
+
35
+ const result = await validate(textDocument, config); // result is an array of `Diagnostic`
36
+ ```
37
+
38
+ #### Hover
39
+
40
+ Get information when [hovering](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_hover) over a token in the workflow file.
41
+
42
+ ```typescript
43
+ import {hover} from "@actions/languageservice";
44
+
45
+ const document = {
46
+ uri: "file:///path/to/file",
47
+ getText: () => "on: push\n jobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - run: echo hello"
48
+ };
49
+
50
+ const hover = await hover(document, {line: 0, character: 1}); // { contents: { kind: "markdown", value: "The event that triggers the workflow" } }
51
+ ```
52
+
53
+ #### Auto-completion
54
+
55
+ ```typescript
56
+ import {complete} from "@actions/languageservice";
57
+
58
+ const document = {
59
+ uri: "file:///path/to/file",
60
+ getText: () => `on:
61
+ jobs:
62
+ build:
63
+ runs-on: ubuntu-latest
64
+ steps:
65
+ - run: echo hello`
66
+ };
67
+
68
+ // Trigger completion for `on: |`
69
+ const suggestions = await complete(document, {line: 0, character: 4});
70
+ ```
71
+
72
+ will return
73
+
74
+ ```jsonc
75
+ [{
76
+ "documentation": {
77
+ "kind": "markdown",
78
+ "value": "Runs your workflow when branch protection rules in the workflow repository are changed.",
79
+ },
80
+ "label": "branch_protection_rule",
81
+ "textEdit": {
82
+ "newText": "branch_protection_rule",
83
+ "range": {
84
+ "end": {"character": 4, "line": 0,},
85
+ "start": {"character": 4, "line": 0},
86
+ },
87
+ },
88
+ },
89
+ //... other events
90
+ ]
91
+ ```
92
+
93
+ ## Contributing
94
+
95
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) at the root of the repository for general guidelines and recommendations.
96
+
97
+ If you do want to contribute, please run [prettier](https://prettier.io/) to format your code and add unit tests as appropriate before submitting your PR.
98
+
99
+ ### Build
100
+
101
+ ```bash
102
+ npm run build
103
+ ```
104
+
105
+ or to watch for changes
106
+
107
+ ```bash
108
+ npm run watch
109
+ ```
110
+
111
+ ### Test
112
+
113
+ ```bash
114
+ npm test
115
+ ```
116
+
117
+ or to watch for changes and run tests:
118
+
119
+ ```bash
120
+ npm run test-watch
121
+ ```
122
+
123
+ ### Lint
124
+
125
+ ```bash
126
+ npm run format-check
127
+ ```
128
+
129
+ ## License
130
+
131
+ This project is licensed under the terms of the MIT open source license. Please refer to [MIT](../LICENSE) for the full terms.
@@ -0,0 +1,28 @@
1
+ export type ActionMetadata = {
2
+ name: string;
3
+ description: string;
4
+ inputs?: ActionInputs;
5
+ outputs?: ActionOutputs;
6
+ };
7
+ export type ActionInput = {
8
+ description: string;
9
+ required?: boolean;
10
+ default?: string;
11
+ deprecationMessage?: string;
12
+ };
13
+ export type ActionInputs = Record<string, ActionInput>;
14
+ export type ActionOutput = {
15
+ description: string;
16
+ value?: string;
17
+ };
18
+ export type ActionOutputs = Record<string, ActionOutput>;
19
+ export type ActionReference = {
20
+ owner: string;
21
+ name: string;
22
+ ref: string;
23
+ path?: string;
24
+ };
25
+ export declare function parseActionReference(uses: string): ActionReference | undefined;
26
+ export declare function actionIdentifier(ref: ActionReference): string;
27
+ export declare function actionUrl(actionRef: ActionReference): string;
28
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAGvD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAyB9E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAK7D;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAK5D"}
package/dist/action.js ADDED
@@ -0,0 +1,36 @@
1
+ // https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses
2
+ export function parseActionReference(uses) {
3
+ if (!uses || uses.startsWith("docker://") || uses.startsWith("./") || uses.startsWith(".\\")) {
4
+ return undefined;
5
+ }
6
+ const [action, ref] = uses.split("@");
7
+ const [owner, name, ...pathSegments] = action.split(/[\\/]/).filter(s => s.length > 0);
8
+ if (!owner || !name) {
9
+ return undefined;
10
+ }
11
+ if (pathSegments.length === 0) {
12
+ return {
13
+ owner,
14
+ name,
15
+ ref
16
+ };
17
+ }
18
+ return {
19
+ owner,
20
+ name,
21
+ ref,
22
+ path: pathSegments.join("/")
23
+ };
24
+ }
25
+ export function actionIdentifier(ref) {
26
+ if (ref.path) {
27
+ return `${ref.owner}/${ref.name}/${ref.ref}/${ref.path}`;
28
+ }
29
+ return `${ref.owner}/${ref.name}/${ref.ref}`;
30
+ }
31
+ export function actionUrl(actionRef) {
32
+ // TODO: Support base uri for GHES
33
+ const gitHubBaseUri = "https://www.github.com/";
34
+ return `${gitHubBaseUri}${actionRef.owner}/${actionRef.name}/tree/${actionRef.ref}/${actionRef.path || ""}`;
35
+ }
36
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"AAiCA,4GAA4G;AAC5G,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;QAC5F,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,OAAO;YACL,KAAK;YACL,IAAI;YACJ,GAAG;SACJ,CAAC;KACH;IAED,OAAO;QACL,KAAK;QACL,IAAI;QACJ,GAAG;QACH,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAoB;IACnD,IAAI,GAAG,CAAC,IAAI,EAAE;QACZ,OAAO,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;KAC1D;IACD,OAAO,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAA0B;IAClD,kCAAkC;IAClC,MAAM,aAAa,GAAG,yBAAyB,CAAC;IAEhD,OAAO,GAAG,aAAa,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAC9G,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/index";
2
+ import { FileProvider } from "@actions/workflow-parser/workflows/file-provider";
3
+ import { Position, TextDocument } from "vscode-languageserver-textdocument";
4
+ import { CompletionItem } from "vscode-languageserver-types";
5
+ import { ContextProviderConfig } from "./context-providers/config";
6
+ import { ValueProviderConfig } from "./value-providers/config";
7
+ export declare function getExpressionInput(input: string, pos: number): string;
8
+ export type CompletionConfig = {
9
+ valueProviderConfig?: ValueProviderConfig;
10
+ contextProviderConfig?: ContextProviderConfig;
11
+ fileProvider?: FileProvider;
12
+ };
13
+ export declare function complete(textDocument: TextDocument, position: Position, config?: CompletionConfig): Promise<CompletionItem[]>;
14
+ export declare function getExistingValues(token: TemplateToken | null, parent: TemplateToken): Set<string> | undefined;
15
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../src/complete.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,aAAa,EAAC,MAAM,iDAAiD,CAAC;AAI9E,OAAO,EAAC,YAAY,EAAC,MAAM,kDAAkD,CAAC;AAC9E,OAAO,EAAC,QAAQ,EAAE,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAC,cAAc,EAAyD,MAAM,6BAA6B,CAAC;AACnH,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AAYjE,OAAO,EAAQ,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,wBAAsB,QAAQ,CAC5B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CA2F3B;AA6CD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,2BAkCnF"}
@@ -0,0 +1,203 @@
1
+ import { complete as completeExpression } from "@actions/expressions";
2
+ import { isBasicExpression, isSequence, isString } from "@actions/workflow-parser";
3
+ import { ErrorPolicy } from "@actions/workflow-parser/model/convert";
4
+ import { OPEN_EXPRESSION } from "@actions/workflow-parser/templates/template-constants";
5
+ import { TokenType } from "@actions/workflow-parser/templates/tokens/types";
6
+ import { CompletionItemKind, CompletionItemTag, Range, TextEdit } from "vscode-languageserver-types";
7
+ import { getContext, Mode } from "./context-providers/default";
8
+ import { getWorkflowContext } from "./context/workflow-context";
9
+ import { validatorFunctions } from "./expression-validation/functions";
10
+ import { error } from "./log";
11
+ import { isPotentiallyExpression } from "./utils/expression-detection";
12
+ import { findToken } from "./utils/find-token";
13
+ import { guessIndentation } from "./utils/indentation-guesser";
14
+ import { mapRange } from "./utils/range";
15
+ import { getRelCharOffset } from "./utils/rel-char-pos";
16
+ import { isPlaceholder, transform } from "./utils/transform";
17
+ import { fetchOrConvertWorkflowTemplate, fetchOrParseWorkflow } from "./utils/workflow-cache";
18
+ import { defaultValueProviders } from "./value-providers/default";
19
+ import { definitionValues } from "./value-providers/definition";
20
+ export function getExpressionInput(input, pos) {
21
+ // Find start marker around the cursor position
22
+ let startPos = input.lastIndexOf(OPEN_EXPRESSION, pos);
23
+ if (startPos === -1) {
24
+ startPos = 0;
25
+ }
26
+ else {
27
+ startPos += OPEN_EXPRESSION.length;
28
+ }
29
+ return input.substring(startPos, pos);
30
+ }
31
+ export async function complete(textDocument, position, config) {
32
+ // Edge case: when completing a key like `foo:|`, do not calculate auto-completions
33
+ const charBeforePos = textDocument.getText({
34
+ start: { line: position.line, character: position.character - 1 },
35
+ end: { line: position.line, character: position.character }
36
+ });
37
+ if (charBeforePos === ":") {
38
+ return [];
39
+ }
40
+ // Fix the input to work around YAML parsing issues
41
+ const [newDoc, newPos] = transform(textDocument, position);
42
+ const file = {
43
+ name: textDocument.uri,
44
+ content: newDoc.getText()
45
+ };
46
+ const parsedWorkflow = fetchOrParseWorkflow(file, textDocument.uri, true);
47
+ if (!parsedWorkflow.value) {
48
+ return [];
49
+ }
50
+ const template = await fetchOrConvertWorkflowTemplate(parsedWorkflow.context, parsedWorkflow.value, textDocument.uri, config, {
51
+ fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0,
52
+ errorPolicy: ErrorPolicy.TryConversion
53
+ });
54
+ const { token, keyToken, parent, path } = findToken(newPos, parsedWorkflow.value);
55
+ const workflowContext = getWorkflowContext(textDocument.uri, template, path);
56
+ // If we are inside an expression, take a different code-path. The workflow parser does not correctly create
57
+ // expression nodes for invalid expressions and during editing expressions are invalid most of the time.
58
+ if (token) {
59
+ if (isBasicExpression(token) || isPotentiallyExpression(token)) {
60
+ const allowedContext = token.definitionInfo?.allowedContext || [];
61
+ const context = await getContext(allowedContext, config?.contextProviderConfig, workflowContext, Mode.Completion);
62
+ return getExpressionCompletionItems(token, context, newPos);
63
+ }
64
+ }
65
+ const indentation = guessIndentation(newDoc, 2, true); // Use 2 spaces as default and most common for YAML
66
+ const indentString = " ".repeat(indentation.tabSize);
67
+ const values = await getValues(token, keyToken, parent, config?.valueProviderConfig, workflowContext, indentString);
68
+ let replaceRange;
69
+ if (token?.range) {
70
+ replaceRange = mapRange(token.range);
71
+ }
72
+ else if (!token) {
73
+ // Not a valid token, create a range from the current position
74
+ const line = newDoc.getText({ start: { line: position.line, character: 0 }, end: position });
75
+ // Get the length of the current word
76
+ const val = line.match(/[\w_-]*$/)?.[0].length || 0;
77
+ // Check if we need to remove a trailing colon
78
+ const charAfterPos = textDocument.getText({
79
+ start: { line: position.line, character: position.character },
80
+ end: { line: position.line, character: position.character + 1 }
81
+ });
82
+ if (charAfterPos === ":") {
83
+ replaceRange = Range.create({ line: position.line, character: position.character - val }, { line: position.line, character: position.character + 1 });
84
+ }
85
+ else {
86
+ replaceRange = Range.create({ line: position.line, character: position.character - val }, position);
87
+ }
88
+ }
89
+ return values.map(value => {
90
+ const newText = value.insertText || value.label;
91
+ const item = {
92
+ label: value.label,
93
+ documentation: value.description && {
94
+ kind: "markdown",
95
+ value: value.description
96
+ },
97
+ tags: value.deprecated ? [CompletionItemTag.Deprecated] : undefined,
98
+ textEdit: replaceRange ? TextEdit.replace(replaceRange, newText) : TextEdit.insert(position, newText)
99
+ };
100
+ return item;
101
+ });
102
+ }
103
+ async function getValues(token, keyToken, parent, valueProviderConfig, workflowContext, indentation) {
104
+ if (!parent) {
105
+ return [];
106
+ }
107
+ const existingValues = getExistingValues(token, parent);
108
+ // Use the value providers from the parent if the current key is null
109
+ const valueProviderToken = keyToken || parent;
110
+ const customValueProvider = valueProviderToken?.definition?.key && valueProviderConfig?.[valueProviderToken.definition.key];
111
+ if (customValueProvider) {
112
+ const customValues = await customValueProvider.get(workflowContext, existingValues);
113
+ if (customValues) {
114
+ return filterAndSortCompletionOptions(customValues, existingValues);
115
+ }
116
+ }
117
+ const defaultValueProvider = valueProviderToken?.definition?.key && defaultValueProviders[valueProviderToken.definition.key];
118
+ if (defaultValueProvider) {
119
+ const values = await defaultValueProvider.get(workflowContext, existingValues);
120
+ return filterAndSortCompletionOptions(values, existingValues);
121
+ }
122
+ // Use the definition if there are no value providers
123
+ const def = keyToken?.definition || parent.definition;
124
+ if (!def) {
125
+ return [];
126
+ }
127
+ const values = definitionValues(def, indentation);
128
+ return filterAndSortCompletionOptions(values, existingValues);
129
+ }
130
+ export function getExistingValues(token, parent) {
131
+ // For incomplete YAML, we may only have a parent token
132
+ if (token) {
133
+ if (!isString(token)) {
134
+ return;
135
+ }
136
+ if (isSequence(parent)) {
137
+ const sequenceValues = new Set();
138
+ for (const t of parent) {
139
+ if (isString(t)) {
140
+ // Should we support other literal values here?
141
+ sequenceValues.add(t.value);
142
+ }
143
+ }
144
+ return sequenceValues;
145
+ }
146
+ }
147
+ if (parent.templateTokenType === TokenType.Mapping) {
148
+ // No token and parent is a mapping, so we're completing a key
149
+ const mapKeys = new Set();
150
+ const mapToken = parent;
151
+ for (const { key, value } of mapToken) {
152
+ if (isString(key) && !isPlaceholder(key, value)) {
153
+ mapKeys.add(key.value);
154
+ }
155
+ }
156
+ return mapKeys;
157
+ }
158
+ }
159
+ function getExpressionCompletionItems(token, context, pos) {
160
+ if (!token.range) {
161
+ return [];
162
+ }
163
+ let currentInput = "";
164
+ if (isBasicExpression(token)) {
165
+ currentInput = token.source || token.expression;
166
+ }
167
+ else {
168
+ const stringToken = token.assertString("Expected string token for expression completion");
169
+ currentInput = stringToken.source || stringToken.value;
170
+ }
171
+ const relCharOffset = getRelCharOffset(token.range, currentInput, pos);
172
+ const expressionInput = (getExpressionInput(currentInput, relCharOffset) || "").trim();
173
+ try {
174
+ return completeExpression(expressionInput, context, [], validatorFunctions).map(item => mapExpressionCompletionItem(item, currentInput[relCharOffset]));
175
+ }
176
+ catch (e) {
177
+ error(`Error while completing expression: '${e?.message || "<no details>"}'`);
178
+ return [];
179
+ }
180
+ }
181
+ function filterAndSortCompletionOptions(options, existingValues) {
182
+ options = options.filter(x => !existingValues?.has(x.label));
183
+ options.sort((a, b) => a.label.localeCompare(b.label));
184
+ return options;
185
+ }
186
+ function mapExpressionCompletionItem(item, charAfterPos) {
187
+ let insertText;
188
+ // Insert parentheses if the cursor is after a function
189
+ // and the function does not have any parantheses already
190
+ if (item.function) {
191
+ insertText = charAfterPos === "(" ? item.label : item.label + "()";
192
+ }
193
+ return {
194
+ label: item.label,
195
+ documentation: item.description && {
196
+ kind: "markdown",
197
+ value: item.description
198
+ },
199
+ insertText: insertText,
200
+ kind: item.function ? CompletionItemKind.Function : CompletionItemKind.Variable
201
+ };
202
+ }
203
+ //# sourceMappingURL=complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../src/complete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { WorkflowTemplate } from "@actions/workflow-parser";
2
+ import { Job, ReusableWorkflowJob, Step } from "@actions/workflow-parser/model/workflow-template";
3
+ import { TemplateToken } from "@actions/workflow-parser/templates/tokens/template-token";
4
+ export interface WorkflowContext {
5
+ uri: string;
6
+ template: WorkflowTemplate | undefined;
7
+ /** If the context is for a position within a regular job, this will be the job */
8
+ job?: Job;
9
+ /** If the context is for a position within a reusable workflow job, this will be the reusable workflow job */
10
+ reusableWorkflowJob?: ReusableWorkflowJob;
11
+ /** If the context is for a position within a step, this will be the step */
12
+ step?: Step;
13
+ }
14
+ export declare function getWorkflowContext(uri: string, template: WorkflowTemplate | undefined, tokenPath: TemplateToken[]): WorkflowContext;
15
+ //# sourceMappingURL=workflow-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-context.d.ts","sourceRoot":"","sources":["../../src/context/workflow-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAEjF,OAAO,EAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAC,MAAM,kDAAkD,CAAC;AAIhG,OAAO,EAAC,aAAa,EAAC,MAAM,0DAA0D,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAEvC,kFAAkF;IAClF,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,8GAA8G;IAC9G,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAE1C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,SAAS,EAAE,aAAa,EAAE,GACzB,eAAe,CA8CjB"}
@@ -0,0 +1,64 @@
1
+ import { isMapping, isSequence } from "@actions/workflow-parser";
2
+ import { isJob, isReusableWorkflowJob } from "@actions/workflow-parser/model/type-guards";
3
+ export function getWorkflowContext(uri, template, tokenPath) {
4
+ const context = { uri: uri, template };
5
+ if (!template) {
6
+ return context;
7
+ }
8
+ let stepsSequence = undefined;
9
+ let stepToken = undefined;
10
+ // Iterate through the token path to find the job and step
11
+ for (const token of tokenPath) {
12
+ switch (token.definition?.key) {
13
+ case "job": {
14
+ const jobID = token.value;
15
+ const job = template.jobs.find(job => job.id.value === jobID);
16
+ if (!job) {
17
+ break;
18
+ }
19
+ if (isJob(job)) {
20
+ context.job = job;
21
+ }
22
+ else if (isReusableWorkflowJob(job)) {
23
+ context.reusableWorkflowJob = job;
24
+ }
25
+ break;
26
+ }
27
+ case "steps": {
28
+ if (isSequence(token)) {
29
+ stepsSequence = token;
30
+ }
31
+ break;
32
+ }
33
+ case "regular-step":
34
+ case "run-step": {
35
+ if (isMapping(token)) {
36
+ stepToken = token;
37
+ }
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ if (context.job && isJob(context.job)) {
43
+ context.step = findStep(context.job.steps, stepsSequence, stepToken);
44
+ }
45
+ return context;
46
+ }
47
+ function findStep(steps, stepSequence, stepToken) {
48
+ if (!steps || !stepSequence || !stepToken) {
49
+ return undefined;
50
+ }
51
+ // Steps may not define an ID, so find the step by index
52
+ let stepIndex = -1;
53
+ for (let i = 0; i < stepSequence.count; i++) {
54
+ if (stepSequence.get(i) === stepToken) {
55
+ stepIndex = i;
56
+ break;
57
+ }
58
+ }
59
+ if (stepIndex === -1 || stepIndex >= steps.length) {
60
+ return undefined;
61
+ }
62
+ return steps[stepIndex];
63
+ }
64
+ //# sourceMappingURL=workflow-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-context.js","sourceRoot":"","sources":["../../src/context/workflow-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAmB,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAC,KAAK,EAAE,qBAAqB,EAAC,MAAM,4CAA4C,CAAC;AAsBxF,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,QAAsC,EACtC,SAA0B;IAE1B,MAAM,OAAO,GAAoB,EAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,OAAO,CAAC;KAChB;IAED,IAAI,aAAa,GAA8B,SAAS,CAAC;IACzD,IAAI,SAAS,GAA6B,SAAS,CAAC;IAEpD,0DAA0D;IAC1D,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,QAAQ,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE;YAC7B,KAAK,KAAK,CAAC,CAAC;gBACV,MAAM,KAAK,GAAI,KAAqB,CAAC,KAAK,CAAC;gBAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBAC9D,IAAI,CAAC,GAAG,EAAE;oBACR,MAAM;iBACP;gBACD,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;oBACd,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;iBACnB;qBAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE;oBACrC,OAAO,CAAC,mBAAmB,GAAG,GAAG,CAAC;iBACnC;gBACD,MAAM;aACP;YACD,KAAK,OAAO,CAAC,CAAC;gBACZ,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;oBACrB,aAAa,GAAG,KAAK,CAAC;iBACvB;gBACD,MAAM;aACP;YACD,KAAK,cAAc,CAAC;YACpB,KAAK,UAAU,CAAC,CAAC;gBACf,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE;oBACpB,SAAS,GAAG,KAAK,CAAC;iBACnB;gBACD,MAAM;aACP;SACF;KACF;IAED,IAAI,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACrC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;KACtE;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,YAA4B,EAAE,SAAwB;IACtF,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE;QACzC,OAAO,SAAS,CAAC;KAClB;IAED,wDAAwD;IACxD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YACrC,SAAS,GAAG,CAAC,CAAC;YACd,MAAM;SACP;KACF;IAED,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE;QACjD,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { DescriptionDictionary } from "@actions/expressions";
2
+ import { WorkflowContext } from "../context/workflow-context";
3
+ import { Mode } from "./default";
4
+ export type ContextProviderConfig = {
5
+ getContext: (name: string, defaultContext: DescriptionDictionary | undefined, workflowContext: WorkflowContext, mode: Mode) => Promise<DescriptionDictionary | undefined>;
6
+ };
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/context-providers/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,qBAAqB,GAAG,SAAS,EACjD,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,IAAI,KACP,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;CACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/context-providers/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { data, DescriptionDictionary } from "@actions/expressions";
2
+ import { WorkflowContext } from "../context/workflow-context";
3
+ import { ContextProviderConfig } from "./config";
4
+ export type ContextValue = DescriptionDictionary | data.Null;
5
+ export declare enum Mode {
6
+ Completion = 0,
7
+ Validation = 1,
8
+ Hover = 2
9
+ }
10
+ export declare function getContext(names: string[], config: ContextProviderConfig | undefined, workflowContext: WorkflowContext, mode: Mode): Promise<DescriptionDictionary>;
11
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/context-providers/default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAC,qBAAqB,EAAC,MAAM,UAAU,CAAC;AAe/C,MAAM,MAAM,YAAY,GAAG,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC;AAE7D,oBAAY,IAAI;IACd,UAAU,IAAA;IACV,UAAU,IAAA;IACV,KAAK,IAAA;CACN;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,qBAAqB,GAAG,SAAS,EACzC,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,qBAAqB,CAAC,CAiBhC"}