From b5c5720b48b5909e213a4f2e235707dd6c4e2433 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Mon, 30 Jan 2023 17:05:32 -0800 Subject: [PATCH 1/2] Extract client creation Also default to use the language server version in the user agent --- actions-languageserver/src/client.ts | 9 ++++++ actions-languageserver/src/connection.ts | 29 ++++++++++--------- .../src/context-providers.ts | 14 ++++----- .../src/description-provider.ts | 15 ++++------ .../src/initializationOptions.ts | 5 ++++ actions-languageserver/src/on-completion.ts | 7 +++-- actions-languageserver/src/value-providers.ts | 16 ++++------ actions-languageserver/tsconfig.json | 3 +- 8 files changed, 52 insertions(+), 46 deletions(-) create mode 100644 actions-languageserver/src/client.ts diff --git a/actions-languageserver/src/client.ts b/actions-languageserver/src/client.ts new file mode 100644 index 0000000..6edce22 --- /dev/null +++ b/actions-languageserver/src/client.ts @@ -0,0 +1,9 @@ +import {Octokit} from "@octokit/rest"; +import {version} from "../package.json"; + +export function getClient(token: string, userAgent?: string): Octokit { + return new Octokit({ + auth: token, + userAgent: userAgent || `GitHub Actions Language Server (${version})` + }); +} diff --git a/actions-languageserver/src/connection.ts b/actions-languageserver/src/connection.ts index d1650bc..daddd1c 100644 --- a/actions-languageserver/src/connection.ts +++ b/actions-languageserver/src/connection.ts @@ -16,19 +16,20 @@ import { TextDocumentSyncKind } from "vscode-languageserver"; import {TextDocument} from "vscode-languageserver-textdocument"; +import {getClient} from "./client"; +import {Commands} from "./commands"; import {contextProviders} from "./context-providers"; +import {descriptionProvider} from "./description-provider"; import {InitializationOptions, RepositoryContext} from "./initializationOptions"; import {onCompletion} from "./on-completion"; import {TTLCache} from "./utils/cache"; import {valueProviders} from "./value-providers"; import {getActionInputs} from "./value-providers/action-inputs"; -import {Commands} from "./commands"; -import {descriptionProvider} from "./description-provider"; export function initConnection(connection: Connection) { const documents: TextDocuments = new TextDocuments(TextDocument); - let sessionToken: string | undefined; + let client: Octokit | undefined; let repos: RepositoryContext[] = []; const cache = new TTLCache(); @@ -49,7 +50,11 @@ export function initConnection(connection: Connection) { ); const options: InitializationOptions = params.initializationOptions; - sessionToken = options.sessionToken; + + if (options.sessionToken) { + client = getClient(options.sessionToken, options.userAgent); + } + if (options.repos) { repos = options.repos; } @@ -93,15 +98,13 @@ export function initConnection(connection: Connection) { const repoContext = repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri)); const config: ValidationConfig = { - valueProviderConfig: valueProviders(sessionToken, repoContext, cache), - contextProviderConfig: contextProviders(sessionToken, repoContext, cache), + valueProviderConfig: valueProviders(client, repoContext, cache), + contextProviderConfig: contextProviders(client, repoContext, cache), getActionInputs: async action => { - if (sessionToken) { - const octokit = new Octokit({ - auth: sessionToken - }); - return await getActionInputs(octokit, cache, action); + if (client) { + return await getActionInputs(client, cache, action); } + return undefined; } }; @@ -114,7 +117,7 @@ export function initConnection(connection: Connection) { return await onCompletion( position, documents.get(textDocument.uri)!, - sessionToken, + client, repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri)), cache ); @@ -122,7 +125,7 @@ export function initConnection(connection: Connection) { connection.onHover(async ({position, textDocument}: HoverParams): Promise => { return hover(documents.get(textDocument.uri)!, position, { - descriptionProvider: descriptionProvider(sessionToken, cache) + descriptionProvider: descriptionProvider(client, cache) }); }); diff --git a/actions-languageserver/src/context-providers.ts b/actions-languageserver/src/context-providers.ts index 5d1f151..965475c 100644 --- a/actions-languageserver/src/context-providers.ts +++ b/actions-languageserver/src/context-providers.ts @@ -9,18 +9,14 @@ import {RepositoryContext} from "./initializationOptions"; import {TTLCache} from "./utils/cache"; export function contextProviders( - sessionToken: string | undefined, + client: Octokit | undefined, repo: RepositoryContext | undefined, cache: TTLCache ): ContextProviderConfig { - if (!repo || !sessionToken) { + if (!repo || !client) { return {getContext: (_: string) => Promise.resolve(undefined)}; } - const octokit = new Octokit({ - auth: sessionToken - }); - const getContext = async ( name: string, defaultContext: DescriptionDictionary | undefined, @@ -28,11 +24,11 @@ export function contextProviders( ) => { switch (name) { case "secrets": - return await getSecrets(workflowContext, octokit, cache, repo, defaultContext); + return await getSecrets(workflowContext, client, cache, repo, defaultContext); case "vars": - return await getVariables(workflowContext, octokit, cache, repo, defaultContext); + return await getVariables(workflowContext, client, cache, repo, defaultContext); case "steps": - return await getStepsContext(octokit, cache, defaultContext, workflowContext); + return await getStepsContext(client, cache, defaultContext, workflowContext); } }; diff --git a/actions-languageserver/src/description-provider.ts b/actions-languageserver/src/description-provider.ts index bd724ed..128a1ee 100644 --- a/actions-languageserver/src/description-provider.ts +++ b/actions-languageserver/src/description-provider.ts @@ -1,22 +1,17 @@ import {DescriptionProvider} from "@github/actions-languageservice/hover"; import {Octokit} from "@octokit/rest"; -import {TTLCache} from "./utils/cache"; import {getActionInputDescription} from "./description-providers/action-input"; +import {TTLCache} from "./utils/cache"; -export function descriptionProvider(sessionToken: string | undefined, cache: TTLCache): DescriptionProvider { - const octokit = - sessionToken && - new Octokit({ - auth: sessionToken - }); - +export function descriptionProvider(client: Octokit | undefined, cache: TTLCache): DescriptionProvider { const getDescription: DescriptionProvider["getDescription"] = async (context, token, path) => { - if (!octokit) { + if (!client) { return undefined; } + const parent = path[path.length - 1]; if (context.step && parent.definition?.key === "step-with") { - return await getActionInputDescription(octokit, cache, context.step, token); + return await getActionInputDescription(client, cache, context.step, token); } }; diff --git a/actions-languageserver/src/initializationOptions.ts b/actions-languageserver/src/initializationOptions.ts index fa61722..0052dda 100644 --- a/actions-languageserver/src/initializationOptions.ts +++ b/actions-languageserver/src/initializationOptions.ts @@ -9,6 +9,11 @@ export interface InitializationOptions { */ sessionToken?: string; + /** + * Optional user agent to use when making calls to github.com + */ + userAgent?: string; + /** * List of repositories that the language server should be aware of */ diff --git a/actions-languageserver/src/on-completion.ts b/actions-languageserver/src/on-completion.ts index 43bd70f..8be0d3b 100644 --- a/actions-languageserver/src/on-completion.ts +++ b/actions-languageserver/src/on-completion.ts @@ -1,4 +1,5 @@ import {complete} from "@github/actions-languageservice/complete"; +import {Octokit} from "@octokit/rest"; import {CompletionItem, Position} from "vscode-languageserver"; import {TextDocument} from "vscode-languageserver-textdocument"; import {contextProviders} from "./context-providers"; @@ -9,14 +10,14 @@ import {valueProviders} from "./value-providers"; export async function onCompletion( position: Position, document: TextDocument, - sessionToken: string | undefined, + client: Octokit | undefined, repoContext: RepositoryContext | undefined, cache: TTLCache ): Promise { return await complete( document, position, - repoContext && valueProviders(sessionToken, repoContext, cache), - repoContext && contextProviders(sessionToken, repoContext, cache) + repoContext && valueProviders(client, repoContext, cache), + repoContext && contextProviders(client, repoContext, cache) ); } diff --git a/actions-languageserver/src/value-providers.ts b/actions-languageserver/src/value-providers.ts index d5e0eba..3180431 100644 --- a/actions-languageserver/src/value-providers.ts +++ b/actions-languageserver/src/value-providers.ts @@ -9,34 +9,30 @@ import {getEnvironments} from "./value-providers/job-environment"; import {getRunnerLabels} from "./value-providers/runs-on"; export function valueProviders( - sessionToken: string | undefined, + client: Octokit | undefined, repo: RepositoryContext | undefined, cache: TTLCache ): ValueProviderConfig { - if (!repo || !sessionToken) { + if (!repo || !client) { return {}; } - const octokit = new Octokit({ - auth: sessionToken - }); - return { "job-environment": { kind: ValueProviderKind.AllowedValues, - get: (_: WorkflowContext) => getEnvironments(octokit, cache, repo.owner, repo.name) + get: (_: WorkflowContext) => getEnvironments(client, cache, repo.owner, repo.name) }, "job-environment-name": { kind: ValueProviderKind.AllowedValues, - get: (_: WorkflowContext) => getEnvironments(octokit, cache, repo.owner, repo.name) + get: (_: WorkflowContext) => getEnvironments(client, cache, repo.owner, repo.name) }, "runs-on": { kind: ValueProviderKind.SuggestedValues, - get: (_: WorkflowContext) => getRunnerLabels(octokit, cache, repo.owner, repo.name) + get: (_: WorkflowContext) => getRunnerLabels(client, cache, repo.owner, repo.name) }, "step-with": { kind: ValueProviderKind.AllowedValues, - get: (context: WorkflowContext) => getActionInputValues(octokit, cache, context) + get: (context: WorkflowContext) => getActionInputValues(client, cache, context) } }; } diff --git a/actions-languageserver/tsconfig.json b/actions-languageserver/tsconfig.json index d2faef8..85f9f1c 100644 --- a/actions-languageserver/tsconfig.json +++ b/actions-languageserver/tsconfig.json @@ -8,7 +8,8 @@ "sourceMap": true, "strict": true, "moduleResolution": "node", - "lib": ["es6", "webworker"] + "lib": ["es6", "webworker"], + "resolveJsonModule": true }, "watchOptions": { "watchFile": "useFsEvents", From 7baf5da7eed34f4e9e88fb35d8056a30408d81a7 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 31 Jan 2023 09:13:44 -0800 Subject: [PATCH 2/2] Remove package.json version import --- actions-languageserver/src/client.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/actions-languageserver/src/client.ts b/actions-languageserver/src/client.ts index 6edce22..de54554 100644 --- a/actions-languageserver/src/client.ts +++ b/actions-languageserver/src/client.ts @@ -1,9 +1,8 @@ import {Octokit} from "@octokit/rest"; -import {version} from "../package.json"; export function getClient(token: string, userAgent?: string): Octokit { return new Octokit({ auth: token, - userAgent: userAgent || `GitHub Actions Language Server (${version})` + userAgent: userAgent || `GitHub Actions Language Server` }); }