@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.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +8 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.d.ts +4 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +5 -0
- package/dist/commands.js.map +1 -0
- package/dist/connection.d.ts +3 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +127 -0
- package/dist/connection.js.map +1 -0
- package/dist/context-providers/action-outputs.d.ts +5 -0
- package/dist/context-providers/action-outputs.d.ts.map +1 -0
- package/dist/context-providers/action-outputs.js +5 -0
- package/dist/context-providers/action-outputs.js.map +1 -0
- package/dist/context-providers/secrets.d.ts +8 -0
- package/dist/context-providers/secrets.d.ts.map +1 -0
- package/dist/context-providers/secrets.js +122 -0
- package/dist/context-providers/secrets.js.map +1 -0
- package/dist/context-providers/steps.d.ts +6 -0
- package/dist/context-providers/steps.d.ts.map +1 -0
- package/dist/context-providers/steps.js +60 -0
- package/dist/context-providers/steps.js.map +1 -0
- package/dist/context-providers/variables.d.ts +13 -0
- package/dist/context-providers/variables.d.ts.map +1 -0
- package/dist/context-providers/variables.js +120 -0
- package/dist/context-providers/variables.js.map +1 -0
- package/dist/context-providers.d.ts +6 -0
- package/dist/context-providers.d.ts.map +1 -0
- package/dist/context-providers.js +20 -0
- package/dist/context-providers.js.map +1 -0
- package/dist/description-provider.d.ts +5 -0
- package/dist/description-provider.d.ts.map +1 -0
- package/dist/description-provider.js +20 -0
- package/dist/description-provider.js.map +1 -0
- package/dist/description-providers/action-description.d.ts +5 -0
- package/dist/description-providers/action-description.d.ts.map +1 -0
- package/dist/description-providers/action-description.js +18 -0
- package/dist/description-providers/action-description.js.map +1 -0
- package/dist/description-providers/action-input.d.ts +6 -0
- package/dist/description-providers/action-input.d.ts.map +1 -0
- package/dist/description-providers/action-input.js +36 -0
- package/dist/description-providers/action-input.js.map +1 -0
- package/dist/file-provider.d.ts +5 -0
- package/dist/file-provider.d.ts.map +1 -0
- package/dist/file-provider.js +49 -0
- package/dist/file-provider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/initializationOptions.d.ts +45 -0
- package/dist/initializationOptions.d.ts.map +1 -0
- package/dist/initializationOptions.js +2 -0
- package/dist/initializationOptions.js.map +1 -0
- package/dist/on-completion.d.ts +7 -0
- package/dist/on-completion.d.ts.map +1 -0
- package/dist/on-completion.js +15 -0
- package/dist/on-completion.js.map +1 -0
- package/dist/request.d.ts +7 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +4 -0
- package/dist/request.js.map +1 -0
- package/dist/utils/action-metadata.d.ts +5 -0
- package/dist/utils/action-metadata.d.ts.map +1 -0
- package/dist/utils/action-metadata.js +56 -0
- package/dist/utils/action-metadata.js.map +1 -0
- package/dist/utils/cache.d.ts +14 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +35 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/error.d.ts +3 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +22 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/repo-permission.d.ts +6 -0
- package/dist/utils/repo-permission.d.ts.map +1 -0
- package/dist/utils/repo-permission.js +36 -0
- package/dist/utils/repo-permission.js.map +1 -0
- package/dist/utils/timer.d.ts +2 -0
- package/dist/utils/timer.d.ts.map +1 -0
- package/dist/utils/timer.js +12 -0
- package/dist/utils/timer.js.map +1 -0
- package/dist/utils/username.d.ts +4 -0
- package/dist/utils/username.d.ts.map +1 -0
- package/dist/utils/username.js +14 -0
- package/dist/utils/username.js.map +1 -0
- package/dist/value-providers/action-inputs.d.ts +8 -0
- package/dist/value-providers/action-inputs.d.ts.map +1 -0
- package/dist/value-providers/action-inputs.js +28 -0
- package/dist/value-providers/action-inputs.js.map +1 -0
- package/dist/value-providers/job-environment.d.ts +5 -0
- package/dist/value-providers/job-environment.d.ts.map +1 -0
- package/dist/value-providers/job-environment.js +21 -0
- package/dist/value-providers/job-environment.js.map +1 -0
- package/dist/value-providers/runs-on.d.ts +5 -0
- package/dist/value-providers/runs-on.d.ts.map +1 -0
- package/dist/value-providers/runs-on.js +34 -0
- package/dist/value-providers/runs-on.js.map +1 -0
- package/dist/value-providers.d.ts +6 -0
- package/dist/value-providers.d.ts.map +1 -0
- package/dist/value-providers.js +30 -0
- package/dist/value-providers.js.map +1 -0
- 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
|
+
|
package/dist/client.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,UAAU,eAAe;CAC1B"}
|
package/dist/commands.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|