diff --git a/.gitignore b/.gitignore index ba6e0dc..3609de4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ */node_modules */dist - +lerna-debug.log node_modules .DS_Store \ No newline at end of file diff --git a/expressions/package.json b/expressions/package.json index 8f14626..53700d0 100755 --- a/expressions/package.json +++ b/expressions/package.json @@ -1,6 +1,6 @@ { "name": "@actions/expressions", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/languageserver/package.json b/languageserver/package.json index a9f8e9e..e38a628 100644 --- a/languageserver/package.json +++ b/languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@actions/languageserver", - "version": "0.3.5", + "version": "0.3.6", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -43,8 +43,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@actions/languageservice": "^0.3.5", - "@actions/workflow-parser": "^0.3.5", + "@actions/languageservice": "^0.3.6", + "@actions/workflow-parser": "^0.3.6", "@octokit/rest": "^19.0.7", "@octokit/types": "^9.0.0", "vscode-languageserver": "^8.0.2", diff --git a/languageserver/src/client.ts b/languageserver/src/client.ts index de54554..ac0aa61 100644 --- a/languageserver/src/client.ts +++ b/languageserver/src/client.ts @@ -1,8 +1,9 @@ import {Octokit} from "@octokit/rest"; -export function getClient(token: string, userAgent?: string): Octokit { +export function getClient(token: string, userAgent?: string, apiUrl?: string): Octokit { return new Octokit({ auth: token, - userAgent: userAgent || `GitHub Actions Language Server` + userAgent: userAgent || `GitHub Actions Language Server`, + baseUrl: apiUrl }); } diff --git a/languageserver/src/connection.ts b/languageserver/src/connection.ts index 274923a..90b139b 100644 --- a/languageserver/src/connection.ts +++ b/languageserver/src/connection.ts @@ -51,7 +51,7 @@ export function initConnection(connection: Connection) { const options = params.initializationOptions as InitializationOptions; if (options.sessionToken) { - client = getClient(options.sessionToken, options.userAgent); + client = getClient(options.sessionToken, options.userAgent, options.gitHubApiUrl); } if (options.repos) { diff --git a/languageserver/src/context-providers/variables.ts b/languageserver/src/context-providers/variables.ts index 92e5d4c..ef32c78 100644 --- a/languageserver/src/context-providers/variables.ts +++ b/languageserver/src/context-providers/variables.ts @@ -2,9 +2,10 @@ import {data, DescriptionDictionary} from "@actions/expressions"; import {Pair} from "@actions/expressions/data/expressiondata"; import {StringData} from "@actions/expressions/data/index"; import {WorkflowContext} from "@actions/languageservice/context/workflow-context"; -import {warn} from "@actions/languageservice/log"; +import {log, warn} from "@actions/languageservice/log"; import {isMapping, isString} from "@actions/workflow-parser"; import {Octokit} from "@octokit/rest"; +import {RequestError} from "@octokit/request-error"; import {RepositoryContext} from "../initializationOptions"; import {TTLCache} from "../utils/cache"; @@ -42,50 +43,58 @@ export async function getVariables( } const variablesContext = defaultContext || new DescriptionDictionary(); - const variables = await getRemoteVariables(octokit, cache, repo, environmentName); + try { + const variables = await getRemoteVariables(octokit, cache, repo, environmentName); - // Build combined map of variables - const variablesMap = new Map< - string, - { - key: string; - value: data.StringData; - description?: string; - } - >(); + // Build combined map of variables + const variablesMap = new Map< + string, + { + key: string; + value: data.StringData; + description?: string; + } + >(); - variables.organizationVariables.forEach(variable => - variablesMap.set(variable.key.toLowerCase(), { - key: variable.key, - value: new data.StringData(variable.value.coerceString()), - description: `${variable.value.coerceString()} - Organization variable` - }) - ); + variables.organizationVariables.forEach(variable => + variablesMap.set(variable.key.toLowerCase(), { + key: variable.key, + value: new data.StringData(variable.value.coerceString()), + description: `${variable.value.coerceString()} - Organization variable` + }) + ); - // Override org variables with repo variables - variables.repoVariables.forEach(variable => - variablesMap.set(variable.key.toLowerCase(), { - key: variable.key, - value: new data.StringData(variable.value.coerceString()), - description: `${variable.value.coerceString()} - Repository variable` - }) - ); + // Override org variables with repo variables + variables.repoVariables.forEach(variable => + variablesMap.set(variable.key.toLowerCase(), { + key: variable.key, + value: new data.StringData(variable.value.coerceString()), + description: `${variable.value.coerceString()} - Repository variable` + }) + ); - // Override repo variables with environment veriables (if defined) - variables.environmentVariables.forEach(variable => - variablesMap.set(variable.key.toLowerCase(), { - key: variable.key, - value: new data.StringData(variable.value.coerceString()), - description: `${variable.value.coerceString()} - Variable for environment \`${environmentName || ""}\`` - }) - ); + // Override repo variables with environment veriables (if defined) + variables.environmentVariables.forEach(variable => + variablesMap.set(variable.key.toLowerCase(), { + key: variable.key, + value: new data.StringData(variable.value.coerceString()), + description: `${variable.value.coerceString()} - Variable for environment \`${environmentName || ""}\`` + }) + ); - // Sort variables by key and add to context - Array.from(variablesMap.values()) - .sort((a, b) => a.key.localeCompare(b.key)) - .forEach(variable => variablesContext?.add(variable.key, variable.value, variable.description)); + // Sort variables by key and add to context + Array.from(variablesMap.values()) + .sort((a, b) => a.key.localeCompare(b.key)) + .forEach(variable => variablesContext?.add(variable.key, variable.value, variable.description)); - return variablesContext; + return variablesContext; + } catch (e) { + if (!(e instanceof RequestError)) throw e; + if (e.name == "HttpError" && e.status == 404) { + log("Failure to request variables. Ignore if you're using GitHub Enterprise Server below version 3.8"); + return variablesContext; + } else throw e; + } } export async function getRemoteVariables( diff --git a/languageserver/src/initializationOptions.ts b/languageserver/src/initializationOptions.ts index abc1547..59ef462 100644 --- a/languageserver/src/initializationOptions.ts +++ b/languageserver/src/initializationOptions.ts @@ -23,6 +23,11 @@ export interface InitializationOptions { * Desired log level */ logLevel?: LogLevel; + + /** + * If a GitHub Enterprise Server should be used, the URL of the API endpoint, eg "https://ghe.my-company.com/api/v3" + */ + gitHubApiUrl?: string; } export interface RepositoryContext { diff --git a/languageservice/package.json b/languageservice/package.json index 8cb10a6..3264eb6 100644 --- a/languageservice/package.json +++ b/languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@actions/languageservice", - "version": "0.3.5", + "version": "0.3.6", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -44,8 +44,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@actions/expressions": "^0.3.5", - "@actions/workflow-parser": "^0.3.5", + "@actions/expressions": "^0.3.6", + "@actions/workflow-parser": "^0.3.6", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "vscode-uri": "^3.0.7", diff --git a/lerna.json b/lerna.json index 22c90fc..a3751df 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,10 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "useWorkspaces": true, - "version": "0.3.5" + "packages": [ + "expressions", + "workflow-parser", + "languageservice", + "languageserver" + ], + "version": "0.3.6" } diff --git a/package-lock.json b/package-lock.json index 58f18ea..b83ed56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,7 +135,7 @@ }, "expressions": { "name": "@actions/expressions", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -395,11 +395,11 @@ }, "languageserver": { "name": "@actions/languageserver", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "dependencies": { - "@actions/languageservice": "^0.3.5", - "@actions/workflow-parser": "^0.3.5", + "@actions/languageservice": "^0.3.6", + "@actions/workflow-parser": "^0.3.6", "@octokit/rest": "^19.0.7", "@octokit/types": "^9.0.0", "vscode-languageserver": "^8.0.2", @@ -678,11 +678,11 @@ }, "languageservice": { "name": "@actions/languageservice", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "dependencies": { - "@actions/expressions": "^0.3.5", - "@actions/workflow-parser": "^0.3.5", + "@actions/expressions": "^0.3.6", + "@actions/workflow-parser": "^0.3.6", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "vscode-uri": "^3.0.7", @@ -11721,10 +11721,10 @@ }, "workflow-parser": { "name": "@actions/workflow-parser", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "dependencies": { - "@actions/expressions": "^0.3.5", + "@actions/expressions": "^0.3.6", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/workflow-parser/package.json b/workflow-parser/package.json index a91e6c5..c06c835 100644 --- a/workflow-parser/package.json +++ b/workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@actions/workflow-parser", - "version": "0.3.5", + "version": "0.3.6", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -43,7 +43,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@actions/expressions": "^0.3.5", + "@actions/expressions": "^0.3.6", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/workflow-parser/src/workflow-v1.0.json b/workflow-parser/src/workflow-v1.0.json index f990beb..b0be097 100644 --- a/workflow-parser/src/workflow-v1.0.json +++ b/workflow-parser/src/workflow-v1.0.json @@ -1183,7 +1183,7 @@ ] }, "workflow-run-activity": { - "description": "The types of workflow run activity that trigger the workflow. Suupported activity types: `completed`, `requested`, `in_progress`.", + "description": "The types of workflow run activity that trigger the workflow. Supported activity types: `completed`, `requested`, `in_progress`.", "one-of": [ "workflow-run-activity-type", "workflow-run-activity-types" @@ -2489,7 +2489,7 @@ "string": { "require-non-empty": true }, - "description": "Use `shell` to override the default shell settings in the runner's operating system. You can use built-in shell keywords, or you can define a custom set of shell options. The shell command that is run internally executes a temporary file that contains the comands specified in `run`." + "description": "Use `shell` to override the default shell settings in the runner's operating system. You can use built-in shell keywords, or you can define a custom set of shell options. The shell command that is run internally executes a temporary file that contains the commands specified in `run`." }, "working-directory": { "string": {