From b432867548a3f47100f0c1a3a903b45ba2f5afae Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Tue, 7 Feb 2023 16:42:28 -0500 Subject: [PATCH 01/18] Complete multi-segment expressions --- .../src/complete.expressions.test.ts | 7 ++++++ actions-languageservice/src/complete.ts | 10 ++++---- .../src/context-providers/matrix.test.ts | 2 +- .../src/model/converter/jobs.ts | 2 +- .../src/model/converter/steps.ts | 2 +- .../src/templates/template-reader.ts | 7 +++--- .../tokens/basic-expression-token.ts | 24 ++++++++++++++++--- 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index 070ea21..d7f2b25 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -262,6 +262,13 @@ jobs: expect(result.map(x => x.label)).toEqual(["event"]); }); + it("auto-complete complex partial", async () => { + const input = 'run-name: "run ${{ github.ev| }} run"'; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + it("using default context provider", async () => { const input = "on: push\njobs:\n build:\n runs-on: ubuntu-latest\n environment:\n url: ${{ runner.| }}\n steps:\n - run: echo"; diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 54942fb..a0ce6e0 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -205,20 +205,18 @@ function getExpressionCompletionItems( context: DescriptionDictionary, pos: Position ): CompletionItem[] { - let expressionInput = ""; let currentInput = ""; - let relCharPos: number = 0; if (isBasicExpression(token)) { - expressionInput = currentInput = token.expression; - relCharPos = getRelCharPos(token.range!, expressionInput, pos); + currentInput = token.source || token.expression; } else { const stringToken = token.assertString("Expected string token for expression completion"); currentInput = stringToken.source || stringToken.value; - relCharPos = getRelCharPos(stringToken.range!, currentInput, pos); - expressionInput = (getExpressionInput(currentInput, relCharPos) || "").trim(); } + const relCharPos = getRelCharPos(token.range!, currentInput, pos); + const expressionInput = (getExpressionInput(currentInput, relCharPos) || "").trim(); + try { return completeExpression(expressionInput, context, [], validatorFunctions).map(item => mapExpressionCompletionItem(item, currentInput[relCharPos]) diff --git a/actions-languageservice/src/context-providers/matrix.test.ts b/actions-languageservice/src/context-providers/matrix.test.ts index 6b8bd99..3285b0d 100644 --- a/actions-languageservice/src/context-providers/matrix.test.ts +++ b/actions-languageservice/src/context-providers/matrix.test.ts @@ -45,7 +45,7 @@ function stringToToken(value: string) { } function expressionToToken(expr: string) { - return new BasicExpressionToken(undefined, undefined, expr, undefined, undefined); + return new BasicExpressionToken(undefined, undefined, expr, undefined, undefined, expr); } function contextFromStrategy(strategy?: TemplateToken) { diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 17aa165..a70cef7 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -111,7 +111,7 @@ function convertJob(context: TemplateContext, jobKey: StringToken, token: Mappin id: jobKey, name: undefined, needs: undefined, - if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined), + if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, "success()"), env: undefined, concurrency: undefined, environment: undefined, diff --git a/actions-workflow-parser/src/model/converter/steps.ts b/actions-workflow-parser/src/model/converter/steps.ts index 4adca20..2ecf0e7 100644 --- a/actions-workflow-parser/src/model/converter/steps.ts +++ b/actions-workflow-parser/src/model/converter/steps.ts @@ -52,7 +52,7 @@ function convertStep(context: TemplateContext, idBuilder: IdBuilder, step: Templ let uses: StringToken | undefined; let continueOnError: boolean | undefined; let env: MappingToken | undefined; - const ifCondition = new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined); + const ifCondition = new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, "success()"); for (const item of mapping) { const key = item.key.assertString("steps item key"); switch (key.value) { diff --git a/actions-workflow-parser/src/templates/template-reader.ts b/actions-workflow-parser/src/templates/template-reader.ts index d00ea75..2bbcbbc 100644 --- a/actions-workflow-parser/src/templates/template-reader.ts +++ b/actions-workflow-parser/src/templates/template-reader.ts @@ -606,8 +606,9 @@ class TemplateReader { this._fileId, token.range, `format('${format.join("")}'${args.join("")})`, - token.definitionInfo, - expressionTokens + definitionInfo, + expressionTokens, + raw ); } @@ -667,7 +668,7 @@ class TemplateReader { // Return the expression return { - expression: new BasicExpressionToken(this._fileId, range, trimmed, definitionInfo, undefined), + expression: new BasicExpressionToken(this._fileId, range, trimmed, definitionInfo, undefined, value), error: undefined }; } diff --git a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts index 6d5912d..b7c29f5 100644 --- a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts +++ b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts @@ -13,6 +13,8 @@ export class BasicExpressionToken extends ExpressionToken { public readonly originalExpressions: BasicExpressionToken[] | undefined; + public readonly source: string; + /** * @param originalExpressions If the basic expression was transformed from individual expressions, these will be the original ones */ @@ -21,11 +23,13 @@ export class BasicExpressionToken extends ExpressionToken { range: TokenRange | undefined, expression: string, definitionInfo: DefinitionInfo | undefined, - originalExpressions: BasicExpressionToken[] | undefined + originalExpressions: BasicExpressionToken[] | undefined, + source: string ) { super(TokenType.BasicExpression, file, range, undefined, definitionInfo); this.expr = expression; this.originalExpressions = originalExpressions; + this.source = source; } public get expression(): string { @@ -34,8 +38,22 @@ export class BasicExpressionToken extends ExpressionToken { public override clone(omitSource?: boolean): TemplateToken { return omitSource - ? new BasicExpressionToken(undefined, undefined, this.expr, this.definitionInfo, this.originalExpressions) - : new BasicExpressionToken(this.file, this.range, this.expr, this.definitionInfo, this.originalExpressions); + ? new BasicExpressionToken( + undefined, + undefined, + this.expr, + this.definitionInfo, + this.originalExpressions, + this.source + ) + : new BasicExpressionToken( + this.file, + this.range, + this.expr, + this.definitionInfo, + this.originalExpressions, + this.source + ); } public override toString(): string { From 99612e73ab1625509e7b92abbf4b9151c36f60ee Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Tue, 7 Feb 2023 17:45:34 -0500 Subject: [PATCH 02/18] Merge clean up --- actions-workflow-parser/src/model/converter/jobs.ts | 1 - .../src/templates/tokens/basic-expression-token.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 50152b9..b07e368 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -96,4 +96,3 @@ function validateNeeds( } } } - diff --git a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts index 89295fd..01c7a44 100644 --- a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts +++ b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts @@ -15,8 +15,6 @@ export class BasicExpressionToken extends ExpressionToken { public readonly originalExpressions: BasicExpressionToken[] | undefined; - public readonly source: string; - /** * The range of the expression within the source string. * From cd38b2fe7690336c2fb07a5d02da373463dc68f9 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 7 Feb 2023 14:52:12 -0800 Subject: [PATCH 03/18] Support `needs` for reusable jobs --- .../src/context-providers/needs.test.ts | 75 +++++++++++++++++++ .../src/context-providers/needs.ts | 7 +- .../src/context/workflow-context.test.ts | 27 +------ .../src/test-utils/test-workflow-context.ts | 26 +++++++ .../src/model/converter/job.ts | 6 +- 5 files changed, 110 insertions(+), 31 deletions(-) create mode 100644 actions-languageservice/src/context-providers/needs.test.ts create mode 100644 actions-languageservice/src/test-utils/test-workflow-context.ts diff --git a/actions-languageservice/src/context-providers/needs.test.ts b/actions-languageservice/src/context-providers/needs.test.ts new file mode 100644 index 0000000..31f8c24 --- /dev/null +++ b/actions-languageservice/src/context-providers/needs.test.ts @@ -0,0 +1,75 @@ +import {DescriptionDictionary} from "@github/actions-expressions/."; +import {WorkflowContext} from "../context/workflow-context"; +import {testGetWorkflowContext} from "../test-utils/test-workflow-context"; +import {getNeedsContext} from "./needs"; + +describe("needs context", () => { + describe("invalid workflow context", () => { + it("jobs not defined", () => { + const workflowContext = {} as WorkflowContext; + expect(workflowContext.job).toBeUndefined(); + expect(workflowContext.reusableWorkflowJob).toBeUndefined(); + + const context = getNeedsContext(workflowContext); + expect(context).toEqual(new DescriptionDictionary()); + }); + }); + + it("job without needs", async () => { + const workflowContext = await testGetWorkflowContext(`on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: ec|ho`); + + const context = getNeedsContext(workflowContext); + expect(context).toEqual(new DescriptionDictionary()); + }); + + it("job with needs", async () => { + const workflowContext = await testGetWorkflowContext(`on: push +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo + build: + runs-on: ubuntu-latest + needs: [test] + steps: + - run: ec|ho`); + + const context = getNeedsContext(workflowContext); + expect(context.pairs().map(x => x.key)).toEqual(["test"]); + }); + + it("reusable job without needs", async () => { + const workflowContext = await testGetWorkflowContext(`on: push +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo + build: + uses: ./.github/workflows/some-reusable-wor|kflow.yml`); + + const context = getNeedsContext(workflowContext); + expect(context).toEqual(new DescriptionDictionary()); + }); + + it("reusable job with needs", async () => { + const workflowContext = await testGetWorkflowContext(`on: push +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo + build: + uses: ./.github/workflows/some-reusable-wor|kflow.yml + needs: [test]`); + + const context = getNeedsContext(workflowContext); + expect(context.pairs().map(x => x.key)).toEqual(["test"]); + }); +}); diff --git a/actions-languageservice/src/context-providers/needs.ts b/actions-languageservice/src/context-providers/needs.ts index e261b0d..23d9aa8 100644 --- a/actions-languageservice/src/context-providers/needs.ts +++ b/actions-languageservice/src/context-providers/needs.ts @@ -6,11 +6,14 @@ import {WorkflowContext} from "../context/workflow-context"; export function getNeedsContext(workflowContext: WorkflowContext): DescriptionDictionary { const d = new DescriptionDictionary(); - if (!workflowContext.job || !workflowContext.job.needs) { + + const job = workflowContext.job || workflowContext.reusableWorkflowJob; + + if (!job?.needs) { return d; } - for (const jobID of workflowContext.job.needs) { + for (const jobID of job.needs) { const job = workflowContext.template?.jobs.find(job => job.id.value === jobID.value); d.add(jobID.value, needsJobContext(job)); } diff --git a/actions-languageservice/src/context/workflow-context.test.ts b/actions-languageservice/src/context/workflow-context.test.ts index 1f2a3ad..6e99cdd 100644 --- a/actions-languageservice/src/context/workflow-context.test.ts +++ b/actions-languageservice/src/context/workflow-context.test.ts @@ -1,30 +1,5 @@ -import {convertWorkflowTemplate, parseWorkflow, WorkflowTemplate} from "@github/actions-workflow-parser"; import {ActionStep, RunStep} from "@github/actions-workflow-parser/model/workflow-template"; -import {nullTrace} from "../nulltrace"; -import {getPositionFromCursor} from "../test-utils/cursor-position"; -import {findToken} from "../utils/find-token"; -import {getWorkflowContext, WorkflowContext} from "./workflow-context"; - -async function testGetWorkflowContext(input: string): Promise { - const [textDocument, pos] = getPositionFromCursor(input); - const result = parseWorkflow( - { - content: textDocument.getText(), - name: "wf.yaml" - }, - nullTrace - ); - - let template: WorkflowTemplate | undefined; - - if (result.value) { - template = await convertWorkflowTemplate(result.context, result.value); - } - - const {path} = findToken(pos, result.value); - - return getWorkflowContext(textDocument.uri, template, path); -} +import {testGetWorkflowContext} from "../test-utils/test-workflow-context"; describe("getWorkflowContext", () => { it("context for workflow", async () => { diff --git a/actions-languageservice/src/test-utils/test-workflow-context.ts b/actions-languageservice/src/test-utils/test-workflow-context.ts new file mode 100644 index 0000000..c5a1a7b --- /dev/null +++ b/actions-languageservice/src/test-utils/test-workflow-context.ts @@ -0,0 +1,26 @@ +import {convertWorkflowTemplate, parseWorkflow, WorkflowTemplate} from "@github/actions-workflow-parser"; +import {getWorkflowContext, WorkflowContext} from "../context/workflow-context"; +import {nullTrace} from "../nulltrace"; +import {findToken} from "../utils/find-token"; +import {getPositionFromCursor} from "./cursor-position"; + +export async function testGetWorkflowContext(input: string): Promise { + const [textDocument, pos] = getPositionFromCursor(input); + const result = parseWorkflow( + { + content: textDocument.getText(), + name: "wf.yaml" + }, + nullTrace + ); + + let template: WorkflowTemplate | undefined; + + if (result.value) { + template = await convertWorkflowTemplate(result.context, result.value); + } + + const {path} = findToken(pos, result.value); + + return getWorkflowContext(textDocument.uri, template, path); +} diff --git a/actions-workflow-parser/src/model/converter/job.ts b/actions-workflow-parser/src/model/converter/job.ts index ee5f30e..4d01148 100644 --- a/actions-workflow-parser/src/model/converter/job.ts +++ b/actions-workflow-parser/src/model/converter/job.ts @@ -1,7 +1,7 @@ import {TemplateContext} from "../../templates/template-context"; -import {StringToken, MappingToken, BasicExpressionToken, TemplateToken, ScalarToken} from "../../templates/tokens"; +import {BasicExpressionToken, MappingToken, ScalarToken, StringToken, TemplateToken} from "../../templates/tokens"; import {isSequence, isString} from "../../templates/tokens/type-guards"; -import {WorkflowJob, Step} from "../workflow-template"; +import {Step, WorkflowJob} from "../workflow-template"; import {convertConcurrency} from "./concurrency"; import {convertToJobContainer, convertToJobServices} from "./container"; import {handleTemplateTokenErrors} from "./handle-errors"; @@ -103,7 +103,7 @@ export function convertJob(context: TemplateContext, jobKey: StringToken, token: type: "reusableWorkflowJob", id: jobKey, name: jobName(name, jobKey), - needs: needs ?? [], + needs, if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), ref: workflowJobRef, "input-definitions": undefined, From f7b8a566cef229f253b36080a5730ca37dd3a73b Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 7 Feb 2023 15:12:16 -0800 Subject: [PATCH 04/18] Force reusable job `needs` to be empty array --- actions-workflow-parser/src/model/converter/job.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-workflow-parser/src/model/converter/job.ts b/actions-workflow-parser/src/model/converter/job.ts index 4d01148..5a7f335 100644 --- a/actions-workflow-parser/src/model/converter/job.ts +++ b/actions-workflow-parser/src/model/converter/job.ts @@ -103,7 +103,7 @@ export function convertJob(context: TemplateContext, jobKey: StringToken, token: type: "reusableWorkflowJob", id: jobKey, name: jobName(name, jobKey), - needs, + needs: needs || [], if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), ref: workflowJobRef, "input-definitions": undefined, From 6777fc299001f9237b7a14540737ab8a4d7faffe Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 7 Feb 2023 15:13:45 -0800 Subject: [PATCH 05/18] Remove `/."` imports --- actions-languageservice/src/context-providers/needs.test.ts | 2 +- .../src/expression-hover/expression-pos.test.ts | 2 +- actions-languageservice/src/hover.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actions-languageservice/src/context-providers/needs.test.ts b/actions-languageservice/src/context-providers/needs.test.ts index 31f8c24..6058798 100644 --- a/actions-languageservice/src/context-providers/needs.test.ts +++ b/actions-languageservice/src/context-providers/needs.test.ts @@ -1,4 +1,4 @@ -import {DescriptionDictionary} from "@github/actions-expressions/."; +import {DescriptionDictionary} from "@github/actions-expressions"; import {WorkflowContext} from "../context/workflow-context"; import {testGetWorkflowContext} from "../test-utils/test-workflow-context"; import {getNeedsContext} from "./needs"; diff --git a/actions-languageservice/src/expression-hover/expression-pos.test.ts b/actions-languageservice/src/expression-hover/expression-pos.test.ts index d7fcc39..1b9f175 100644 --- a/actions-languageservice/src/expression-hover/expression-pos.test.ts +++ b/actions-languageservice/src/expression-hover/expression-pos.test.ts @@ -1,4 +1,4 @@ -import {parseWorkflow} from "@github/actions-workflow-parser/."; +import {parseWorkflow} from "@github/actions-workflow-parser"; import {File} from "@github/actions-workflow-parser/workflows/file"; import {nullTrace} from "../nulltrace"; import {getPositionFromCursor} from "../test-utils/cursor-position"; diff --git a/actions-languageservice/src/hover.test.ts b/actions-languageservice/src/hover.test.ts index b92717d..7ec5afd 100644 --- a/actions-languageservice/src/hover.test.ts +++ b/actions-languageservice/src/hover.test.ts @@ -1,4 +1,4 @@ -import {isString} from "@github/actions-workflow-parser/."; +import {isString} from "@github/actions-workflow-parser"; import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; import {DescriptionProvider, hover, HoverConfig} from "./hover"; import {getPositionFromCursor} from "./test-utils/cursor-position"; From df1836ef9057a5946f0e57c5b915386ab9130bd7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 23:20:45 +0000 Subject: [PATCH 06/18] v0.1.127 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index 15c566c..ae2aa42 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 3b355cf..c9ea4f2 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.126", + "version": "0.1.127", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-languageservice": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index 0a94fd9..b6c4525 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.126", + "version": "0.1.127", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-expressions": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index 5a007f1..f3191b2 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.126", + "@github/actions-expressions": "^0.1.127", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 0170c9a..6d16a2c 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.126", + "version": "0.1.127", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.126", + "@github/actions-languageserver": "^0.1.127", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index ca156aa..8e03793 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.126" + "version": "0.1.127" } diff --git a/package-lock.json b/package-lock.json index 13332ff..cbf4201 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-languageservice": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-expressions": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.126", + "@github/actions-expressions": "^0.1.127", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.126", + "version": "0.1.127", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.126", + "@github/actions-languageserver": "^0.1.127", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-languageservice": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.126", - "@github/actions-workflow-parser": "^0.1.126", + "@github/actions-expressions": "^0.1.127", + "@github/actions-workflow-parser": "^0.1.127", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.126", + "@github/actions-expressions": "^0.1.127", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.126", + "@github/actions-languageserver": "^0.1.127", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From fc87fcb11fc8fce209bca01750b8a1eab1fca788 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 18:35:50 -0500 Subject: [PATCH 07/18] Add a `FileProvider` to auto-completion --- actions-languageserver/src/connection.ts | 1 + actions-languageserver/src/on-completion.ts | 17 +-- .../src/complete.expressions.test.ts | 118 +++++++++--------- actions-languageservice/src/complete.test.ts | 4 +- actions-languageservice/src/complete.ts | 24 +++- 5 files changed, 90 insertions(+), 74 deletions(-) diff --git a/actions-languageserver/src/connection.ts b/actions-languageserver/src/connection.ts index d061b4e..d3c8bf9 100644 --- a/actions-languageserver/src/connection.ts +++ b/actions-languageserver/src/connection.ts @@ -119,6 +119,7 @@ export function initConnection(connection: Connection) { connection.onCompletion(async ({position, textDocument}: TextDocumentPositionParams): Promise => { return await onCompletion( + connection, position, documents.get(textDocument.uri)!, client, diff --git a/actions-languageserver/src/on-completion.ts b/actions-languageserver/src/on-completion.ts index 8be0d3b..0d0ae4f 100644 --- a/actions-languageserver/src/on-completion.ts +++ b/actions-languageserver/src/on-completion.ts @@ -1,23 +1,26 @@ import {complete} from "@github/actions-languageservice/complete"; import {Octokit} from "@octokit/rest"; -import {CompletionItem, Position} from "vscode-languageserver"; +import {CompletionItem, Connection, Position} from "vscode-languageserver"; import {TextDocument} from "vscode-languageserver-textdocument"; import {contextProviders} from "./context-providers"; +import {getFileProvider} from "./file-provider"; import {RepositoryContext} from "./initializationOptions"; import {TTLCache} from "./utils/cache"; import {valueProviders} from "./value-providers"; export async function onCompletion( + connection: Connection, position: Position, document: TextDocument, client: Octokit | undefined, repoContext: RepositoryContext | undefined, cache: TTLCache ): Promise { - return await complete( - document, - position, - repoContext && valueProviders(client, repoContext, cache), - repoContext && contextProviders(client, repoContext, cache) - ); + return await complete(document, position, { + valueProviderConfig: repoContext && valueProviders(client, repoContext, cache), + contextProviderConfig: repoContext && contextProviders(client, repoContext, cache), + fileProvider: getFileProvider(client, cache, repoContext?.workspaceUri, async path => { + return await connection.sendRequest("actions/readFile", {path}); + }) + }); } diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index fb0e65b..e9a0acf 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -59,7 +59,7 @@ describe("expressions", () => { describe("top-level auto-complete", () => { it("single region", async () => { const input = "run-name: ${{ | }}"; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result.map(x => x.label)).toEqual([ "github", @@ -76,18 +76,16 @@ describe("expressions", () => { }); it("within parentheses", async () => { - const result = await complete( - ...getPositionFromCursor("run-name: ${{ 1 == (github.|) }}"), - undefined, + const result = await complete(...getPositionFromCursor("run-name: ${{ 1 == (github.|) }}"), { contextProviderConfig - ); + }); expect(result.map(x => x.label)).toEqual(["event"]); }); it("contains description", async () => { const input = "run-name: ${{ github.| }}"; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result).toContainEqual({ label: "api_url", @@ -101,7 +99,7 @@ describe("expressions", () => { it("single region with existing input", async () => { const input = "run-name: ${{ g| }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "github", @@ -119,7 +117,7 @@ describe("expressions", () => { it("single region with existing condition", async () => { const input = "run-name: ${{ g| == 'test' }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "github", @@ -137,7 +135,7 @@ describe("expressions", () => { it("multiple regions with partial function", async () => { const input = "run-name: Run a ${{ inputs.test }} one-line script ${{ from|('test') == inputs.name }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "github", @@ -155,7 +153,7 @@ describe("expressions", () => { it("multiple regions - first region", async () => { const input = "run-name: test-${{ git| == 1 }}-${{ github.event }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "github", @@ -173,7 +171,7 @@ describe("expressions", () => { it("multiple regions", async () => { const input = "run-name: test-${{ github }}-${{ | }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "github", @@ -199,7 +197,7 @@ jobs: first line test \${{ github.| }} test2`; - const result = await complete(...getPositionFromCursor(input, 1), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input, 1), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -213,7 +211,7 @@ jobs: first line test \${{ github.| }} test2`; - const result = await complete(...getPositionFromCursor(input, 1), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input, 1), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -227,7 +225,7 @@ jobs: first line test \${{ github.| }} test2`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -241,7 +239,7 @@ jobs: first line test \${{ github.| }} test2`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -261,21 +259,21 @@ jobs: foo: '{}' steps: - name: "\${{ fromJSON('test') == (inputs.|) }}"`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["test"]); }); it("nested auto-complete", async () => { const input = "run-name: ${{ github.| }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); it("auto-complete partial", async () => { const input = "run-name: ${{ github.ev| }}"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -283,7 +281,7 @@ jobs: it("using default context provider", async () => { const input = "on: push\njobs:\n build:\n runs-on: ubuntu-latest\n environment:\n url: ${{ runner.| }}\n steps:\n - run: echo"; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["arch", "name", "os", "temp", "tool_cache"]); }); @@ -298,7 +296,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -311,7 +309,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -326,7 +324,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -339,7 +337,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -355,7 +353,7 @@ jobs: steps: - run: echo if: \${{ github.| }}`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -368,7 +366,7 @@ jobs: steps: - run: echo if: github.|`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); @@ -388,7 +386,7 @@ jobs: with: deploy-key: \${{ secrets.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["GITHUB_TOKEN"]); }); @@ -412,7 +410,7 @@ jobs: steps: - run: echo "hello \${{ needs.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["b"]); }); @@ -431,7 +429,7 @@ jobs: steps: - run: echo "hello \${{ needs.a.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["outputs", "result"]); }); @@ -452,7 +450,7 @@ jobs: steps: - run: echo "hello \${{ needs.a.outputs.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["build_id"]); }); @@ -481,7 +479,7 @@ jobs: env: envstepb: step_b_env `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["envjobb", "envstepb", "envwf"]); }); @@ -509,7 +507,7 @@ jobs: steps: - run: echo "hello \${{ inputs.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["another-name", "name", "third-name"]); }); @@ -524,7 +522,7 @@ jobs: steps: - run: echo "hello \${{ inputs.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result).toEqual([]); }); @@ -542,7 +540,7 @@ jobs: - run: echo \${{ github.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result.map(x => x.label)).toContain("actor"); }); @@ -570,7 +568,7 @@ jobs: steps: - run: echo "hello \${{ github.event.inputs.| `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result.map(x => x.label)).toEqual(["another-name", "name", "third-name"]); }); @@ -587,7 +585,7 @@ jobs: - run: echo \${{ github.event.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result.map(x => x.label)).not.toContain("inputs"); expect(result.map(x => x.label)).not.toContain("schedule"); @@ -607,7 +605,7 @@ jobs: - run: echo \${{ github.event.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); expect(result.map(x => x.label)).toEqual(["repository", "schedule", "workflow"]); }); @@ -623,7 +621,7 @@ jobs: - run: echo \${{ github.event.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); // forced is part of the push event payload expect(result.map(x => x.label)).toContain("forced"); @@ -642,7 +640,7 @@ jobs: - run: echo \${{ github.event.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, undefined); + const result = await complete(...getPositionFromCursor(input)); // We don't validate github.event for workflow_call, // but there should still be auto-completion suggestions @@ -665,7 +663,7 @@ jobs: - id: c run: echo "hello \${{ steps.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["a", "b"]); }); @@ -681,7 +679,7 @@ jobs: run: echo hello a - run: echo "hello \${{ steps.a.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["conclusion", "outcome", "outputs"]); }); @@ -700,7 +698,7 @@ jobs: - id: c run: echo hello c `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["a"]); }); @@ -717,7 +715,7 @@ jobs: run: echo hello b - run: echo "hello \${{ steps.| `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["b"]); }); @@ -736,7 +734,7 @@ jobs: - run: npm test > test-job-\${{ | }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).not.toContain("strategy"); }); @@ -757,7 +755,7 @@ jobs: - run: npm test > test-job-\${{ | }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toContain("strategy"); }); @@ -778,7 +776,7 @@ jobs: - run: npm test > test-job-\${{ strategy.| }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["fail-fast", "job-index", "job-total", "max-parallel"]); }); @@ -797,7 +795,7 @@ jobs: - run: npm test > test-job-\${{ | }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).not.toContain("strategy"); }); @@ -818,7 +816,7 @@ jobs: - run: npm test > test-job-\${{ | }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toContain("strategy"); }); @@ -841,7 +839,7 @@ jobs: node-version: \${{ matrix.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["node", "os"]); }); @@ -873,7 +871,7 @@ jobs: node-version: \${{ matrix.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["animal", "color", "fruit", "shape"]); }); @@ -894,7 +892,7 @@ jobs: node-version: \${{ matrix.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([]); }); @@ -918,7 +916,7 @@ jobs: node-version: \${{ matrix.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["animal", "fruit"]); }); @@ -940,7 +938,7 @@ jobs: node-version: \${{ matrix.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["color"]); }); @@ -963,7 +961,7 @@ jobs: - run: echo \${{ job.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["container", "services", "status"]); }); @@ -980,7 +978,7 @@ jobs: run: echo hi `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual([ "env", "github", @@ -1014,7 +1012,7 @@ jobs: run: echo hi `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["foo"]); }); @@ -1031,7 +1029,7 @@ jobs: - run: echo \${{ job.container.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["id", "network"]); }); @@ -1051,7 +1049,7 @@ jobs: - run: echo \${{ job.services.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["nginx", "redis"]); }); @@ -1072,7 +1070,7 @@ jobs: - run: echo \${{ job.services.nginx.| }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["id", "network", "ports"]); }); }); @@ -1089,7 +1087,7 @@ jobs: - run: echo \${{ | }}.txt `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); // Built-in function const toJSON = result.find(x => x.label === "toJson"); @@ -1121,7 +1119,7 @@ jobs: - run: echo \${{ toJS|(github.event) }} `; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.find(x => x.label === "toJson")!.insertText).toBe("toJson"); }); diff --git a/actions-languageservice/src/complete.test.ts b/actions-languageservice/src/complete.test.ts index d7ab496..5dda48e 100644 --- a/actions-languageservice/src/complete.test.ts +++ b/actions-languageservice/src/complete.test.ts @@ -192,7 +192,7 @@ jobs: } } }; - const result = await complete(...getPositionFromCursor(input), config); + const result = await complete(...getPositionFromCursor(input), {valueProviderConfig: config}); expect(result).not.toBeUndefined(); expect(result.length).toEqual(1); @@ -210,7 +210,7 @@ jobs: } } }; - const result = await complete(...getPositionFromCursor(input), config); + const result = await complete(...getPositionFromCursor(input), {valueProviderConfig: config}); expect(result).not.toBeUndefined(); expect(result.length).toEqual(1); diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 1b888b7..8fd5eb6 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -13,6 +13,7 @@ import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/in import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {TokenType} from "@github/actions-workflow-parser/templates/tokens/types"; import {File} from "@github/actions-workflow-parser/workflows/file"; +import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; import {Position, TextDocument} from "vscode-languageserver-textdocument"; import {CompletionItem, CompletionItemKind, CompletionItemTag, Range, TextEdit} from "vscode-languageserver-types"; import {ContextProviderConfig} from "./context-providers/config"; @@ -43,11 +44,16 @@ export function getExpressionInput(input: string, pos: number): string { return input.substring(startPos, pos); } +export type CompletionConfig = { + valueProviderConfig?: ValueProviderConfig; + contextProviderConfig?: ContextProviderConfig; + fileProvider?: FileProvider; +}; + export async function complete( textDocument: TextDocument, position: Position, - valueProviderConfig?: ValueProviderConfig, - contextProviderConfig?: ContextProviderConfig + config?: CompletionConfig ): Promise { // Edge case: when completing a key like `foo:|`, do not calculate auto-completions const charBeforePos = textDocument.getText({ @@ -71,7 +77,15 @@ export async function complete( } const {token, keyToken, parent, path} = findToken(newPos, result.value); - const template = await convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate( + result.context, + result.value, + ErrorPolicy.TryConversion, + config?.fileProvider, + { + fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0 + } + ); const workflowContext = getWorkflowContext(textDocument.uri, template, path); // If we are inside an expression, take a different code-path. The workflow parser does not correctly create @@ -79,7 +93,7 @@ export async function complete( if (token) { if (isBasicExpression(token) || isPotentiallyExpression(token)) { const allowedContext = token.definitionInfo?.allowedContext || []; - const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion); + const context = await getContext(allowedContext, config?.contextProviderConfig, workflowContext, Mode.Completion); return getExpressionCompletionItems(token, context, newPos); } @@ -88,7 +102,7 @@ export async function complete( const indentation = guessIndentation(newDoc, 2, true); // Use 2 spaces as default and most common for YAML const indentString = " ".repeat(indentation.tabSize); - const values = await getValues(token, keyToken, parent, valueProviderConfig, workflowContext, indentString); + const values = await getValues(token, keyToken, parent, config?.valueProviderConfig, workflowContext, indentString); let replaceRange: Range | undefined; if (token?.range) { From 63fdcf143fcca58c6853179794d20a721b66fb39 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 19:13:41 -0500 Subject: [PATCH 08/18] Support completing reusable job inputs --- .../src/complete.reusable-workflows.test.ts | 59 +++++++++++++++ .../src/test-utils/test-file-provider.ts | 75 +++++++++++++++++++ actions-languageservice/src/validate.ts | 9 ++- .../src/validate.workflow-references.test.ts | 71 +----------------- .../src/value-providers/default.ts | 5 ++ .../value-providers/reusable-job-inputs.ts | 40 ++++++++++ 6 files changed, 187 insertions(+), 72 deletions(-) create mode 100644 actions-languageservice/src/complete.reusable-workflows.test.ts create mode 100644 actions-languageservice/src/test-utils/test-file-provider.ts create mode 100644 actions-languageservice/src/value-providers/reusable-job-inputs.ts diff --git a/actions-languageservice/src/complete.reusable-workflows.test.ts b/actions-languageservice/src/complete.reusable-workflows.test.ts new file mode 100644 index 0000000..98fb858 --- /dev/null +++ b/actions-languageservice/src/complete.reusable-workflows.test.ts @@ -0,0 +1,59 @@ +import {CompletionItem, MarkupContent} from "vscode-languageserver-types"; +import {complete} from "./complete"; +import {getPositionFromCursor} from "./test-utils/cursor-position"; +import {testFileProvider} from "./test-utils/test-file-provider"; + +function mapResult(result: CompletionItem[]) { + return result.map(x => { + return {label: x.label, description: (x.documentation as MarkupContent).value}; + }); +} + +describe("completion with reusable workflows", () => { + it("completes job inputs", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow-with-inputs.yaml + with: + | +`; + const result = await complete(...getPositionFromCursor(input), {fileProvider: testFileProvider}); + + expect(result).not.toBeUndefined(); + expect(mapResult(result)).toEqual([ + { + label: "name", + description: "An optional name" + }, + { + label: "username", + description: "A username passed from the caller workflow" + } + ]); + }); + + it("filters out existing job inputs", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow-with-inputs.yaml + with: + username: monalisa + | +`; + const result = await complete(...getPositionFromCursor(input), {fileProvider: testFileProvider}); + + expect(result).not.toBeUndefined(); + expect(mapResult(result)).toEqual([ + { + label: "name", + description: "An optional name" + } + ]); + }); +}); diff --git a/actions-languageservice/src/test-utils/test-file-provider.ts b/actions-languageservice/src/test-utils/test-file-provider.ts new file mode 100644 index 0000000..8e45679 --- /dev/null +++ b/actions-languageservice/src/test-utils/test-file-provider.ts @@ -0,0 +1,75 @@ +import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; +import {fileIdentifier} from "@github/actions-workflow-parser/workflows/file-reference"; + +export const testFileProvider: FileProvider = { + getFileContent: async ref => { + switch (fileIdentifier(ref)) { + case "monalisa/octocat/workflow.yaml@main": + return { + name: "monalisa/octocat/workflow.yaml", + content: ` +on: workflow_call +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 +` + }; + + case "monalisa/octocat/.github/workflows/non-reusable-workflow.yaml@main": + return { + name: "monalisa/octocat/.github/workflows/non-reusable-workflow.yaml", + content: ` +on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 +` + }; + + case "./reusable-workflow.yaml": + return { + name: "reusable-workflow.yaml", + content: ` +on: workflow_call +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 +` + }; + + case "./reusable-workflow-with-inputs.yaml": + return { + name: "reusable-workflow-with-inputs.yaml", + content: ` +on: + workflow_call: + inputs: + username: + description: 'A username passed from the caller workflow' + required: true + type: string + + name: + description: 'An optional name' + required: false + type: string + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + ` + }; + + default: + throw new Error("File not found"); + } + } +}; diff --git a/actions-languageservice/src/validate.ts b/actions-languageservice/src/validate.ts index ca91193..544a163 100644 --- a/actions-languageservice/src/validate.ts +++ b/actions-languageservice/src/validate.ts @@ -118,15 +118,20 @@ async function additionalValidations( // Allowed values coming from the schema have already been validated. Only check if // a value provider is defined for a token and if it is, validate the values match. - if (config?.valueProviderConfig && token.range && validationDefinition) { + if (token.range && validationDefinition) { const defKey = validationDefinition.key; if (defKey === "step-with") { // Action inputs should be validated already in validateAction continue; } + if (defKey === "workflow-job-with") { + // Reusable workflow job inputs are validated by the parser + continue; + } + // Try a custom value provider first - let valueProvider = config.valueProviderConfig[defKey]; + let valueProvider = config?.valueProviderConfig?.[defKey]; if (!valueProvider) { // fall back to default valueProvider = defaultValueProviders[defKey]; diff --git a/actions-languageservice/src/validate.workflow-references.test.ts b/actions-languageservice/src/validate.workflow-references.test.ts index e9f256a..48614cb 100644 --- a/actions-languageservice/src/validate.workflow-references.test.ts +++ b/actions-languageservice/src/validate.workflow-references.test.ts @@ -1,76 +1,7 @@ -import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; -import {fileIdentifier} from "@github/actions-workflow-parser/workflows/file-reference"; import {createDocument} from "./test-utils/document"; +import {testFileProvider} from "./test-utils/test-file-provider"; import {validate} from "./validate"; -const testFileProvider: FileProvider = { - getFileContent: async ref => { - switch (fileIdentifier(ref)) { - case "monalisa/octocat/workflow.yaml@main": - return { - name: "monalisa/octocat/workflow.yaml", - content: ` -on: workflow_call -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 -` - }; - - case "monalisa/octocat/.github/workflows/non-reusable-workflow.yaml@main": - return { - name: "monalisa/octocat/.github/workflows/non-reusable-workflow.yaml", - content: ` -on: push -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 -` - }; - - case "./reusable-workflow.yaml": - return { - name: "reusable-workflow.yaml", - content: ` -on: workflow_call -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 -` - }; - - case "./reusable-workflow-with-inputs.yaml": - return { - name: "reusable-workflow-with-inputs.yaml", - content: ` -on: - workflow_call: - inputs: - username: - description: 'A username passed from the caller workflow' - required: true - type: string - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - ` - }; - - default: - throw new Error("File not found"); - } - } -}; - describe("workflow references validation", () => { it("invalid workflow reference", async () => { const input = ` diff --git a/actions-languageservice/src/value-providers/default.ts b/actions-languageservice/src/value-providers/default.ts index be59611..3c915cf 100644 --- a/actions-languageservice/src/value-providers/default.ts +++ b/actions-languageservice/src/value-providers/default.ts @@ -1,6 +1,7 @@ import {WorkflowContext} from "../context/workflow-context"; import {ValueProviderConfig, ValueProviderKind} from "./config"; import {needs} from "./needs"; +import {reusableJobInputs} from "./reusable-job-inputs"; import {stringsToValues} from "./strings-to-values"; export const defaultValueProviders: ValueProviderConfig = { @@ -8,6 +9,10 @@ export const defaultValueProviders: ValueProviderConfig = { kind: ValueProviderKind.AllowedValues, get: needs }, + "workflow-job-with": { + kind: ValueProviderKind.AllowedValues, + get: async context => reusableJobInputs(context) + }, "runs-on": { kind: ValueProviderKind.SuggestedValues, get: async (_: WorkflowContext) => diff --git a/actions-languageservice/src/value-providers/reusable-job-inputs.ts b/actions-languageservice/src/value-providers/reusable-job-inputs.ts new file mode 100644 index 0000000..391d5a8 --- /dev/null +++ b/actions-languageservice/src/value-providers/reusable-job-inputs.ts @@ -0,0 +1,40 @@ +import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; +import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; +import {isMapping, isString} from "@github/actions-workflow-parser/templates/tokens/type-guards"; +import {WorkflowContext} from "../context/workflow-context"; +import {Value} from "./config"; +import {stringsToValues} from "./strings-to-values"; + +export function reusableJobInputs(context: WorkflowContext): Value[] { + if (!context.reusableWorkflowJob?.["input-definitions"]) { + return []; + } + + const values: Value[] = []; + + for (const {key, value} of context.reusableWorkflowJob["input-definitions"]) { + if (!isString(key)) { + continue; + } + + values.push({ + label: key.value, + description: inputDescription(value) + }); + } + + return values; +} + +function inputDescription(inputDef: TemplateToken): string | undefined { + if (!isMapping(inputDef)) { + return undefined; + } + + const descriptionToken = inputDef.find("description"); + if (!descriptionToken || !isString(descriptionToken)) { + return undefined; + } + + return descriptionToken.value; +} From 2358166326db9c3f11f262abe03914e5898f2792 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 19:43:42 -0500 Subject: [PATCH 09/18] Support reusable workflow outputs in expressions --- .../src/context-providers/needs.test.ts | 53 +++++++++++++++++++ .../src/context-providers/needs.ts | 7 ++- .../src/test-utils/test-file-provider.ts | 19 +++++++ .../src/test-utils/test-workflow-context.ts | 5 +- 4 files changed, 79 insertions(+), 5 deletions(-) diff --git a/actions-languageservice/src/context-providers/needs.test.ts b/actions-languageservice/src/context-providers/needs.test.ts index 6058798..729646c 100644 --- a/actions-languageservice/src/context-providers/needs.test.ts +++ b/actions-languageservice/src/context-providers/needs.test.ts @@ -72,4 +72,57 @@ jobs: const context = getNeedsContext(workflowContext); expect(context.pairs().map(x => x.key)).toEqual(["test"]); }); + + describe("outputs", () => { + it("regular job with outputs", async () => { + const workflowContext = await testGetWorkflowContext(` +on: push +jobs: + a: + outputs: + build_id: my-build-id + runs-on: ubuntu-latest + steps: + - run: echo + b: + uses: ./.github/workflows/some-reusable-wor|kflow.yml + needs: [a] +`); + + const context = getNeedsContext(workflowContext); + + const needs = context.get("a") as DescriptionDictionary; + expect(needs).toBeDefined(); + + const outputs = needs.get("outputs") as DescriptionDictionary; + expect(outputs).toBeDefined(); + + expect(outputs.pairs().map(x => x.key)).toEqual(["build_id"]); + }); + + it("reusable job with outputs", async () => { + const workflowContext = await testGetWorkflowContext(` +on: push +jobs: + a: + uses: ./reusable-workflow-with-outputs.yaml + + b: + needs: [a] + runs-on: ubuntu-latest + steps: + - run: ec|ho +`); + + const context = getNeedsContext(workflowContext); + + const needs = context.get("a") as DescriptionDictionary; + expect(needs).toBeDefined(); + + const outputs = needs.get("outputs") as DescriptionDictionary; + expect(outputs).toBeDefined(); + + expect(outputs.pairs().map(x => x.key)).toEqual(["build_id"]); + }); + }); }); diff --git a/actions-languageservice/src/context-providers/needs.ts b/actions-languageservice/src/context-providers/needs.ts index 23d9aa8..3196e9f 100644 --- a/actions-languageservice/src/context-providers/needs.ts +++ b/actions-languageservice/src/context-providers/needs.ts @@ -1,7 +1,6 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {isScalar, isString} from "@github/actions-workflow-parser"; -import {isJob} from "@github/actions-workflow-parser/model/type-guards"; -import {Job, WorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; +import {WorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; import {WorkflowContext} from "../context/workflow-context"; export function getNeedsContext(workflowContext: WorkflowContext): DescriptionDictionary { @@ -25,7 +24,7 @@ function needsJobContext(job?: WorkflowJob): DescriptionDictionary { // https://docs.github.com/en/actions/learn-github-actions/contexts#needs-context const d = new DescriptionDictionary(); - if (job && isJob(job)) { + if (job) { d.add("outputs", jobOutputs(job)); } @@ -34,7 +33,7 @@ function needsJobContext(job?: WorkflowJob): DescriptionDictionary { return d; } -function jobOutputs(job?: Job): DescriptionDictionary { +function jobOutputs(job?: WorkflowJob): DescriptionDictionary { const d = new DescriptionDictionary(); if (!job?.outputs) { return d; diff --git a/actions-languageservice/src/test-utils/test-file-provider.ts b/actions-languageservice/src/test-utils/test-file-provider.ts index 8e45679..c527755 100644 --- a/actions-languageservice/src/test-utils/test-file-provider.ts +++ b/actions-languageservice/src/test-utils/test-file-provider.ts @@ -68,6 +68,25 @@ jobs: ` }; + case "./reusable-workflow-with-outputs.yaml": + return { + name: "reusable-workflow-with-outputs.yaml", + content: ` +on: + workflow_call: + outputs: + build_id: + description: 'The resulting build ID' + value: 123 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 +` + }; + default: throw new Error("File not found"); } diff --git a/actions-languageservice/src/test-utils/test-workflow-context.ts b/actions-languageservice/src/test-utils/test-workflow-context.ts index c5a1a7b..e671ba2 100644 --- a/actions-languageservice/src/test-utils/test-workflow-context.ts +++ b/actions-languageservice/src/test-utils/test-workflow-context.ts @@ -3,6 +3,7 @@ import {getWorkflowContext, WorkflowContext} from "../context/workflow-context"; import {nullTrace} from "../nulltrace"; import {findToken} from "../utils/find-token"; import {getPositionFromCursor} from "./cursor-position"; +import {testFileProvider} from "./test-file-provider"; export async function testGetWorkflowContext(input: string): Promise { const [textDocument, pos] = getPositionFromCursor(input); @@ -17,7 +18,9 @@ export async function testGetWorkflowContext(input: string): Promise Date: Wed, 8 Feb 2023 00:46:13 +0000 Subject: [PATCH 10/18] v0.1.128 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index ae2aa42..357d26b 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index c9ea4f2..a17e7e2 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.127", + "version": "0.1.128", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-languageservice": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index b6c4525..d36c947 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.127", + "version": "0.1.128", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-expressions": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index f3191b2..a41a1a0 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.127", + "@github/actions-expressions": "^0.1.128", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 6d16a2c..ae34cf1 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.127", + "version": "0.1.128", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.127", + "@github/actions-languageserver": "^0.1.128", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index 8e03793..625814e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.127" + "version": "0.1.128" } diff --git a/package-lock.json b/package-lock.json index cbf4201..d22fd87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-languageservice": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-expressions": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.127", + "@github/actions-expressions": "^0.1.128", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.127", + "version": "0.1.128", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.127", + "@github/actions-languageserver": "^0.1.128", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-languageservice": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.127", - "@github/actions-workflow-parser": "^0.1.127", + "@github/actions-expressions": "^0.1.128", + "@github/actions-workflow-parser": "^0.1.128", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.127", + "@github/actions-expressions": "^0.1.128", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.127", + "@github/actions-languageserver": "^0.1.128", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 672b989fcd350b309fc37dea267c682018a8171b Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Feb 2023 01:51:09 +0000 Subject: [PATCH 11/18] v0.1.129 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index 357d26b..3bf7cd4 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index a17e7e2..77e9a72 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.128", + "version": "0.1.129", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-languageservice": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index d36c947..a0bf5f7 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.128", + "version": "0.1.129", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-expressions": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index a41a1a0..22815df 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.128", + "@github/actions-expressions": "^0.1.129", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index ae34cf1..1d9dffa 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.128", + "version": "0.1.129", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.128", + "@github/actions-languageserver": "^0.1.129", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index 625814e..9948b66 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.128" + "version": "0.1.129" } diff --git a/package-lock.json b/package-lock.json index d22fd87..52e0112 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-languageservice": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-expressions": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.128", + "@github/actions-expressions": "^0.1.129", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.128", + "version": "0.1.129", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.128", + "@github/actions-languageserver": "^0.1.129", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-languageservice": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.128", - "@github/actions-workflow-parser": "^0.1.128", + "@github/actions-expressions": "^0.1.129", + "@github/actions-workflow-parser": "^0.1.129", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.128", + "@github/actions-expressions": "^0.1.129", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.128", + "@github/actions-languageserver": "^0.1.129", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From c56a86952eb9ff178880060c74a6a37e7c8e7a9a Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Feb 2023 15:39:44 +0000 Subject: [PATCH 12/18] v0.1.130 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index 3bf7cd4..83e00c4 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 77e9a72..fa299b4 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.129", + "version": "0.1.130", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-languageservice": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index a0bf5f7..d10791f 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.129", + "version": "0.1.130", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-expressions": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index 22815df..e1a7e96 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.129", + "@github/actions-expressions": "^0.1.130", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 1d9dffa..995f5c7 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.129", + "version": "0.1.130", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.129", + "@github/actions-languageserver": "^0.1.130", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index 9948b66..1d42bde 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.129" + "version": "0.1.130" } diff --git a/package-lock.json b/package-lock.json index 52e0112..2cc038a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-languageservice": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-expressions": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.129", + "@github/actions-expressions": "^0.1.130", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.129", + "version": "0.1.130", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.129", + "@github/actions-languageserver": "^0.1.130", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-languageservice": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.129", - "@github/actions-workflow-parser": "^0.1.129", + "@github/actions-expressions": "^0.1.130", + "@github/actions-workflow-parser": "^0.1.130", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.129", + "@github/actions-expressions": "^0.1.130", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.129", + "@github/actions-languageserver": "^0.1.130", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 5c897048dbaa66ae4210409185d5241dcc3f1e44 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Wed, 8 Feb 2023 10:51:56 -0500 Subject: [PATCH 13/18] Update test to failing --- actions-languageservice/src/complete.expressions.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index 7817beb..77e51e6 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -278,9 +278,9 @@ jobs: expect(result.map(x => x.label)).toEqual(["event"]); }); - it("auto-complete complex partial", async () => { + it.failing("auto-complete complex partial", async () => { const input = 'run-name: "run ${{ github.ev| }} run"'; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); expect(result.map(x => x.label)).toEqual(["event"]); }); From 44fe960bae23dc7cd714979ca8594a6f56e6f451 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Wed, 8 Feb 2023 11:00:01 -0500 Subject: [PATCH 14/18] Test is passing now? --- actions-languageservice/src/complete.expressions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index 77e51e6..f7130e7 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -278,7 +278,7 @@ jobs: expect(result.map(x => x.label)).toEqual(["event"]); }); - it.failing("auto-complete complex partial", async () => { + it("auto-complete complex partial", async () => { const input = 'run-name: "run ${{ github.ev| }} run"'; const result = await complete(...getPositionFromCursor(input), {contextProviderConfig}); From 88f72a60828e061c775354dce10c58dd7aa35360 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Feb 2023 16:13:37 +0000 Subject: [PATCH 15/18] v0.1.131 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index 83e00c4..625f0a5 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index fa299b4..9a734a9 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.130", + "version": "0.1.131", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-languageservice": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index d10791f..9648ddb 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.130", + "version": "0.1.131", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-expressions": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index e1a7e96..43cf599 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.130", + "@github/actions-expressions": "^0.1.131", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 995f5c7..1c109f8 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.130", + "version": "0.1.131", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.130", + "@github/actions-languageserver": "^0.1.131", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index 1d42bde..e9c4b1c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.130" + "version": "0.1.131" } diff --git a/package-lock.json b/package-lock.json index 2cc038a..5600bb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-languageservice": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-expressions": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.130", + "@github/actions-expressions": "^0.1.131", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.130", + "version": "0.1.131", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.130", + "@github/actions-languageserver": "^0.1.131", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-languageservice": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.130", - "@github/actions-workflow-parser": "^0.1.130", + "@github/actions-expressions": "^0.1.131", + "@github/actions-workflow-parser": "^0.1.131", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.130", + "@github/actions-expressions": "^0.1.131", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.130", + "@github/actions-languageserver": "^0.1.131", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From cfe75cef4ae010d803e127508c199386e1c70564 Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Wed, 8 Feb 2023 11:02:18 -0500 Subject: [PATCH 16/18] Update default runner label list --- actions-languageservice/src/complete.test.ts | 26 ++++++------------- .../src/value-providers/default.ts | 9 ++++--- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/actions-languageservice/src/complete.test.ts b/actions-languageservice/src/complete.test.ts index 5dda48e..b6c7436 100644 --- a/actions-languageservice/src/complete.test.ts +++ b/actions-languageservice/src/complete.test.ts @@ -14,8 +14,9 @@ describe("completion", () => { const result = await complete(...getPositionFromCursor(input)); expect(result).not.toBeUndefined(); - expect(result.length).toEqual(11); - expect(result[0].label).toEqual("macos-10.13"); + expect(result.length).toEqual(12); + const labels = result.map(x => x.label); + expect(labels).toContain("macos-latest"); }); it("needs", async () => { @@ -46,26 +47,15 @@ jobs: const input = `on: push jobs: build: - runs-on: [self-hosted, u|]`; + runs-on: [ubuntu-latest, u|]`; const result = await complete(...getPositionFromCursor(input)); expect(result).not.toBeUndefined(); - expect(result.length).toEqual(10); + expect(result.length).toEqual(11); - expect(result[0].label).toEqual("macos-10.13"); - }); - - it("sequence filters out existing values", async () => { - const input = `on: push -jobs: - build: - runs-on: [ubuntu-latest, u|]`; - const result = await complete(...getPositionFromCursor(input)); - - expect(result).not.toBeUndefined(); - expect(result.length).toEqual(10); - - expect(result[0].label).toEqual("macos-10.13"); + const labels = result.map(x => x.label); + expect(labels).toContain("macos-latest"); + expect(labels).not.toContain("ubuntu-latest"); }); it("one-of definition completion", async () => { diff --git a/actions-languageservice/src/value-providers/default.ts b/actions-languageservice/src/value-providers/default.ts index 3c915cf..b0a0ea8 100644 --- a/actions-languageservice/src/value-providers/default.ts +++ b/actions-languageservice/src/value-providers/default.ts @@ -18,15 +18,16 @@ export const defaultValueProviders: ValueProviderConfig = { get: async (_: WorkflowContext) => stringsToValues([ "ubuntu-latest", + "ubuntu-22.04", + "ubuntu-20.04", "ubuntu-18.04", - "ubuntu-16.04", "windows-latest", + "windows-2022", "windows-2019", - "windows-2016", "macos-latest", + "macos-12", + "macos-11", "macos-10.15", - "macos-10.14", - "macos-10.13", "self-hosted" ]) } From 6c067e1fa53686c119b66e5d2c8e5f806cee3d07 Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Wed, 8 Feb 2023 12:22:27 -0500 Subject: [PATCH 17/18] Share default runner label list --- .../src/value-providers/runs-on.ts | 19 ++---------- .../src/value-providers/default.ts | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/actions-languageserver/src/value-providers/runs-on.ts b/actions-languageserver/src/value-providers/runs-on.ts index 732e464..f47de7c 100644 --- a/actions-languageserver/src/value-providers/runs-on.ts +++ b/actions-languageserver/src/value-providers/runs-on.ts @@ -1,31 +1,16 @@ import {Value} from "@github/actions-languageservice/value-providers/config"; +import {DEFAULT_RUNNER_LABELS} from "@github/actions-languageservice/value-providers/default"; import {Octokit} from "@octokit/rest"; import {TTLCache} from "../utils/cache"; // Limitation: getRunnerLabels returns default hosted labels and labels for repository self-hosted runners. // It doesn't return labels for organization runners visible to the repository. export async function getRunnerLabels(client: Octokit, cache: TTLCache, owner: string, name: string): Promise { - const defaultLabels = [ - "ubuntu-latest", - "ubuntu-22.04", - "ubuntu-20.04", - "ubuntu-18.04", - "windows-latest", - "windows-2022", - "windows-2019", - "windows-2016", - "macos-latest", - "macos-12", - "macos-11", - "macos-10.15", - "self-hosted" - ]; - const repoLabels = await cache.get(`${owner}/${name}/runner-labels`, undefined, () => fetchRunnerLabels(client, owner, name) ); - for (const label of defaultLabels) { + for (const label of DEFAULT_RUNNER_LABELS) { repoLabels.add(label); } diff --git a/actions-languageservice/src/value-providers/default.ts b/actions-languageservice/src/value-providers/default.ts index b0a0ea8..8081f45 100644 --- a/actions-languageservice/src/value-providers/default.ts +++ b/actions-languageservice/src/value-providers/default.ts @@ -4,6 +4,21 @@ import {needs} from "./needs"; import {reusableJobInputs} from "./reusable-job-inputs"; import {stringsToValues} from "./strings-to-values"; +export const DEFAULT_RUNNER_LABELS = [ + "ubuntu-latest", + "ubuntu-22.04", + "ubuntu-20.04", + "ubuntu-18.04", + "windows-latest", + "windows-2022", + "windows-2019", + "macos-latest", + "macos-12", + "macos-11", + "macos-10.15", + "self-hosted" +]; + export const defaultValueProviders: ValueProviderConfig = { needs: { kind: ValueProviderKind.AllowedValues, @@ -15,20 +30,6 @@ export const defaultValueProviders: ValueProviderConfig = { }, "runs-on": { kind: ValueProviderKind.SuggestedValues, - get: async (_: WorkflowContext) => - stringsToValues([ - "ubuntu-latest", - "ubuntu-22.04", - "ubuntu-20.04", - "ubuntu-18.04", - "windows-latest", - "windows-2022", - "windows-2019", - "macos-latest", - "macos-12", - "macos-11", - "macos-10.15", - "self-hosted" - ]) + get: async (_: WorkflowContext) => stringsToValues(DEFAULT_RUNNER_LABELS) } }; From 1bff36a3d39271806b989d83d19d493fac5b2f53 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Feb 2023 17:38:12 +0000 Subject: [PATCH 18/18] v0.1.132 --- actions-expressions/package.json | 2 +- actions-languageserver/package.json | 6 ++--- actions-languageservice/package.json | 6 ++--- actions-workflow-parser/package.json | 4 ++-- browser-playground/package.json | 4 ++-- lerna.json | 2 +- package-lock.json | 34 ++++++++++++++-------------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/actions-expressions/package.json b/actions-expressions/package.json index 625f0a5..4888f5e 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 9a734a9..fcf389e 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.131", + "version": "0.1.132", "description": "Language server for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-languageservice": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-languageservice": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", diff --git a/actions-languageservice/package.json b/actions-languageservice/package.json index 9648ddb..bfa7a91 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.131", + "version": "0.1.132", "description": "Language service for GitHub Actions", "license": "MIT", "type": "module", @@ -38,8 +38,8 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-expressions": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" diff --git a/actions-workflow-parser/package.json b/actions-workflow-parser/package.json index 43cf599..bdfe643 100644 --- a/actions-workflow-parser/package.json +++ b/actions-workflow-parser/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-workflow-parser", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "type": "module", "source": "./src/index.ts", @@ -40,7 +40,7 @@ "watch": "tsc --build tsconfig.build.json --watch" }, "dependencies": { - "@github/actions-expressions": "^0.1.131", + "@github/actions-expressions": "^0.1.132", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 1c109f8..16e2580 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.131", + "version": "0.1.132", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.131", + "@github/actions-languageserver": "^0.1.132", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", diff --git a/lerna.json b/lerna.json index e9c4b1c..d7131e8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.131" + "version": "0.1.132" } diff --git a/package-lock.json b/package-lock.json index 5600bb4..a175757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-languageservice": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "@octokit/rest": "^19.0.7", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", @@ -59,11 +59,11 @@ }, "actions-languageservice": { "name": "@github/actions-languageservice", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-expressions": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "vscode-languageserver-textdocument": "^1.0.7", "vscode-languageserver-types": "^3.17.2", "yaml": "^2.1.1" @@ -82,10 +82,10 @@ }, "actions-workflow-parser": { "name": "@github/actions-workflow-parser", - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.131", + "@github/actions-expressions": "^0.1.132", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.131", + "version": "0.1.132", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.131", + "@github/actions-languageserver": "^0.1.132", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", "monaco-languageclient": "^4.0.3", @@ -14570,8 +14570,8 @@ "@github/actions-languageserver": { "version": "file:actions-languageserver", "requires": { - "@github/actions-languageservice": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-languageservice": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "@octokit/rest": "^19.0.7", "@types/jest": "^29.0.3", "fetch-mock": "^9.11.0", @@ -14588,8 +14588,8 @@ "@github/actions-languageservice": { "version": "file:actions-languageservice", "requires": { - "@github/actions-expressions": "^0.1.131", - "@github/actions-workflow-parser": "^0.1.131", + "@github/actions-expressions": "^0.1.132", + "@github/actions-workflow-parser": "^0.1.132", "@types/jest": "^29.0.3", "jest": "^29.0.3", "prettier": "^2.8.3", @@ -14604,7 +14604,7 @@ "@github/actions-workflow-parser": { "version": "file:actions-workflow-parser", "requires": { - "@github/actions-expressions": "^0.1.131", + "@github/actions-expressions": "^0.1.132", "@types/jest": "^29.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/parser": "^5.40.0", @@ -17562,7 +17562,7 @@ "browser-playground": { "version": "file:browser-playground", "requires": { - "@github/actions-languageserver": "^0.1.131", + "@github/actions-languageserver": "^0.1.132", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2",