@actions/languageserver 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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/client.d.ts +3 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +8 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/commands.d.ts +4 -0
  8. package/dist/commands.d.ts.map +1 -0
  9. package/dist/commands.js +5 -0
  10. package/dist/commands.js.map +1 -0
  11. package/dist/connection.d.ts +3 -0
  12. package/dist/connection.d.ts.map +1 -0
  13. package/dist/connection.js +127 -0
  14. package/dist/connection.js.map +1 -0
  15. package/dist/context-providers/action-outputs.d.ts +5 -0
  16. package/dist/context-providers/action-outputs.d.ts.map +1 -0
  17. package/dist/context-providers/action-outputs.js +5 -0
  18. package/dist/context-providers/action-outputs.js.map +1 -0
  19. package/dist/context-providers/secrets.d.ts +8 -0
  20. package/dist/context-providers/secrets.d.ts.map +1 -0
  21. package/dist/context-providers/secrets.js +122 -0
  22. package/dist/context-providers/secrets.js.map +1 -0
  23. package/dist/context-providers/steps.d.ts +6 -0
  24. package/dist/context-providers/steps.d.ts.map +1 -0
  25. package/dist/context-providers/steps.js +60 -0
  26. package/dist/context-providers/steps.js.map +1 -0
  27. package/dist/context-providers/variables.d.ts +13 -0
  28. package/dist/context-providers/variables.d.ts.map +1 -0
  29. package/dist/context-providers/variables.js +120 -0
  30. package/dist/context-providers/variables.js.map +1 -0
  31. package/dist/context-providers.d.ts +6 -0
  32. package/dist/context-providers.d.ts.map +1 -0
  33. package/dist/context-providers.js +20 -0
  34. package/dist/context-providers.js.map +1 -0
  35. package/dist/description-provider.d.ts +5 -0
  36. package/dist/description-provider.d.ts.map +1 -0
  37. package/dist/description-provider.js +20 -0
  38. package/dist/description-provider.js.map +1 -0
  39. package/dist/description-providers/action-description.d.ts +5 -0
  40. package/dist/description-providers/action-description.d.ts.map +1 -0
  41. package/dist/description-providers/action-description.js +18 -0
  42. package/dist/description-providers/action-description.js.map +1 -0
  43. package/dist/description-providers/action-input.d.ts +6 -0
  44. package/dist/description-providers/action-input.d.ts.map +1 -0
  45. package/dist/description-providers/action-input.js +36 -0
  46. package/dist/description-providers/action-input.js.map +1 -0
  47. package/dist/file-provider.d.ts +5 -0
  48. package/dist/file-provider.d.ts.map +1 -0
  49. package/dist/file-provider.js +49 -0
  50. package/dist/file-provider.js.map +1 -0
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +19 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/initializationOptions.d.ts +45 -0
  56. package/dist/initializationOptions.d.ts.map +1 -0
  57. package/dist/initializationOptions.js +2 -0
  58. package/dist/initializationOptions.js.map +1 -0
  59. package/dist/on-completion.d.ts +7 -0
  60. package/dist/on-completion.d.ts.map +1 -0
  61. package/dist/on-completion.js +15 -0
  62. package/dist/on-completion.js.map +1 -0
  63. package/dist/request.d.ts +7 -0
  64. package/dist/request.d.ts.map +1 -0
  65. package/dist/request.js +4 -0
  66. package/dist/request.js.map +1 -0
  67. package/dist/utils/action-metadata.d.ts +5 -0
  68. package/dist/utils/action-metadata.d.ts.map +1 -0
  69. package/dist/utils/action-metadata.js +56 -0
  70. package/dist/utils/action-metadata.js.map +1 -0
  71. package/dist/utils/cache.d.ts +14 -0
  72. package/dist/utils/cache.d.ts.map +1 -0
  73. package/dist/utils/cache.js +35 -0
  74. package/dist/utils/cache.js.map +1 -0
  75. package/dist/utils/error.d.ts +3 -0
  76. package/dist/utils/error.d.ts.map +1 -0
  77. package/dist/utils/error.js +22 -0
  78. package/dist/utils/error.js.map +1 -0
  79. package/dist/utils/repo-permission.d.ts +6 -0
  80. package/dist/utils/repo-permission.d.ts.map +1 -0
  81. package/dist/utils/repo-permission.js +36 -0
  82. package/dist/utils/repo-permission.js.map +1 -0
  83. package/dist/utils/timer.d.ts +2 -0
  84. package/dist/utils/timer.d.ts.map +1 -0
  85. package/dist/utils/timer.js +12 -0
  86. package/dist/utils/timer.js.map +1 -0
  87. package/dist/utils/username.d.ts +4 -0
  88. package/dist/utils/username.d.ts.map +1 -0
  89. package/dist/utils/username.js +14 -0
  90. package/dist/utils/username.js.map +1 -0
  91. package/dist/value-providers/action-inputs.d.ts +8 -0
  92. package/dist/value-providers/action-inputs.d.ts.map +1 -0
  93. package/dist/value-providers/action-inputs.js +28 -0
  94. package/dist/value-providers/action-inputs.js.map +1 -0
  95. package/dist/value-providers/job-environment.d.ts +5 -0
  96. package/dist/value-providers/job-environment.d.ts.map +1 -0
  97. package/dist/value-providers/job-environment.js +21 -0
  98. package/dist/value-providers/job-environment.js.map +1 -0
  99. package/dist/value-providers/runs-on.d.ts +5 -0
  100. package/dist/value-providers/runs-on.d.ts.map +1 -0
  101. package/dist/value-providers/runs-on.js +34 -0
  102. package/dist/value-providers/runs-on.js.map +1 -0
  103. package/dist/value-providers.d.ts +6 -0
  104. package/dist/value-providers.d.ts.map +1 -0
  105. package/dist/value-providers.js +30 -0
  106. package/dist/value-providers.js.map +1 -0
  107. package/package.json +75 -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,134 @@
1
+ # actions/languageserver
2
+
3
+ `actions-languageserver` hosts the `actions-languageservice` and makes it available via the [language server protocol](https://microsoft.github.io/language-server-protocol/) (LSP) as a standalone language server.
4
+
5
+ ## Installation
6
+
7
+ The [package](https://www.npmjs.com/package/@actions/languageserver) contains TypeScript types and compiled ECMAScript modules.
8
+
9
+ ```bash
10
+ npm install @actions/languageserver
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ### Basic usage using `vscode-languageserver-node`
16
+
17
+ For the server, import the module. It detects whether it's running in a Node.js environment or a web worker and initializes the appropriate connection.
18
+
19
+ `server.ts`:
20
+
21
+ ```typescript
22
+ import "@actions/languageserver";
23
+ ```
24
+
25
+ For the client, create a new `LanguageClient` pointing to the server module.
26
+
27
+ `client.ts`:
28
+
29
+ ```typescript
30
+ import {LanguageClient, ServerOptions, TransportKind} from "vscode-languageclient/node";
31
+
32
+ const debugOptions = {execArgv: ["--nolazy", "--inspect=6010"]};
33
+
34
+ const clientOptions: LanguageClientOptions = {
35
+ documentSelector: [{
36
+ pattern: "**/.github/workflows/*.{yaml,yml}"
37
+ }]
38
+ };
39
+
40
+ const serverModule = context.asAbsolutePath(path.join("dist", "server.js"));
41
+ const serverOptions: ServerOptions = {
42
+ run: {module: serverModule, transport: TransportKind.ipc},
43
+ debug: {
44
+ module: serverModule,
45
+ transport: TransportKind.ipc,
46
+ options: debugOptions
47
+ }
48
+ };
49
+
50
+ const client = new LanguageClient("actions-language", "GitHub Actions Language Server", serverOptions, clientOptions);
51
+ ```
52
+
53
+ ### From a web worker
54
+
55
+ See [../browser-playground](../browser-playground) for an example implementation that hosts the language server in a web worker.
56
+
57
+ ### Providing advanced functionality
58
+
59
+ The language server accepts initialization options that can be used to configure additional functionality. If you pass in a github.com `sessionToken`, the language service will use data from github.com to perform additional validations and provide additional auto-completion suggestions.
60
+
61
+ ```typescript
62
+ export interface InitializationOptions {
63
+ /**
64
+ * GitHub token that will be used to retrieve additional information from github.com
65
+ *
66
+ * Requires the `repo` and `workflow` scopes
67
+ */
68
+ sessionToken?: string;
69
+
70
+ /**
71
+ * List of repositories that the language server should be aware of
72
+ */
73
+ repos?: RepositoryContext[];
74
+
75
+ /**
76
+ * Desired log level
77
+ */
78
+ logLevel?: LogLevel;
79
+ }
80
+ ```
81
+
82
+ pass the `initializationOptions` to the `LanguageClient` when establishing the connection:
83
+
84
+ ```typescript
85
+ const clientOptions: LanguageClientOptions = {
86
+ documentSelector: [{
87
+ pattern: "**/.github/workflows/*.{yaml,yml}"
88
+ }],
89
+ initializationOptions: initializationOptions
90
+ };
91
+
92
+ const client = new LanguageClient("actions-language", "GitHub Actions Language Server", serverOptions, clientOptions);
93
+ ```
94
+
95
+ ## Contributing
96
+
97
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) at the root of the repository for general guidelines and recommendations.
98
+
99
+ 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.
100
+
101
+ ### Build
102
+
103
+ ```bash
104
+ npm run build
105
+ ```
106
+
107
+ or to watch for changes
108
+
109
+ ```bash
110
+ npm run watch
111
+ ```
112
+
113
+ ### Test
114
+
115
+ ```bash
116
+ npm test
117
+ ```
118
+
119
+ or to watch for changes and run tests:
120
+
121
+ ```bash
122
+ npm run test-watch
123
+ ```
124
+
125
+ ### Lint
126
+
127
+ ```bash
128
+ npm run format-check
129
+ ```
130
+
131
+ ## License
132
+
133
+ This project is licensed under the terms of the MIT open source license. Please refer to [MIT](../LICENSE) for the full terms.
134
+
@@ -0,0 +1,3 @@
1
+ import { Octokit } from "@octokit/rest";
2
+ export declare function getClient(token: string, userAgent?: string): Octokit;
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAKpE"}
package/dist/client.js ADDED
@@ -0,0 +1,8 @@
1
+ import { Octokit } from "@octokit/rest";
2
+ export function getClient(token, userAgent) {
3
+ return new Octokit({
4
+ auth: token,
5
+ userAgent: userAgent || `GitHub Actions Language Server`
6
+ });
7
+ }
8
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,SAAkB;IACzD,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,SAAS,IAAI,gCAAgC;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare enum Commands {
2
+ ClearCache = "cacheClear"
3
+ }
4
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,UAAU,eAAe;CAC1B"}
@@ -0,0 +1,5 @@
1
+ export var Commands;
2
+ (function (Commands) {
3
+ Commands["ClearCache"] = "cacheClear";
4
+ })(Commands || (Commands = {}));
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAEX;AAFD,WAAY,QAAQ;IAClB,qCAAyB,CAAA;AAC3B,CAAC,EAFW,QAAQ,KAAR,QAAQ,QAEnB"}
@@ -0,0 +1,3 @@
1
+ import { Connection } from "vscode-languageserver";
2
+ export declare function initConnection(connection: Connection): void;
3
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,UAAU,EAYX,MAAM,uBAAuB,CAAC;AAe/B,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,QA2IpD"}
@@ -0,0 +1,127 @@
1
+ import { documentLinks, hover, validate } from "@actions/languageservice";
2
+ import { registerLogger, setLogLevel } from "@actions/languageservice/log";
3
+ import { clearCache, clearCacheEntry } from "@actions/languageservice/utils/workflow-cache";
4
+ import { TextDocuments, TextDocumentSyncKind } from "vscode-languageserver";
5
+ import { TextDocument } from "vscode-languageserver-textdocument";
6
+ import { getClient } from "./client";
7
+ import { Commands } from "./commands";
8
+ import { contextProviders } from "./context-providers";
9
+ import { descriptionProvider } from "./description-provider";
10
+ import { getFileProvider } from "./file-provider";
11
+ import { onCompletion } from "./on-completion";
12
+ import { Requests } from "./request";
13
+ import { fetchActionMetadata } from "./utils/action-metadata";
14
+ import { TTLCache } from "./utils/cache";
15
+ import { timeOperation } from "./utils/timer";
16
+ import { valueProviders } from "./value-providers";
17
+ export function initConnection(connection) {
18
+ const documents = new TextDocuments(TextDocument);
19
+ let client;
20
+ let repos = [];
21
+ const cache = new TTLCache();
22
+ let hasWorkspaceFolderCapability = false;
23
+ // Register remote console logger with language service
24
+ registerLogger(connection.console);
25
+ connection.onInitialize((params) => {
26
+ const capabilities = params.capabilities;
27
+ hasWorkspaceFolderCapability = !!(capabilities.workspace && !!capabilities.workspace.workspaceFolders);
28
+ const options = params.initializationOptions;
29
+ if (options.sessionToken) {
30
+ client = getClient(options.sessionToken, options.userAgent);
31
+ }
32
+ if (options.repos) {
33
+ repos = options.repos;
34
+ }
35
+ if (options.logLevel !== undefined) {
36
+ setLogLevel(options.logLevel);
37
+ }
38
+ const result = {
39
+ capabilities: {
40
+ textDocumentSync: TextDocumentSyncKind.Full,
41
+ completionProvider: {
42
+ resolveProvider: false,
43
+ triggerCharacters: [":", "."]
44
+ },
45
+ hoverProvider: true,
46
+ documentLinkProvider: {
47
+ resolveProvider: false
48
+ }
49
+ }
50
+ };
51
+ if (hasWorkspaceFolderCapability) {
52
+ result.capabilities.workspace = {
53
+ workspaceFolders: {
54
+ supported: true
55
+ }
56
+ };
57
+ }
58
+ return result;
59
+ });
60
+ connection.onInitialized(() => {
61
+ if (hasWorkspaceFolderCapability) {
62
+ connection.workspace.onDidChangeWorkspaceFolders(() => {
63
+ clearCache();
64
+ });
65
+ }
66
+ });
67
+ // The content of a text document has changed. This event is emitted
68
+ // when the text document first opened or when its content has changed.
69
+ documents.onDidChangeContent(change => {
70
+ clearCacheEntry(change.document.uri);
71
+ return timeOperation("validation", async () => await validateTextDocument(change.document));
72
+ });
73
+ async function validateTextDocument(textDocument) {
74
+ const repoContext = repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri));
75
+ const config = {
76
+ valueProviderConfig: valueProviders(client, repoContext, cache),
77
+ contextProviderConfig: contextProviders(client, repoContext, cache),
78
+ fetchActionMetadata: async (action) => {
79
+ if (client) {
80
+ return await fetchActionMetadata(client, cache, action);
81
+ }
82
+ return undefined;
83
+ },
84
+ fileProvider: getFileProvider(client, cache, repoContext?.workspaceUri, async (path) => {
85
+ return await connection.sendRequest(Requests.ReadFile, { path });
86
+ })
87
+ };
88
+ const result = await validate(textDocument, config);
89
+ await connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: result });
90
+ }
91
+ connection.onCompletion(async ({ position, textDocument }) => {
92
+ return timeOperation("completion", async () => await onCompletion(connection, position, getDocument(documents, textDocument), client, repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri)), cache));
93
+ });
94
+ connection.onHover(async ({ position, textDocument }) => {
95
+ return timeOperation("hover", async () => {
96
+ const repoContext = repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri));
97
+ return await hover(getDocument(documents, textDocument), position, {
98
+ descriptionProvider: descriptionProvider(client, cache),
99
+ contextProviderConfig: repoContext && contextProviders(client, repoContext, cache),
100
+ fileProvider: getFileProvider(client, cache, repoContext?.workspaceUri, async (path) => {
101
+ return await connection.sendRequest(Requests.ReadFile, { path });
102
+ })
103
+ });
104
+ });
105
+ });
106
+ connection.onRequest("workspace/executeCommand", async (params) => {
107
+ if (params.command === Commands.ClearCache) {
108
+ cache.clear();
109
+ await Promise.all(documents.all().map(doc => validateTextDocument(doc)));
110
+ }
111
+ });
112
+ connection.onDocumentLinks(async ({ textDocument }) => {
113
+ const repoContext = repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri));
114
+ return documentLinks(getDocument(documents, textDocument), repoContext?.workspaceUri);
115
+ });
116
+ // Make the text document manager listen on the connection
117
+ // for open, change and close text document events
118
+ documents.listen(connection);
119
+ // Listen on the connection
120
+ connection.listen();
121
+ }
122
+ function getDocument(documents, id) {
123
+ // The text document manager should ensure all documents exist
124
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
125
+ return documents.get(id.uri);
126
+ }
127
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ActionOutputs, ActionReference } from "@actions/languageservice/action";
2
+ import { Octokit } from "@octokit/rest";
3
+ import { TTLCache } from "../utils/cache";
4
+ export declare function getActionOutputs(octokit: Octokit, cache: TTLCache, action: ActionReference): Promise<ActionOutputs | undefined>;
5
+ //# sourceMappingURL=action-outputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-outputs.d.ts","sourceRoot":"","sources":["../../src/context-providers/action-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAExC,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAEpC"}
@@ -0,0 +1,5 @@
1
+ import { fetchActionMetadata } from "../utils/action-metadata";
2
+ export async function getActionOutputs(octokit, cache, action) {
3
+ return (await fetchActionMetadata(octokit, cache, action))?.outputs;
4
+ }
5
+ //# sourceMappingURL=action-outputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-outputs.js","sourceRoot":"","sources":["../../src/context-providers/action-outputs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgB,EAChB,KAAe,EACf,MAAuB;IAEvB,OAAO,CAAC,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;AACtE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { DescriptionDictionary } from "@actions/expressions";
2
+ import { Mode } from "@actions/languageservice/context-providers/default";
3
+ import { WorkflowContext } from "@actions/languageservice/context/workflow-context";
4
+ import { Octokit } from "@octokit/rest";
5
+ import { RepositoryContext } from "../initializationOptions";
6
+ import { TTLCache } from "../utils/cache";
7
+ export declare function getSecrets(workflowContext: WorkflowContext, octokit: Octokit, cache: TTLCache, repo: RepositoryContext, defaultContext: DescriptionDictionary | undefined, mode: Mode): Promise<DescriptionDictionary>;
8
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/context-providers/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAC,IAAI,EAAC,MAAM,oDAAoD,CAAC;AACxE,OAAO,EAAC,eAAe,EAAC,MAAM,mDAAmD,CAAC;AAGlF,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAIxC,wBAAsB,UAAU,CAC9B,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,iBAAiB,EACvB,cAAc,EAAE,qBAAqB,GAAG,SAAS,EACjD,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,qBAAqB,CAAC,CA+EhC"}
@@ -0,0 +1,122 @@
1
+ import { data, DescriptionDictionary } from "@actions/expressions";
2
+ import { StringData } from "@actions/expressions/data/string";
3
+ import { Mode } from "@actions/languageservice/context-providers/default";
4
+ import { warn } from "@actions/languageservice/log";
5
+ import { isMapping, isString } from "@actions/workflow-parser";
6
+ import { errorStatus } from "../utils/error";
7
+ import { getRepoPermission } from "../utils/repo-permission";
8
+ export async function getSecrets(workflowContext, octokit, cache, repo, defaultContext, mode) {
9
+ const secretsContext = defaultContext || new DescriptionDictionary();
10
+ const permission = await getRepoPermission(octokit, cache, repo);
11
+ if (permission === "none") {
12
+ secretsContext.complete = false;
13
+ return secretsContext;
14
+ }
15
+ const eventsConfig = workflowContext?.template?.events;
16
+ if (eventsConfig?.workflow_call) {
17
+ // Unpredictable secrets may be passed in via a workflow_call trigger
18
+ secretsContext.complete = false;
19
+ // Exit early for validation mode or if workflow_call is the only trigger
20
+ if (mode === Mode.Validation || Object.keys(eventsConfig).length == 1) {
21
+ return secretsContext;
22
+ }
23
+ }
24
+ let environmentName;
25
+ if (workflowContext?.job?.environment) {
26
+ if (isString(workflowContext.job.environment)) {
27
+ environmentName = workflowContext.job.environment.value;
28
+ }
29
+ else if (isMapping(workflowContext.job.environment)) {
30
+ for (const x of workflowContext.job.environment) {
31
+ if (isString(x.key) && x.key.value === "name") {
32
+ if (isString(x.value)) {
33
+ environmentName = x.value.value;
34
+ }
35
+ break;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ const secrets = await getRemoteSecrets(octokit, cache, repo, environmentName);
41
+ // Build combined map of secrets
42
+ const secretsMap = new Map();
43
+ secrets.orgSecrets.forEach(secret => secretsMap.set(secret.value.toLowerCase(), {
44
+ key: secret.value,
45
+ value: new data.StringData("***"),
46
+ description: "Organization secret"
47
+ }));
48
+ // Override org secrets with repo secrets
49
+ secrets.repoSecrets.forEach(secret => secretsMap.set(secret.value.toLowerCase(), {
50
+ key: secret.value,
51
+ value: new data.StringData("***"),
52
+ description: "Repository secret"
53
+ }));
54
+ // Override repo secrets with environment secrets (if defined)
55
+ secrets.environmentSecrets.forEach(secret => secretsMap.set(secret.value.toLowerCase(), {
56
+ key: secret.value,
57
+ value: new data.StringData("***"),
58
+ description: `Secret for environment \`${environmentName || ""}\``
59
+ }));
60
+ // Sort secrets by key and add to context
61
+ Array.from(secretsMap.values())
62
+ .sort((a, b) => a.key.localeCompare(b.key))
63
+ .forEach(secret => secretsContext?.add(secret.key, secret.value, secret.description));
64
+ return secretsContext;
65
+ }
66
+ async function getRemoteSecrets(octokit, cache, repo, environmentName) {
67
+ return {
68
+ repoSecrets: await cache.get(`${repo.owner}/${repo.name}/secrets`, undefined, () => fetchSecrets(octokit, repo.owner, repo.name)),
69
+ environmentSecrets: (environmentName &&
70
+ (await cache.get(`${repo.owner}/${repo.name}/secrets/environment/${environmentName}`, undefined, () => fetchEnvironmentSecrets(octokit, repo.id, environmentName)))) ||
71
+ [],
72
+ orgSecrets: await cache.get(`${repo.owner}/secrets`, undefined, () => fetchOrganizationSecrets(octokit, repo))
73
+ };
74
+ }
75
+ async function fetchSecrets(octokit, owner, name) {
76
+ try {
77
+ return await octokit.paginate(octokit.actions.listRepoSecrets, {
78
+ owner,
79
+ repo: name,
80
+ per_page: 100
81
+ }, response => response.data.map(secret => new StringData(secret.name)));
82
+ }
83
+ catch (e) {
84
+ console.log("Failure to retrieve secrets: ", e);
85
+ throw e;
86
+ }
87
+ }
88
+ async function fetchEnvironmentSecrets(octokit, repositoryId, environmentName) {
89
+ try {
90
+ return await octokit.paginate(octokit.actions.listEnvironmentSecrets, {
91
+ repository_id: repositoryId,
92
+ environment_name: environmentName,
93
+ per_page: 100
94
+ }, response => response.data.map(secret => new StringData(secret.name)));
95
+ }
96
+ catch (e) {
97
+ if (errorStatus(e) === 404) {
98
+ warn(`Environment ${environmentName} not found`);
99
+ return [];
100
+ }
101
+ console.log("Failure to retrieve environment secrets: ", e);
102
+ throw e;
103
+ }
104
+ }
105
+ async function fetchOrganizationSecrets(octokit, repo) {
106
+ if (!repo.organizationOwned) {
107
+ return [];
108
+ }
109
+ try {
110
+ const secrets = await octokit.paginate("GET /repos/{owner}/{repo}/actions/organization-secrets", {
111
+ owner: repo.owner,
112
+ repo: repo.name,
113
+ per_page: 100
114
+ });
115
+ return secrets.map(secret => new StringData(secret.name));
116
+ }
117
+ catch (e) {
118
+ console.log("Failure to retrieve organization secrets: ", e);
119
+ throw e;
120
+ }
121
+ }
122
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/context-providers/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { DescriptionDictionary } from "@actions/expressions";
2
+ import { WorkflowContext } from "@actions/languageservice/context/workflow-context";
3
+ import { Octokit } from "@octokit/rest";
4
+ import { TTLCache } from "../utils/cache";
5
+ export declare function getStepsContext(octokit: Octokit, cache: TTLCache, defaultContext: DescriptionDictionary | undefined, workflowContext: WorkflowContext): Promise<DescriptionDictionary | undefined>;
6
+ //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/context-providers/steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,qBAAqB,EAA0B,MAAM,sBAAsB,CAAC;AAE1F,OAAO,EAAC,eAAe,EAAC,MAAM,mDAAmD,CAAC;AAElF,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGxC,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,EACf,cAAc,EAAE,qBAAqB,GAAG,SAAS,EACjD,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA6D5C"}
@@ -0,0 +1,60 @@
1
+ import { data, DescriptionDictionary, isDescriptionDictionary } from "@actions/expressions";
2
+ import { parseActionReference } from "@actions/languageservice/action";
3
+ import { isActionStep } from "@actions/workflow-parser/model/type-guards";
4
+ import { getActionOutputs } from "./action-outputs";
5
+ export async function getStepsContext(octokit, cache, defaultContext, workflowContext) {
6
+ if (!defaultContext || !workflowContext.job) {
7
+ return defaultContext;
8
+ }
9
+ // The default context includes the set of valid
10
+ // step ids that can be used in expressions
11
+ const contextSteps = new Set();
12
+ for (const { key } of defaultContext.pairs()) {
13
+ contextSteps.add(key);
14
+ }
15
+ // Copy the default context for each step
16
+ // If the step is an action, add the action outputs to the context
17
+ const stepsContext = new DescriptionDictionary();
18
+ for (const step of workflowContext.job.steps) {
19
+ if (!contextSteps.has(step.id)) {
20
+ continue;
21
+ }
22
+ const defaultStepContext = defaultContext.get(step.id);
23
+ if (!defaultStepContext) {
24
+ stepsContext.add(step.id, new data.Null());
25
+ continue;
26
+ }
27
+ if (!isActionStep(step) || !isDescriptionDictionary(defaultStepContext)) {
28
+ stepsContext.add(step.id, defaultStepContext);
29
+ continue;
30
+ }
31
+ const action = parseActionReference(step.uses.value);
32
+ if (!action) {
33
+ stepsContext.add(step.id, defaultStepContext);
34
+ continue;
35
+ }
36
+ const stepContext = new DescriptionDictionary();
37
+ for (const { key, value, description } of defaultStepContext.pairs()) {
38
+ switch (key) {
39
+ case "outputs": {
40
+ const outputs = await getActionOutputs(octokit, cache, action);
41
+ if (!outputs) {
42
+ stepContext.add(key, value, description);
43
+ continue;
44
+ }
45
+ const outputsDict = new DescriptionDictionary();
46
+ for (const [key, value] of Object.entries(outputs)) {
47
+ outputsDict.add(key, new data.StringData(value.description), value.description);
48
+ }
49
+ stepContext.add("outputs", outputsDict);
50
+ break;
51
+ }
52
+ default:
53
+ stepContext.add(key, value, description);
54
+ }
55
+ }
56
+ stepsContext.add(step.id, stepContext);
57
+ }
58
+ return stepsContext;
59
+ }
60
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/context-providers/steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DescriptionDictionary } from "@actions/expressions";
2
+ import { Pair } from "@actions/expressions/data/expressiondata";
3
+ import { WorkflowContext } from "@actions/languageservice/context/workflow-context";
4
+ import { Octokit } from "@octokit/rest";
5
+ import { RepositoryContext } from "../initializationOptions";
6
+ import { TTLCache } from "../utils/cache";
7
+ export declare function getVariables(workflowContext: WorkflowContext, octokit: Octokit, cache: TTLCache, repo: RepositoryContext, defaultContext: DescriptionDictionary | undefined): Promise<DescriptionDictionary | undefined>;
8
+ export declare function getRemoteVariables(octokit: Octokit, cache: TTLCache, repo: RepositoryContext, environmentName?: string): Promise<{
9
+ repoVariables: Pair[];
10
+ environmentVariables: Pair[];
11
+ organizationVariables: Pair[];
12
+ }>;
13
+ //# sourceMappingURL=variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/context-providers/variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAC,IAAI,EAAC,MAAM,0CAA0C,CAAC;AAE9D,OAAO,EAAC,eAAe,EAAC,MAAM,mDAAmD,CAAC;AAGlF,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAIxC,wBAAsB,YAAY,CAChC,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,iBAAiB,EACvB,cAAc,EAAE,qBAAqB,GAAG,SAAS,GAChD,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAqE5C;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,iBAAiB,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC;IACT,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAC7B,qBAAqB,EAAE,IAAI,EAAE,CAAC;CAC/B,CAAC,CAgBD"}