From 117b69f10f95ee0493ee041fde5ade01ac1ab108 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 31 Jan 2023 15:31:16 -0800 Subject: [PATCH 01/52] Add range to tokens --- actions-expressions/src/errors.ts | 2 +- actions-expressions/src/lexer.test.ts | 194 ++++++++++++++++++-------- actions-expressions/src/lexer.ts | 29 +++- 3 files changed, 157 insertions(+), 68 deletions(-) diff --git a/actions-expressions/src/errors.ts b/actions-expressions/src/errors.ts index 0a2db07..72202a9 100644 --- a/actions-expressions/src/errors.ts +++ b/actions-expressions/src/errors.ts @@ -20,7 +20,7 @@ export class ExpressionError extends Error { constructor(private typ: ErrorType, private tok: Token) { super(`${errorDescription(typ)}: '${tokenString(tok)}'`); - this.pos = this.tok.pos; + this.pos = this.tok.range.start; } public pos: Pos; diff --git a/actions-expressions/src/lexer.test.ts b/actions-expressions/src/lexer.test.ts index 749f721..3145534 100644 --- a/actions-expressions/src/lexer.test.ts +++ b/actions-expressions/src/lexer.test.ts @@ -3,32 +3,32 @@ import {Lexer, Token, TokenType} from "./lexer"; describe("lexer", () => { const tests: { input: string; - tokenType: TokenType[]; - token?: Token; + tokenTypes: TokenType[]; + tokens?: Token[]; }[] = [ - {input: "<", tokenType: [TokenType.LESS]}, - {input: ">", tokenType: [TokenType.GREATER]}, + {input: "<", tokenTypes: [TokenType.LESS]}, + {input: ">", tokenTypes: [TokenType.GREATER]}, - {input: "!=", tokenType: [TokenType.BANG_EQUAL]}, - {input: "==", tokenType: [TokenType.EQUAL_EQUAL]}, - {input: "<=", tokenType: [TokenType.LESS_EQUAL]}, - {input: ">=", tokenType: [TokenType.GREATER_EQUAL]}, + {input: "!=", tokenTypes: [TokenType.BANG_EQUAL]}, + {input: "==", tokenTypes: [TokenType.EQUAL_EQUAL]}, + {input: "<=", tokenTypes: [TokenType.LESS_EQUAL]}, + {input: ">=", tokenTypes: [TokenType.GREATER_EQUAL]}, - {input: "&&", tokenType: [TokenType.AND]}, - {input: "||", tokenType: [TokenType.OR]}, + {input: "&&", tokenTypes: [TokenType.AND]}, + {input: "||", tokenTypes: [TokenType.OR]}, // Numbers - {input: "12", tokenType: [TokenType.NUMBER]}, - {input: "12.0", tokenType: [TokenType.NUMBER]}, - {input: "0", tokenType: [TokenType.NUMBER]}, - {input: "-0", tokenType: [TokenType.NUMBER]}, - {input: "-12.0", tokenType: [TokenType.NUMBER]}, + {input: "12", tokenTypes: [TokenType.NUMBER]}, + {input: "12.0", tokenTypes: [TokenType.NUMBER]}, + {input: "0", tokenTypes: [TokenType.NUMBER]}, + {input: "-0", tokenTypes: [TokenType.NUMBER]}, + {input: "-12.0", tokenTypes: [TokenType.NUMBER]}, // Strings - {input: "'It''s okay'", tokenType: [TokenType.STRING]}, + {input: "'It''s okay'", tokenTypes: [TokenType.STRING]}, { input: "format('{0} == ''queued''', needs)", - tokenType: [ + tokenTypes: [ TokenType.IDENTIFIER, TokenType.LEFT_PAREN, TokenType.STRING, @@ -41,87 +41,161 @@ describe("lexer", () => { // Arrays { input: "[1,2]", - tokenType: [TokenType.LEFT_BRACKET, TokenType.NUMBER, TokenType.COMMA, TokenType.NUMBER, TokenType.RIGHT_BRACKET] + tokenTypes: [TokenType.LEFT_BRACKET, TokenType.NUMBER, TokenType.COMMA, TokenType.NUMBER, TokenType.RIGHT_BRACKET] }, // Simple expressions { input: "1 == 2", - tokenType: [TokenType.NUMBER, TokenType.EQUAL_EQUAL, TokenType.NUMBER] + tokenTypes: [TokenType.NUMBER, TokenType.EQUAL_EQUAL, TokenType.NUMBER] }, { input: "1== 1", - tokenType: [TokenType.NUMBER, TokenType.EQUAL_EQUAL, TokenType.NUMBER] + tokenTypes: [TokenType.NUMBER, TokenType.EQUAL_EQUAL, TokenType.NUMBER] }, { input: "1< 1", - tokenType: [TokenType.NUMBER, TokenType.LESS, TokenType.NUMBER] + tokenTypes: [TokenType.NUMBER, TokenType.LESS, TokenType.NUMBER] }, // Identifiers { input: "github", - tokenType: [TokenType.IDENTIFIER], - token: { - type: TokenType.IDENTIFIER, - lexeme: "github", - pos: { - line: 0, - column: 0 + tokenTypes: [TokenType.IDENTIFIER], + tokens: [ + { + type: TokenType.IDENTIFIER, + lexeme: "github", + range: { + start: { + line: 0, + column: 0 + }, + end: { + line: 0, + column: 6 + } + } } - } + ] }, // Keywords { input: "true", - tokenType: [TokenType.TRUE], - token: { - type: TokenType.TRUE, - lexeme: "true", - pos: { - line: 0, - column: 0 + tokenTypes: [TokenType.TRUE], + tokens: [ + { + type: TokenType.TRUE, + lexeme: "true", + range: { + start: { + line: 0, + column: 0 + }, + end: { + line: 0, + column: 4 + } + } } - } + ] }, { input: "false", - tokenType: [TokenType.FALSE], - token: { - type: TokenType.FALSE, - lexeme: "false", - pos: { - line: 0, - column: 0 + tokenTypes: [TokenType.FALSE], + tokens: [ + { + type: TokenType.FALSE, + lexeme: "false", + range: { + start: { + line: 0, + column: 0 + }, + end: { + line: 0, + column: 5 + } + } } - } + ] }, { input: "null", - tokenType: [TokenType.NULL], - token: { - type: TokenType.NULL, - lexeme: "null", - pos: { - line: 0, - column: 0 + tokenTypes: [TokenType.NULL], + tokens: [ + { + type: TokenType.NULL, + lexeme: "null", + range: { + start: { + line: 0, + column: 0 + }, + end: { + line: 0, + column: 4 + } + } } - } + ] + }, + + { + input: "github\n ==", + tokenTypes: [TokenType.IDENTIFIER, TokenType.EQUAL_EQUAL], + tokens: [ + { + type: TokenType.IDENTIFIER, + lexeme: "github", + range: { + start: { + line: 0, + column: 0 + }, + end: { + line: 0, + column: 6 + } + } + }, + { + type: TokenType.EQUAL_EQUAL, + lexeme: "==", + range: { + start: { + line: 1, + column: 1 + }, + end: { + line: 1, + column: 3 + } + } + } + ] } ]; - test.each(tests)("$input", ({input, tokenType, token}: {input: string; tokenType: TokenType[]; token?: Token}) => { - const l = new Lexer(input); + test.each(tests)( + "$input", + ({input, tokenTypes, tokens}: {input: string; tokenTypes: TokenType[]; tokens?: Token[]}) => { + const l = new Lexer(input); - const r = l.lex(); + const r = l.lex(); - const want = r.tokens.map(t => t.type); + const got = r.tokens.map(t => t.type); - tokenType.push(TokenType.EOF); + tokenTypes.push(TokenType.EOF); + expect(got).toEqual(tokenTypes); - expect(want).toEqual(tokenType); - }); + if (tokens) { + // Ignore the last EOF token + expect(r.tokens.slice(0, r.tokens.length - 1)).toEqual(tokens); + } + } + ); }); diff --git a/actions-expressions/src/lexer.ts b/actions-expressions/src/lexer.ts index 2d9c0fa..c52bbf2 100644 --- a/actions-expressions/src/lexer.ts +++ b/actions-expressions/src/lexer.ts @@ -36,13 +36,18 @@ export type Pos = { column: number; }; +export type Range = { + start: Pos; + end: Pos; +}; + export type Token = { type: TokenType; lexeme: string; value?: string | number | boolean; - pos: Pos; + range: Range; }; export function tokenString(tok: Token): string { @@ -192,7 +197,7 @@ export class Lexer { this.tokens.push({ type: TokenType.EOF, lexeme: "", - pos: this.pos() + range: this.range() }); return { @@ -207,6 +212,20 @@ export class Lexer { }; } + private endPos(): Pos { + return { + line: this.line, + column: this.offset - this.lastLineOffset + }; + } + + private range(): Range { + return { + start: this.pos(), + end: this.endPos() + }; + } + private atEnd(): boolean { return this.offset >= this.input.length; } @@ -240,10 +259,6 @@ export class Lexer { return this.input[this.offset++]; } - private reverse(): string { - return this.input[--this.offset]; - } - private match(expected: string): boolean { if (this.atEnd()) { return false; @@ -260,7 +275,7 @@ export class Lexer { this.tokens.push({ type, lexeme: this.input.substring(this.start, this.offset), - pos: this.pos(), + range: this.range(), value }); } From 38c8ed1080ebd4e2bf6c92c8fbe33c70d7369ca9 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Tue, 31 Jan 2023 16:21:01 -0800 Subject: [PATCH 02/52] Keep original token for literals --- actions-expressions/src/ast.ts | 2 +- actions-expressions/src/parser.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/actions-expressions/src/ast.ts b/actions-expressions/src/ast.ts index 04a87b6..cb37fad 100644 --- a/actions-expressions/src/ast.ts +++ b/actions-expressions/src/ast.ts @@ -17,7 +17,7 @@ export abstract class Expr { } export class Literal extends Expr { - constructor(public literal: ExpressionData) { + constructor(public literal: ExpressionData, public token: Token) { super(); } diff --git a/actions-expressions/src/parser.ts b/actions-expressions/src/parser.ts index ee4cf3a..9345bd6 100644 --- a/actions-expressions/src/parser.ts +++ b/actions-expressions/src/parser.ts @@ -196,7 +196,7 @@ export class Parser { if (this.match(TokenType.IDENTIFIER)) { let property = this.previous(); - expr = new IndexAccess(expr, new Literal(new data.StringData(property.lexeme))); + expr = new IndexAccess(expr, new Literal(new data.StringData(property.lexeme), property)); } else if (this.match(TokenType.STAR)) { expr = new IndexAccess(expr, new Star()); } else { @@ -254,19 +254,19 @@ export class Parser { private primary(): Expr { switch (true) { case this.match(TokenType.FALSE): - return new Literal(new data.BooleanData(false)); + return new Literal(new data.BooleanData(false), this.previous()); case this.match(TokenType.TRUE): - return new Literal(new data.BooleanData(true)); + return new Literal(new data.BooleanData(true), this.previous()); case this.match(TokenType.NULL): - return new Literal(new data.Null()); + return new Literal(new data.Null(), this.previous()); case this.match(TokenType.NUMBER): - return new Literal(new data.NumberData(this.previous().value as number)); + return new Literal(new data.NumberData(this.previous().value as number), this.previous()); case this.match(TokenType.STRING): - return new Literal(new data.StringData(this.previous().value as string)); + return new Literal(new data.StringData(this.previous().value as string), this.previous()); case this.match(TokenType.LEFT_PAREN): const expr = this.expression(); From 9d93f919d34c0798664a6839ee9fa99c8e4c7903 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Wed, 1 Feb 2023 15:48:19 -0800 Subject: [PATCH 03/52] Sync test data changes --- .../testdata/reader/concurrency.yml | 8 +- .../testdata/reader/errors-insert.yml | 25 ++ .../reader/errors-invalid-mapping-key.yml | 17 ++ .../reader/errors-job-concurrency.yml | 2 - ...rrors-job-runs-on-group-invalid-prefix.yml | 4 +- .../testdata/reader/errors-matrix-bad-key.yml | 19 ++ .../reader/errors-matrix-empty-vector.yml | 20 ++ .../reader/errors-matrix-max-depth.yml | 2 - .../testdata/reader/errors-max-depth.yml | 2 - .../testdata/reader/errors-max-file-size.yml | 2 - ...s-max-job-limit-with-reusable-workflow.yml | 1 - .../reader/errors-max-result-size.yml | 2 - ...-reusable-workflow-job-inputs-required.yml | 1 - ...able-workflow-job-inputs-type-mismatch.yml | 1 - ...reusable-workflow-job-inputs-undefined.yml | 1 - ...ble-workflow-job-nested-depth-exceeded.yml | 1 - ...llowed-job-level-from-caller-job-level.yml | 1 - ...d-job-level-from-caller-workflow-level.yml | 1 - ...d-workflow-level-from-caller-job-level.yml | 1 - ...kflow-level-from-caller-workflow-level.yml | 1 - ...reusable-workflow-job-secrets-required.yml | 1 - ...eusable-workflow-job-secrets-undefined.yml | 1 - .../errors-reusable-workflow-job-secrets.yml | 1 - ...rors-reusable-workflow-max-result-size.yml | 1 - ...-allowed-job-level-from-caller-default.yml | 1 - ...llowed-job-level-from-caller-job-level.yml | 1 - ...d-job-level-from-caller-workflow-level.yml | 1 - ...ions-not-allowed-request-actions-write.yml | 1 - ...sions-not-allowed-request-checks-write.yml | 1 - ...ons-not-allowed-request-contents-write.yml | 1 - ...-not-allowed-request-deployments-write.yml | 1 - ...-not-allowed-request-discussions-write.yml | 1 - ...ons-not-allowed-request-id-token-write.yml | 1 - ...sions-not-allowed-request-issues-write.yml | 1 - ...ons-not-allowed-request-packages-write.yml | 1 - ...ssions-not-allowed-request-pages-write.yml | 1 - ...ot-allowed-request-pull-requests-write.yml | 1 - ...-allowed-request-read-all-allowed-none.yml | 1 - ...owed-request-repository-projects-write.yml | 1 - ...-allowed-request-security-events-write.yml | 1 - ...ons-not-allowed-request-statuses-write.yml | 1 - ...allowed-request-write-all-allowed-none.yml | 1 - ...wed-request-write-all-allowed-read-all.yml | 1 - ...wed-workflow-level-from-caller-default.yml | 1 - ...d-workflow-level-from-caller-job-level.yml | 1 - ...kflow-level-from-caller-workflow-level.yml | 1 - .../testdata/reader/errors-step-id.yml | 2 - .../reader/errors-step-run-exceeds-length.yml | 1 - .../reader/errors-step-uses-syntax.yml | 2 - .../reader/errors-unexpected-mapping.yml | 2 - .../testdata/reader/escape-html-values.yml | 4 +- .../testdata/reader/float-folded-style.yml | 47 +++ .../testdata/reader/insert.yml | 94 ++++++ .../testdata/reader/job-basic.yml | 2 - .../reader/job-cancel-timeout-minutes.yml | 1 - .../testdata/reader/job-concurrency.yml | 1 - .../testdata/reader/job-continue-on-error.yml | 1 - .../testdata/reader/job-defaults.yml | 2 - .../testdata/reader/job-if.yml | 4 +- .../testdata/reader/job-permissions.yml | 2 - .../testdata/reader/job-timeout-minutes.yml | 1 - .../testdata/reader/matrix-basic.yml | 283 ++++++++++++++++++ .../testdata/reader/misc-jobs.yml | 8 +- .../testdata/reader/misc-steps.yml | 2 - .../testdata/reader/mvp.yml | 2 - .../on-workflow_dispatch-inputs-null.yml | 2 - .../reader/on-workflow_dispatch-inputs.yml | 10 +- ...workflow_dispatch-unknown-keys-ignored.yml | 2 - .../testdata/reader/permissions.yml | 4 +- .../reader/preserves-source-info-basic.yml | 3 - ...reserves-source-info-reusable-workflow.yml | 53 +--- .../reader/preserves-source-info-simple.yml | 4 +- .../reader/reusable-workflow-inputs.yml | 29 +- .../reader/reusable-workflow-job-basic.yml | 61 ++-- ...able-workflow-job-inputs-type-coercion.yml | 29 +- .../reader/reusable-workflow-job-name.yml | 79 ++--- .../reusable-workflow-job-nested-basic.yml | 53 +--- .../reusable-workflow-job-nested-multiple.yml | 204 +++++++++++++ ...usable-workflow-job-nested-permissions.yml | 82 ++--- ...ssions-embedded-permissions-after-jobs.yml | 28 +- ...w-job-permissions-embedded-permissions.yml | 28 +- ...issions-overrides-default-limited-read.yml | 54 +--- ...ssions-overrides-default-limited-write.yml | 54 +--- ...b-permissions-overrides-workflow-level.yml | 55 +--- .../reader/reusable-workflow-job-strategy.yml | 30 +- .../reader/reusable-workflow-multiple.yml | 53 +--- .../reader/reusable-workflow-no-inputs.yml | 27 +- .../reader/reusable-workflow-outputs.yml | 28 +- ...flow-secrets-secret-without-definition.yml | 29 +- .../reader/reusable-workflow-secrets.yml | 57 ++-- .../testdata/reader/root-env-defaults.yml | 2 - ...tep-id-generates-counter-per-collision.yml | 18 ++ .../testdata/reader/step-if.yml | 2 - .../testdata/reader/workflow-defaults.yml | 2 - .../testdata/reader/yaml-schema-bool.yml | 2 - .../reader/yaml-schema-exceptions.yml | 77 +++++ .../testdata/reader/yaml-schema-float.yml | 3 - .../testdata/reader/yaml-schema-int.yml | 2 - .../testdata/reader/yaml-schema-null.yml | 3 - .../testdata/reader/yaml-schema-sequence.yml | 3 - .../reader/yaml-schema-str-block-styles.yml | 2 - .../reader/yaml-schema-str-flow-styles.yml | 5 +- .../testdata/reader/yaml-schema-string.yml | 30 +- .../testdata/reader/yaml-schema-timestamp.yml | 2 - 104 files changed, 1091 insertions(+), 719 deletions(-) create mode 100644 actions-workflow-parser/testdata/reader/errors-insert.yml create mode 100644 actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml create mode 100644 actions-workflow-parser/testdata/reader/errors-matrix-bad-key.yml create mode 100644 actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml create mode 100644 actions-workflow-parser/testdata/reader/float-folded-style.yml create mode 100644 actions-workflow-parser/testdata/reader/insert.yml create mode 100644 actions-workflow-parser/testdata/reader/matrix-basic.yml create mode 100644 actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml create mode 100644 actions-workflow-parser/testdata/reader/yaml-schema-exceptions.yml diff --git a/actions-workflow-parser/testdata/reader/concurrency.yml b/actions-workflow-parser/testdata/reader/concurrency.yml index ad07011..473f159 100644 --- a/actions-workflow-parser/testdata/reader/concurrency.yml +++ b/actions-workflow-parser/testdata/reader/concurrency.yml @@ -1,9 +1,7 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push -concurrency: +concurrency: group: ${{ github.ref }} cancel-in-progress: true jobs: @@ -13,7 +11,7 @@ jobs: - uses: actions/checkout@v3 - run: echo hi continue-on-error: true - concurrency: + concurrency: group: ${{ github.ref }} cancel-in-progress: true build2: @@ -24,7 +22,7 @@ jobs: concurrency: staging build4: runs-on: macos-latest - concurrency: + concurrency: group: ref cancel-in-progress: ${{ github.ref }} diff --git a/actions-workflow-parser/testdata/reader/errors-insert.yml b/actions-workflow-parser/testdata/reader/errors-insert.yml new file mode 100644 index 0000000..8e91acf --- /dev/null +++ b/actions-workflow-parser/testdata/reader/errors-insert.yml @@ -0,0 +1,25 @@ +include-source: false # Drop file/line/col from output +skip: + - TypeScript +--- +on: push +jobs: + run: + runs-on: ubuntu-latest + env: + bad_insert1: "This is a bad ${{ insert }}" + bad_insert2: "${{ insert }} are bad at the beginning" + ${{ insert }}: ${{ github.ref }} + steps: + - run: echo hi +--- +{ + "errors": [ + { + "Message": ".github/workflows/errors-insert.yml (Line: 6, Col: 20): The directive 'insert' is not allowed in this context. Directives are not supported for expressions that are embedded within a string. Directives are only supported when the entire value is an expression." + }, + { + "Message": ".github/workflows/errors-insert.yml (Line: 7, Col: 20): The directive 'insert' is not allowed in this context. Directives are not supported for expressions that are embedded within a string. Directives are only supported when the entire value is an expression." + } + ] +} diff --git a/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml b/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml new file mode 100644 index 0000000..81ecbe6 --- /dev/null +++ b/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml @@ -0,0 +1,17 @@ +include-source: false # Drop file/line/col from output +--- +on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - null : ' ' + run: echo {{ 😀 }} +--- +{ + "errors": [ + { + "Message": ".github/workflows/errors-invalid-mapping-key.yml (Line: 6, Col: 9): Unexpected value ''" + } + ] +} \ No newline at end of file diff --git a/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml b/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml index 4fc9392..8eee053 100644 --- a/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml +++ b/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml b/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml index 2b35981..1726575 100644 --- a/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml +++ b/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: @@ -15,7 +13,7 @@ jobs: steps: - run: echo hi build3: - runs-on: + runs-on: group: ent/ steps: - run: echo hi diff --git a/actions-workflow-parser/testdata/reader/errors-matrix-bad-key.yml b/actions-workflow-parser/testdata/reader/errors-matrix-bad-key.yml new file mode 100644 index 0000000..164ca3a --- /dev/null +++ b/actions-workflow-parser/testdata/reader/errors-matrix-bad-key.yml @@ -0,0 +1,19 @@ +include-source: false # Drop file/line/col from output +--- +on: push +jobs: + bad-strategy-key: + strategy: + bad-key: + os: [10] + runs-on: macos-latest + steps: + - run: echo hi +--- +{ + "errors": [ + { + "Message": ".github/workflows/errors-matrix-bad-key.yml (Line: 5, Col: 7): Unexpected value 'bad-key'" + } + ] +} \ No newline at end of file diff --git a/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml b/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml new file mode 100644 index 0000000..1cce7ef --- /dev/null +++ b/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml @@ -0,0 +1,20 @@ +include-source: false # Drop file/line/col from output +--- +on: push +jobs: + empty-vector: + strategy: + matrix: + os: [] + version: [10,12] + runs-on: macos-latest + steps: + - run: echo hi +--- +{ + "errors": [ + { + "Message": ".github/workflows/errors-matrix-empty-vector.yml (Line: 6, Col: 13): Matrix vector 'os' does not contain any values" + } + ] +} \ No newline at end of file diff --git a/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml b/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml index 6822766..423a67e 100644 --- a/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml +++ b/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-max-depth.yml b/actions-workflow-parser/testdata/reader/errors-max-depth.yml index 539fbee..b5e9963 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-depth.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-depth.yml @@ -1,7 +1,5 @@ include-source: false # Drop file/line/col from output max-depth: 5 -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-max-file-size.yml b/actions-workflow-parser/testdata/reader/errors-max-file-size.yml index ec56b7b..7b3d178 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-file-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-file-size.yml @@ -1,7 +1,5 @@ include-source: false # Drop file/line/col from output max-file-size: 124 -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml b/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml index 2e7aac0..ef315bf 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript max-job-limit: 8 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-max-result-size.yml b/actions-workflow-parser/testdata/reader/errors-max-result-size.yml index 67a93c7..4ec8e21 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-result-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-result-size.yml @@ -1,7 +1,5 @@ include-source: false # Drop file/line/col from output max-result-size: 768 -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml index df6d826..6f1d9fb 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml index 1df5ce1..268eb6e 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml index 7611a4c..87c5b82 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml index 60f9db6..13ea7f6 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml index a5b1ce3..9041aab 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml index e8e74bf..533c444 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml index 40a20a1..76e196b 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml index d92939f..f571bfb 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml index 6015a83..1bd2c84 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml index 97ad0e7..48d9816 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml index b812f32..dac0d5a 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml index 1b32531..861ec90 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output max-result-size: 2048 skip: - - TypeScript - Go --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml index 4051c23..0793610 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml index f77fb2a..d1f49b4 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml index 9fc4cb6..8535043 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml index aee494b..6c16789 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml index 19243c4..643dccd 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml index 52603d1..47cec4f 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml index 4d3fcd3..81f97cb 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml index 72473e7..c79f80b 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml index 1d4f128..fc062d6 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml index 3cb7d0a..0ef1272 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml index 1e6c9c4..ecc4cf3 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml index babdc6b..d671e23 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml index 68c3a23..7c9f558 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml index 5f520bc..8ba8409 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml index 7df1abc..6dd37c8 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml index d7081ae..c6dc1a6 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml index 2aebcc9..dd2b3fd 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml index 98a4844..bd52f88 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml index 9d5ca02..22fd8c4 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml index 67ba05a..2cab2b0 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml index 61865f7..2ac2408 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml index b414ccb..eaa04c1 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/errors-step-id.yml b/actions-workflow-parser/testdata/reader/errors-step-id.yml index d980321..f36cfd3 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-id.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-id.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- name: CI on: diff --git a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml index 8933371..bf0a55a 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml index 3b244e2..b840137 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml index 5482655..eb365b1 100644 --- a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml +++ b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/escape-html-values.yml b/actions-workflow-parser/testdata/reader/escape-html-values.yml index 5138f67..69900a5 100644 --- a/actions-workflow-parser/testdata/reader/escape-html-values.yml +++ b/actions-workflow-parser/testdata/reader/escape-html-values.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push env: @@ -12,7 +10,7 @@ jobs: steps: - run: echo Hello && World #string token build2: - if: false + if: false runs-on: ubuntu-latest steps: - run: echo 1 diff --git a/actions-workflow-parser/testdata/reader/float-folded-style.yml b/actions-workflow-parser/testdata/reader/float-folded-style.yml new file mode 100644 index 0000000..f3fdb4d --- /dev/null +++ b/actions-workflow-parser/testdata/reader/float-folded-style.yml @@ -0,0 +1,47 @@ +include-source: false # Drop file/line/col from output +--- +on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Switch to using Python 3.10 by default + uses: actions/setup-python@v4 + with: + python-version: >- + 3.10 +--- +{ + "jobs": [ + { + "type": "job", + "id": "build", + "name": "build", + "if": { + "type": 3, + "expr": "success()" + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__actions_setup-python", + "name": "Switch to using Python 3.10 by default", + "if": { + "type": 3, + "expr": "success()" + }, + "uses": "actions/setup-python@v4", + "with": { + "type": 2, + "map": [ + { + "Key": "python-version", + "Value": "3.10" + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/actions-workflow-parser/testdata/reader/insert.yml b/actions-workflow-parser/testdata/reader/insert.yml new file mode 100644 index 0000000..11f7d95 --- /dev/null +++ b/actions-workflow-parser/testdata/reader/insert.yml @@ -0,0 +1,94 @@ +include-source: false # Drop file/line/col from output +skip: + - TypeScript +--- +on: push +jobs: + generate: + runs-on: ubuntu-latest + outputs: + matrix_map: ${{ steps.set-matrix.outputs.matrix }} + steps: + - run: echo hi + run: + runs-on: ubuntu-latest + needs: generate + env: + ${{ insert }}: ${{ fromJson(needs.generate.outputs.matrix_map) }} + steps: + - run: echo hi +--- +{ + "jobs": [ + { + "type": "job", + "id": "generate", + "name": "generate", + "if": { + "type": 3, + "expr": "success()" + }, + "runs-on": "ubuntu-latest", + "outputs": { + "type": 2, + "map": [ + { + "Key": "matrix_map", + "Value": { + "type": 3, + "expr": "steps.set-matrix.outputs.matrix" + } + } + ] + }, + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + }, + { + "type": "job", + "id": "run", + "name": "run", + "needs": [ + "generate" + ], + "if": { + "type": 3, + "expr": "success()" + }, + "env": { + "type": 2, + "map": [ + { + "Key": { + "type": 4, + "directive": "insert" + }, + "Value": { + "type": 3, + "expr": "fromJson(needs.generate.outputs.matrix_map)" + } + } + ] + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] +} diff --git a/actions-workflow-parser/testdata/reader/job-basic.yml b/actions-workflow-parser/testdata/reader/job-basic.yml index 824c814..581d9c8 100644 --- a/actions-workflow-parser/testdata/reader/job-basic.yml +++ b/actions-workflow-parser/testdata/reader/job-basic.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml b/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml index 632dc91..462eb7a 100644 --- a/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml +++ b/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-concurrency.yml b/actions-workflow-parser/testdata/reader/job-concurrency.yml index 4a9d711..ba8e59f 100644 --- a/actions-workflow-parser/testdata/reader/job-concurrency.yml +++ b/actions-workflow-parser/testdata/reader/job-concurrency.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml index 6a09af9..cd54490 100644 --- a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml +++ b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-defaults.yml b/actions-workflow-parser/testdata/reader/job-defaults.yml index 25e99dd..76bf9b3 100644 --- a/actions-workflow-parser/testdata/reader/job-defaults.yml +++ b/actions-workflow-parser/testdata/reader/job-defaults.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-if.yml b/actions-workflow-parser/testdata/reader/job-if.yml index bfa5a5b..caf7c5a 100644 --- a/actions-workflow-parser/testdata/reader/job-if.yml +++ b/actions-workflow-parser/testdata/reader/job-if.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push env: @@ -21,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo hi - build4: + build4: needs: - build - build2 diff --git a/actions-workflow-parser/testdata/reader/job-permissions.yml b/actions-workflow-parser/testdata/reader/job-permissions.yml index df3095c..d5aab8f 100644 --- a/actions-workflow-parser/testdata/reader/job-permissions.yml +++ b/actions-workflow-parser/testdata/reader/job-permissions.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml index f6c7b76..61b474d 100644 --- a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml +++ b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/matrix-basic.yml b/actions-workflow-parser/testdata/reader/matrix-basic.yml new file mode 100644 index 0000000..f8738d1 --- /dev/null +++ b/actions-workflow-parser/testdata/reader/matrix-basic.yml @@ -0,0 +1,283 @@ +include-source: false # Drop file/line/col from output +--- +on: push +jobs: + matrix-basic: + strategy: + matrix: + version: [10, 12, 14] + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - run: echo hi + matrix-nested-sequences: + strategy: + matrix: + version: [[[[10]],2],12,14] + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - run: echo hi + matrix-with-infinity: + strategy: + matrix: + version: [1, 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999] + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - run: echo hi + nested-matrix: + strategy: + matrix: { vector1: [ {foo: {bar: baz} } ] } + runs-on: linux + steps: + - run: echo hi +--- +{ + "jobs": [ + { + "type": "job", + "id": "matrix-basic", + "name": "matrix-basic", + "if": { + "type": 3, + "expr": "success()" + }, + "strategy": { + "type": 2, + "map": [ + { + "Key": "matrix", + "Value": { + "type": 2, + "map": [ + { + "Key": "version", + "Value": { + "type": 1, + "seq": [ + 10, + 12, + 14 + ] + } + }, + { + "Key": "os", + "Value": { + "type": 1, + "seq": [ + "ubuntu-latest", + "windows-latest" + ] + } + } + ] + } + } + ] + }, + "runs-on": { + "type": 3, + "expr": "matrix.os" + }, + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + }, + { + "type": "job", + "id": "matrix-nested-sequences", + "name": "matrix-nested-sequences", + "if": { + "type": 3, + "expr": "success()" + }, + "strategy": { + "type": 2, + "map": [ + { + "Key": "matrix", + "Value": { + "type": 2, + "map": [ + { + "Key": "version", + "Value": { + "type": 1, + "seq": [ + { + "type": 1, + "seq": [ + { + "type": 1, + "seq": [ + { + "type": 1, + "seq": [ + 10 + ] + } + ] + }, + 2 + ] + }, + 12, + 14 + ] + } + }, + { + "Key": "os", + "Value": { + "type": 1, + "seq": [ + "ubuntu-latest", + "windows-latest" + ] + } + } + ] + } + } + ] + }, + "runs-on": { + "type": 3, + "expr": "matrix.os" + }, + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + }, + { + "type": "job", + "id": "matrix-with-infinity", + "name": "matrix-with-infinity", + "if": { + "type": 3, + "expr": "success()" + }, + "strategy": { + "type": 2, + "map": [ + { + "Key": "matrix", + "Value": { + "type": 2, + "map": [ + { + "Key": "version", + "Value": { + "type": 1, + "seq": [ + 1, + "Infinity" + ] + } + }, + { + "Key": "os", + "Value": { + "type": 1, + "seq": [ + "ubuntu-latest", + "windows-latest" + ] + } + } + ] + } + } + ] + }, + "runs-on": { + "type": 3, + "expr": "matrix.os" + }, + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + }, + { + "type": "job", + "id": "nested-matrix", + "name": "nested-matrix", + "if": { + "type": 3, + "expr": "success()" + }, + "strategy": { + "type": 2, + "map": [ + { + "Key": "matrix", + "Value": { + "type": 2, + "map": [ + { + "Key": "vector1", + "Value": { + "type": 1, + "seq": [ + { + "type": 2, + "map": [ + { + "Key": "foo", + "Value": { + "type": 2, + "map": [ + { + "Key": "bar", + "Value": "baz" + } + ] + } + } + ] + } + ] + } + } + ] + } + } + ] + }, + "runs-on": "linux", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] +} \ No newline at end of file diff --git a/actions-workflow-parser/testdata/reader/misc-jobs.yml b/actions-workflow-parser/testdata/reader/misc-jobs.yml index ca88646..0a35e11 100644 --- a/actions-workflow-parser/testdata/reader/misc-jobs.yml +++ b/actions-workflow-parser/testdata/reader/misc-jobs.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: @@ -10,7 +8,7 @@ jobs: name: ${{ github.actor }} timeout-minutes: ${{ github.ref }} cancel-timeout-minutes: 300 - concurrency: + concurrency: group: ${{ github.ref }} cancel-in-progress: true env: @@ -28,10 +26,10 @@ jobs: build2: runs-on: [self-hosted, linux] continue-on-error: true - name: Jobs Repro Hardcode + name: Jobs Repro Hardcode timeout-minutes: 360 cancel-timeout-minutes: 300 - concurrency: + concurrency: group: groupA cancel-in-progress: true env: diff --git a/actions-workflow-parser/testdata/reader/misc-steps.yml b/actions-workflow-parser/testdata/reader/misc-steps.yml index b75efd8..9625212 100644 --- a/actions-workflow-parser/testdata/reader/misc-steps.yml +++ b/actions-workflow-parser/testdata/reader/misc-steps.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/mvp.yml b/actions-workflow-parser/testdata/reader/mvp.yml index 417ef36..4276ec5 100644 --- a/actions-workflow-parser/testdata/reader/mvp.yml +++ b/actions-workflow-parser/testdata/reader/mvp.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- # This is a basic workflow to help you get started with Actions diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml index c1a963d..2da51d0 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Typescript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml index 56920d2..a48e261 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml @@ -1,7 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go - - Typescript --- on: workflow_dispatch: @@ -22,6 +19,10 @@ on: - debug # Defaults to string input4: + input5-Env: + description: 'Test environment' + type: environment + required: true jobs: my-job: runs-on: ubuntu-latest @@ -33,7 +34,8 @@ jobs: "input1": "string", "input2": "boolean", "input3": "choice", - "input4": "string" + "input4": "string", + "input5-Env": "environment" }, "jobs": [ { diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml index 2b53084..0d222e4 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Typescript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/permissions.yml b/actions-workflow-parser/testdata/reader/permissions.yml index 54ba0de..8d9d828 100644 --- a/actions-workflow-parser/testdata/reader/permissions.yml +++ b/actions-workflow-parser/testdata/reader/permissions.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push permissions: @@ -24,7 +22,7 @@ jobs: - uses: actions/checkout@v3 - run: echo hi continue-on-error: true - deploy: + deploy: runs-on: ubuntu-latest permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml index 9063438..ca7749f 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml @@ -1,7 +1,4 @@ include-source: true # Preserve file/line/col in serialized output -skip: - - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml index f7ed89e..6721b26 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml @@ -1,7 +1,6 @@ include-source: true # Preserve file/line/col in serialized output skip: - Go - - TypeScript --- on: push jobs: @@ -33,46 +32,34 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": { + "type": "reusableWorkflowJob", + "id": { "type": 0, "file": 1, "line": 3, "col": 3, "lit": "build" }, - "Name": { + "name": { "type": 0, "file": 1, "line": 3, "col": 3, "lit": "build" }, - "Needs": [], - "If": { + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": { + "ref": { "type": 0, "file": 1, "line": 4, "col": 11, "lit": "some-org-1/some-repo-1/.github/workflows/build.yml@v1" }, - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": { @@ -120,46 +107,34 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": { + "type": "reusableWorkflowJob", + "id": { "type": 0, "file": 1, "line": 5, "col": 3, "lit": "deploy" }, - "Name": { + "name": { "type": 0, "file": 1, "line": 5, "col": 3, "lit": "deploy" }, - "Needs": [], - "If": { + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": { + "ref": { "type": 0, "file": 1, "line": 6, "col": 11, "lit": "some-org-2/some-repo-2/.github/workflows/deploy.yml@v2" }, - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": { diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml index e7797df..2f525af 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml @@ -1,9 +1,7 @@ include-source: true # Preserve file/line/col in serialized output -skip: - - TypeScript --- # This is meant to cover all the different types of TemplateToken that are output -# with include-source: true. Currently it is missing type 4 (insert expression) +# with include-source: true. Currently it is missing type 4 (insert expression) # and type 7 (null), once we have matrix strategy we should be able to get null or combine # this test with preserves-source-info-basic.yml. on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml index 0e209c6..3604796 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -53,17 +52,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "input-definitions": { "type": 2, "map": [ { @@ -200,7 +198,7 @@ jobs: } ] }, - "InputValues": { + "input-values": { "type": 2, "map": [ { @@ -229,16 +227,7 @@ jobs: } ] }, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml index b4721ab..37fd6ee 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -66,19 +65,18 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "deploy-1", - "Name": "deploy-1", - "Needs": [ + "type": "reusableWorkflowJob", + "id": "deploy-1", + "name": "deploy-1", + "needs": [ "build" ], - "If": { + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy.yml@v1", - "Permissions": null, - "InputDefinitions": { + "ref": "contoso/templates/.github/workflows/deploy.yml@v1", + "input-definitions": { "type": 2, "map": [ { @@ -99,7 +97,7 @@ jobs: } ] }, - "InputValues": { + "input-values": { "type": 2, "map": [ { @@ -108,7 +106,7 @@ jobs: } ] }, - "SecretDefinitions": { + "secret-definitions": { "type": 2, "map": [ { @@ -129,7 +127,7 @@ jobs: } ] }, - "SecretValues": { + "secret-values": { "type": 2, "map": [ { @@ -141,14 +139,7 @@ jobs: } ] }, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "job1", @@ -184,19 +175,18 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "deploy-2", - "Name": "deploy-2", - "Needs": [ + "type": "reusableWorkflowJob", + "id": "deploy-2", + "name": "deploy-2", + "needs": [ "build" ], - "If": { + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy.yml@v1", - "Permissions": null, - "InputDefinitions": { + "ref": "contoso/templates/.github/workflows/deploy.yml@v1", + "input-definitions": { "type": 2, "map": [ { @@ -217,7 +207,7 @@ jobs: } ] }, - "InputValues": { + "input-values": { "type": 2, "map": [ { @@ -226,7 +216,7 @@ jobs: } ] }, - "SecretDefinitions": { + "secret-definitions": { "type": 2, "map": [ { @@ -247,15 +237,8 @@ jobs: } ] }, - "SecretValues": null, - "InheritSecrets": true, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "inherit-secrets": true, + "jobs": [ { "type": "job", "id": "job1", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml index 31c89cb..0afcc09 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -35,17 +34,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy", - "Name": "deploy", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy", + "name": "deploy", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy.yml@v1", - "Permissions": null, - "InputDefinitions": { + "ref": "contoso/templates/.github/workflows/deploy.yml@v1", + "input-definitions": { "type": 2, "map": [ { @@ -98,7 +96,7 @@ jobs: } ] }, - "InputValues": { + "input-values": { "type": 2, "map": [ { @@ -119,16 +117,7 @@ jobs: } ] }, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "job1", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml index 5b52215..3e67c56 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -26,28 +25,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "build-it", @@ -71,28 +58,16 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build1", - "Name": "custom name", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build1", + "name": "custom name", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "build-it", @@ -116,31 +91,19 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": { "type": 3, "expr": "github.ref" }, - "Needs": [], - "If": { + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "build-it", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml index 9ae18a1..144b28c 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript max-nested-reusable-workflows-depth: 2 --- on: push @@ -28,51 +27,27 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy-level-0", - "Name": "deploy-level-0", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy-level-0", + "name": "deploy-level-0", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy-level-1.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/deploy-level-1.yml@v1", + "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy-level-1", - "Name": "deploy-level-1", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy-level-1", + "name": "deploy-level-1", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy-level-2.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/deploy-level-2.yml@v1", + "jobs": [ { "type": "job", "id": "deploy-level-1", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml new file mode 100644 index 0000000..8199cf1 --- /dev/null +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml @@ -0,0 +1,204 @@ +include-source: false # Drop file/line/col from output +skip: + - Go +max-nested-reusable-workflows-depth: 2 +--- +on: push +jobs: + a: + uses: contoso/templates/.github/workflows/deploy-level-1a.yml@v1 + b: + uses: contoso/templates/.github/workflows/deploy-level-1b.yml@v1 + c: + uses: contoso/templates/.github/workflows/deploy-level-1c.yml@v1 +--- +contoso/templates/.github/workflows/deploy-level-1a.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-1a: + uses: contoso/templates/.github/workflows/deploy-level-2a.yml@v1 +--- +contoso/templates/.github/workflows/deploy-level-2a.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-2a: + runs-on: ubuntu-latest + steps: + - run: echo hi +--- +contoso/templates/.github/workflows/deploy-level-1b.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-1b: + uses: contoso/templates/.github/workflows/deploy-level-2b.yml@v1 +--- +contoso/templates/.github/workflows/deploy-level-2b.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-2b: + runs-on: ubuntu-latest + steps: + - run: echo hi +--- +contoso/templates/.github/workflows/deploy-level-1c.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-1c: + uses: contoso/templates/.github/workflows/deploy-level-2c.yml@v1 +--- +contoso/templates/.github/workflows/deploy-level-2c.yml@v1 +--- +on: workflow_call +jobs: + deploy-level-2c: + runs-on: ubuntu-latest + steps: + - run: echo hi +--- +{ + "jobs": [ + { + "type": "reusableWorkflowJob", + "id": "a", + "name": "a", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-1a.yml@v1", + "jobs": [ + { + "type": "reusableWorkflowJob", + "id": "deploy-level-1a", + "name": "deploy-level-1a", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-2a.yml@v1", + "jobs": [ + { + "type": "job", + "id": "deploy-level-2a", + "name": "deploy-level-2a", + "if": { + "type": 3, + "expr": "success()" + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] + } + ] + }, + { + "type": "reusableWorkflowJob", + "id": "b", + "name": "b", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-1b.yml@v1", + "jobs": [ + { + "type": "reusableWorkflowJob", + "id": "deploy-level-1b", + "name": "deploy-level-1b", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-2b.yml@v1", + "jobs": [ + { + "type": "job", + "id": "deploy-level-2b", + "name": "deploy-level-2b", + "if": { + "type": 3, + "expr": "success()" + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] + } + ] + }, + { + "type": "reusableWorkflowJob", + "id": "c", + "name": "c", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-1c.yml@v1", + "jobs": [ + { + "type": "reusableWorkflowJob", + "id": "deploy-level-1c", + "name": "deploy-level-1c", + "needs": [], + "if": { + "type": 3, + "expr": "success()" + }, + "ref": "contoso/templates/.github/workflows/deploy-level-2c.yml@v1", + "jobs": [ + { + "type": "job", + "id": "deploy-level-2c", + "name": "deploy-level-2c", + "if": { + "type": 3, + "expr": "success()" + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] + } + ] + } + ] +} diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml index f8b78fd..2d0c4e2 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript max-nested-reusable-workflows-depth: 3 --- on: push @@ -42,80 +41,47 @@ jobs: }, "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy-level-0", - "Name": "deploy-level-0", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy-level-0", + "name": "deploy-level-0", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy-level-1.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/deploy-level-1.yml@v1", + "permissions": { "actions": "write" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy-level-1", - "Name": "deploy-level-1", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy-level-1", + "name": "deploy-level-1", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy-level-2.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/deploy-level-2.yml@v1", + "permissions": { "actions": "read" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "deploy-level-3", - "Name": "deploy-level-3", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "deploy-level-3", + "name": "deploy-level-3", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/deploy-level-3.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/deploy-level-3.yml@v1", + "permissions": { "actions": "read" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy-level-3", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml index 58a2555..2c6b906 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push @@ -47,30 +46,19 @@ permissions: }, "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "write" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml index b0d0b14..d98c9d8 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push @@ -47,30 +46,19 @@ jobs: }, "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "read" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml index 4eaca32..bbf0a99 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push @@ -27,28 +26,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "deploy", @@ -72,30 +59,19 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": "build2", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": "build2", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "write" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml index b9a0e5d..ca3659b 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: Write --- on: push @@ -27,28 +26,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "deploy", @@ -72,30 +59,19 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": "build2", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": "build2", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "write" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml index 6833b2f..d724692 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript permissions-policy: LimitedRead --- on: push @@ -32,30 +31,19 @@ jobs: }, "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "read" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", @@ -82,30 +70,19 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": "build2", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": "build2", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "permissions": { "actions": "write" }, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml index adbe218..c343684 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -31,17 +30,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "input-definitions": { "type": 2, "map": [ { @@ -58,7 +56,7 @@ jobs: } ] }, - "InputValues": { + "input-values": { "type": 2, "map": [ { @@ -70,15 +68,7 @@ jobs: } ] }, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": { + "strategy": { "type": 2, "map": [ { @@ -101,7 +91,7 @@ jobs: } ] }, - "Jobs": [ + "jobs": [ { "type": "job", "id": "build-it", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml index 4b4a31c..d129cdb 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -33,28 +32,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "deploy", @@ -78,28 +65,16 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": "build2", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": "build2", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso2/templates2/.github/workflows/build2.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso2/templates2/.github/workflows/build2.yml@v1", + "jobs": [ { "type": "job", "id": "deploy2", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml index 5550cd7..e07bb6b 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -21,28 +20,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml index 6ef098c..62501c2 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -27,22 +26,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": null, - "SecretValues": null, - "InheritSecrets": false, - "Outputs": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "outputs": { "type": 2, "map": [ { @@ -66,12 +59,7 @@ jobs: } ] }, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "job1", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml index 883d3d6..664f4fc 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -25,19 +24,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "secret-definitions": { "type": 2, "map": [ { @@ -46,7 +42,7 @@ jobs: } ] }, - "SecretValues": { + "secret-values": { "type": 2, "map": [ { @@ -58,14 +54,7 @@ jobs: } ] }, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml index 40cda81..7714103 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: @@ -32,19 +31,16 @@ jobs: { "jobs": [ { - "Type": "reusableWorkflowJob", - "Id": "build", - "Name": "build", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build", + "name": "build", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "secret-definitions": { "type": 2, "map": [ { @@ -61,7 +57,7 @@ jobs: } ] }, - "SecretValues": { + "secret-values": { "type": 2, "map": [ { @@ -73,14 +69,7 @@ jobs: } ] }, - "InheritSecrets": false, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "jobs": [ { "type": "job", "id": "deploy", @@ -104,19 +93,16 @@ jobs: ] }, { - "Type": "reusableWorkflowJob", - "Id": "build2", - "Name": "build2", - "Needs": [], - "If": { + "type": "reusableWorkflowJob", + "id": "build2", + "name": "build2", + "needs": [], + "if": { "type": 3, "expr": "success()" }, - "Ref": "contoso/templates/.github/workflows/build.yml@v1", - "Permissions": null, - "InputDefinitions": null, - "InputValues": null, - "SecretDefinitions": { + "ref": "contoso/templates/.github/workflows/build.yml@v1", + "secret-definitions": { "type": 2, "map": [ { @@ -133,15 +119,8 @@ jobs: } ] }, - "SecretValues": null, - "InheritSecrets": true, - "Outputs": null, - "Defaults": null, - "Env": null, - "Concurrency": null, - "EmbeddedConcurrency": null, - "Strategy": null, - "Jobs": [ + "inherit-secrets": true, + "jobs": [ { "type": "job", "id": "deploy", diff --git a/actions-workflow-parser/testdata/reader/root-env-defaults.yml b/actions-workflow-parser/testdata/reader/root-env-defaults.yml index 5b19c66..f696886 100644 --- a/actions-workflow-parser/testdata/reader/root-env-defaults.yml +++ b/actions-workflow-parser/testdata/reader/root-env-defaults.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/step-id-generates-counter-per-collision.yml b/actions-workflow-parser/testdata/reader/step-id-generates-counter-per-collision.yml index 0713335..f588b88 100644 --- a/actions-workflow-parser/testdata/reader/step-id-generates-counter-per-collision.yml +++ b/actions-workflow-parser/testdata/reader/step-id-generates-counter-per-collision.yml @@ -6,10 +6,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: Actions/Capitalized@v2 - uses: actions/setup-node@v2 - uses: docker://alpine:latest - run: echo hello - uses: actions/checkout@v2 + - uses: Actions/Capitalized@v2 - uses: actions/setup-node@v3 - uses: docker://alpine:latest - run: echo hello @@ -34,6 +36,14 @@ jobs: }, "uses": "actions/checkout@v2" }, + { + "id": "__Actions_Capitalized", + "if": { + "type": 3, + "expr": "success()" + }, + "uses": "Actions/Capitalized@v2" + }, { "id": "__actions_setup-node", "if": { @@ -66,6 +76,14 @@ jobs: }, "uses": "actions/checkout@v2" }, + { + "id": "__Actions_Capitalized_2", + "if": { + "type": 3, + "expr": "success()" + }, + "uses": "Actions/Capitalized@v2" + }, { "id": "__actions_setup-node_2", "if": { diff --git a/actions-workflow-parser/testdata/reader/step-if.yml b/actions-workflow-parser/testdata/reader/step-if.yml index ffbaf89..4aafc71 100644 --- a/actions-workflow-parser/testdata/reader/step-if.yml +++ b/actions-workflow-parser/testdata/reader/step-if.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/workflow-defaults.yml b/actions-workflow-parser/testdata/reader/workflow-defaults.yml index 51fb7f8..0e8162c 100644 --- a/actions-workflow-parser/testdata/reader/workflow-defaults.yml +++ b/actions-workflow-parser/testdata/reader/workflow-defaults.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push defaults: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-bool.yml b/actions-workflow-parser/testdata/reader/yaml-schema-bool.yml index b0bbd06..9100be9 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-bool.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-bool.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-exceptions.yml b/actions-workflow-parser/testdata/reader/yaml-schema-exceptions.yml new file mode 100644 index 0000000..70de47f --- /dev/null +++ b/actions-workflow-parser/testdata/reader/yaml-schema-exceptions.yml @@ -0,0 +1,77 @@ +include-source: false # Drop file/line/col from output +--- +on: push +env: + UNDERSCORED_INT_AS_STRING: 12_345 + UNDERSCORED_FLOAT_AS_STRING: 23_456.789_321 +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + vector-1: + - 12_345 + - 23_456.789_321 + steps: + - run: echo hi +--- +{ + "env": { + "type": 2, + "map": [ + { + "Key": "UNDERSCORED_INT_AS_STRING", + "Value": "12_345" + }, + { + "Key": "UNDERSCORED_FLOAT_AS_STRING", + "Value": "23_456.789_321" + } + ] + }, + "jobs": [ + { + "type": "job", + "id": "build", + "name": "build", + "if": { + "type": 3, + "expr": "success()" + }, + "strategy": { + "type": 2, + "map": [ + { + "Key": "matrix", + "Value": { + "type": 2, + "map": [ + { + "Key": "vector-1", + "Value": { + "type": 1, + "seq": [ + "12_345", + "23_456.789_321" + ] + } + } + ] + } + } + ] + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] +} diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml index 2531ab8..247833d 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml @@ -1,7 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-int.yml b/actions-workflow-parser/testdata/reader/yaml-schema-int.yml index c571fa3..a6189c4 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-int.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-int.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml index 86d09a0..0e73a48 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml @@ -1,7 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml index c285c3e..5a8f525 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml @@ -1,7 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-str-block-styles.yml b/actions-workflow-parser/testdata/reader/yaml-schema-str-block-styles.yml index e474ae6..026d4ef 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-str-block-styles.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-str-block-styles.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml index 092a72f..b8772d3 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml @@ -1,7 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Go - - TypeScript --- on: push jobs: @@ -35,7 +32,7 @@ jobs: # Customer-breaking change we discovered when upgrading from YamlDotNet.Signed 6.0.0 to YamlDotNet 12.0.2. # YamlDotNet 12.0.2 produces the error "While scanning a multi-line double-quoted scalar, found wrong indentation." - - "hello + - "hello world" steps: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml index 41ed76d..da60fcb 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: -- TypeScript --- on: push jobs: @@ -12,6 +10,14 @@ jobs: dot: . single-quoted-number: '8' double-quoted-number: "9" + hex-number: 0xCB2431 + hex-string: "0xCB2431" + # binary-number: 0b10100111001 // Binary numbers are not supported by C# at the moment + # binary-string: "0b1111" + octal-number: 0o1234567 + octal-string: "0o1234567" + python-version: >- + 3.10 --- { "jobs": [ @@ -46,6 +52,26 @@ jobs: { "Key": "double-quoted-number", "Value": "9" + }, + { + "Key": "hex-number", + "Value": "13313073" + }, + { + "Key": "hex-string", + "Value": "0xCB2431" + }, + { + "Key": "octal-number", + "Value": "342391" + }, + { + "Key": "octal-string", + "Value": "0o1234567" + }, + { + "Key": "python-version", + "Value": "3.10" } ] } diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml index 26ab729..9009132 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: -- TypeScript --- on: push jobs: From c66efcf85b8893d1ee36bf0e86c9a1c833ba7faf Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Wed, 1 Feb 2023 17:20:17 -0800 Subject: [PATCH 04/52] Revert skip typescript --- actions-workflow-parser/testdata/reader/concurrency.yml | 2 ++ .../testdata/reader/errors-job-concurrency.yml | 2 ++ .../testdata/reader/errors-job-runs-on-group-invalid-prefix.yml | 2 ++ .../testdata/reader/errors-matrix-max-depth.yml | 2 ++ actions-workflow-parser/testdata/reader/errors-max-depth.yml | 2 ++ .../testdata/reader/errors-max-file-size.yml | 2 ++ .../reader/errors-max-job-limit-with-reusable-workflow.yml | 1 + .../testdata/reader/errors-max-result-size.yml | 2 ++ .../reader/errors-reusable-workflow-job-inputs-required.yml | 1 + .../errors-reusable-workflow-job-inputs-type-mismatch.yml | 1 + .../reader/errors-reusable-workflow-job-inputs-undefined.yml | 1 + .../errors-reusable-workflow-job-nested-depth-exceeded.yml | 1 + ...-permissions-not-allowed-job-level-from-caller-job-level.yml | 1 + ...issions-not-allowed-job-level-from-caller-workflow-level.yml | 1 + ...issions-not-allowed-workflow-level-from-caller-job-level.yml | 1 + ...ns-not-allowed-workflow-level-from-caller-workflow-level.yml | 1 + .../reader/errors-reusable-workflow-job-secrets-required.yml | 1 + .../reader/errors-reusable-workflow-job-secrets-undefined.yml | 1 + .../testdata/reader/errors-reusable-workflow-job-secrets.yml | 1 + .../reader/errors-reusable-workflow-max-result-size.yml | 1 + ...ow-permissions-not-allowed-job-level-from-caller-default.yml | 1 + ...-permissions-not-allowed-job-level-from-caller-job-level.yml | 1 + ...issions-not-allowed-job-level-from-caller-workflow-level.yml | 1 + ...e-workflow-permissions-not-allowed-request-actions-write.yml | 1 + ...le-workflow-permissions-not-allowed-request-checks-write.yml | 1 + ...-workflow-permissions-not-allowed-request-contents-write.yml | 1 + ...rkflow-permissions-not-allowed-request-deployments-write.yml | 1 + ...rkflow-permissions-not-allowed-request-discussions-write.yml | 1 + ...-workflow-permissions-not-allowed-request-id-token-write.yml | 1 + ...le-workflow-permissions-not-allowed-request-issues-write.yml | 1 + ...-workflow-permissions-not-allowed-request-packages-write.yml | 1 + ...ble-workflow-permissions-not-allowed-request-pages-write.yml | 1 + ...flow-permissions-not-allowed-request-pull-requests-write.yml | 1 + ...ow-permissions-not-allowed-request-read-all-allowed-none.yml | 1 + ...ermissions-not-allowed-request-repository-projects-write.yml | 1 + ...ow-permissions-not-allowed-request-security-events-write.yml | 1 + ...-workflow-permissions-not-allowed-request-statuses-write.yml | 1 + ...w-permissions-not-allowed-request-write-all-allowed-none.yml | 1 + ...rmissions-not-allowed-request-write-all-allowed-read-all.yml | 1 + ...rmissions-not-allowed-workflow-level-from-caller-default.yml | 1 + ...issions-not-allowed-workflow-level-from-caller-job-level.yml | 1 + ...ns-not-allowed-workflow-level-from-caller-workflow-level.yml | 1 + actions-workflow-parser/testdata/reader/errors-step-if.yml | 2 ++ .../testdata/reader/errors-step-run-exceeds-length.yml | 1 + .../testdata/reader/errors-step-uses-syntax.yml | 2 ++ .../testdata/reader/errors-unexpected-mapping.yml | 2 ++ actions-workflow-parser/testdata/reader/escape-html-values.yml | 2 ++ actions-workflow-parser/testdata/reader/job-basic.yml | 2 ++ actions-workflow-parser/testdata/reader/job-concurrency.yml | 1 + .../testdata/reader/job-continue-on-error.yml | 1 + actions-workflow-parser/testdata/reader/job-defaults.yml | 2 ++ actions-workflow-parser/testdata/reader/job-if.yml | 2 ++ actions-workflow-parser/testdata/reader/job-permissions.yml | 2 ++ actions-workflow-parser/testdata/reader/job-timeout-minutes.yml | 1 + actions-workflow-parser/testdata/reader/misc-jobs.yml | 2 ++ actions-workflow-parser/testdata/reader/misc-steps.yml | 2 ++ actions-workflow-parser/testdata/reader/mvp.yml | 2 ++ .../testdata/reader/on-workflow_dispatch-inputs-null.yml | 2 ++ .../testdata/reader/on-workflow_dispatch-inputs.yml | 2 ++ .../reader/on-workflow_dispatch-unknown-keys-ignored.yml | 2 ++ actions-workflow-parser/testdata/reader/permissions.yml | 2 ++ .../testdata/reader/preserves-source-info-basic.yml | 2 ++ .../testdata/reader/preserves-source-info-reusable-workflow.yml | 1 + .../testdata/reader/preserves-source-info-simple.yml | 2 ++ .../testdata/reader/reusable-workflow-inputs.yml | 1 + .../testdata/reader/reusable-workflow-job-basic.yml | 1 + .../reader/reusable-workflow-job-inputs-type-coercion.yml | 1 + .../testdata/reader/reusable-workflow-job-name.yml | 1 + .../testdata/reader/reusable-workflow-job-nested-basic.yml | 1 + .../testdata/reader/reusable-workflow-job-nested-multiple.yml | 1 + .../reader/reusable-workflow-job-nested-permissions.yml | 1 + ...workflow-job-permissions-embedded-permissions-after-jobs.yml | 1 + .../reusable-workflow-job-permissions-embedded-permissions.yml | 1 + ...-workflow-job-permissions-overrides-default-limited-read.yml | 1 + ...workflow-job-permissions-overrides-default-limited-write.yml | 1 + ...usable-workflow-job-permissions-overrides-workflow-level.yml | 1 + .../testdata/reader/reusable-workflow-job-strategy.yml | 1 + .../testdata/reader/reusable-workflow-multiple.yml | 1 + .../testdata/reader/reusable-workflow-no-inputs.yml | 1 + .../testdata/reader/reusable-workflow-outputs.yml | 1 + .../reusable-workflow-secrets-secret-without-definition.yml | 1 + .../testdata/reader/reusable-workflow-secrets.yml | 1 + actions-workflow-parser/testdata/reader/root-env-defaults.yml | 2 ++ actions-workflow-parser/testdata/reader/step-if.yml | 2 ++ actions-workflow-parser/testdata/reader/workflow-defaults.yml | 2 ++ actions-workflow-parser/testdata/reader/yaml-schema-float.yml | 2 ++ actions-workflow-parser/testdata/reader/yaml-schema-null.yml | 2 ++ .../testdata/reader/yaml-schema-sequence.yml | 2 ++ .../testdata/reader/yaml-schema-str-flow-styles.yml | 2 ++ actions-workflow-parser/testdata/reader/yaml-schema-string.yml | 2 ++ .../testdata/reader/yaml-schema-timestamp.yml | 2 ++ 91 files changed, 124 insertions(+) diff --git a/actions-workflow-parser/testdata/reader/concurrency.yml b/actions-workflow-parser/testdata/reader/concurrency.yml index 473f159..b230bef 100644 --- a/actions-workflow-parser/testdata/reader/concurrency.yml +++ b/actions-workflow-parser/testdata/reader/concurrency.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push concurrency: diff --git a/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml b/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml index 8eee053..4fc9392 100644 --- a/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml +++ b/actions-workflow-parser/testdata/reader/errors-job-concurrency.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml b/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml index 1726575..1c8e3c7 100644 --- a/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml +++ b/actions-workflow-parser/testdata/reader/errors-job-runs-on-group-invalid-prefix.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml b/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml index 423a67e..6822766 100644 --- a/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml +++ b/actions-workflow-parser/testdata/reader/errors-matrix-max-depth.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-max-depth.yml b/actions-workflow-parser/testdata/reader/errors-max-depth.yml index b5e9963..7076f8d 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-depth.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-depth.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript max-depth: 5 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-max-file-size.yml b/actions-workflow-parser/testdata/reader/errors-max-file-size.yml index 7b3d178..832bf53 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-file-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-file-size.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript max-file-size: 124 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml b/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml index ef315bf..2e7aac0 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-job-limit-with-reusable-workflow.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript max-job-limit: 8 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-max-result-size.yml b/actions-workflow-parser/testdata/reader/errors-max-result-size.yml index 4ec8e21..82306fa 100644 --- a/actions-workflow-parser/testdata/reader/errors-max-result-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-max-result-size.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript max-result-size: 768 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml index 6f1d9fb..df6d826 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml index 268eb6e..1df5ce1 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-type-mismatch.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml index 87c5b82..7611a4c 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml index 13ea7f6..60f9db6 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-depth-exceeded.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml index 9041aab..a5b1ce3 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-job-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml index 533c444..e8e74bf 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-job-level-from-caller-workflow-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml index 76e196b..40a20a1 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-job-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml index f571bfb..d92939f 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-nested-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- permissions: actions: write diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml index 1bd2c84..6015a83 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-required.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml index 48d9816..97ad0e7 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets-undefined.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml index dac0d5a..b812f32 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml index 861ec90..567a3e4 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-max-result-size.yml @@ -2,6 +2,7 @@ include-source: false # Drop file/line/col from output max-result-size: 2048 skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml index 0793610..4051c23 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-default.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml index d1f49b4..f77fb2a 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-job-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml index 8535043..9fc4cb6 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-job-level-from-caller-workflow-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml index 6c16789..aee494b 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-actions-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml index 643dccd..19243c4 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-checks-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml index 47cec4f..52603d1 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-contents-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml index 81f97cb..4d3fcd3 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-deployments-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml index c79f80b..72473e7 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-discussions-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml index fc062d6..1d4f128 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-id-token-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml index 0ef1272..3cb7d0a 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-issues-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml index ecc4cf3..1e6c9c4 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-packages-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml index d671e23..babdc6b 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pages-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml index 7c9f558..68c3a23 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-pull-requests-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml index 8ba8409..5f520bc 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-read-all-allowed-none.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml index 6dd37c8..7df1abc 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-repository-projects-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml index c6dc1a6..d7081ae 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-security-events-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml index dd2b3fd..2aebcc9 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-statuses-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml index bd52f88..98a4844 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-none.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml index 22fd8c4..9d5ca02 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-request-write-all-allowed-read-all.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead # Note, the workflow names are intentionally short so the error message doesn't get truncated too much --- diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml index 2cab2b0..67ba05a 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-default.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml index 2ac2408..61865f7 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-job-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml index eaa04c1..b414ccb 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-permissions-not-allowed-workflow-level-from-caller-workflow-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/errors-step-if.yml b/actions-workflow-parser/testdata/reader/errors-step-if.yml index a46c1e8..5903c0f 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-if.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-if.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push: diff --git a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml index bf0a55a..936ac60 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml index b840137..e9fdc06 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml index eb365b1..61b0ba8 100644 --- a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml +++ b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/escape-html-values.yml b/actions-workflow-parser/testdata/reader/escape-html-values.yml index 69900a5..f7aa984 100644 --- a/actions-workflow-parser/testdata/reader/escape-html-values.yml +++ b/actions-workflow-parser/testdata/reader/escape-html-values.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/job-basic.yml b/actions-workflow-parser/testdata/reader/job-basic.yml index 581d9c8..c1d60c3 100644 --- a/actions-workflow-parser/testdata/reader/job-basic.yml +++ b/actions-workflow-parser/testdata/reader/job-basic.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-concurrency.yml b/actions-workflow-parser/testdata/reader/job-concurrency.yml index ba8e59f..6e59942 100644 --- a/actions-workflow-parser/testdata/reader/job-concurrency.yml +++ b/actions-workflow-parser/testdata/reader/job-concurrency.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml index cd54490..d80dc60 100644 --- a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml +++ b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-defaults.yml b/actions-workflow-parser/testdata/reader/job-defaults.yml index 76bf9b3..e08958b 100644 --- a/actions-workflow-parser/testdata/reader/job-defaults.yml +++ b/actions-workflow-parser/testdata/reader/job-defaults.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-if.yml b/actions-workflow-parser/testdata/reader/job-if.yml index caf7c5a..e519613 100644 --- a/actions-workflow-parser/testdata/reader/job-if.yml +++ b/actions-workflow-parser/testdata/reader/job-if.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/job-permissions.yml b/actions-workflow-parser/testdata/reader/job-permissions.yml index d5aab8f..2fe6edd 100644 --- a/actions-workflow-parser/testdata/reader/job-permissions.yml +++ b/actions-workflow-parser/testdata/reader/job-permissions.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml index 61b474d..cce97df 100644 --- a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml +++ b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/misc-jobs.yml b/actions-workflow-parser/testdata/reader/misc-jobs.yml index 0a35e11..f0f7d26 100644 --- a/actions-workflow-parser/testdata/reader/misc-jobs.yml +++ b/actions-workflow-parser/testdata/reader/misc-jobs.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/misc-steps.yml b/actions-workflow-parser/testdata/reader/misc-steps.yml index 9625212..ddcbc39 100644 --- a/actions-workflow-parser/testdata/reader/misc-steps.yml +++ b/actions-workflow-parser/testdata/reader/misc-steps.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/mvp.yml b/actions-workflow-parser/testdata/reader/mvp.yml index 4276ec5..f163b15 100644 --- a/actions-workflow-parser/testdata/reader/mvp.yml +++ b/actions-workflow-parser/testdata/reader/mvp.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- # This is a basic workflow to help you get started with Actions diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml index 2da51d0..c1a963d 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml index a48e261..ad85c31 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml index 0d222e4..2b53084 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/permissions.yml b/actions-workflow-parser/testdata/reader/permissions.yml index 8d9d828..0d8c690 100644 --- a/actions-workflow-parser/testdata/reader/permissions.yml +++ b/actions-workflow-parser/testdata/reader/permissions.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml index ca7749f..b1aff7f 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml @@ -1,4 +1,6 @@ include-source: true # Preserve file/line/col in serialized output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml index 6721b26..cc38740 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml @@ -1,6 +1,7 @@ include-source: true # Preserve file/line/col in serialized output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml index 2f525af..12b23fa 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml @@ -1,4 +1,6 @@ include-source: true # Preserve file/line/col in serialized output +skip: + - Typescript --- # This is meant to cover all the different types of TemplateToken that are output # with include-source: true. Currently it is missing type 4 (insert expression) diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml index 3604796..cabbb11 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml index 37fd6ee..0cc5364 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml index 0afcc09..655c0be 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml index 3e67c56..29839b9 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml index 144b28c..f38992d 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml index 8199cf1..79f2673 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml index 2d0c4e2..e0c797b 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript max-nested-reusable-workflows-depth: 3 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml index 2c6b906..94de16a 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml index d98c9d8..965c083 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml index bbf0a99..4d040b0 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml index ca3659b..3125d12 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript permissions-policy: Write --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml index d724692..0ed4153 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml index c343684..17907e2 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml index d129cdb..050ab38 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml index e07bb6b..0381c25 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml index 62501c2..a48e668 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml index 664f4fc..68667b4 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml index 7714103..eab6968 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/root-env-defaults.yml b/actions-workflow-parser/testdata/reader/root-env-defaults.yml index f696886..6109c9e 100644 --- a/actions-workflow-parser/testdata/reader/root-env-defaults.yml +++ b/actions-workflow-parser/testdata/reader/root-env-defaults.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/step-if.yml b/actions-workflow-parser/testdata/reader/step-if.yml index 4aafc71..de0baa7 100644 --- a/actions-workflow-parser/testdata/reader/step-if.yml +++ b/actions-workflow-parser/testdata/reader/step-if.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/workflow-defaults.yml b/actions-workflow-parser/testdata/reader/workflow-defaults.yml index 0e8162c..014ec6b 100644 --- a/actions-workflow-parser/testdata/reader/workflow-defaults.yml +++ b/actions-workflow-parser/testdata/reader/workflow-defaults.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push defaults: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml index 247833d..96c5144 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml index 0e73a48..a345d26 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml index 5a8f525..4475e31 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml index b8772d3..128ac01 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml index da60fcb..e2122ac 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml index 9009132..3de4316 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - Typescript --- on: push jobs: From f19d2bd0a9ff095f38002faea2616bfc3df0bb95 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Wed, 1 Feb 2023 17:33:44 -0800 Subject: [PATCH 05/52] Skip new tests and fix capitalization --- actions-workflow-parser/testdata/reader/errors-insert.yml | 2 -- .../testdata/reader/errors-invalid-mapping-key.yml | 2 ++ .../testdata/reader/errors-matrix-empty-vector.yml | 2 ++ actions-workflow-parser/testdata/reader/errors-step-id.yml | 2 ++ actions-workflow-parser/testdata/reader/errors-step-if.yml | 2 -- .../testdata/reader/errors-step-run-exceeds-length.yml | 2 +- .../testdata/reader/errors-step-uses-syntax.yml | 2 +- .../testdata/reader/errors-unexpected-mapping.yml | 2 +- actions-workflow-parser/testdata/reader/escape-html-values.yml | 2 +- actions-workflow-parser/testdata/reader/float-folded-style.yml | 2 ++ actions-workflow-parser/testdata/reader/job-basic.yml | 2 +- .../testdata/reader/job-cancel-timeout-minutes.yml | 1 + actions-workflow-parser/testdata/reader/job-concurrency.yml | 2 +- .../testdata/reader/job-continue-on-error.yml | 2 +- actions-workflow-parser/testdata/reader/job-defaults.yml | 2 +- actions-workflow-parser/testdata/reader/job-if.yml | 2 +- actions-workflow-parser/testdata/reader/job-permissions.yml | 2 +- actions-workflow-parser/testdata/reader/job-timeout-minutes.yml | 2 +- actions-workflow-parser/testdata/reader/matrix-basic.yml | 2 ++ actions-workflow-parser/testdata/reader/misc-jobs.yml | 2 +- actions-workflow-parser/testdata/reader/misc-steps.yml | 2 +- actions-workflow-parser/testdata/reader/mvp.yml | 2 +- .../testdata/reader/on-workflow_dispatch-inputs-null.yml | 2 +- .../testdata/reader/on-workflow_dispatch-inputs.yml | 2 +- .../reader/on-workflow_dispatch-unknown-keys-ignored.yml | 2 +- actions-workflow-parser/testdata/reader/permissions.yml | 2 +- .../testdata/reader/preserves-source-info-basic.yml | 2 +- .../testdata/reader/preserves-source-info-reusable-workflow.yml | 2 +- .../testdata/reader/preserves-source-info-simple.yml | 2 +- .../testdata/reader/reusable-workflow-inputs.yml | 2 +- .../testdata/reader/reusable-workflow-job-basic.yml | 2 +- .../reader/reusable-workflow-job-inputs-type-coercion.yml | 2 +- .../testdata/reader/reusable-workflow-job-name.yml | 2 +- .../testdata/reader/reusable-workflow-job-nested-basic.yml | 2 +- .../testdata/reader/reusable-workflow-job-nested-multiple.yml | 2 +- .../reader/reusable-workflow-job-nested-permissions.yml | 2 +- ...workflow-job-permissions-embedded-permissions-after-jobs.yml | 2 +- .../reusable-workflow-job-permissions-embedded-permissions.yml | 2 +- ...-workflow-job-permissions-overrides-default-limited-read.yml | 2 +- ...workflow-job-permissions-overrides-default-limited-write.yml | 2 +- ...usable-workflow-job-permissions-overrides-workflow-level.yml | 2 +- .../testdata/reader/reusable-workflow-job-strategy.yml | 2 +- .../testdata/reader/reusable-workflow-multiple.yml | 2 +- .../testdata/reader/reusable-workflow-no-inputs.yml | 2 +- .../testdata/reader/reusable-workflow-outputs.yml | 2 +- .../reusable-workflow-secrets-secret-without-definition.yml | 2 +- .../testdata/reader/reusable-workflow-secrets.yml | 2 +- actions-workflow-parser/testdata/reader/root-env-defaults.yml | 2 +- actions-workflow-parser/testdata/reader/step-if.yml | 2 +- actions-workflow-parser/testdata/reader/workflow-defaults.yml | 2 +- actions-workflow-parser/testdata/reader/yaml-schema-float.yml | 2 +- actions-workflow-parser/testdata/reader/yaml-schema-null.yml | 2 +- .../testdata/reader/yaml-schema-sequence.yml | 2 +- .../testdata/reader/yaml-schema-str-flow-styles.yml | 2 +- actions-workflow-parser/testdata/reader/yaml-schema-string.yml | 2 +- .../testdata/reader/yaml-schema-timestamp.yml | 2 +- 56 files changed, 59 insertions(+), 52 deletions(-) diff --git a/actions-workflow-parser/testdata/reader/errors-insert.yml b/actions-workflow-parser/testdata/reader/errors-insert.yml index 8e91acf..6506202 100644 --- a/actions-workflow-parser/testdata/reader/errors-insert.yml +++ b/actions-workflow-parser/testdata/reader/errors-insert.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml b/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml index 81ecbe6..1611363 100644 --- a/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml +++ b/actions-workflow-parser/testdata/reader/errors-invalid-mapping-key.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml b/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml index 1cce7ef..6c4a744 100644 --- a/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml +++ b/actions-workflow-parser/testdata/reader/errors-matrix-empty-vector.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-step-id.yml b/actions-workflow-parser/testdata/reader/errors-step-id.yml index f36cfd3..d980321 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-id.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-id.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- name: CI on: diff --git a/actions-workflow-parser/testdata/reader/errors-step-if.yml b/actions-workflow-parser/testdata/reader/errors-step-if.yml index 5903c0f..a46c1e8 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-if.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-if.yml @@ -1,6 +1,4 @@ include-source: false # Drop file/line/col from output -skip: - - Typescript --- on: push: diff --git a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml index 936ac60..8933371 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-run-exceeds-length.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml index e9fdc06..3b244e2 100644 --- a/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml +++ b/actions-workflow-parser/testdata/reader/errors-step-uses-syntax.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml index 61b0ba8..5482655 100644 --- a/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml +++ b/actions-workflow-parser/testdata/reader/errors-unexpected-mapping.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/escape-html-values.yml b/actions-workflow-parser/testdata/reader/escape-html-values.yml index f7aa984..2fb679a 100644 --- a/actions-workflow-parser/testdata/reader/escape-html-values.yml +++ b/actions-workflow-parser/testdata/reader/escape-html-values.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/float-folded-style.yml b/actions-workflow-parser/testdata/reader/float-folded-style.yml index f3fdb4d..bd28b60 100644 --- a/actions-workflow-parser/testdata/reader/float-folded-style.yml +++ b/actions-workflow-parser/testdata/reader/float-folded-style.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-basic.yml b/actions-workflow-parser/testdata/reader/job-basic.yml index c1d60c3..824c814 100644 --- a/actions-workflow-parser/testdata/reader/job-basic.yml +++ b/actions-workflow-parser/testdata/reader/job-basic.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml b/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml index 462eb7a..632dc91 100644 --- a/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml +++ b/actions-workflow-parser/testdata/reader/job-cancel-timeout-minutes.yml @@ -1,6 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-concurrency.yml b/actions-workflow-parser/testdata/reader/job-concurrency.yml index 6e59942..4a9d711 100644 --- a/actions-workflow-parser/testdata/reader/job-concurrency.yml +++ b/actions-workflow-parser/testdata/reader/job-concurrency.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml index d80dc60..6a09af9 100644 --- a/actions-workflow-parser/testdata/reader/job-continue-on-error.yml +++ b/actions-workflow-parser/testdata/reader/job-continue-on-error.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-defaults.yml b/actions-workflow-parser/testdata/reader/job-defaults.yml index e08958b..25e99dd 100644 --- a/actions-workflow-parser/testdata/reader/job-defaults.yml +++ b/actions-workflow-parser/testdata/reader/job-defaults.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/job-if.yml b/actions-workflow-parser/testdata/reader/job-if.yml index e519613..ef715cf 100644 --- a/actions-workflow-parser/testdata/reader/job-if.yml +++ b/actions-workflow-parser/testdata/reader/job-if.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/job-permissions.yml b/actions-workflow-parser/testdata/reader/job-permissions.yml index 2fe6edd..df3095c 100644 --- a/actions-workflow-parser/testdata/reader/job-permissions.yml +++ b/actions-workflow-parser/testdata/reader/job-permissions.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml index cce97df..f6c7b76 100644 --- a/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml +++ b/actions-workflow-parser/testdata/reader/job-timeout-minutes.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/matrix-basic.yml b/actions-workflow-parser/testdata/reader/matrix-basic.yml index f8738d1..d6f1e91 100644 --- a/actions-workflow-parser/testdata/reader/matrix-basic.yml +++ b/actions-workflow-parser/testdata/reader/matrix-basic.yml @@ -1,4 +1,6 @@ include-source: false # Drop file/line/col from output +skip: + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/misc-jobs.yml b/actions-workflow-parser/testdata/reader/misc-jobs.yml index f0f7d26..417c527 100644 --- a/actions-workflow-parser/testdata/reader/misc-jobs.yml +++ b/actions-workflow-parser/testdata/reader/misc-jobs.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/misc-steps.yml b/actions-workflow-parser/testdata/reader/misc-steps.yml index ddcbc39..b75efd8 100644 --- a/actions-workflow-parser/testdata/reader/misc-steps.yml +++ b/actions-workflow-parser/testdata/reader/misc-steps.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/mvp.yml b/actions-workflow-parser/testdata/reader/mvp.yml index f163b15..417ef36 100644 --- a/actions-workflow-parser/testdata/reader/mvp.yml +++ b/actions-workflow-parser/testdata/reader/mvp.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- # This is a basic workflow to help you get started with Actions diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml index c1a963d..f65c6b2 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs-null.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml index ad85c31..b97e1f1 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-inputs.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml index 2b53084..ee2019a 100644 --- a/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml +++ b/actions-workflow-parser/testdata/reader/on-workflow_dispatch-unknown-keys-ignored.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: workflow_dispatch: diff --git a/actions-workflow-parser/testdata/reader/permissions.yml b/actions-workflow-parser/testdata/reader/permissions.yml index 0d8c690..df6f689 100644 --- a/actions-workflow-parser/testdata/reader/permissions.yml +++ b/actions-workflow-parser/testdata/reader/permissions.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push permissions: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml index b1aff7f..9c16081 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-basic.yml @@ -1,6 +1,6 @@ include-source: true # Preserve file/line/col in serialized output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml index cc38740..acf4c70 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-reusable-workflow.yml @@ -1,7 +1,7 @@ include-source: true # Preserve file/line/col in serialized output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml index 12b23fa..75303ce 100644 --- a/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml +++ b/actions-workflow-parser/testdata/reader/preserves-source-info-simple.yml @@ -1,6 +1,6 @@ include-source: true # Preserve file/line/col in serialized output skip: - - Typescript + - TypeScript --- # This is meant to cover all the different types of TemplateToken that are output # with include-source: true. Currently it is missing type 4 (insert expression) diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml index cabbb11..cd82fa4 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml index 0cc5364..9d9c070 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-basic.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml index 655c0be..dbe138c 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml index 29839b9..60c8c3c 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml index f38992d..ec93258 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-basic.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml index 79f2673..de28ff1 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-multiple.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript max-nested-reusable-workflows-depth: 2 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml index e0c797b..773dd93 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-nested-permissions.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript max-nested-reusable-workflows-depth: 3 --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml index 94de16a..e613903 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions-after-jobs.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml index 965c083..47ce8d1 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-embedded-permissions.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml index 4d040b0..d6fb3b6 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-read.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml index 3125d12..e9fa67a 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-default-limited-write.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript permissions-policy: Write --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml index 0ed4153..7f096d0 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-permissions-overrides-workflow-level.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript permissions-policy: LimitedRead --- on: push diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml index 17907e2..cd35281 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml index 050ab38..959dfc1 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml index 0381c25..df0edad 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml index a48e668..c567cac 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml index 68667b4..2c8e078 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets-secret-without-definition.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml index eab6968..7514011 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-secrets.yml @@ -1,7 +1,7 @@ include-source: false # Drop file/line/col from output skip: - Go - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/root-env-defaults.yml b/actions-workflow-parser/testdata/reader/root-env-defaults.yml index 6109c9e..5b19c66 100644 --- a/actions-workflow-parser/testdata/reader/root-env-defaults.yml +++ b/actions-workflow-parser/testdata/reader/root-env-defaults.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push env: diff --git a/actions-workflow-parser/testdata/reader/step-if.yml b/actions-workflow-parser/testdata/reader/step-if.yml index de0baa7..ffbaf89 100644 --- a/actions-workflow-parser/testdata/reader/step-if.yml +++ b/actions-workflow-parser/testdata/reader/step-if.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/workflow-defaults.yml b/actions-workflow-parser/testdata/reader/workflow-defaults.yml index 014ec6b..51fb7f8 100644 --- a/actions-workflow-parser/testdata/reader/workflow-defaults.yml +++ b/actions-workflow-parser/testdata/reader/workflow-defaults.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push defaults: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml index 96c5144..fb7f36f 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-float.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-float.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml index a345d26..6349637 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-null.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-null.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml index 4475e31..8d458f7 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-sequence.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml index 128ac01..9f2a87c 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-str-flow-styles.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml index e2122ac..cc9ca28 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-string.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-string.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml index 3de4316..c722fb9 100644 --- a/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml +++ b/actions-workflow-parser/testdata/reader/yaml-schema-timestamp.yml @@ -1,6 +1,6 @@ include-source: false # Drop file/line/col from output skip: - - Typescript + - TypeScript --- on: push jobs: From a1fea7e7fdd432c5cc67515c5ed9028228aab40d Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Wed, 1 Feb 2023 17:36:17 -0800 Subject: [PATCH 06/52] Add `getDescription` method to description dict --- actions-expressions/src/completion/descriptionDictionary.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/actions-expressions/src/completion/descriptionDictionary.ts b/actions-expressions/src/completion/descriptionDictionary.ts index 08a4eda..0fe6892 100644 --- a/actions-expressions/src/completion/descriptionDictionary.ts +++ b/actions-expressions/src/completion/descriptionDictionary.ts @@ -34,4 +34,8 @@ export class DescriptionDictionary extends Dictionary { const pairs = super.pairs(); return pairs.map(p => ({...p, description: this.descriptions.get(p.key)})); } + + getDescription(key: string): string | undefined { + return this.descriptions.get(key); + } } From c287b805577538f9d4106ad825c59b8002388f74 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:52:23 -0800 Subject: [PATCH 07/52] Add expression range to BasicExpressionToken --- .../src/expressions.test.ts | 14 ++++++-- .../src/model/converter/jobs.ts | 2 +- .../src/model/converter/steps.ts | 2 +- .../src/templates/template-reader.ts | 34 +++++++++++++++--- .../tokens/basic-expression-token.ts | 36 +++++++++++++++++-- .../src/templates/tokens/token-range.ts | 1 + 6 files changed, 76 insertions(+), 13 deletions(-) diff --git a/actions-workflow-parser/src/expressions.test.ts b/actions-workflow-parser/src/expressions.test.ts index 8bdc916..c8f1664 100644 --- a/actions-workflow-parser/src/expressions.test.ts +++ b/actions-workflow-parser/src/expressions.test.ts @@ -55,7 +55,7 @@ jobs: steps: - run: | echo \${{ github.event_name }} - echo 'hello' \${{ github.ref }}` + echo 'hello' \${{github.ref }}` } ], nullTrace @@ -81,19 +81,27 @@ jobs: } expect(stepRun.originalExpressions).toHaveLength(2); - expect(stepRun.originalExpressions!.map(x => [x.toDisplayString(), x.range])).toEqual([ + expect(stepRun.originalExpressions!.map(x => [x.toDisplayString(), x.range, x.expressionRange])).toEqual([ [ "${{ github.event_name }}", { start: {line: 7, column: 16}, end: {line: 7, column: 40} + }, + { + start: {line: 7, column: 20}, + end: {line: 7, column: 37} } ], [ "${{ github.ref }}", { start: {line: 8, column: 24}, - end: {line: 8, column: 41} + end: {line: 8, column: 40} + }, + { + start: {line: 8, column: 27}, + end: {line: 8, column: 37} } ] ]); diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 17aa165..ac31142 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, undefined), 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..aa11f5d 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, undefined); 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..cdc3e4c 100644 --- a/actions-workflow-parser/src/templates/template-reader.ts +++ b/actions-workflow-parser/src/templates/template-reader.ts @@ -607,7 +607,8 @@ class TemplateReader { token.range, `format('${format.join("")}'${args.join("")})`, token.definitionInfo, - expressionTokens + expressionTokens, + undefined ); } @@ -615,10 +616,10 @@ class TemplateReader { tr: TokenRange, rawExpression: string, allowedContext: string[], - token: TemplateToken, + token: StringToken, definitionInfo: DefinitionInfo | undefined ): ExpressionToken | undefined { - const parseExpressionResult = this.parseExpression(tr, rawExpression, allowedContext, definitionInfo); + const parseExpressionResult = this.parseExpression(tr, token, rawExpression, allowedContext, definitionInfo); // Check for error if (parseExpressionResult.error) { @@ -630,7 +631,8 @@ class TemplateReader { } private parseExpression( - range: TokenRange | undefined, + range: TokenRange, + token: StringToken, value: string, allowedContext: string[], definitionInfo: DefinitionInfo | undefined @@ -665,9 +667,31 @@ class TemplateReader { }; } + const startTrim = value.length - value.trimStart().length; + const endTrim = value.length - value.trimEnd().length; + + const expressionRange: TokenRange = { + start: { + ...range.start, + column: range.start.column + OPEN_EXPRESSION.length + startTrim + }, + end: { + ...range.end, + column: range.end.column - CLOSE_EXPRESSION.length - endTrim + } + }; + // Return the expression return { - expression: new BasicExpressionToken(this._fileId, range, trimmed, definitionInfo, undefined), + expression: new BasicExpressionToken( + this._fileId, + range, + trimmed, + definitionInfo, + undefined, + token.source, + expressionRange + ), 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..01c7a44 100644 --- a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts +++ b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts @@ -11,8 +11,18 @@ import {TokenType} from "./types"; export class BasicExpressionToken extends ExpressionToken { private readonly expr: string; + public readonly source: string | undefined; + public readonly originalExpressions: BasicExpressionToken[] | undefined; + /** + * The range of the expression within the source string. + * + * `range` is the range of the entire expression, including the `${{` and `}}`. `expression` is only the expression + * without any ${{ }} markers. `expressionRange` is the range of just the expression within the document. + */ + public readonly expressionRange: TokenRange | undefined; + /** * @param originalExpressions If the basic expression was transformed from individual expressions, these will be the original ones */ @@ -21,11 +31,15 @@ export class BasicExpressionToken extends ExpressionToken { range: TokenRange | undefined, expression: string, definitionInfo: DefinitionInfo | undefined, - originalExpressions: BasicExpressionToken[] | undefined + originalExpressions: BasicExpressionToken[] | undefined, + source: string | undefined, + expressionRange?: TokenRange | undefined ) { super(TokenType.BasicExpression, file, range, undefined, definitionInfo); this.expr = expression; + this.source = source; this.originalExpressions = originalExpressions; + this.expressionRange = expressionRange; } public get expression(): string { @@ -34,8 +48,24 @@ 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, + this.expressionRange + ) + : new BasicExpressionToken( + this.file, + this.range, + this.expr, + this.definitionInfo, + this.originalExpressions, + this.source, + this.expressionRange + ); } public override toString(): string { diff --git a/actions-workflow-parser/src/templates/tokens/token-range.ts b/actions-workflow-parser/src/templates/tokens/token-range.ts index 03d5f8e..8cc0c2b 100644 --- a/actions-workflow-parser/src/templates/tokens/token-range.ts +++ b/actions-workflow-parser/src/templates/tokens/token-range.ts @@ -2,6 +2,7 @@ export type Position = { /** The one-based line value */ line: number; + /** The one-based column value */ column: number; }; From c9c1d9e537d4acfaf01a265f06278407702eff4e Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:52:37 -0800 Subject: [PATCH 08/52] React to parser changes --- actions-languageservice/src/context-providers/matrix.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-languageservice/src/context-providers/matrix.test.ts b/actions-languageservice/src/context-providers/matrix.test.ts index 6b8bd99..65dea8c 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, undefined); } function contextFromStrategy(strategy?: TemplateToken) { From 634f7ecbd4dc53c1f5dcc3e6c12bf4ed072dcf11 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:53:01 -0800 Subject: [PATCH 09/52] Extract helper functions --- actions-languageservice/src/utils/rel-char-pos.ts | 15 +++++++++++++++ actions-languageservice/src/utils/type-guards.ts | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 actions-languageservice/src/utils/rel-char-pos.ts create mode 100644 actions-languageservice/src/utils/type-guards.ts diff --git a/actions-languageservice/src/utils/rel-char-pos.ts b/actions-languageservice/src/utils/rel-char-pos.ts new file mode 100644 index 0000000..3ffa100 --- /dev/null +++ b/actions-languageservice/src/utils/rel-char-pos.ts @@ -0,0 +1,15 @@ +import {TokenRange} from "@github/actions-workflow-parser/templates/tokens/token-range"; +import {Position} from "vscode-languageserver-textdocument"; +import {mapRange} from "./range"; + +export function getRelCharOffset(tokenRange: TokenRange, currentInput: string, pos: Position): number { + const range = mapRange(tokenRange); + if (range.start.line !== range.end.line) { + const lines = currentInput.split("\n"); + const lineDiff = pos.line - range.start.line - 1; + const linesBeforeCusor = lines.slice(0, lineDiff); + return linesBeforeCusor.join("\n").length + pos.character + 1; + } else { + return pos.character - range.start.character; + } +} diff --git a/actions-languageservice/src/utils/type-guards.ts b/actions-languageservice/src/utils/type-guards.ts new file mode 100644 index 0000000..62fbe2e --- /dev/null +++ b/actions-languageservice/src/utils/type-guards.ts @@ -0,0 +1,12 @@ +import {isString} from "@github/actions-workflow-parser"; +import {DefinitionType} from "@github/actions-workflow-parser/templates/schema/definition-type"; +import {StringDefinition} from "@github/actions-workflow-parser/templates/schema/string-definition"; +import {OPEN_EXPRESSION} from "@github/actions-workflow-parser/templates/template-constants"; +import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/index"; + +export function isStringExpression(token: TemplateToken): boolean { + const isExpression = + token.definition?.definitionType === DefinitionType.String && (token.definition as StringDefinition).isExpression; + const containsExpression = isString(token) && token.value.indexOf(OPEN_EXPRESSION) >= 0; + return isExpression || containsExpression; +} From 60757d5de8b805384c3fff0d760a5c5ad44f2d1f Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:57:02 -0800 Subject: [PATCH 10/52] Logic for determining expression hover --- .../expression-hover/expression-pos.test.ts | 92 ++++++++++ .../src/expression-hover/expression-pos.ts | 58 ++++++ .../src/expression-hover/pos-range.ts | 10 ++ .../src/expression-hover/visitor.test.ts | 134 ++++++++++++++ .../src/expression-hover/visitor.ts | 166 ++++++++++++++++++ 5 files changed, 460 insertions(+) create mode 100644 actions-languageservice/src/expression-hover/expression-pos.test.ts create mode 100644 actions-languageservice/src/expression-hover/expression-pos.ts create mode 100644 actions-languageservice/src/expression-hover/pos-range.ts create mode 100644 actions-languageservice/src/expression-hover/visitor.test.ts create mode 100644 actions-languageservice/src/expression-hover/visitor.ts diff --git a/actions-languageservice/src/expression-hover/expression-pos.test.ts b/actions-languageservice/src/expression-hover/expression-pos.test.ts new file mode 100644 index 0000000..d90c824 --- /dev/null +++ b/actions-languageservice/src/expression-hover/expression-pos.test.ts @@ -0,0 +1,92 @@ +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"; +import {findToken} from "../utils/find-token"; +import {ExpressionPos, mapToExpressionPos} from "./expression-pos"; + +describe("mapToExpressionPos", () => { + it("simple expression", () => { + expect( + testMapToExpressionPos(`on: push +run-name: \${{ git|hub.event }}`) + ).toEqual({ + expression: "github.event", + position: {line: 0, column: 3}, + documentRange: { + start: {line: 1, character: 14}, + end: {line: 1, character: 26} + } + }); + }); + + it("implicit format expression", () => { + expect( + testMapToExpressionPos(`on: push +run-name: hello \${{ git|hub.event }}`) + ).toEqual({ + expression: "github.event", + position: {line: 0, column: 3}, + documentRange: { + start: {line: 1, character: 20}, + end: {line: 1, character: 32} + } + }); + }); + + it("implicit complex format expression", () => { + expect( + testMapToExpressionPos(`on: push +run-name: hello \${{ github.test }}-\${{ git|hub.event }}`) + ).toEqual({ + expression: "github.event", + position: {line: 0, column: 3}, + documentRange: { + start: {line: 1, character: 39}, + end: {line: 1, character: 51} + } + }); + }); + + it("multi-line expression", () => { + expect( + testMapToExpressionPos(`on: push +jobs: + build: + runs-on: [self-hosted] + steps: + - run: > + echo 'hello' + echo '\${{ github.event.te|st }} + echo 'world' + echo '\${{ github.event.test }}`) + ).toEqual({ + expression: "github.event.test", + position: {line: 0, column: 15}, + documentRange: { + start: {line: 7, character: 18}, + end: {line: 7, character: 35} + } + }); + }); +}); + +function testMapToExpressionPos(input: string) { + const [td, pos] = getPositionFromCursor(input); + + const file: File = { + name: td.uri, + content: td.getText() + }; + const result = parseWorkflow(file.name, [file], nullTrace); + if (!result.value) { + throw new Error("Invalid workflow"); + } + + const {token} = findToken(pos, result.value); + if (!token) { + throw new Error("No token found"); + } + + return mapToExpressionPos(token, pos); +} diff --git a/actions-languageservice/src/expression-hover/expression-pos.ts b/actions-languageservice/src/expression-hover/expression-pos.ts new file mode 100644 index 0000000..777372b --- /dev/null +++ b/actions-languageservice/src/expression-hover/expression-pos.ts @@ -0,0 +1,58 @@ +import {Pos} from "@github/actions-expressions/lexer"; +import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; +import {isBasicExpression} from "@github/actions-workflow-parser/templates/tokens/type-guards"; +import {Position, Range as LSPRange} from "vscode-languageserver-textdocument"; +import {mapRange} from "../utils/range"; +import {posWithinRange} from "./pos-range"; + +export type ExpressionPos = { + /** The expression that includes the position */ + expression: string; + + /** Adjusted position, pointing into the expression */ + position: Pos; + + /** Range of the expression in the document */ + documentRange: LSPRange; +}; + +export function mapToExpressionPos(token: TemplateToken, position: Position): ExpressionPos | undefined { + const pos: Pos = { + line: position.line + 1, + column: position.character + 1 + }; + + if (!isBasicExpression(token)) { + return undefined; + } + + if (token.originalExpressions?.length) { + for (const originalExp of token.originalExpressions) { + // Find the original expression that contains the position + if (posWithinRange(pos, originalExp.expressionRange!)) { + const tr = mapRange(originalExp.expressionRange); + + return { + expression: originalExp.expression, + position: { + line: pos.line - tr.start.line - 1, + column: pos.column - tr.start.character - 1 + }, + documentRange: tr + }; + } + } + + return undefined; + } + + const tr = mapRange(token.expressionRange!); + return { + expression: token.expression, + position: { + line: pos.line - tr.start.line - 1, + column: pos.column - tr.start.character - 1 + }, + documentRange: tr + }; +} diff --git a/actions-languageservice/src/expression-hover/pos-range.ts b/actions-languageservice/src/expression-hover/pos-range.ts new file mode 100644 index 0000000..c40728d --- /dev/null +++ b/actions-languageservice/src/expression-hover/pos-range.ts @@ -0,0 +1,10 @@ +import {Pos, Range} from "@github/actions-expressions/lexer"; + +export function posWithinRange(pos: Pos, range: Range): boolean { + return ( + pos.line >= range.start.line && + pos.line <= range.end.line && + pos.column >= range.start.column && + pos.column <= range.end.column + ); +} diff --git a/actions-languageservice/src/expression-hover/visitor.test.ts b/actions-languageservice/src/expression-hover/visitor.test.ts new file mode 100644 index 0000000..b0b7d1e --- /dev/null +++ b/actions-languageservice/src/expression-hover/visitor.test.ts @@ -0,0 +1,134 @@ +import {data, DescriptionDictionary, Lexer, Parser} from "@github/actions-expressions"; +import {convertWorkflowTemplate, parseWorkflow} from "@github/actions-workflow-parser"; +import {ErrorPolicy} from "@github/actions-workflow-parser/model/convert"; +import {File} from "@github/actions-workflow-parser/workflows/file"; +import {ContextProviderConfig} from "../context-providers/config"; +import {getContext, Mode} from "../context-providers/default"; +import {getWorkflowContext} from "../context/workflow-context"; +import {validatorFunctions} from "../expression-validation/functions"; +import {nullTrace} from "../nulltrace"; +import {getPositionFromCursor} from "../test-utils/cursor-position"; +import {HoverVisitor} from "./visitor"; + +const contextProviderConfig: ContextProviderConfig = { + getContext: async (context: string) => { + switch (context) { + case "github": + return new DescriptionDictionary( + { + key: "event", + value: new data.StringData("push"), + description: "The event that triggered the workflow" + }, + { + key: "test", + value: new DescriptionDictionary({ + key: "name", + value: new data.StringData("push"), + description: "Name for the test" + }), + description: "Test dictionary" + } + ); + } + + return undefined; + } +}; + +describe("visitor", () => { + describe("unsupported hover positions", () => { + ["1 =|= 2", "12|3", "1 == |(2)", "'ab|c'"].forEach(x => + it(x, async () => expect(await hoverExpression(x)).toBeUndefined()) + ); + }); + + it("top-level context access", async () => { + expect(await hoverExpression("githu|b")).toEqual({ + label: "github", + description: + "Information about the workflow run. For more information, see [`github` context](https://docs.github.com/actions/learn-github-actions/contexts#github-context).", + function: false, + range: { + start: {line: 0, column: 0}, + end: {line: 0, column: 6} + } + }); + }); + + it("nested context access", async () => { + expect(await hoverExpression("github.test.na|me")).toEqual({ + label: "name", + description: "Name for the test", + function: false, + range: { + start: {line: 0, column: 0}, + end: {line: 0, column: 16} + } + }); + }); + + it("nested context access with string key", async () => { + expect(await hoverExpression("github['te|st']")).toEqual({ + label: "test", + description: "Test dictionary", + function: false, + range: { + start: {line: 0, column: 0}, + end: {line: 0, column: 13} + } + }); + }); + + it("function call", async () => { + expect(await hoverExpression("cont|ains(github, 'github')")).toEqual({ + label: "contains", + description: + "`contains( search, item )`\n\nReturns `true` if `search` contains `item`. If `search`" + + " is an array, this function returns `true` if the `item` is an element in the array. If `search`" + + " is a string, this function returns `true` if the `item` is a substring of `search`. This function" + + " is not case sensitive. Casts values to a string.", + function: true, + range: { + start: {line: 0, column: 0}, + end: {line: 0, column: 8} + } + }); + }); +}); + +async function hoverExpression(input: string) { + const [td, pos] = getPositionFromCursor(input); + const allowedContext = ["github"]; //token.definitionInfo?.allowedContext || []; + + const file: File = { + name: td.uri, + content: td.getText() + }; + const result = parseWorkflow(file.name, [file], nullTrace); + if (!result.value) { + return undefined; + } + + const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); + const workflowContext = getWorkflowContext(td.uri, template, []); + const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion); + + const r = new HoverVisitor( + { + line: pos.line, + column: pos.character + }, + context, + [], + validatorFunctions + ); + + const l = new Lexer(td.getText()); + const lr = l.lex(); + + const p = new Parser(lr.tokens, ["github"], []); + const expr = p.parse(); + + return r.hover(expr); +} diff --git a/actions-languageservice/src/expression-hover/visitor.ts b/actions-languageservice/src/expression-hover/visitor.ts new file mode 100644 index 0000000..78f20c9 --- /dev/null +++ b/actions-languageservice/src/expression-hover/visitor.ts @@ -0,0 +1,166 @@ +import { + DescriptionDictionary, + Evaluator, + isDescriptionDictionary, + wellKnownFunctions +} from "@github/actions-expressions"; +import { + Binary, + ContextAccess, + Expr, + ExprVisitor, + FunctionCall, + Grouping, + IndexAccess, + Literal, + Logical, + Unary +} from "@github/actions-expressions/ast"; +import {FunctionDefinition, FunctionInfo} from "@github/actions-expressions/funcs/info"; +import {Pos, Range} from "@github/actions-expressions/lexer"; +import {posWithinRange} from "./pos-range"; + +export type HoverResult = + | undefined + | { + label: string; + description?: string; + function: boolean; + range: Range; + }; + +export class HoverVisitor implements ExprVisitor { + private ignorePosCheck = false; + + constructor( + private pos: Pos, + private context: DescriptionDictionary, + private extensionFunctions: FunctionInfo[], + private functions: Map + ) {} + + hover(n: Expr): HoverResult { + return n.accept(this); + } + + visitLiteral(literal: Literal): HoverResult { + return undefined; + } + + visitUnary(unary: Unary): HoverResult { + return this.hover(unary.expr); + } + + visitBinary(binary: Binary): HoverResult { + return this.hover(binary.left) || this.hover(binary.right); + } + + visitLogical(logical: Logical): HoverResult { + for (const arg of logical.args) { + const result = this.hover(arg); + if (result) { + return result; + } + } + + return undefined; + } + + visitGrouping(grouping: Grouping): HoverResult { + return this.hover(grouping.group); + } + + visitContextAccess(contextAccess: ContextAccess): HoverResult { + if (this.ignorePosCheck || posWithinRange(this.pos, contextAccess.name.range)) { + const contextName = contextAccess.name.lexeme; + + return { + label: contextName, + description: this.context.getDescription(contextName), + function: false, + range: contextAccess.name.range + }; + } + + return undefined; + } + + visitIndexAccess(indexAccess: IndexAccess): HoverResult { + // Is the position within the index, so for example: + // github.event.test + // ^ - pos + if (!(indexAccess.index instanceof Literal)) { + // No support for context access of the form github[github.event] + return undefined; + } + + if (!posWithinRange(this.pos, indexAccess.index.token.range)) { + // Try to get hover from the rest of the expression + return this.hover(indexAccess.expr); + } + + const ev = new Evaluator(indexAccess.expr, this.context, this.functions); + const result = ev.evaluate(); + + if (!isDescriptionDictionary(result)) { + // No description to show + return undefined; + } + + const key = indexAccess.index.literal.coerceString(); + const description = result.getDescription(key); + if (!description) { + return undefined; + } + + // Calculate context access range for whole expression. For example: + // github.event.test + // ^ - pos + // should return the range: + // github.event.test + // ^^^^^^^^^^^^ + this.ignorePosCheck = true; + + try { + const contextHover = this.hover(indexAccess.expr); + if (!contextHover) { + throw new Error("Expected context hover to be defined"); + } + + return { + label: key, + description: description, + function: false, + range: { + start: contextHover.range.start, + end: indexAccess.index.token.range.end + } + }; + } finally { + this.ignorePosCheck = false; + } + } + + visitFunctionCall(functionCall: FunctionCall): HoverResult { + if (posWithinRange(this.pos, functionCall.functionName.range)) { + const functionName = functionCall.functionName.lexeme.toLowerCase(); + const f = this.functions.get(functionName) || wellKnownFunctions[functionName]; + + return { + label: f.name, + description: f.description, + function: true, + range: functionCall.functionName.range + }; + } + + for (const args of functionCall.args) { + const result = this.hover(args); + if (result) { + return result; + } + } + + return undefined; + } +} From f5463c18b50b9145fa86d44e8cb6acd55d62973e Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:57:16 -0800 Subject: [PATCH 11/52] React to extracted functions, add test --- .../src/complete.expressions.test.ts | 18 ++++++++ actions-languageservice/src/complete.ts | 41 +++++-------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index d95fd5a..7b34546 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -153,6 +153,24 @@ 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); + + expect(result.map(x => x.label)).toEqual([ + "github", + "inputs", + "vars", + "contains", + "endsWith", + "format", + "fromJson", + "join", + "startsWith", + "toJson" + ]); + }); + it("multiple regions", async () => { const input = "run-name: test-${{ github }}-${{ | }}"; const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 54942fb..5ba7678 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -1,4 +1,4 @@ -import {DescriptionDictionary, complete as completeExpression} from "@github/actions-expressions"; +import {complete as completeExpression, DescriptionDictionary} from "@github/actions-expressions"; import {CompletionItem as ExpressionCompletionItem} from "@github/actions-expressions/completion"; import { convertWorkflowTemplate, @@ -8,8 +8,6 @@ import { parseWorkflow } from "@github/actions-workflow-parser"; import {ErrorPolicy} from "@github/actions-workflow-parser/model/convert"; -import {DefinitionType} from "@github/actions-workflow-parser/templates/schema/definition-type"; -import {StringDefinition} from "@github/actions-workflow-parser/templates/schema/string-definition"; import {OPEN_EXPRESSION} from "@github/actions-workflow-parser/templates/template-constants"; import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/index"; import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; @@ -26,11 +24,12 @@ import {nullTrace} from "./nulltrace"; import {findToken} from "./utils/find-token"; import {guessIndentation} from "./utils/indentation-guesser"; import {mapRange} from "./utils/range"; +import {getRelCharOffset} from "./utils/rel-char-pos"; import {transform} from "./utils/transform"; +import {isStringExpression} from "./utils/type-guards"; import {Value, ValueProviderConfig} from "./value-providers/config"; import {defaultValueProviders} from "./value-providers/default"; import {definitionValues} from "./value-providers/definition"; -import {TokenRange} from "@github/actions-workflow-parser/templates/tokens/token-range"; export function getExpressionInput(input: string, pos: number): string { // Find start marker around the cursor position @@ -79,7 +78,7 @@ export async function complete( // expression nodes for invalid expressions and during editing expressions are invalid most of the time. if (token) { const isStringExpressionToken = isStringExpression(token); - const isBasicExpressionToken = isBasicExpression(token) && token.isExpression; + const isBasicExpressionToken = isBasicExpression(token); if (isStringExpressionToken || isBasicExpressionToken) { const allowedContext = token.definitionInfo?.allowedContext || []; @@ -93,12 +92,14 @@ export async function complete( const indentString = " ".repeat(indentation.tabSize); const values = await getValues(token, keyToken, parent, valueProviderConfig, workflowContext, indentString); + let replaceRange: Range | undefined; if (token?.range) { replaceRange = mapRange(token.range); } else if (!token) { // Not a valid token, create a range from the current position const line = newDoc.getText({start: {line: position.line, character: 0}, end: position}); + // Get the length of the current word const val = line.match(/[\w_-]*$/)?.[0].length || 0; replaceRange = Range.create({line: position.line, character: position.character - val}, position); @@ -207,21 +208,21 @@ function getExpressionCompletionItems( ): CompletionItem[] { let expressionInput = ""; let currentInput = ""; - let relCharPos: number = 0; + let relCharOffset: number = 0; if (isBasicExpression(token)) { expressionInput = currentInput = token.expression; - relCharPos = getRelCharPos(token.range!, expressionInput, pos); + relCharOffset = getRelCharOffset(token.range!, expressionInput, pos); } 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(); + relCharOffset = getRelCharOffset(stringToken.range!, currentInput, pos); + expressionInput = (getExpressionInput(currentInput, relCharOffset) || "").trim(); } try { return completeExpression(expressionInput, context, [], validatorFunctions).map(item => - mapExpressionCompletionItem(item, currentInput[relCharPos]) + mapExpressionCompletionItem(item, currentInput[relCharOffset]) ); } catch (e: any) { error(`Error while completing expression: '${e?.message || ""}'`); @@ -252,23 +253,3 @@ function mapExpressionCompletionItem(item: ExpressionCompletionItem, charAfterPo kind: item.function ? CompletionItemKind.Function : CompletionItemKind.Variable }; } - -function getRelCharPos(tokenRange: TokenRange, currentInput: string, pos: Position): number { - // Transform the overall position into a node relative position - const range = mapRange(tokenRange); - if (range.start.line !== range.end.line) { - const lines = currentInput.split("\n"); - const lineDiff = pos.line - range.start.line - 1; - const linesBeforeCusor = lines.slice(0, lineDiff); - return linesBeforeCusor.join("\n").length + pos.character + 1; - } else { - return pos.character - range.start.character; - } -} - -function isStringExpression(token: TemplateToken): boolean { - const isExpression = - token.definition?.definitionType === DefinitionType.String && (token.definition as StringDefinition).isExpression; - const containsExpression = isString(token) && token.value.indexOf(OPEN_EXPRESSION) >= 0; - return isExpression || containsExpression; -} From cb7149686720ae39e9bf724667b15c67295bbdf8 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:57:26 -0800 Subject: [PATCH 12/52] Integrate expression hover --- .../src/hover.expressions.test.ts | 116 ++++++++++++++++++ actions-languageservice/src/hover.test.ts | 2 +- actions-languageservice/src/hover.ts | 103 ++++++++++++++-- 3 files changed, 208 insertions(+), 13 deletions(-) create mode 100644 actions-languageservice/src/hover.expressions.test.ts diff --git a/actions-languageservice/src/hover.expressions.test.ts b/actions-languageservice/src/hover.expressions.test.ts new file mode 100644 index 0000000..6b6bc21 --- /dev/null +++ b/actions-languageservice/src/hover.expressions.test.ts @@ -0,0 +1,116 @@ +import {data, DescriptionDictionary} from "@github/actions-expressions"; +import {Hover} from "vscode-languageserver-types"; +import {ContextProviderConfig} from "./context-providers/config"; +import {hover} from "./hover"; +import {registerLogger} from "./log"; +import {getPositionFromCursor} from "./test-utils/cursor-position"; +import {TestLogger} from "./test-utils/logger"; + +const contextProviderConfig: ContextProviderConfig = { + getContext: async (context: string) => { + switch (context) { + case "github": + return new DescriptionDictionary( + { + key: "event", + value: new data.StringData("push"), + description: "The event that triggered the workflow" + }, + { + key: "test", + value: new DescriptionDictionary({ + key: "name", + value: new data.StringData("push"), + description: "Name for the test" + }), + description: "Test dictionary" + } + ); + } + + return undefined; + } +}; + +registerLogger(new TestLogger()); + +describe("hover.expressions", () => { + it("context access", async () => { + const input = `on: push +run-name: \${{ github.even|t }} +jobs: + build: + runs-on: [self-hosted]`; + const result = await hover(...getPositionFromCursor(input), { + contextProviderConfig + }); + expect(result).toEqual({ + contents: "The event that triggered the workflow", + range: { + start: {line: 1, character: 14}, + end: {line: 1, character: 26} + } + }); + }); + + it("context", async () => { + const input = `on: push +run-name: \${{ git|hub.event }} +jobs: + build: + runs-on: [self-hosted]`; + const result = await hover(...getPositionFromCursor(input), { + contextProviderConfig + }); + expect(result).toEqual({ + contents: + "Information about the workflow run. For more information, see [`github` context](https://docs.github.com/actions/learn-github-actions/contexts#github-context).", + range: { + start: {line: 1, character: 14}, + end: {line: 1, character: 20} + } + }); + }); + + it("multiple expressions", async () => { + const input = `on: push +run-name: \${{ git|hub.event }}-\${{ github.event }} +jobs: + build: + runs-on: [self-hosted]`; + const result = await hover(...getPositionFromCursor(input), { + contextProviderConfig + }); + expect(result).toEqual({ + contents: + "Information about the workflow run. For more information, see [`github` context](https://docs.github.com/actions/learn-github-actions/contexts#github-context).", + range: { + start: {line: 1, character: 14}, + end: {line: 1, character: 20} + } + }); + }); + + it("multi-line expression", async () => { + const input = `on: push +jobs: + build: + runs-on: [self-hosted] + steps: + - run: | + echo 'hello' + echo '\${{ github.test.na|me }} + echo 'world' + echo '\${{ github.event.test }}`; + const result = await hover(...getPositionFromCursor(input, 1), { + contextProviderConfig + }); + expect(result).toEqual({ + contents: "Name for the test", + range: { + start: {line: 7, character: 18}, + end: {line: 7, character: 34} + } + }); + }); +}); diff --git a/actions-languageservice/src/hover.test.ts b/actions-languageservice/src/hover.test.ts index fe017dc..b92717d 100644 --- a/actions-languageservice/src/hover.test.ts +++ b/actions-languageservice/src/hover.test.ts @@ -3,7 +3,7 @@ import {StringToken} from "@github/actions-workflow-parser/templates/tokens/stri import {DescriptionProvider, hover, HoverConfig} from "./hover"; import {getPositionFromCursor} from "./test-utils/cursor-position"; -function testHoverConfig(tokenValue: string, tokenKey: string, description?: string) { +export function testHoverConfig(tokenValue: string, tokenKey: string, description?: string) { return { descriptionProvider: { getDescription: async (_, token, __) => { diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index eab154e..cfea343 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -1,37 +1,72 @@ +import {DescriptionDictionary, Parser} from "@github/actions-expressions"; +import {FunctionInfo} from "@github/actions-expressions/funcs/info"; +import {Lexer} from "@github/actions-expressions/lexer"; import {convertWorkflowTemplate, parseWorkflow, ParseWorkflowResult} from "@github/actions-workflow-parser"; import {ErrorPolicy} from "@github/actions-workflow-parser/model/convert"; -import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; -import {TokenResult} from "./utils/find-token"; -import {File} from "@github/actions-workflow-parser/workflows/file"; -import {isString} from "@github/actions-workflow-parser/templates/tokens/type-guards"; +import {getCronDescription} from "@github/actions-workflow-parser/model/converter/cron"; +import {splitAllowedContext} from "@github/actions-workflow-parser/templates/allowed-context"; import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; +import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; +import {isBasicExpression, isString} from "@github/actions-workflow-parser/templates/tokens/type-guards"; +import {File} from "@github/actions-workflow-parser/workflows/file"; import {Position, TextDocument} from "vscode-languageserver-textdocument"; import {Hover} from "vscode-languageserver-types"; +import {ContextProviderConfig} from "./context-providers/config"; +import {getContext, Mode} from "./context-providers/default"; import {getWorkflowContext, WorkflowContext} from "./context/workflow-context"; +import {ExpressionPos, mapToExpressionPos} from "./expression-hover/expression-pos"; +import {HoverVisitor} from "./expression-hover/visitor"; +import {validatorFunctions} from "./expression-validation/functions"; import {info} from "./log"; import {nullTrace} from "./nulltrace"; -import {findToken} from "./utils/find-token"; +import {findToken, TokenResult} from "./utils/find-token"; import {mapRange} from "./utils/range"; -import {getCronDescription} from "@github/actions-workflow-parser/model/converter/cron"; +import {isStringExpression} from "./utils/type-guards"; + +export type HoverConfig = { + descriptionProvider?: DescriptionProvider; + contextProviderConfig?: ContextProviderConfig; +}; export type DescriptionProvider = { getDescription(context: WorkflowContext, token: TemplateToken, path: TemplateToken[]): Promise; }; -export type HoverConfig = { - descriptionProvider?: DescriptionProvider; -}; - -// Render value description and Context when hovering over a key in a MappingToken export async function hover(document: TextDocument, position: Position, config?: HoverConfig): Promise { const file: File = { name: document.uri, content: document.getText() }; const result = parseWorkflow(file.name, [file], nullTrace); + if (!result.value) { + return null; + } const tokenResult = findToken(position, result.value); const token = tokenResult.token; + + if (config?.contextProviderConfig && token && tokenResult.keyToken?.definition) { + const isStringExpressionToken = isStringExpression(token); + const isBasicExpressionToken = isBasicExpression(token); + + if (isStringExpressionToken || isBasicExpressionToken) { + info(`Calculating expression hover for token with definition ${tokenResult.keyToken.definition.key}`); + + const allowedContext = + token.definitionInfo?.allowedContext || tokenResult.keyToken?.definitionInfo?.allowedContext || []; + const {namedContexts, functions} = splitAllowedContext(allowedContext); + + const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); + const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path); + const context = await getContext(namedContexts, config.contextProviderConfig, workflowContext, Mode.Completion); + + const exprPos = mapToExpressionPos(token, position); + if (exprPos) { + return expressionHover(exprPos, context, namedContexts, functions); + } + } + } + if (!token?.definition) { return null; } @@ -40,7 +75,7 @@ export async function hover(document: TextDocument, position: Position, config?: if (tokenResult.parent && isCronMappingValue(tokenResult)) { const tokenValue = (token as StringToken).value; - let description = getCronDescription(tokenValue); + const description = getCronDescription(tokenValue); if (description) { return { contents: description, @@ -88,3 +123,47 @@ function isCronMappingValue(tokenResult: TokenResult): boolean { tokenResult.token.value !== "cron" ); } + +function expressionHover( + exprPos: ExpressionPos, + context: DescriptionDictionary, + namedContexts: string[], + functions: FunctionInfo[] +): Hover | null { + const {expression, position, documentRange} = exprPos; + + try { + const l = new Lexer(expression); + const lr = l.lex(); + + const p = new Parser(lr.tokens, namedContexts, functions); + const expr = p.parse(); + + const v = new HoverVisitor(position, context, [], validatorFunctions); + const hoverResult = v.hover(expr); + if (!hoverResult) { + return null; + } + + const mr = hoverResult.range; + + return { + contents: hoverResult?.description || hoverResult?.label, + // Map the expression range back to a document range + range: { + start: { + line: documentRange.start.line + mr.start.line, + character: documentRange.start.character + mr.start.column + }, + end: { + line: documentRange.start.line + mr.end.line, + character: documentRange.start.character + mr.end.column + } + } + }; + } catch (e) { + // Hovering over an invalid expression should not cause an error here + info(`Encountered error trying to calculate expression hover: ${e}`); + return null; + } +} From 5acfa896b4cb48b05b03770101e2113b524657b0 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:57:34 -0800 Subject: [PATCH 13/52] Hook up hover with new config --- actions-languageserver/src/connection.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/actions-languageserver/src/connection.ts b/actions-languageserver/src/connection.ts index daddd1c..0a047f0 100644 --- a/actions-languageserver/src/connection.ts +++ b/actions-languageserver/src/connection.ts @@ -124,8 +124,11 @@ export function initConnection(connection: Connection) { }); connection.onHover(async ({position, textDocument}: HoverParams): Promise => { + const repoContext = repos.find(repo => textDocument.uri.startsWith(repo.workspaceUri)); + return hover(documents.get(textDocument.uri)!, position, { - descriptionProvider: descriptionProvider(client, cache) + descriptionProvider: descriptionProvider(client, cache), + contextProviderConfig: repoContext && contextProviders(client, repoContext, cache) }); }); From 03d11f9c2c60be8496d7c418369b8c3f878ef76e Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 10:20:23 -0800 Subject: [PATCH 14/52] Use similar definition info to validation for hover --- actions-languageservice/src/hover.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index cfea343..7d1211a 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -43,17 +43,17 @@ export async function hover(document: TextDocument, position: Position, config?: } const tokenResult = findToken(position, result.value); - const token = tokenResult.token; + const {token, keyToken, parent} = tokenResult; - if (config?.contextProviderConfig && token && tokenResult.keyToken?.definition) { + const hoverToken = keyToken || parent || token; + if (config?.contextProviderConfig && token && hoverToken?.definition) { const isStringExpressionToken = isStringExpression(token); const isBasicExpressionToken = isBasicExpression(token); if (isStringExpressionToken || isBasicExpressionToken) { - info(`Calculating expression hover for token with definition ${tokenResult.keyToken.definition.key}`); + info(`Calculating expression hover for token with definition ${hoverToken.definition.key}`); - const allowedContext = - token.definitionInfo?.allowedContext || tokenResult.keyToken?.definitionInfo?.allowedContext || []; + const allowedContext = hoverToken.definitionInfo?.allowedContext || []; const {namedContexts, functions} = splitAllowedContext(allowedContext); const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); From b5fba1360e921da98457ffbed2d1d38033daf495 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 10:29:04 -0800 Subject: [PATCH 15/52] Add more descriptions for static contexts --- .../src/context-providers/descriptions.json | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/actions-languageservice/src/context-providers/descriptions.json b/actions-languageservice/src/context-providers/descriptions.json index f2b35b6..176871c 100644 --- a/actions-languageservice/src/context-providers/descriptions.json +++ b/actions-languageservice/src/context-providers/descriptions.json @@ -182,5 +182,39 @@ "outcome": { "description": "The result of a completed step before `continue-on-error` is applied. Possible values are `success`, `failure`, `cancelled`, or `skipped`. When a `continue-on-error` step fails, the `outcome` is `failure`, but the final conclusion is `success`." } + }, + "runner": { + "name": { + "description": "The name of the runner executing the job." + }, + "os": { + "description": "The operating system of the runner executing the job. Possible values are `Linux`, `Windows`, or `macOS`." + }, + "arch": { + "description": "The architecture of the runner executing the job. Possible values are `X86`, `X64`, `ARM`, or `ARM64`." + }, + "temp": { + "description": "The path to a temporary directory on the runner. This directory is emptied at the beginning and end of each job. Note that files will not be removed if the runner's user account does not have permission to delete them." + }, + "tool_cache": { + "description": "The path to the directory containing preinstalled tools for GitHub-hosted runners. For more information, see \"[About GitHub-hosted runners](https://docs.github.com/actions/reference/specifications-for-github-hosted-runners/#supported-software)\"." + }, + "debug": { + "description": "This is set only if [debug logging](https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging) is enabled, and always has the value of 1. It can be useful as an indicator to enable additional debugging or verbose logging in your own job steps." + } + }, + "strategy": { + "fail-fast": { + "description": "The `fail-fast` setting for the job. Possible values are `true` or `false`. For more information, see [Workflow syntax for GitHub Actions: `jobs..strategy.fail-fast`](https://docs.github.com/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategyfail-fast)." + }, + "max-parallel": { + "description": "The `max-parallel` setting for the job. For more information, see [Workflow syntax for GitHub Actions: `jobs..strategy.max-parallel`](https://docs.github.com/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymax-parallel)." + }, + "job-index": { + "description": "The index of the current job in the matrix. **Note:** This number is a zero-based number. The first job's index in the matrix is `0`." + }, + "job-total": { + "description": "The total number of jobs in the matrix. **Note:** This number **is not** a zero-based number. For example, for a matrix with four jobs, the value of `job-total` is `4`." + } } } \ No newline at end of file From f546438ec3d7e3ae8c94b68ceb1254f2e9213cc5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Feb 2023 20:33:47 +0000 Subject: [PATCH 16/52] v0.1.114 --- 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 57a3bbf..5854a48 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.113", + "version": "0.1.114", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 3aed71f..c3e3b2b 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.113", + "version": "0.1.114", "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.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-languageservice": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "@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 5097c14..a43f14b 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.113", + "version": "0.1.114", "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.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-expressions": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "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 264de56..17f9f0e 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.113", + "version": "0.1.114", "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.113", + "@github/actions-expressions": "^0.1.114", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index d3d4494..80a9380 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.113", + "version": "0.1.114", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.113", + "@github/actions-languageserver": "^0.1.114", "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 d6d3e09..c42ddb6 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.113" + "version": "0.1.114" } diff --git a/package-lock.json b/package-lock.json index 0ed4d8c..5d35c47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.113", + "version": "0.1.114", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.113", + "version": "0.1.114", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-languageservice": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "@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.113", + "version": "0.1.114", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-expressions": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "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.113", + "version": "0.1.114", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.113", + "@github/actions-expressions": "^0.1.114", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.113", + "version": "0.1.114", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.113", + "@github/actions-languageserver": "^0.1.114", "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.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-languageservice": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "@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.113", - "@github/actions-workflow-parser": "^0.1.113", + "@github/actions-expressions": "^0.1.114", + "@github/actions-workflow-parser": "^0.1.114", "@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.113", + "@github/actions-expressions": "^0.1.114", "@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.113", + "@github/actions-languageserver": "^0.1.114", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 903c813ad1d275924bacbb25602be20e2c3898e1 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 13:02:34 -0800 Subject: [PATCH 17/52] Adjust variable naming --- .../src/expression-hover/expression-pos.ts | 18 ++++++++++-------- .../src/expression-hover/visitor.test.ts | 19 +++++++++---------- actions-languageservice/src/hover.ts | 14 +++++++------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/actions-languageservice/src/expression-hover/expression-pos.ts b/actions-languageservice/src/expression-hover/expression-pos.ts index 777372b..ad3be03 100644 --- a/actions-languageservice/src/expression-hover/expression-pos.ts +++ b/actions-languageservice/src/expression-hover/expression-pos.ts @@ -30,15 +30,16 @@ export function mapToExpressionPos(token: TemplateToken, position: Position): Ex for (const originalExp of token.originalExpressions) { // Find the original expression that contains the position if (posWithinRange(pos, originalExp.expressionRange!)) { - const tr = mapRange(originalExp.expressionRange); + const exprRange = mapRange(originalExp.expressionRange); return { expression: originalExp.expression, + // Adjust the position to point into the expression position: { - line: pos.line - tr.start.line - 1, - column: pos.column - tr.start.character - 1 + line: pos.line - exprRange.start.line - 1, + column: pos.column - exprRange.start.character - 1 }, - documentRange: tr + documentRange: exprRange }; } } @@ -46,13 +47,14 @@ export function mapToExpressionPos(token: TemplateToken, position: Position): Ex return undefined; } - const tr = mapRange(token.expressionRange!); + const exprRange = mapRange(token.expressionRange!); return { expression: token.expression, + // Adjust the position to point into the expression position: { - line: pos.line - tr.start.line - 1, - column: pos.column - tr.start.character - 1 + line: pos.line - exprRange.start.line - 1, + column: pos.column - exprRange.start.character - 1 }, - documentRange: tr + documentRange: exprRange }; } diff --git a/actions-languageservice/src/expression-hover/visitor.test.ts b/actions-languageservice/src/expression-hover/visitor.test.ts index b0b7d1e..7d3ed87 100644 --- a/actions-languageservice/src/expression-hover/visitor.test.ts +++ b/actions-languageservice/src/expression-hover/visitor.test.ts @@ -99,7 +99,7 @@ describe("visitor", () => { async function hoverExpression(input: string) { const [td, pos] = getPositionFromCursor(input); - const allowedContext = ["github"]; //token.definitionInfo?.allowedContext || []; + const allowedContext = ["github"]; const file: File = { name: td.uri, @@ -114,7 +114,13 @@ async function hoverExpression(input: string) { const workflowContext = getWorkflowContext(td.uri, template, []); const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion); - const r = new HoverVisitor( + const l = new Lexer(td.getText()); + const lr = l.lex(); + + const p = new Parser(lr.tokens, ["github"], []); + const expr = p.parse(); + + const hv = new HoverVisitor( { line: pos.line, column: pos.character @@ -123,12 +129,5 @@ async function hoverExpression(input: string) { [], validatorFunctions ); - - const l = new Lexer(td.getText()); - const lr = l.lex(); - - const p = new Parser(lr.tokens, ["github"], []); - const expr = p.parse(); - - return r.hover(expr); + return hv.hover(expr); } diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 7d1211a..9db065c 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -139,25 +139,25 @@ function expressionHover( const p = new Parser(lr.tokens, namedContexts, functions); const expr = p.parse(); - const v = new HoverVisitor(position, context, [], validatorFunctions); - const hoverResult = v.hover(expr); + const hv = new HoverVisitor(position, context, [], validatorFunctions); + const hoverResult = hv.hover(expr); if (!hoverResult) { return null; } - const mr = hoverResult.range; + const exprRange = hoverResult.range; return { contents: hoverResult?.description || hoverResult?.label, // Map the expression range back to a document range range: { start: { - line: documentRange.start.line + mr.start.line, - character: documentRange.start.character + mr.start.column + line: documentRange.start.line + exprRange.start.line, + character: documentRange.start.character + exprRange.start.column }, end: { - line: documentRange.start.line + mr.end.line, - character: documentRange.start.character + mr.end.column + line: documentRange.start.line + exprRange.end.line, + character: documentRange.start.character + exprRange.end.column } } }; From 1faf6572b7c0f2bf3ae2040ac08ad928f5993bf8 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 13:14:02 -0800 Subject: [PATCH 18/52] Rename helper --- actions-languageservice/src/complete.ts | 7 ++----- actions-languageservice/src/hover.ts | 15 ++++++--------- .../{type-guards.ts => expression-detection.ts} | 6 +++--- 3 files changed, 11 insertions(+), 17 deletions(-) rename actions-languageservice/src/utils/{type-guards.ts => expression-detection.ts} (80%) diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 5ba7678..a028bd1 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -21,12 +21,12 @@ import {getWorkflowContext, WorkflowContext} from "./context/workflow-context"; import {validatorFunctions} from "./expression-validation/functions"; import {error} from "./log"; import {nullTrace} from "./nulltrace"; +import {isPotentiallyExpression} from "./utils/expression-detection"; import {findToken} from "./utils/find-token"; import {guessIndentation} from "./utils/indentation-guesser"; import {mapRange} from "./utils/range"; import {getRelCharOffset} from "./utils/rel-char-pos"; import {transform} from "./utils/transform"; -import {isStringExpression} from "./utils/type-guards"; import {Value, ValueProviderConfig} from "./value-providers/config"; import {defaultValueProviders} from "./value-providers/default"; import {definitionValues} from "./value-providers/definition"; @@ -77,10 +77,7 @@ export async function complete( // If we are inside an expression, take a different code-path. The workflow parser does not correctly create // expression nodes for invalid expressions and during editing expressions are invalid most of the time. if (token) { - const isStringExpressionToken = isStringExpression(token); - const isBasicExpressionToken = isBasicExpression(token); - - if (isStringExpressionToken || isBasicExpressionToken) { + if (isBasicExpression(token) || isPotentiallyExpression(token)) { const allowedContext = token.definitionInfo?.allowedContext || []; const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion); diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 9db065c..2c86c0f 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -19,9 +19,9 @@ import {HoverVisitor} from "./expression-hover/visitor"; import {validatorFunctions} from "./expression-validation/functions"; import {info} from "./log"; import {nullTrace} from "./nulltrace"; +import {isPotentiallyExpression} from "./utils/expression-detection"; import {findToken, TokenResult} from "./utils/find-token"; import {mapRange} from "./utils/range"; -import {isStringExpression} from "./utils/type-guards"; export type HoverConfig = { descriptionProvider?: DescriptionProvider; @@ -45,15 +45,12 @@ export async function hover(document: TextDocument, position: Position, config?: const tokenResult = findToken(position, result.value); const {token, keyToken, parent} = tokenResult; - const hoverToken = keyToken || parent || token; - if (config?.contextProviderConfig && token && hoverToken?.definition) { - const isStringExpressionToken = isStringExpression(token); - const isBasicExpressionToken = isBasicExpression(token); + const tokenDefinitionInfo = (keyToken || parent || token)?.definitionInfo; + if (config?.contextProviderConfig && token && tokenDefinitionInfo) { + if (isBasicExpression(token) || isPotentiallyExpression(token)) { + info(`Calculating expression hover for token with definition ${tokenDefinitionInfo.definition.key}`); - if (isStringExpressionToken || isBasicExpressionToken) { - info(`Calculating expression hover for token with definition ${hoverToken.definition.key}`); - - const allowedContext = hoverToken.definitionInfo?.allowedContext || []; + const allowedContext = tokenDefinitionInfo.allowedContext || []; const {namedContexts, functions} = splitAllowedContext(allowedContext); const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); diff --git a/actions-languageservice/src/utils/type-guards.ts b/actions-languageservice/src/utils/expression-detection.ts similarity index 80% rename from actions-languageservice/src/utils/type-guards.ts rename to actions-languageservice/src/utils/expression-detection.ts index 62fbe2e..2242d8a 100644 --- a/actions-languageservice/src/utils/type-guards.ts +++ b/actions-languageservice/src/utils/expression-detection.ts @@ -4,9 +4,9 @@ import {StringDefinition} from "@github/actions-workflow-parser/templates/schema import {OPEN_EXPRESSION} from "@github/actions-workflow-parser/templates/template-constants"; import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/index"; -export function isStringExpression(token: TemplateToken): boolean { - const isExpression = +export function isPotentiallyExpression(token: TemplateToken): boolean { + const isAlwaysExpression = token.definition?.definitionType === DefinitionType.String && (token.definition as StringDefinition).isExpression; const containsExpression = isString(token) && token.value.indexOf(OPEN_EXPRESSION) >= 0; - return isExpression || containsExpression; + return isAlwaysExpression || containsExpression; } From 4ca197b311dc3f73031553f3c4125c6b581d35ad Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Feb 2023 21:42:57 +0000 Subject: [PATCH 19/52] v0.1.115 --- 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 5854a48..93007eb 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.114", + "version": "0.1.115", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index c3e3b2b..b244466 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.114", + "version": "0.1.115", "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.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-languageservice": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "@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 a43f14b..fe3c048 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.114", + "version": "0.1.115", "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.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-expressions": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "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 17f9f0e..dc78267 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.114", + "version": "0.1.115", "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.114", + "@github/actions-expressions": "^0.1.115", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 80a9380..169feab 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.114", + "version": "0.1.115", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.114", + "@github/actions-languageserver": "^0.1.115", "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 c42ddb6..78d23b7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.114" + "version": "0.1.115" } diff --git a/package-lock.json b/package-lock.json index 5d35c47..d02724b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.114", + "version": "0.1.115", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.114", + "version": "0.1.115", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-languageservice": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "@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.114", + "version": "0.1.115", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-expressions": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "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.114", + "version": "0.1.115", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.114", + "@github/actions-expressions": "^0.1.115", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.114", + "version": "0.1.115", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.114", + "@github/actions-languageserver": "^0.1.115", "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.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-languageservice": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "@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.114", - "@github/actions-workflow-parser": "^0.1.114", + "@github/actions-expressions": "^0.1.115", + "@github/actions-workflow-parser": "^0.1.115", "@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.114", + "@github/actions-expressions": "^0.1.115", "@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.114", + "@github/actions-languageserver": "^0.1.115", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 6b5d32d7af7b6de871db705ed25a4b05792f12f8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Feb 2023 23:20:52 +0000 Subject: [PATCH 20/52] v0.1.116 --- 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 93007eb..ca9b114 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.115", + "version": "0.1.116", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index b244466..1e37ace 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.115", + "version": "0.1.116", "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.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-languageservice": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "@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 fe3c048..82f4c6a 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.115", + "version": "0.1.116", "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.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-expressions": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "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 dc78267..1b087d4 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.115", + "version": "0.1.116", "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.115", + "@github/actions-expressions": "^0.1.116", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 169feab..0f86bee 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.115", + "version": "0.1.116", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.115", + "@github/actions-languageserver": "^0.1.116", "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 78d23b7..6bade6d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.115" + "version": "0.1.116" } diff --git a/package-lock.json b/package-lock.json index d02724b..ed2a1da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.115", + "version": "0.1.116", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.115", + "version": "0.1.116", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-languageservice": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "@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.115", + "version": "0.1.116", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-expressions": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "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.115", + "version": "0.1.116", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.115", + "@github/actions-expressions": "^0.1.116", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.115", + "version": "0.1.116", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.115", + "@github/actions-languageserver": "^0.1.116", "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.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-languageservice": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "@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.115", - "@github/actions-workflow-parser": "^0.1.115", + "@github/actions-expressions": "^0.1.116", + "@github/actions-workflow-parser": "^0.1.116", "@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.115", + "@github/actions-expressions": "^0.1.116", "@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.115", + "@github/actions-languageserver": "^0.1.116", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From a9f469632c93778b8bb713f3d633116bd0e30d20 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 15:48:03 -0800 Subject: [PATCH 21/52] Even with the default context provider config can we show expression hover --- actions-languageservice/src/hover.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 2c86c0f..d6dbdee 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -46,7 +46,7 @@ export async function hover(document: TextDocument, position: Position, config?: const {token, keyToken, parent} = tokenResult; const tokenDefinitionInfo = (keyToken || parent || token)?.definitionInfo; - if (config?.contextProviderConfig && token && tokenDefinitionInfo) { + if (token && tokenDefinitionInfo) { if (isBasicExpression(token) || isPotentiallyExpression(token)) { info(`Calculating expression hover for token with definition ${tokenDefinitionInfo.definition.key}`); @@ -55,7 +55,7 @@ export async function hover(document: TextDocument, position: Position, config?: const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path); - const context = await getContext(namedContexts, config.contextProviderConfig, workflowContext, Mode.Completion); + const context = await getContext(namedContexts, config?.contextProviderConfig, workflowContext, Mode.Completion); const exprPos = mapToExpressionPos(token, position); if (exprPos) { From 36f879de6cd2615c72e8f05c6bd913ca8076e699 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Feb 2023 23:56:23 +0000 Subject: [PATCH 22/52] v0.1.117 --- 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 ca9b114..2232eb5 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.116", + "version": "0.1.117", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 1e37ace..7df2517 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.116", + "version": "0.1.117", "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.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-languageservice": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "@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 82f4c6a..7a34257 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.116", + "version": "0.1.117", "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.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-expressions": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "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 1b087d4..47a7c7a 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.116", + "version": "0.1.117", "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.116", + "@github/actions-expressions": "^0.1.117", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 0f86bee..67aa2fc 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.116", + "version": "0.1.117", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.116", + "@github/actions-languageserver": "^0.1.117", "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 6bade6d..3cc3adf 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.116" + "version": "0.1.117" } diff --git a/package-lock.json b/package-lock.json index ed2a1da..3b03b36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.116", + "version": "0.1.117", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.116", + "version": "0.1.117", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-languageservice": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "@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.116", + "version": "0.1.117", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-expressions": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "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.116", + "version": "0.1.117", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.116", + "@github/actions-expressions": "^0.1.117", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.116", + "version": "0.1.117", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.116", + "@github/actions-languageserver": "^0.1.117", "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.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-languageservice": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "@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.116", - "@github/actions-workflow-parser": "^0.1.116", + "@github/actions-expressions": "^0.1.117", + "@github/actions-workflow-parser": "^0.1.117", "@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.116", + "@github/actions-expressions": "^0.1.117", "@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.116", + "@github/actions-languageserver": "^0.1.117", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From fe16d1a1ed13d605e6a958a16b56c2d899a69a7c Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 16:57:28 -0500 Subject: [PATCH 23/52] Add initial support for converting reusable wf jobs --- .../src/context-providers/env.ts | 6 +- .../src/context-providers/job.ts | 3 +- .../src/context-providers/needs.ts | 14 +- .../src/context-providers/steps.ts | 3 +- .../src/context/workflow-context.ts | 10 +- actions-languageservice/src/document-links.ts | 6 +- .../src/workflow-provider.ts | 5 + .../src/model/converter/base-job.ts | 66 ++++++ .../src/model/converter/job.ts | 70 ++++++ .../src/model/converter/job/runs-on.ts | 102 +++++++++ .../src/model/converter/jobs.ts | 207 +----------------- .../src/model/converter/reusable-job.ts | 34 +++ .../src/model/type-guards.ts | 10 +- .../src/model/workflow-template.ts | 23 +- 14 files changed, 335 insertions(+), 224 deletions(-) create mode 100644 actions-languageservice/src/workflow-provider.ts create mode 100644 actions-workflow-parser/src/model/converter/base-job.ts create mode 100644 actions-workflow-parser/src/model/converter/job.ts create mode 100644 actions-workflow-parser/src/model/converter/job/runs-on.ts create mode 100644 actions-workflow-parser/src/model/converter/reusable-job.ts diff --git a/actions-languageservice/src/context-providers/env.ts b/actions-languageservice/src/context-providers/env.ts index 5aa22cb..8aaeaf4 100644 --- a/actions-languageservice/src/context-providers/env.ts +++ b/actions-languageservice/src/context-providers/env.ts @@ -1,5 +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 {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {WorkflowContext} from "../context/workflow-context"; @@ -12,8 +13,9 @@ export function getEnvContext(workflowContext: WorkflowContext): DescriptionDict } //job env - if (workflowContext.job && workflowContext.job.env) { - envContext(workflowContext.job.env, d); + const job = workflowContext.job; + if (job && isJob(job) && job.env) { + envContext(job.env, d); } //workflow env diff --git a/actions-languageservice/src/context-providers/job.ts b/actions-languageservice/src/context-providers/job.ts index 6c37ab6..5adf7e4 100644 --- a/actions-languageservice/src/context-providers/job.ts +++ b/actions-languageservice/src/context-providers/job.ts @@ -1,5 +1,6 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {isMapping, isSequence} from "@github/actions-workflow-parser"; +import {isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {WorkflowContext} from "../context/workflow-context"; @@ -7,7 +8,7 @@ export function getJobContext(workflowContext: WorkflowContext): DescriptionDict // https://docs.github.com/en/actions/learn-github-actions/contexts#job-context const jobContext = new DescriptionDictionary(); const job = workflowContext.job; - if (!job) { + if (!job || isReusableWorkflowJob(job)) { return jobContext; } diff --git a/actions-languageservice/src/context-providers/needs.ts b/actions-languageservice/src/context-providers/needs.ts index e6cb66d..455bfd5 100644 --- a/actions-languageservice/src/context-providers/needs.ts +++ b/actions-languageservice/src/context-providers/needs.ts @@ -1,6 +1,7 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {isScalar, isString} from "@github/actions-workflow-parser"; -import {Job} from "@github/actions-workflow-parser/model/workflow-template"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; +import {Job, WorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; import {WorkflowContext} from "../context/workflow-context"; export function getNeedsContext(workflowContext: WorkflowContext): DescriptionDictionary { @@ -17,20 +18,21 @@ export function getNeedsContext(workflowContext: WorkflowContext): DescriptionDi return d; } -function needsJobContext(job?: Job): DescriptionDictionary { +function needsJobContext(job?: WorkflowJob): DescriptionDictionary { // https://docs.github.com/en/actions/learn-github-actions/contexts#needs-context const d = new DescriptionDictionary(); - d.add("outputs", jobOutputs(job)); - + if (job && isJob(job)) { + d.add("outputs", jobOutputs(job)); + } // Can be "success", "failure", "cancelled", or "skipped" d.add("result", new data.Null()); return d; } -function jobOutputs(job?: Job): DescriptionDictionary { +function jobOutputs(job: Job): DescriptionDictionary { const d = new DescriptionDictionary(); - if (!job?.outputs) { + if (!job.outputs) { return d; } diff --git a/actions-languageservice/src/context-providers/steps.ts b/actions-languageservice/src/context-providers/steps.ts index b07b18e..fb2d76d 100644 --- a/actions-languageservice/src/context-providers/steps.ts +++ b/actions-languageservice/src/context-providers/steps.ts @@ -1,11 +1,12 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; +import {isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {Step} from "@github/actions-workflow-parser/model/workflow-template"; import {WorkflowContext} from "../context/workflow-context"; import {getDescription} from "./descriptions"; export function getStepsContext(workflowContext: WorkflowContext): DescriptionDictionary { const d = new DescriptionDictionary(); - if (!workflowContext.job?.steps) { + if (!workflowContext.job || isReusableWorkflowJob(workflowContext.job)) { return d; } diff --git a/actions-languageservice/src/context/workflow-context.ts b/actions-languageservice/src/context/workflow-context.ts index 6ba3f28..2b77a24 100644 --- a/actions-languageservice/src/context/workflow-context.ts +++ b/actions-languageservice/src/context/workflow-context.ts @@ -1,5 +1,6 @@ import {isMapping, isSequence, WorkflowTemplate} from "@github/actions-workflow-parser"; -import {Job, Step} from "@github/actions-workflow-parser/model/workflow-template"; +import {isJob, isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; +import {Step, WorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {SequenceToken} from "@github/actions-workflow-parser/templates/tokens/sequence-token"; import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; @@ -11,7 +12,7 @@ export interface WorkflowContext { template: WorkflowTemplate | undefined; /** If the context is for a position within a job, this will be the job */ - job?: Job; + job?: WorkflowJob; /** If the context is for a position within a step, this will be the step */ step?: Step; @@ -54,7 +55,10 @@ export function getWorkflowContext( } } - context.step = findStep(context.job?.steps, stepsSequence, stepToken); + if (context.job && isJob(context.job)) { + context.step = findStep(context.job.steps, stepsSequence, stepToken); + } + return context; } diff --git a/actions-languageservice/src/document-links.ts b/actions-languageservice/src/document-links.ts index 8bc17cb..cd739c0 100644 --- a/actions-languageservice/src/document-links.ts +++ b/actions-languageservice/src/document-links.ts @@ -1,5 +1,6 @@ import {convertWorkflowTemplate, parseWorkflow} from "@github/actions-workflow-parser"; import {ErrorPolicy} from "@github/actions-workflow-parser/model/convert"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; import {File} from "@github/actions-workflow-parser/workflows/file"; import {TextDocument} from "vscode-languageserver-textdocument"; import {DocumentLink} from "vscode-languageserver-types"; @@ -27,7 +28,10 @@ export async function documentLinks(document: TextDocument): Promise Promise; +}; diff --git a/actions-workflow-parser/src/model/converter/base-job.ts b/actions-workflow-parser/src/model/converter/base-job.ts new file mode 100644 index 0000000..0b1d02e --- /dev/null +++ b/actions-workflow-parser/src/model/converter/base-job.ts @@ -0,0 +1,66 @@ +import {TemplateContext} from "../../templates/template-context"; +import {StringToken, MappingToken, BasicExpressionToken} from "../../templates/tokens"; +import {isSequence, isString} from "../../templates/tokens/type-guards"; +import {BaseJob} from "../workflow-template"; +import {convertConcurrency} from "./concurrency"; +import {handleTemplateTokenErrors} from "./handle-errors"; +import {IdBuilder} from "./id-builder"; + +export function convertBaseJob( + context: TemplateContext, + jobKey: StringToken, + token: MappingToken +): Omit { + const error = new IdBuilder().tryAddKnownId(jobKey.value); + if (error) { + context.error(jobKey, error); + } + + const result: Omit = { + id: jobKey, + name: undefined, + needs: undefined, + if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), + concurrency: undefined, + strategy: undefined + }; + + for (const item of token) { + const propertyName = item.key.assertString("job property name"); + switch (propertyName.value) { + case "concurrency": + handleTemplateTokenErrors(item.value, context, undefined, () => convertConcurrency(context, item.value)); + result.concurrency = item.value; + break; + + case "name": + result.name = item.value.assertScalar("job name"); + break; + + case "needs": + result.needs = []; + if (isString(item.value)) { + const jobNeeds = item.value.assertString("job needs id"); + result.needs.push(jobNeeds); + } + + if (isSequence(item.value)) { + for (const seqItem of item.value) { + const jobNeeds = seqItem.assertString("job needs id"); + result.needs.push(jobNeeds); + } + } + break; + + case "strategy": + result.strategy = item.value; + break; + } + } + + if (!result.name) { + result.name = result.id; + } + + return result; +} diff --git a/actions-workflow-parser/src/model/converter/job.ts b/actions-workflow-parser/src/model/converter/job.ts new file mode 100644 index 0000000..4fda96b --- /dev/null +++ b/actions-workflow-parser/src/model/converter/job.ts @@ -0,0 +1,70 @@ +import {TemplateContext} from "../../templates/template-context"; +import {StringToken, MappingToken} from "../../templates/tokens"; +import {Job} from "../workflow-template"; +import {convertBaseJob} from "./base-job"; +import {convertToJobContainer, convertToJobServices} from "./container"; +import {handleTemplateTokenErrors} from "./handle-errors"; +import {convertToActionsEnvironmentRef} from "./job/environment"; +import {convertRunsOn} from "./job/runs-on"; +import {convertSteps} from "./steps"; + +export function convertJob(context: TemplateContext, jobKey: StringToken, token: MappingToken): Job { + const base = convertBaseJob(context, jobKey, token); + const result: Job = { + type: "job", + id: base.id, + name: base.name, + needs: base.needs, + if: base.if, + env: undefined, + concurrency: base.concurrency, + environment: undefined, + strategy: base.strategy, + "runs-on": undefined, + container: undefined, + services: undefined, + outputs: undefined, + steps: [] + }; + + for (const item of token) { + const propertyName = item.key.assertString("job property name"); + switch (propertyName.value) { + case "container": + convertToJobContainer(context, item.value); + result.container = item.value; + break; + + case "env": + result.env = item.value.assertMapping("job env"); + break; + + case "environment": + handleTemplateTokenErrors(item.value, context, undefined, () => + convertToActionsEnvironmentRef(context, item.value) + ); + result.environment = item.value; + break; + + case "outputs": + result.outputs = item.value.assertMapping("job outputs"); + break; + + case "runs-on": + handleTemplateTokenErrors(item.value, context, undefined, () => convertRunsOn(context, item.value)); + result["runs-on"] = item.value; + break; + + case "services": + convertToJobServices(context, item.value); + result.services = item.value; + break; + + case "steps": + result.steps = convertSteps(context, item.value); + break; + } + } + + return result; +} diff --git a/actions-workflow-parser/src/model/converter/job/runs-on.ts b/actions-workflow-parser/src/model/converter/job/runs-on.ts new file mode 100644 index 0000000..c96da91 --- /dev/null +++ b/actions-workflow-parser/src/model/converter/job/runs-on.ts @@ -0,0 +1,102 @@ +import {TemplateContext} from "../../../templates/template-context"; +import {TemplateToken} from "../../../templates/tokens"; +import {isMapping, isString, isSequence} from "../../../templates/tokens/type-guards"; + +type RunsOn = { + labels: Set; + group: string; +}; + +export function convertRunsOn(context: TemplateContext, token: TemplateToken): RunsOn { + const labels = convertRunsOnLabels(token); + + if (!isMapping(token)) { + return { + labels, + group: "" + }; + } + + let group = ""; + + for (const item of token) { + const key = item.key.assertString("job runs-on property name"); + switch (key.value) { + case "group": { + if (item.value.isExpression) { + continue; + } + + const groupName = item.value.assertString("job runs-on group name").value; + const names = groupName.split("/"); + switch (names.length) { + case 1: { + group = groupName; + break; + } + case 2: { + if (!["org", "organization", "ent", "enterprise"].includes(names[0])) { + context.error( + item.value, + `Invalid runs-on group name '${groupName}. Please use 'organization/' or 'enterprise/' prefix to target a single runner group.'` + ); + continue; + } + if (!names[1]) { + context.error(item.value, `Invalid runs-on group name '${groupName}'.`); + continue; + } + + group = groupName; + break; + } + default: { + context.error( + item.value, + `Invalid runs-on group name '${groupName}. Please use 'organization/' or 'enterprise/' prefix to target a single runner group.'` + ); + break; + } + } + break; + } + case "labels": { + const mapLabels = convertRunsOnLabels(item.value); + for (const label of mapLabels) { + labels.add(label); + } + break; + } + } + } + + return { + labels, + group + }; +} + +function convertRunsOnLabels(token: TemplateToken): Set { + const labels = new Set(); + if (token.isExpression) { + return labels; + } + + if (isString(token)) { + labels.add(token.value); + return labels; + } + + if (isSequence(token)) { + for (const item of token) { + if (item.isExpression) { + continue; + } + + const label = item.assertString("job runs-on label sequence item"); + labels.add(label.value); + } + } + + return labels; +} diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index ac31142..5aab4c5 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -1,14 +1,10 @@ import {TemplateContext} from "../../templates/template-context"; -import {BasicExpressionToken, MappingToken, StringToken} from "../../templates/tokens"; +import {StringToken} from "../../templates/tokens"; import {TemplateToken} from "../../templates/tokens/template-token"; -import {isMapping, isSequence, isString} from "../../templates/tokens/type-guards"; +import {isMapping} from "../../templates/tokens/type-guards"; import {Job} from "../workflow-template"; -import {convertConcurrency} from "./concurrency"; -import {convertToJobContainer, convertToJobServices} from "./container"; import {handleTemplateTokenErrors} from "./handle-errors"; -import {IdBuilder} from "./id-builder"; -import {convertToActionsEnvironmentRef} from "./job/environment"; -import {convertSteps} from "./steps"; +import {convertJob} from "./job"; type nodeInfo = { name: string; @@ -100,200 +96,3 @@ function validateNeeds( } } } - -function convertJob(context: TemplateContext, jobKey: StringToken, token: MappingToken): Job { - const error = new IdBuilder().tryAddKnownId(jobKey.value); - if (error) { - context.error(jobKey, error); - } - const result: Job = { - type: "job", - id: jobKey, - name: undefined, - needs: undefined, - if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), - env: undefined, - concurrency: undefined, - environment: undefined, - strategy: undefined, - "runs-on": undefined, - container: undefined, - services: undefined, - outputs: undefined, - steps: [] - }; - - for (const item of token) { - const propertyName = item.key.assertString("job property name"); - switch (propertyName.value) { - case "concurrency": - handleTemplateTokenErrors(item.value, context, undefined, () => convertConcurrency(context, item.value)); - result.concurrency = item.value; - break; - - case "container": - // Do early validation, but don't convert - convertToJobContainer(context, item.value); - result.container = item.value; - break; - - case "env": - result.env = item.value.assertMapping("job env"); - break; - - case "environment": - handleTemplateTokenErrors(item.value, context, undefined, () => - convertToActionsEnvironmentRef(context, item.value) - ); - result.environment = item.value; - break; - - case "name": - result.name = item.value.assertScalar("job name"); - break; - - case "needs": - result.needs = []; - if (isString(item.value)) { - const jobNeeds = item.value.assertString("job needs id"); - result.needs.push(jobNeeds); - } - - if (isSequence(item.value)) { - for (const seqItem of item.value) { - const jobNeeds = seqItem.assertString("job needs id"); - result.needs.push(jobNeeds); - } - } - break; - - case "outputs": - result.outputs = item.value.assertMapping("job outputs"); - break; - - case "runs-on": - handleTemplateTokenErrors(item.value, context, undefined, () => convertRunsOn(context, item.value)); - result["runs-on"] = item.value; - break; - - case "services": - // Do early validation, but don't convert - convertToJobServices(context, item.value); - result.services = item.value; - break; - - case "steps": - result.steps = convertSteps(context, item.value); - break; - - case "strategy": - result.strategy = item.value; - break; - } - } - - if (!result.name) { - result.name = result.id; - } - - return result; -} - -type RunsOn = { - labels: Set; - group: string; -}; - -function convertRunsOn(context: TemplateContext, token: TemplateToken): RunsOn { - const labels = convertRunsOnLabels(token); - - if (!isMapping(token)) { - return { - labels, - group: "" - }; - } - - let group = ""; - - for (const item of token) { - const key = item.key.assertString("job runs-on property name"); - switch (key.value) { - case "group": { - if (item.value.isExpression) { - continue; - } - - const groupName = item.value.assertString("job runs-on group name").value; - const names = groupName.split("/"); - switch (names.length) { - case 1: { - group = groupName; - break; - } - case 2: { - if (!["org", "organization", "ent", "enterprise"].includes(names[0])) { - context.error( - item.value, - `Invalid runs-on group name '${groupName}. Please use 'organization/' or 'enterprise/' prefix to target a single runner group.'` - ); - continue; - } - if (!names[1]) { - context.error(item.value, `Invalid runs-on group name '${groupName}'.`); - continue; - } - - group = groupName; - break; - } - default: { - context.error( - item.value, - `Invalid runs-on group name '${groupName}. Please use 'organization/' or 'enterprise/' prefix to target a single runner group.'` - ); - break; - } - } - break; - } - case "labels": { - const mapLabels = convertRunsOnLabels(item.value); - for (const label of mapLabels) { - labels.add(label); - } - break; - } - } - } - - return { - labels, - group - }; -} - -function convertRunsOnLabels(token: TemplateToken): Set { - const labels = new Set(); - if (token.isExpression) { - return labels; - } - - if (isString(token)) { - labels.add(token.value); - return labels; - } - - if (isSequence(token)) { - for (const item of token) { - if (item.isExpression) { - continue; - } - - const label = item.assertString("job runs-on label sequence item"); - labels.add(label.value); - } - } - - return labels; -} diff --git a/actions-workflow-parser/src/model/converter/reusable-job.ts b/actions-workflow-parser/src/model/converter/reusable-job.ts new file mode 100644 index 0000000..6c75ff3 --- /dev/null +++ b/actions-workflow-parser/src/model/converter/reusable-job.ts @@ -0,0 +1,34 @@ +import {TemplateContext} from "../../templates/template-context"; +import {MappingToken, StringToken} from "../../templates/tokens"; +import {ReusableWorkflowJob} from "../workflow-template"; +import {convertBaseJob} from "./base-job"; + +export function convertResuableWorkflowJob( + context: TemplateContext, + jobKey: StringToken, + token: MappingToken +): ReusableWorkflowJob { + const base = convertBaseJob(context, jobKey, token); + + const result: ReusableWorkflowJob = { + type: "job", + id: base.id, + name: base.name, + needs: base.needs, + if: base.if, + concurrency: base.concurrency, + strategy: base.strategy, + uses: new StringToken(undefined, undefined, "undefined", undefined, undefined) + }; + + for (const item of token) { + const propertyName = item.key.assertString("job property name"); + switch (propertyName.value) { + case "uses": + result.uses = item.value.assertString("job item uses"); + break; + } + } + + return result; +} diff --git a/actions-workflow-parser/src/model/type-guards.ts b/actions-workflow-parser/src/model/type-guards.ts index a1e09c0..bd201c1 100644 --- a/actions-workflow-parser/src/model/type-guards.ts +++ b/actions-workflow-parser/src/model/type-guards.ts @@ -1,4 +1,4 @@ -import {ActionStep, RunStep, Step} from "./workflow-template"; +import {ActionStep, Job, ReusableWorkflowJob, RunStep, Step} from "./workflow-template"; export function isRunStep(step: Step): step is RunStep { return (step as RunStep).run !== undefined; @@ -7,3 +7,11 @@ export function isRunStep(step: Step): step is RunStep { export function isActionStep(step: Step): step is ActionStep { return (step as ActionStep).uses !== undefined; } + +export function isJob(job: Job | ReusableWorkflowJob): job is Job { + return job.type === "job"; +} + +export function isReusableWorkflowJob(job: Job | ReusableWorkflowJob): job is ReusableWorkflowJob { + return job.type === "reusableWorkflowJob"; +} diff --git a/actions-workflow-parser/src/model/workflow-template.ts b/actions-workflow-parser/src/model/workflow-template.ts index 2ede8f5..c50a20e 100644 --- a/actions-workflow-parser/src/model/workflow-template.ts +++ b/actions-workflow-parser/src/model/workflow-template.ts @@ -9,7 +9,7 @@ import { export type WorkflowTemplate = { events: EventsConfig; - jobs: Job[]; + jobs: WorkflowJob[]; concurrency: TemplateToken; env: TemplateToken; @@ -28,16 +28,24 @@ export type ActionsEnvironmentReference = { url?: TemplateToken; }; -export type Job = { - type: string; +export type WorkflowJob = Job | ReusableWorkflowJob; + +export type JobType = "job" | "reusableWorkflowJob"; + +export type BaseJob = { + type: JobType; id: StringToken; name?: ScalarToken; needs?: StringToken[]; if: BasicExpressionToken; - env?: MappingToken; concurrency?: TemplateToken; - environment?: TemplateToken; strategy?: TemplateToken; +}; + +// `job-factory` in the schema +export type Job = BaseJob & { + env?: MappingToken; + environment?: TemplateToken; "runs-on"?: TemplateToken; container?: TemplateToken; services?: TemplateToken; @@ -45,6 +53,11 @@ export type Job = { steps: Step[]; }; +// `workflow-job` in the schema +export type ReusableWorkflowJob = BaseJob & { + uses: StringToken; +}; + export type Container = { image: StringToken; credentials?: Credential; From 6124e78f28536e63ab7592c15a0ddbcc97ac0817 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 16:57:44 -0500 Subject: [PATCH 24/52] Add missing `.prettierignore` files --- actions-expressions/.prettierignore | 5 +++++ actions-languageserver/.prettierignore | 5 +++++ actions-workflow-parser/.prettierignore | 5 +++++ browser-playground/.prettierignore | 5 +++++ 4 files changed, 20 insertions(+) create mode 100644 actions-expressions/.prettierignore create mode 100644 actions-languageserver/.prettierignore create mode 100644 actions-workflow-parser/.prettierignore create mode 100644 browser-playground/.prettierignore diff --git a/actions-expressions/.prettierignore b/actions-expressions/.prettierignore new file mode 100644 index 0000000..ce98533 --- /dev/null +++ b/actions-expressions/.prettierignore @@ -0,0 +1,5 @@ +node_modules +dist +*.md +*.js +*.json diff --git a/actions-languageserver/.prettierignore b/actions-languageserver/.prettierignore new file mode 100644 index 0000000..ce98533 --- /dev/null +++ b/actions-languageserver/.prettierignore @@ -0,0 +1,5 @@ +node_modules +dist +*.md +*.js +*.json diff --git a/actions-workflow-parser/.prettierignore b/actions-workflow-parser/.prettierignore new file mode 100644 index 0000000..ce98533 --- /dev/null +++ b/actions-workflow-parser/.prettierignore @@ -0,0 +1,5 @@ +node_modules +dist +*.md +*.js +*.json diff --git a/browser-playground/.prettierignore b/browser-playground/.prettierignore new file mode 100644 index 0000000..ce98533 --- /dev/null +++ b/browser-playground/.prettierignore @@ -0,0 +1,5 @@ +node_modules +dist +*.md +*.js +*.json From 574216178b791ab3fd9fed62367ccd88b815d49e Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:24:31 -0500 Subject: [PATCH 25/52] Fix `Job` references in language server --- .../src/context-providers/secrets.ts | 13 ++++++++----- .../src/context-providers/steps.ts | 7 ++++--- .../src/context-providers/variables.ts | 13 ++++++++----- .../src/test-utils/workflow-context.ts | 5 +++-- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/actions-languageserver/src/context-providers/secrets.ts b/actions-languageserver/src/context-providers/secrets.ts index 61c6ca0..85ad93d 100644 --- a/actions-languageserver/src/context-providers/secrets.ts +++ b/actions-languageserver/src/context-providers/secrets.ts @@ -2,6 +2,7 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {StringData} from "@github/actions-expressions/data/string"; import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; import {isMapping, isString} from "@github/actions-workflow-parser"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; import {Octokit} from "@octokit/rest"; import {RepositoryContext} from "../initializationOptions"; import {TTLCache} from "../utils/cache"; @@ -14,11 +15,13 @@ export async function getSecrets( defaultContext: DescriptionDictionary | undefined ): Promise { let environmentName: string | undefined; - if (workflowContext?.job?.environment) { - if (isString(workflowContext.job.environment)) { - environmentName = workflowContext.job.environment.value; - } else if (isMapping(workflowContext.job.environment)) { - for (const x of workflowContext.job.environment) { + const job = workflowContext?.job; + const environment = job && isJob(job) && job.environment; + if (environment) { + if (isString(environment)) { + environmentName = environment.value; + } else if (isMapping(environment)) { + for (const x of environment) { if (isString(x.key) && x.key.value === "name") { if (isString(x.value)) { environmentName = x.value.value; diff --git a/actions-languageserver/src/context-providers/steps.ts b/actions-languageserver/src/context-providers/steps.ts index eea315b..a3bed5e 100644 --- a/actions-languageserver/src/context-providers/steps.ts +++ b/actions-languageserver/src/context-providers/steps.ts @@ -1,7 +1,7 @@ import {data, DescriptionDictionary, isDescriptionDictionary} from "@github/actions-expressions"; import {parseActionReference} from "@github/actions-languageservice/action"; import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; -import {isActionStep} from "@github/actions-workflow-parser/model/type-guards"; +import {isActionStep, isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {Octokit} from "@octokit/rest"; import {TTLCache} from "../utils/cache"; import {getActionOutputs} from "./action-outputs"; @@ -12,7 +12,8 @@ export async function getStepsContext( defaultContext: DescriptionDictionary | undefined, workflowContext: WorkflowContext ): Promise { - if (!defaultContext || !workflowContext.job) { + const job = workflowContext.job; + if (!defaultContext || !job || isReusableWorkflowJob(job)) { return defaultContext; } @@ -26,7 +27,7 @@ export async function getStepsContext( // Copy the default context for each step // If the step is an action, add the action outputs to the context const stepsContext = new DescriptionDictionary(); - for (const step of workflowContext.job.steps) { + for (const step of job.steps) { if (!contextSteps.has(step.id)) { continue; } diff --git a/actions-languageserver/src/context-providers/variables.ts b/actions-languageserver/src/context-providers/variables.ts index 52babbd..d14b20b 100644 --- a/actions-languageserver/src/context-providers/variables.ts +++ b/actions-languageserver/src/context-providers/variables.ts @@ -6,6 +6,7 @@ import {Pair} from "@github/actions-expressions/data/expressiondata"; import {RepositoryContext} from "../initializationOptions"; import {StringData} from "@github/actions-expressions/data/index"; import {TTLCache} from "../utils/cache"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; export async function getVariables( workflowContext: WorkflowContext, @@ -15,11 +16,13 @@ export async function getVariables( defaultContext: DescriptionDictionary | undefined ): Promise { let environmentName: string | undefined; - if (workflowContext?.job?.environment) { - if (isString(workflowContext.job.environment)) { - environmentName = workflowContext.job.environment.value; - } else if (isMapping(workflowContext.job.environment)) { - for (const x of workflowContext.job.environment) { + const job = workflowContext?.job; + const environment = job && isJob(job) && job.environment; + if (environment) { + if (isString(environment)) { + environmentName = environment.value; + } else if (isMapping(environment)) { + for (const x of environment) { if (isString(x.key) && x.key.value === "name") { if (isString(x.value)) { environmentName = x.value.value; diff --git a/actions-languageserver/src/test-utils/workflow-context.ts b/actions-languageserver/src/test-utils/workflow-context.ts index aef5cfe..44b3654 100644 --- a/actions-languageserver/src/test-utils/workflow-context.ts +++ b/actions-languageserver/src/test-utils/workflow-context.ts @@ -1,5 +1,6 @@ import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; import {convertWorkflowTemplate, parseWorkflow, TraceWriter} from "@github/actions-workflow-parser"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; const nullTrace: TraceWriter = { info: x => {}, @@ -19,8 +20,8 @@ export function createWorkflowContext(workflow: string, job?: string, stepIndex? context.job = template.jobs.find(j => j.id.value === job); } - if (stepIndex !== undefined) { - context.step = context.job?.steps[stepIndex]; + if (stepIndex !== undefined && context.job && isJob(context.job)) { + context.step = context.job.steps[stepIndex]; } return context; From 04475e413f85e745aa6a5477f28aa1fa14630d39 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:27:15 -0500 Subject: [PATCH 26/52] Explicitly define `type` in each job --- actions-workflow-parser/src/model/workflow-template.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actions-workflow-parser/src/model/workflow-template.ts b/actions-workflow-parser/src/model/workflow-template.ts index c50a20e..508b424 100644 --- a/actions-workflow-parser/src/model/workflow-template.ts +++ b/actions-workflow-parser/src/model/workflow-template.ts @@ -44,6 +44,7 @@ export type BaseJob = { // `job-factory` in the schema export type Job = BaseJob & { + type: "job"; env?: MappingToken; environment?: TemplateToken; "runs-on"?: TemplateToken; @@ -55,6 +56,7 @@ export type Job = BaseJob & { // `workflow-job` in the schema export type ReusableWorkflowJob = BaseJob & { + type: "reusableWorkflowJob"; uses: StringToken; }; From 630a9d124e5556aa2eff12a444af0e1e8e93a839 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:28:48 -0500 Subject: [PATCH 27/52] Use `WorkflowJob` in type guards --- actions-workflow-parser/src/model/type-guards.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actions-workflow-parser/src/model/type-guards.ts b/actions-workflow-parser/src/model/type-guards.ts index bd201c1..60923f2 100644 --- a/actions-workflow-parser/src/model/type-guards.ts +++ b/actions-workflow-parser/src/model/type-guards.ts @@ -1,4 +1,4 @@ -import {ActionStep, Job, ReusableWorkflowJob, RunStep, Step} from "./workflow-template"; +import {ActionStep, Job, ReusableWorkflowJob, RunStep, Step, WorkflowJob} from "./workflow-template"; export function isRunStep(step: Step): step is RunStep { return (step as RunStep).run !== undefined; @@ -8,10 +8,10 @@ export function isActionStep(step: Step): step is ActionStep { return (step as ActionStep).uses !== undefined; } -export function isJob(job: Job | ReusableWorkflowJob): job is Job { +export function isJob(job: WorkflowJob): job is Job { return job.type === "job"; } -export function isReusableWorkflowJob(job: Job | ReusableWorkflowJob): job is ReusableWorkflowJob { +export function isReusableWorkflowJob(job: WorkflowJob): job is ReusableWorkflowJob { return job.type === "reusableWorkflowJob"; } From 3d5b006138d02c7ce7bb3e4c3898e90bb361141c Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:39:49 -0500 Subject: [PATCH 28/52] Fix reusable workflow job type --- actions-workflow-parser/src/model/converter/reusable-job.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-workflow-parser/src/model/converter/reusable-job.ts b/actions-workflow-parser/src/model/converter/reusable-job.ts index 6c75ff3..3eef8f3 100644 --- a/actions-workflow-parser/src/model/converter/reusable-job.ts +++ b/actions-workflow-parser/src/model/converter/reusable-job.ts @@ -11,7 +11,7 @@ export function convertResuableWorkflowJob( const base = convertBaseJob(context, jobKey, token); const result: ReusableWorkflowJob = { - type: "job", + type: "reusableWorkflowJob", id: base.id, name: base.name, needs: base.needs, From 986ce1bfe45a27a2f9e622a6d2bb7052fa5c576d Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:52:48 -0500 Subject: [PATCH 29/52] Separate reusable jobs in the workflow context --- .../src/context-providers/secrets.ts | 13 +++++-------- .../src/context-providers/steps.ts | 7 +++---- .../src/context-providers/variables.ts | 13 +++++-------- .../src/test-utils/workflow-context.ts | 5 ++--- .../src/context-providers/env.ts | 6 ++---- .../src/context-providers/job.ts | 3 +-- .../src/context-providers/needs.ts | 5 +++-- .../src/context-providers/steps.ts | 3 +-- .../src/context/workflow-context.ts | 19 +++++++++++++++---- 9 files changed, 37 insertions(+), 37 deletions(-) diff --git a/actions-languageserver/src/context-providers/secrets.ts b/actions-languageserver/src/context-providers/secrets.ts index 85ad93d..61c6ca0 100644 --- a/actions-languageserver/src/context-providers/secrets.ts +++ b/actions-languageserver/src/context-providers/secrets.ts @@ -2,7 +2,6 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {StringData} from "@github/actions-expressions/data/string"; import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; import {isMapping, isString} from "@github/actions-workflow-parser"; -import {isJob} from "@github/actions-workflow-parser/model/type-guards"; import {Octokit} from "@octokit/rest"; import {RepositoryContext} from "../initializationOptions"; import {TTLCache} from "../utils/cache"; @@ -15,13 +14,11 @@ export async function getSecrets( defaultContext: DescriptionDictionary | undefined ): Promise { let environmentName: string | undefined; - const job = workflowContext?.job; - const environment = job && isJob(job) && job.environment; - if (environment) { - if (isString(environment)) { - environmentName = environment.value; - } else if (isMapping(environment)) { - for (const x of environment) { + if (workflowContext?.job?.environment) { + if (isString(workflowContext.job.environment)) { + environmentName = workflowContext.job.environment.value; + } else if (isMapping(workflowContext.job.environment)) { + for (const x of workflowContext.job.environment) { if (isString(x.key) && x.key.value === "name") { if (isString(x.value)) { environmentName = x.value.value; diff --git a/actions-languageserver/src/context-providers/steps.ts b/actions-languageserver/src/context-providers/steps.ts index a3bed5e..eea315b 100644 --- a/actions-languageserver/src/context-providers/steps.ts +++ b/actions-languageserver/src/context-providers/steps.ts @@ -1,7 +1,7 @@ import {data, DescriptionDictionary, isDescriptionDictionary} from "@github/actions-expressions"; import {parseActionReference} from "@github/actions-languageservice/action"; import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; -import {isActionStep, isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; +import {isActionStep} from "@github/actions-workflow-parser/model/type-guards"; import {Octokit} from "@octokit/rest"; import {TTLCache} from "../utils/cache"; import {getActionOutputs} from "./action-outputs"; @@ -12,8 +12,7 @@ export async function getStepsContext( defaultContext: DescriptionDictionary | undefined, workflowContext: WorkflowContext ): Promise { - const job = workflowContext.job; - if (!defaultContext || !job || isReusableWorkflowJob(job)) { + if (!defaultContext || !workflowContext.job) { return defaultContext; } @@ -27,7 +26,7 @@ export async function getStepsContext( // Copy the default context for each step // If the step is an action, add the action outputs to the context const stepsContext = new DescriptionDictionary(); - for (const step of job.steps) { + for (const step of workflowContext.job.steps) { if (!contextSteps.has(step.id)) { continue; } diff --git a/actions-languageserver/src/context-providers/variables.ts b/actions-languageserver/src/context-providers/variables.ts index d14b20b..52babbd 100644 --- a/actions-languageserver/src/context-providers/variables.ts +++ b/actions-languageserver/src/context-providers/variables.ts @@ -6,7 +6,6 @@ import {Pair} from "@github/actions-expressions/data/expressiondata"; import {RepositoryContext} from "../initializationOptions"; import {StringData} from "@github/actions-expressions/data/index"; import {TTLCache} from "../utils/cache"; -import {isJob} from "@github/actions-workflow-parser/model/type-guards"; export async function getVariables( workflowContext: WorkflowContext, @@ -16,13 +15,11 @@ export async function getVariables( defaultContext: DescriptionDictionary | undefined ): Promise { let environmentName: string | undefined; - const job = workflowContext?.job; - const environment = job && isJob(job) && job.environment; - if (environment) { - if (isString(environment)) { - environmentName = environment.value; - } else if (isMapping(environment)) { - for (const x of environment) { + if (workflowContext?.job?.environment) { + if (isString(workflowContext.job.environment)) { + environmentName = workflowContext.job.environment.value; + } else if (isMapping(workflowContext.job.environment)) { + for (const x of workflowContext.job.environment) { if (isString(x.key) && x.key.value === "name") { if (isString(x.value)) { environmentName = x.value.value; diff --git a/actions-languageserver/src/test-utils/workflow-context.ts b/actions-languageserver/src/test-utils/workflow-context.ts index 44b3654..aef5cfe 100644 --- a/actions-languageserver/src/test-utils/workflow-context.ts +++ b/actions-languageserver/src/test-utils/workflow-context.ts @@ -1,6 +1,5 @@ import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; import {convertWorkflowTemplate, parseWorkflow, TraceWriter} from "@github/actions-workflow-parser"; -import {isJob} from "@github/actions-workflow-parser/model/type-guards"; const nullTrace: TraceWriter = { info: x => {}, @@ -20,8 +19,8 @@ export function createWorkflowContext(workflow: string, job?: string, stepIndex? context.job = template.jobs.find(j => j.id.value === job); } - if (stepIndex !== undefined && context.job && isJob(context.job)) { - context.step = context.job.steps[stepIndex]; + if (stepIndex !== undefined) { + context.step = context.job?.steps[stepIndex]; } return context; diff --git a/actions-languageservice/src/context-providers/env.ts b/actions-languageservice/src/context-providers/env.ts index 8aaeaf4..5aa22cb 100644 --- a/actions-languageservice/src/context-providers/env.ts +++ b/actions-languageservice/src/context-providers/env.ts @@ -1,6 +1,5 @@ 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 {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {WorkflowContext} from "../context/workflow-context"; @@ -13,9 +12,8 @@ export function getEnvContext(workflowContext: WorkflowContext): DescriptionDict } //job env - const job = workflowContext.job; - if (job && isJob(job) && job.env) { - envContext(job.env, d); + if (workflowContext.job && workflowContext.job.env) { + envContext(workflowContext.job.env, d); } //workflow env diff --git a/actions-languageservice/src/context-providers/job.ts b/actions-languageservice/src/context-providers/job.ts index 5adf7e4..6c37ab6 100644 --- a/actions-languageservice/src/context-providers/job.ts +++ b/actions-languageservice/src/context-providers/job.ts @@ -1,6 +1,5 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; import {isMapping, isSequence} from "@github/actions-workflow-parser"; -import {isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {WorkflowContext} from "../context/workflow-context"; @@ -8,7 +7,7 @@ export function getJobContext(workflowContext: WorkflowContext): DescriptionDict // https://docs.github.com/en/actions/learn-github-actions/contexts#job-context const jobContext = new DescriptionDictionary(); const job = workflowContext.job; - if (!job || isReusableWorkflowJob(job)) { + if (!job) { return jobContext; } diff --git a/actions-languageservice/src/context-providers/needs.ts b/actions-languageservice/src/context-providers/needs.ts index 455bfd5..e261b0d 100644 --- a/actions-languageservice/src/context-providers/needs.ts +++ b/actions-languageservice/src/context-providers/needs.ts @@ -25,14 +25,15 @@ function needsJobContext(job?: WorkflowJob): DescriptionDictionary { if (job && isJob(job)) { d.add("outputs", jobOutputs(job)); } + // Can be "success", "failure", "cancelled", or "skipped" d.add("result", new data.Null()); return d; } -function jobOutputs(job: Job): DescriptionDictionary { +function jobOutputs(job?: Job): DescriptionDictionary { const d = new DescriptionDictionary(); - if (!job.outputs) { + if (!job?.outputs) { return d; } diff --git a/actions-languageservice/src/context-providers/steps.ts b/actions-languageservice/src/context-providers/steps.ts index fb2d76d..b07b18e 100644 --- a/actions-languageservice/src/context-providers/steps.ts +++ b/actions-languageservice/src/context-providers/steps.ts @@ -1,12 +1,11 @@ import {data, DescriptionDictionary} from "@github/actions-expressions"; -import {isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {Step} from "@github/actions-workflow-parser/model/workflow-template"; import {WorkflowContext} from "../context/workflow-context"; import {getDescription} from "./descriptions"; export function getStepsContext(workflowContext: WorkflowContext): DescriptionDictionary { const d = new DescriptionDictionary(); - if (!workflowContext.job || isReusableWorkflowJob(workflowContext.job)) { + if (!workflowContext.job?.steps) { return d; } diff --git a/actions-languageservice/src/context/workflow-context.ts b/actions-languageservice/src/context/workflow-context.ts index 2b77a24..c4c20af 100644 --- a/actions-languageservice/src/context/workflow-context.ts +++ b/actions-languageservice/src/context/workflow-context.ts @@ -1,6 +1,6 @@ import {isMapping, isSequence, WorkflowTemplate} from "@github/actions-workflow-parser"; import {isJob, isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; -import {Step, WorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; +import {Step, Job, ReusableWorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/mapping-token"; import {SequenceToken} from "@github/actions-workflow-parser/templates/tokens/sequence-token"; import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; @@ -11,8 +11,11 @@ export interface WorkflowContext { template: WorkflowTemplate | undefined; - /** If the context is for a position within a job, this will be the job */ - job?: WorkflowJob; + /** If the context is for a position within a regular job, this will be the job */ + job?: Job; + + /** If the context is for a position within a reusable workflow job, this will be the reusable workflow job */ + reusableWorkflowJob?: ReusableWorkflowJob; /** If the context is for a position within a step, this will be the step */ step?: Step; @@ -36,7 +39,15 @@ export function getWorkflowContext( switch (token.definition?.key) { case "job": { const jobID = (token as StringToken).value; - context.job = template.jobs.find(job => job.id.value === jobID); + const job = template.jobs.find(job => job.id.value === jobID); + if (!job) { + break; + } + if (isJob(job)) { + context.job = job; + } else if (isReusableWorkflowJob(job)) { + context.reusableWorkflowJob = job; + } break; } case "steps": { From 2e953b26ea17a7e692b511fd6af064e27ded3d3f Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 3 Feb 2023 17:59:14 -0500 Subject: [PATCH 30/52] Support reusable workflow jobs in the test context --- .../src/test-utils/workflow-context.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/actions-languageserver/src/test-utils/workflow-context.ts b/actions-languageserver/src/test-utils/workflow-context.ts index aef5cfe..88eb740 100644 --- a/actions-languageserver/src/test-utils/workflow-context.ts +++ b/actions-languageserver/src/test-utils/workflow-context.ts @@ -1,5 +1,6 @@ import {WorkflowContext} from "@github/actions-languageservice/context/workflow-context"; import {convertWorkflowTemplate, parseWorkflow, TraceWriter} from "@github/actions-workflow-parser"; +import {isJob} from "@github/actions-workflow-parser/model/type-guards"; const nullTrace: TraceWriter = { info: x => {}, @@ -16,7 +17,14 @@ export function createWorkflowContext(workflow: string, job?: string, stepIndex? const context: WorkflowContext = {uri: "test.yaml", template}; if (job) { - context.job = template.jobs.find(j => j.id.value === job); + const workflowJob = template.jobs.find(j => j.id.value === job); + if (workflowJob) { + if (isJob(workflowJob)) { + context.job = workflowJob; + } else { + context.reusableWorkflowJob = workflowJob; + } + } } if (stepIndex !== undefined) { From c55066fbec4423131f35d4fda41ec75cad21fa80 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 15:39:23 +0000 Subject: [PATCH 31/52] v0.1.118 --- 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 2232eb5..59ce57d 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.117", + "version": "0.1.118", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 7df2517..505e242 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.117", + "version": "0.1.118", "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.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-languageservice": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "@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 7a34257..b19d16d 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.117", + "version": "0.1.118", "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.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-expressions": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "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 47a7c7a..784b2ec 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.117", + "version": "0.1.118", "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.117", + "@github/actions-expressions": "^0.1.118", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 67aa2fc..93567c9 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.117", + "version": "0.1.118", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.117", + "@github/actions-languageserver": "^0.1.118", "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 3cc3adf..e49754b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.117" + "version": "0.1.118" } diff --git a/package-lock.json b/package-lock.json index 3b03b36..6e3c44f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.117", + "version": "0.1.118", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.117", + "version": "0.1.118", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-languageservice": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "@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.117", + "version": "0.1.118", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-expressions": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "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.117", + "version": "0.1.118", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.117", + "@github/actions-expressions": "^0.1.118", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.117", + "version": "0.1.118", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.117", + "@github/actions-languageserver": "^0.1.118", "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.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-languageservice": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "@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.117", - "@github/actions-workflow-parser": "^0.1.117", + "@github/actions-expressions": "^0.1.118", + "@github/actions-workflow-parser": "^0.1.118", "@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.117", + "@github/actions-expressions": "^0.1.118", "@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.117", + "@github/actions-languageserver": "^0.1.118", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From f4dde16b61170f314bc538c79d1042bd89db5337 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 11:15:15 -0500 Subject: [PATCH 32/52] Add a `FileProvider` to `parseWorkflow` --- .../src/test-utils/workflow-context.ts | 2 +- actions-languageservice/src/complete.ts | 2 +- .../src/context/workflow-context.test.ts | 11 ++-- actions-languageservice/src/document-links.ts | 2 +- .../expression-hover/expression-pos.test.ts | 2 +- .../src/expression-hover/visitor.test.ts | 2 +- actions-languageservice/src/hover.ts | 2 +- .../src/utils/find-token.test.ts | 11 ++-- actions-languageservice/src/validate.ts | 2 +- .../src/workflow-provider.ts | 5 -- .../src/expressions.test.ts | 55 ++++++---------- actions-workflow-parser/src/index.test.ts | 46 +++++-------- .../src/model/convert.test.ts | 66 +++++++------------ .../templates/tokens/template-token.test.ts | 11 ++-- .../src/workflows/file-provider.ts | 3 + .../src/workflows/workflow-parser.test.ts | 2 +- .../src/workflows/workflow-parser.ts | 11 ++-- .../src/workflows/yaml-object-reader.test.ts | 11 ++-- actions-workflow-parser/src/xlang.test.ts | 11 ++-- 19 files changed, 96 insertions(+), 161 deletions(-) delete mode 100644 actions-languageservice/src/workflow-provider.ts create mode 100644 actions-workflow-parser/src/workflows/file-provider.ts diff --git a/actions-languageserver/src/test-utils/workflow-context.ts b/actions-languageserver/src/test-utils/workflow-context.ts index 88eb740..bd0ee97 100644 --- a/actions-languageserver/src/test-utils/workflow-context.ts +++ b/actions-languageserver/src/test-utils/workflow-context.ts @@ -9,7 +9,7 @@ const nullTrace: TraceWriter = { }; export function createWorkflowContext(workflow: string, job?: string, stepIndex?: number): WorkflowContext { - const parsed = parseWorkflow("test.yaml", [{name: "test.yaml", content: workflow}], nullTrace); + const parsed = parseWorkflow({name: "test.yaml", content: workflow}, nullTrace); if (!parsed.value) { throw new Error("Failed to parse workflow"); } diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index a028bd1..3047d63 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -65,7 +65,7 @@ export async function complete( name: textDocument.uri, content: newDoc.getText() }; - const result = parseWorkflow(file.name, [file], nullTrace); + const result = parseWorkflow(file, nullTrace); if (!result.value) { return []; } diff --git a/actions-languageservice/src/context/workflow-context.test.ts b/actions-languageservice/src/context/workflow-context.test.ts index 4a4d162..c336f3c 100644 --- a/actions-languageservice/src/context/workflow-context.test.ts +++ b/actions-languageservice/src/context/workflow-context.test.ts @@ -8,13 +8,10 @@ import {getWorkflowContext, WorkflowContext} from "./workflow-context"; function testGetWorkflowContext(input: string): WorkflowContext { const [textDocument, pos] = getPositionFromCursor(input); const result = parseWorkflow( - "wf.yaml", - [ - { - content: textDocument.getText(), - name: "wf.yaml" - } - ], + { + content: textDocument.getText(), + name: "wf.yaml" + }, nullTrace ); diff --git a/actions-languageservice/src/document-links.ts b/actions-languageservice/src/document-links.ts index cd739c0..625498d 100644 --- a/actions-languageservice/src/document-links.ts +++ b/actions-languageservice/src/document-links.ts @@ -14,7 +14,7 @@ export async function documentLinks(document: TextDocument): Promise Promise; -}; diff --git a/actions-workflow-parser/src/expressions.test.ts b/actions-workflow-parser/src/expressions.test.ts index c8f1664..1e46282 100644 --- a/actions-workflow-parser/src/expressions.test.ts +++ b/actions-workflow-parser/src/expressions.test.ts @@ -6,19 +6,16 @@ import {parseWorkflow} from "./workflows/workflow-parser"; describe("Workflow Expression Parsing", () => { it("preserves original expressions when building format", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push run-name: Test \${{ github.event_name }} \${{ github.ref }} jobs: build: runs-on: ubuntu-latest steps: - run: echo 'hello'` - } - ], + }, nullTrace ); @@ -44,11 +41,9 @@ jobs: it("preserves original expressions when building format for multi-line strings", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest @@ -56,8 +51,7 @@ jobs: - run: | echo \${{ github.event_name }} echo 'hello' \${{github.ref }}` - } - ], + }, nullTrace ); @@ -109,11 +103,9 @@ jobs: it("return errors and string token with preserved expressions for (multiple) expression errors", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest @@ -121,8 +113,7 @@ jobs: - run: | echo \${{ abc }} echo 'hello' \${{ gith }}` - } - ], + }, nullTrace ); @@ -147,11 +138,9 @@ jobs: it("reports all errors for multi-line expressions at the correct locations", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest @@ -159,8 +148,7 @@ jobs: - run: | echo \${{ fromJSON2('test') }} echo 'hello' \${{ toJSON2(inputs.test) }}` - } - ], + }, nullTrace ); @@ -186,19 +174,16 @@ jobs: it("parses isExpression strings into expression tokens", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest if: github.event_name == 'push' steps: - run: echo 'hello'` - } - ], + }, nullTrace ); diff --git a/actions-workflow-parser/src/index.test.ts b/actions-workflow-parser/src/index.test.ts index b316089..c1e2372 100644 --- a/actions-workflow-parser/src/index.test.ts +++ b/actions-workflow-parser/src/index.test.ts @@ -5,13 +5,10 @@ import {parseWorkflow} from "./workflows/workflow-parser"; describe("parseWorkflow", () => { it("parses valid workflow", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: "on: push\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - run: echo 'hello'" - } - ], + { + name: "test.yaml", + content: "on: push\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - run: echo 'hello'" + }, nullTrace ); @@ -20,13 +17,10 @@ describe("parseWorkflow", () => { it("contains range for error", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: "on: push\njobs:\n build:\n steps:\n - run: echo 'hello'" - } - ], + { + name: "test.yaml", + content: "on: push\njobs:\n build:\n steps:\n - run: echo 'hello'" + }, nullTrace ); @@ -40,19 +34,16 @@ describe("parseWorkflow", () => { it("error range for expression is constrained to scalar node", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: `on: push + { + name: "test.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest steps: - name: \${{ github.event = 12 }} run: echo 'hello'` - } - ], + }, nullTrace ); @@ -71,14 +62,11 @@ jobs: it("tokens contain descriptions", () => { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: - "on: push\nname: hello\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - run: echo 'hello'" - } - ], + { + name: "test.yaml", + content: + "on: push\nname: hello\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - run: echo 'hello'" + }, nullTrace ); diff --git a/actions-workflow-parser/src/model/convert.test.ts b/actions-workflow-parser/src/model/convert.test.ts index fa75ae8..93db6be 100644 --- a/actions-workflow-parser/src/model/convert.test.ts +++ b/actions-workflow-parser/src/model/convert.test.ts @@ -9,16 +9,13 @@ function serializeTemplate(template: unknown): unknown { describe("convertWorkflowTemplate", () => { it("converts workflow with one job", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push + { + name: "wf.yaml", + content: `on: push jobs: build: runs-on: ubuntu-latest` - } - ], + }, nullTrace ); @@ -48,11 +45,9 @@ jobs: it("converts workflow if expressions", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push + { + name: "wf.yaml", + content: `on: push jobs: build: if: \${{ true }} @@ -60,8 +55,7 @@ jobs: deploy: if: true runs-on: ubuntu-latest` - } - ], + }, nullTrace ); @@ -100,17 +94,14 @@ jobs: it("converts workflow with empty needs", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push + { + name: "wf.yaml", + content: `on: push jobs: build: needs: # comment to preserve whitespace in test runs-on: ubuntu-latest` - } - ], + }, nullTrace ); @@ -145,11 +136,9 @@ jobs: it("converts workflow with needs errors", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push + { + name: "wf.yaml", + content: `on: push jobs: job1: needs: [unknown-job, job3] @@ -159,8 +148,7 @@ jobs: job3: needs: job1 runs-on: ubuntu-latest` - } - ], + }, nullTrace ); @@ -225,11 +213,9 @@ jobs: it("converts workflow with invalid on", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: + { + name: "wf.yaml", + content: `on: workflow_dispatch: inputs: test: @@ -239,8 +225,7 @@ jobs: runs-on: ubuntu-latest steps: - run: echo hello` - } - ], + }, nullTrace ); @@ -288,15 +273,12 @@ jobs: it("converts workflow with invalid jobs", () => { const result = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push + { + name: "wf.yaml", + content: `on: push jobs: build:` - } - ], + }, nullTrace ); diff --git a/actions-workflow-parser/src/templates/tokens/template-token.test.ts b/actions-workflow-parser/src/templates/tokens/template-token.test.ts index 520eb28..34afdab 100644 --- a/actions-workflow-parser/src/templates/tokens/template-token.test.ts +++ b/actions-workflow-parser/src/templates/tokens/template-token.test.ts @@ -6,13 +6,10 @@ import {TemplateToken} from "./template-token"; describe("traverse", () => { it("returns parent token and key", () => { const workflow = parseWorkflow( - "wf.yaml", - [ - { - name: "wf.yaml", - content: `on: push` - } - ], + { + name: "wf.yaml", + content: `on: push` + }, nullTrace ); diff --git a/actions-workflow-parser/src/workflows/file-provider.ts b/actions-workflow-parser/src/workflows/file-provider.ts new file mode 100644 index 0000000..8416915 --- /dev/null +++ b/actions-workflow-parser/src/workflows/file-provider.ts @@ -0,0 +1,3 @@ +export interface FileProvider { + getFileContent(path: string): Promise; +} diff --git a/actions-workflow-parser/src/workflows/workflow-parser.test.ts b/actions-workflow-parser/src/workflows/workflow-parser.test.ts index 021ac2b..a4d587a 100644 --- a/actions-workflow-parser/src/workflows/workflow-parser.test.ts +++ b/actions-workflow-parser/src/workflows/workflow-parser.test.ts @@ -11,7 +11,7 @@ jobs: - name: 'Hello \${{ fromJSON('test') == inputs.name }}' run: echo Hello, world!`; - const result = parseWorkflow("main.yaml", [{name: "main.yaml", content: content}], nullTrace); + const result = parseWorkflow({name: "main.yaml", content: content}, nullTrace); expect(result.context.errors.count).toBe(1); expect(result.value).toBeUndefined(); diff --git a/actions-workflow-parser/src/workflows/workflow-parser.ts b/actions-workflow-parser/src/workflows/workflow-parser.ts index a49c903..f291717 100644 --- a/actions-workflow-parser/src/workflows/workflow-parser.ts +++ b/actions-workflow-parser/src/workflows/workflow-parser.ts @@ -3,6 +3,7 @@ import * as templateReader from "../templates/template-reader"; import {TemplateToken} from "../templates/tokens/template-token"; import {TraceWriter} from "../templates/trace-writer"; import {File} from "./file"; +import {FileProvider} from "./file-provider"; import {WORKFLOW_ROOT} from "./workflow-constants"; import {getWorkflowSchema} from "./workflow-schema"; import {YamlObjectReader} from "./yaml-object-reader"; @@ -11,15 +12,11 @@ export interface ParseWorkflowResult { value: TemplateToken | undefined; } -export function parseWorkflow(entryFileName: string, files: File[], trace: TraceWriter): ParseWorkflowResult { +export function parseWorkflow(entryFile: File, trace: TraceWriter, fileProvider?: FileProvider): ParseWorkflowResult { const context = new TemplateContext(new TemplateValidationErrors(), getWorkflowSchema(), trace); - // Add file ids - files.forEach(x => context.getFileId(x.name)); - - const fileId = context.getFileId(entryFileName); - const fileContent = files[fileId - 1].content; - const reader = new YamlObjectReader(context, fileId, fileContent); + const fileId = context.getFileId(entryFile.name); + const reader = new YamlObjectReader(context, fileId, entryFile.content); if (context.errors.count > 0) { // The file is not valid YAML, template errors could be misleading return { diff --git a/actions-workflow-parser/src/workflows/yaml-object-reader.test.ts b/actions-workflow-parser/src/workflows/yaml-object-reader.test.ts index 4ff3b13..d4d4aac 100644 --- a/actions-workflow-parser/src/workflows/yaml-object-reader.test.ts +++ b/actions-workflow-parser/src/workflows/yaml-object-reader.test.ts @@ -81,13 +81,10 @@ it("YAML errors include range information", () => { function parseAsWorkflow(content: string): TemplateToken | undefined { const result = parseWorkflow( - "test.yaml", - [ - { - name: "test.yaml", - content: content - } - ], + { + name: "test.yaml", + content: content + }, nullTrace ); diff --git a/actions-workflow-parser/src/xlang.test.ts b/actions-workflow-parser/src/xlang.test.ts index 906ed63..a52fcf6 100644 --- a/actions-workflow-parser/src/xlang.test.ts +++ b/actions-workflow-parser/src/xlang.test.ts @@ -53,13 +53,10 @@ describe("x-lang tests", () => { } const parseResult = parseWorkflow( - testFileName, - [ - { - name: testFileName, - content: testInput - } - ], + { + name: testFileName, + content: testInput + }, nullTrace ); From b9a01ed5aad01b1a2c7e8748af05d5156e72bf10 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 12:19:52 -0500 Subject: [PATCH 33/52] Remove undefined return type from `getFileContent` --- actions-workflow-parser/src/workflows/file-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-workflow-parser/src/workflows/file-provider.ts b/actions-workflow-parser/src/workflows/file-provider.ts index 8416915..0bdc01d 100644 --- a/actions-workflow-parser/src/workflows/file-provider.ts +++ b/actions-workflow-parser/src/workflows/file-provider.ts @@ -1,3 +1,3 @@ export interface FileProvider { - getFileContent(path: string): Promise; + getFileContent(path: string): Promise; } From 13aaa381c8c3855ee08e07cead49b6cd5c8ecc01 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 15:10:34 -0500 Subject: [PATCH 34/52] Parse reusable workflows up to a depth of 1 --- .../src/test-utils/workflow-context.ts | 8 +- actions-languageservice/src/complete.ts | 2 +- .../src/context/workflow-context.test.ts | 20 +-- actions-languageservice/src/document-links.ts | 2 +- .../src/expression-hover/visitor.test.ts | 2 +- actions-languageservice/src/hover.ts | 4 +- actions-languageservice/src/validate.ts | 2 +- .../src/model/convert.test.ts | 24 ++-- actions-workflow-parser/src/model/convert.ts | 78 ++++++++++- .../src/model/converter/base-job.ts | 66 --------- .../src/model/converter/job.ts | 125 ++++++++++++++---- .../src/model/converter/jobs.ts | 8 +- .../src/model/converter/referencedWorkflow.ts | 98 ++++++++++++++ .../src/model/converter/reusable-job.ts | 34 ----- .../src/model/workflow-template.ts | 5 +- .../src/workflows/file-provider.ts | 2 + .../src/workflows/workflow-parser.ts | 10 +- actions-workflow-parser/src/xlang.test.ts | 45 +++++-- .../errors-reusable-workflow-job-secrets.yml | 1 - .../reader/reusable-workflow-job-name.yml | 1 - .../reader/reusable-workflow-multiple.yml | 1 - .../reader/reusable-workflow-no-inputs.yml | 1 - 22 files changed, 356 insertions(+), 183 deletions(-) delete mode 100644 actions-workflow-parser/src/model/converter/base-job.ts create mode 100644 actions-workflow-parser/src/model/converter/referencedWorkflow.ts delete mode 100644 actions-workflow-parser/src/model/converter/reusable-job.ts diff --git a/actions-languageserver/src/test-utils/workflow-context.ts b/actions-languageserver/src/test-utils/workflow-context.ts index bd0ee97..edde697 100644 --- a/actions-languageserver/src/test-utils/workflow-context.ts +++ b/actions-languageserver/src/test-utils/workflow-context.ts @@ -8,12 +8,16 @@ const nullTrace: TraceWriter = { error: x => {} }; -export function createWorkflowContext(workflow: string, job?: string, stepIndex?: number): WorkflowContext { +export async function createWorkflowContext( + workflow: string, + job?: string, + stepIndex?: number +): Promise { const parsed = parseWorkflow({name: "test.yaml", content: workflow}, nullTrace); if (!parsed.value) { throw new Error("Failed to parse workflow"); } - const template = convertWorkflowTemplate(parsed.context, parsed.value); + const template = await convertWorkflowTemplate(parsed.context, parsed.value); const context: WorkflowContext = {uri: "test.yaml", template}; if (job) { diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 3047d63..1b888b7 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -71,7 +71,7 @@ export async function complete( } const {token, keyToken, parent, path} = findToken(newPos, result.value); - const template = convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion); 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 diff --git a/actions-languageservice/src/context/workflow-context.test.ts b/actions-languageservice/src/context/workflow-context.test.ts index c336f3c..1f2a3ad 100644 --- a/actions-languageservice/src/context/workflow-context.test.ts +++ b/actions-languageservice/src/context/workflow-context.test.ts @@ -5,7 +5,7 @@ import {getPositionFromCursor} from "../test-utils/cursor-position"; import {findToken} from "../utils/find-token"; import {getWorkflowContext, WorkflowContext} from "./workflow-context"; -function testGetWorkflowContext(input: string): WorkflowContext { +async function testGetWorkflowContext(input: string): Promise { const [textDocument, pos] = getPositionFromCursor(input); const result = parseWorkflow( { @@ -18,7 +18,7 @@ function testGetWorkflowContext(input: string): WorkflowContext { let template: WorkflowTemplate | undefined; if (result.value) { - template = convertWorkflowTemplate(result.context, result.value); + template = await convertWorkflowTemplate(result.context, result.value); } const {path} = findToken(pos, result.value); @@ -27,8 +27,8 @@ function testGetWorkflowContext(input: string): WorkflowContext { } describe("getWorkflowContext", () => { - it("context for workflow", () => { - const context = testGetWorkflowContext(`on: push + it("context for workflow", async () => { + const context = await testGetWorkflowContext(`on: push name: te|st jobs: build: @@ -41,8 +41,8 @@ jobs: expect(context.step).toBeUndefined(); }); - it("context for workflow job", () => { - const context = testGetWorkflowContext(`on: push + it("context for workflow job", async () => { + const context = await testGetWorkflowContext(`on: push jobs: build: runs-on: ubuntu-lat|est @@ -54,8 +54,8 @@ jobs: expect(context.step).toBeUndefined(); }); - it("context for workflow run step", () => { - const context = testGetWorkflowContext(`on: push + it("context for workflow run step", async () => { + const context = await testGetWorkflowContext(`on: push jobs: build: runs-on: ubuntu-latest @@ -71,8 +71,8 @@ jobs: expect(step.run.toDisplayString()).toBe("echo Hello"); }); - it("context for workflow uses step", () => { - const context = testGetWorkflowContext(`on: push + it("context for workflow uses step", async () => { + const context = await testGetWorkflowContext(`on: push jobs: build: runs-on: ubuntu-latest diff --git a/actions-languageservice/src/document-links.ts b/actions-languageservice/src/document-links.ts index 625498d..a22d358 100644 --- a/actions-languageservice/src/document-links.ts +++ b/actions-languageservice/src/document-links.ts @@ -19,7 +19,7 @@ export async function documentLinks(document: TextDocument): Promise { - it("converts workflow with one job", () => { + it("converts workflow with one job", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -19,7 +19,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(serializeTemplate(template)).toEqual({ events: { @@ -43,7 +43,7 @@ jobs: }); }); - it("converts workflow if expressions", () => { + it("converts workflow if expressions", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -59,7 +59,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(serializeTemplate(template)).toEqual({ events: { @@ -92,7 +92,7 @@ jobs: }); }); - it("converts workflow with empty needs", () => { + it("converts workflow with empty needs", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -105,7 +105,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(serializeTemplate(template)).toEqual({ errors: [ @@ -134,7 +134,7 @@ jobs: }); }); - it("converts workflow with needs errors", () => { + it("converts workflow with needs errors", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -152,7 +152,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(serializeTemplate(template)).toEqual({ errors: [ @@ -211,7 +211,7 @@ jobs: }); }); - it("converts workflow with invalid on", () => { + it("converts workflow with invalid on", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -229,7 +229,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(template.jobs).not.toBeUndefined(); expect(template.jobs).toHaveLength(1); @@ -271,7 +271,7 @@ jobs: }); }); - it("converts workflow with invalid jobs", () => { + it("converts workflow with invalid jobs", async () => { const result = parseWorkflow( { name: "wf.yaml", @@ -282,7 +282,7 @@ jobs: nullTrace ); - const template = convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); + const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion); expect(template.jobs).not.toBeUndefined(); expect(template.jobs).toHaveLength(0); diff --git a/actions-workflow-parser/src/model/convert.ts b/actions-workflow-parser/src/model/convert.ts index 3bd9350..197926b 100644 --- a/actions-workflow-parser/src/model/convert.ts +++ b/actions-workflow-parser/src/model/convert.ts @@ -1,9 +1,13 @@ import {TemplateContext} from "../templates/template-context"; import {TemplateToken, TemplateTokenError} from "../templates/tokens/template-token"; +import {FileProvider} from "../workflows/file-provider"; +import {parseWorkflow} from "../workflows/workflow-parser"; import {convertConcurrency} from "./converter/concurrency"; import {convertOn} from "./converter/events"; import {handleTemplateTokenErrors} from "./converter/handle-errors"; import {convertJobs} from "./converter/jobs"; +import {convertReferencedWorkflow} from "./converter/referencedWorkflow"; +import {isReusableWorkflowJob} from "./type-guards"; import {WorkflowTemplate} from "./workflow-template"; export enum ErrorPolicy { @@ -11,11 +15,35 @@ export enum ErrorPolicy { TryConversion } -export function convertWorkflowTemplate( +export type WorkflowTemplateConverterOptions = { + /** + * The maximum depth of reusable workflows allowed in the workflow. + * If this depth is exceeded, an error will be reported. + * If {@link fetchReusableWorkflowDepth} is less than this value, the maximum depth + * won't be enforced. + * Default: 4 + */ + maxReusableWorkflowDepth?: number; + /** + * The depth to fetch reusable workflows, up to {@link maxReusableWorkflowDepth}. + * Currently only a fetch depth of 0 or 1 is supported. + * Default: 0 + */ + fetchReusableWorkflowDepth?: number; +}; + +const defaultOptions: Required = { + maxReusableWorkflowDepth: 4, + fetchReusableWorkflowDepth: 0 +}; + +export async function convertWorkflowTemplate( context: TemplateContext, root: TemplateToken, - errorPolicy: ErrorPolicy = ErrorPolicy.ReturnErrorsOnly -): WorkflowTemplate { + errorPolicy: ErrorPolicy = ErrorPolicy.ReturnErrorsOnly, + fileProvider?: FileProvider, + options: WorkflowTemplateConverterOptions = defaultOptions +): Promise { const result = {} as WorkflowTemplate; if (context.errors.getErrors().length > 0 && errorPolicy === ErrorPolicy.ReturnErrorsOnly) { @@ -25,6 +53,12 @@ export function convertWorkflowTemplate( return result; } + const opts = getOptionsWithDefaults(options); + + if (fileProvider === undefined && opts.fetchReusableWorkflowDepth > 0) { + context.error(root, new Error("A file provider is required to fetch reusable workflows")); + } + try { const rootMapping = root.assertMapping("root"); @@ -49,6 +83,31 @@ export function convertWorkflowTemplate( break; } } + + // Load referenced workflows + for (const job of result.jobs || []) { + if (isReusableWorkflowJob(job)) { + if (opts.maxReusableWorkflowDepth === 0) { + context.error(job.ref, new Error("Reusable workflows are not allowed")); + continue; + } + + if (opts.fetchReusableWorkflowDepth === 0 || fileProvider === undefined) { + continue; + } + + try { + const file = await fileProvider.getFileContent(job.ref.value); + const workflow = parseWorkflow(file, context); + if (!workflow.value) { + continue; + } + convertReferencedWorkflow(context, workflow.value, job); + } catch { + context.error(job.ref, new Error("Unable to find reusable workflow")); + } + } + } } catch (err) { if (err instanceof TemplateTokenError) { context.error(err.token, err); @@ -66,3 +125,16 @@ export function convertWorkflowTemplate( return result; } + +function getOptionsWithDefaults(options: WorkflowTemplateConverterOptions): Required { + return { + maxReusableWorkflowDepth: + options.maxReusableWorkflowDepth !== undefined + ? options.maxReusableWorkflowDepth + : defaultOptions.maxReusableWorkflowDepth, + fetchReusableWorkflowDepth: + options.fetchReusableWorkflowDepth !== undefined + ? options.fetchReusableWorkflowDepth + : defaultOptions.fetchReusableWorkflowDepth + }; +} diff --git a/actions-workflow-parser/src/model/converter/base-job.ts b/actions-workflow-parser/src/model/converter/base-job.ts deleted file mode 100644 index 0b1d02e..0000000 --- a/actions-workflow-parser/src/model/converter/base-job.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {TemplateContext} from "../../templates/template-context"; -import {StringToken, MappingToken, BasicExpressionToken} from "../../templates/tokens"; -import {isSequence, isString} from "../../templates/tokens/type-guards"; -import {BaseJob} from "../workflow-template"; -import {convertConcurrency} from "./concurrency"; -import {handleTemplateTokenErrors} from "./handle-errors"; -import {IdBuilder} from "./id-builder"; - -export function convertBaseJob( - context: TemplateContext, - jobKey: StringToken, - token: MappingToken -): Omit { - const error = new IdBuilder().tryAddKnownId(jobKey.value); - if (error) { - context.error(jobKey, error); - } - - const result: Omit = { - id: jobKey, - name: undefined, - needs: undefined, - if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), - concurrency: undefined, - strategy: undefined - }; - - for (const item of token) { - const propertyName = item.key.assertString("job property name"); - switch (propertyName.value) { - case "concurrency": - handleTemplateTokenErrors(item.value, context, undefined, () => convertConcurrency(context, item.value)); - result.concurrency = item.value; - break; - - case "name": - result.name = item.value.assertScalar("job name"); - break; - - case "needs": - result.needs = []; - if (isString(item.value)) { - const jobNeeds = item.value.assertString("job needs id"); - result.needs.push(jobNeeds); - } - - if (isSequence(item.value)) { - for (const seqItem of item.value) { - const jobNeeds = seqItem.assertString("job needs id"); - result.needs.push(jobNeeds); - } - } - break; - - case "strategy": - result.strategy = item.value; - break; - } - } - - if (!result.name) { - result.name = result.id; - } - - return result; -} diff --git a/actions-workflow-parser/src/model/converter/job.ts b/actions-workflow-parser/src/model/converter/job.ts index 4fda96b..a7f1776 100644 --- a/actions-workflow-parser/src/model/converter/job.ts +++ b/actions-workflow-parser/src/model/converter/job.ts @@ -1,70 +1,137 @@ import {TemplateContext} from "../../templates/template-context"; -import {StringToken, MappingToken} from "../../templates/tokens"; -import {Job} from "../workflow-template"; -import {convertBaseJob} from "./base-job"; +import {StringToken, MappingToken, BasicExpressionToken, TemplateToken, ScalarToken} from "../../templates/tokens"; +import {isSequence, isString} from "../../templates/tokens/type-guards"; +import {WorkflowJob, Step} from "../workflow-template"; +import {convertConcurrency} from "./concurrency"; import {convertToJobContainer, convertToJobServices} from "./container"; import {handleTemplateTokenErrors} from "./handle-errors"; +import {IdBuilder} from "./id-builder"; import {convertToActionsEnvironmentRef} from "./job/environment"; import {convertRunsOn} from "./job/runs-on"; import {convertSteps} from "./steps"; -export function convertJob(context: TemplateContext, jobKey: StringToken, token: MappingToken): Job { - const base = convertBaseJob(context, jobKey, token); - const result: Job = { - type: "job", - id: base.id, - name: base.name, - needs: base.needs, - if: base.if, - env: undefined, - concurrency: base.concurrency, - environment: undefined, - strategy: base.strategy, - "runs-on": undefined, - container: undefined, - services: undefined, - outputs: undefined, - steps: [] - }; +export function convertJob(context: TemplateContext, jobKey: StringToken, token: MappingToken): WorkflowJob { + const error = new IdBuilder().tryAddKnownId(jobKey.value); + if (error) { + context.error(jobKey, error); + } + + let concurrency, container, env, environment, name, outputs, runsOn, services, strategy: TemplateToken | undefined; + let needs: StringToken[] | undefined = undefined; + let steps: Step[] = []; + let workflowJobRef: StringToken | undefined; for (const item of token) { const propertyName = item.key.assertString("job property name"); switch (propertyName.value) { + case "concurrency": + handleTemplateTokenErrors(item.value, context, undefined, () => convertConcurrency(context, item.value)); + concurrency = item.value; + break; + case "container": convertToJobContainer(context, item.value); - result.container = item.value; + container = item.value; break; case "env": - result.env = item.value.assertMapping("job env"); + env = item.value.assertMapping("job env"); break; case "environment": handleTemplateTokenErrors(item.value, context, undefined, () => convertToActionsEnvironmentRef(context, item.value) ); - result.environment = item.value; + environment = item.value; break; + case "name": + name = item.value.assertScalar("job name"); + break; + + case "needs": { + needs = []; + if (isString(item.value)) { + const jobNeeds = item.value.assertString("job needs id"); + needs.push(jobNeeds); + } + + if (isSequence(item.value)) { + for (const seqItem of item.value) { + const jobNeeds = seqItem.assertString("job needs id"); + needs.push(jobNeeds); + } + } + break; + } + case "outputs": - result.outputs = item.value.assertMapping("job outputs"); + outputs = item.value.assertMapping("job outputs"); break; case "runs-on": handleTemplateTokenErrors(item.value, context, undefined, () => convertRunsOn(context, item.value)); - result["runs-on"] = item.value; + runsOn = item.value; break; case "services": convertToJobServices(context, item.value); - result.services = item.value; + services = item.value; break; case "steps": - result.steps = convertSteps(context, item.value); + steps = convertSteps(context, item.value); + break; + + case "strategy": + strategy = item.value; + break; + + case "uses": + workflowJobRef = item.value.assertString("job item uses"); break; } } - return result; + if (workflowJobRef !== undefined) { + return { + type: "reusableWorkflowJob", + id: jobKey, + name: jobName(name, jobKey), + needs: needs ?? [], + if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), + ref: workflowJobRef, + concurrency, + strategy + }; + } else { + return { + type: "job", + id: jobKey, + name: jobName(name, jobKey), + needs, + if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), + env, + concurrency, + environment, + strategy, + "runs-on": runsOn, + container, + services, + outputs, + steps + }; + } +} + +function jobName(name: ScalarToken | undefined, jobKey: StringToken): ScalarToken { + if (name === undefined) { + return jobKey; + } + + if (isString(name) && name.value === "") { + return jobKey; + } + + return name; } diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 5aab4c5..b07e368 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -2,7 +2,7 @@ import {TemplateContext} from "../../templates/template-context"; import {StringToken} from "../../templates/tokens"; import {TemplateToken} from "../../templates/tokens/template-token"; import {isMapping} from "../../templates/tokens/type-guards"; -import {Job} from "../workflow-template"; +import {WorkflowJob} from "../workflow-template"; import {handleTemplateTokenErrors} from "./handle-errors"; import {convertJob} from "./job"; @@ -11,9 +11,9 @@ type nodeInfo = { needs: StringToken[]; }; -export function convertJobs(context: TemplateContext, token: TemplateToken): Job[] { +export function convertJobs(context: TemplateContext, token: TemplateToken): WorkflowJob[] { if (isMapping(token)) { - const result: Job[] = []; + const result: WorkflowJob[] = []; const jobsWithSatisfiedNeeds: nodeInfo[] = []; const alljobsWithUnsatisfiedNeeds: nodeInfo[] = []; @@ -49,7 +49,7 @@ export function convertJobs(context: TemplateContext, token: TemplateToken): Job function validateNeeds( token: TemplateToken, context: TemplateContext, - result: Job[], + result: WorkflowJob[], jobsWithSatisfiedNeeds: nodeInfo[], alljobsWithUnsatisfiedNeeds: nodeInfo[] ) { diff --git a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts new file mode 100644 index 0000000..e557d82 --- /dev/null +++ b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts @@ -0,0 +1,98 @@ +import {TemplateContext} from "../../templates/template-context"; +import {TemplateToken} from "../../templates/tokens"; +import {TokenType} from "../../templates/tokens/types"; +import {ReusableWorkflowJob} from "../workflow-template"; +import {convertOn} from "./events"; +import {handleTemplateTokenErrors} from "./handle-errors"; +import {convertJobs} from "./jobs"; + +export function convertReferencedWorkflow( + context: TemplateContext, + referencedWorkflow: TemplateToken, + job: ReusableWorkflowJob +) { + const mapping = referencedWorkflow.assertMapping("root"); + + let onToken: TemplateToken | undefined; + for (const pair of mapping) { + const key = pair.key.assertString("root key"); + switch (key.value) { + case "on": { + handleTemplateTokenErrors(mapping, context, undefined, () => + convertReferencedWorkflowOn(context, pair.value, job) + ); + break; + } + case "jobs": { + job.jobs = handleTemplateTokenErrors(mapping, context, [], () => convertJobs(context, pair.value)); + break; + } + } + } + + if (!onToken) { + return; + } + + const events = convertOn(context, onToken); + if (events.workflow_call === undefined) { + context.error(onToken, "workflow_call key is not defined in the referenced workflow."); + } +} + +function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken, job: ReusableWorkflowJob) { + switch (on.templateTokenType) { + case TokenType.String: { + const event = on.assertString("Reference workflow on value").value; + if (event === "workflow_call") { + // TODO: Validate workflow job trigger + return; + } + break; + } + + case TokenType.Sequence: { + const events = on.assertSequence("Reference workflow on value"); + for (const eventToken of events) { + const event = eventToken.assertString(`Reference workflow on value ${eventToken}`).value; + if (event === "workflow_call") { + // TODO: Validate workflow job trigger + return; + } + } + break; + } + + case TokenType.Mapping: { + const eventMapping = on.assertMapping("Reference workflow on value"); + + for (const pair of eventMapping) { + const event = pair.key.assertString(`Reference workflow on value ${pair.key}`).value; + if (event !== "workflow_call") { + continue; + } + + if (pair.value.templateTokenType === TokenType.Null) { + // TODO: Validate workflow job trigger + return; + } + + const definitions = pair.value.assertMapping(`Reference workflow on value ${pair.key}`); + for (const definition of definitions) { + const definitionKey = definition.key.assertString(`on-workflow_call-${definition.key}`).value; + switch (definitionKey) { + case "inputs": + job["input-definitions"] = definition.value.assertMapping(`on-workflow_call-${definition.key}`); + break; + } + } + + // TODO: Validate workflow job trigger + return; + } + break; + } + } + + context.error(on, "workflow_call key is not defined in the referenced workflow."); +} diff --git a/actions-workflow-parser/src/model/converter/reusable-job.ts b/actions-workflow-parser/src/model/converter/reusable-job.ts deleted file mode 100644 index 3eef8f3..0000000 --- a/actions-workflow-parser/src/model/converter/reusable-job.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {TemplateContext} from "../../templates/template-context"; -import {MappingToken, StringToken} from "../../templates/tokens"; -import {ReusableWorkflowJob} from "../workflow-template"; -import {convertBaseJob} from "./base-job"; - -export function convertResuableWorkflowJob( - context: TemplateContext, - jobKey: StringToken, - token: MappingToken -): ReusableWorkflowJob { - const base = convertBaseJob(context, jobKey, token); - - const result: ReusableWorkflowJob = { - type: "reusableWorkflowJob", - id: base.id, - name: base.name, - needs: base.needs, - if: base.if, - concurrency: base.concurrency, - strategy: base.strategy, - uses: new StringToken(undefined, undefined, "undefined", undefined, undefined) - }; - - for (const item of token) { - const propertyName = item.key.assertString("job property name"); - switch (propertyName.value) { - case "uses": - result.uses = item.value.assertString("job item uses"); - break; - } - } - - return result; -} diff --git a/actions-workflow-parser/src/model/workflow-template.ts b/actions-workflow-parser/src/model/workflow-template.ts index 508b424..094e209 100644 --- a/actions-workflow-parser/src/model/workflow-template.ts +++ b/actions-workflow-parser/src/model/workflow-template.ts @@ -57,7 +57,10 @@ export type Job = BaseJob & { // `workflow-job` in the schema export type ReusableWorkflowJob = BaseJob & { type: "reusableWorkflowJob"; - uses: StringToken; + ref: StringToken; + "input-definitions"?: MappingToken; + "input-values"?: MappingToken; + jobs?: WorkflowJob[]; }; export type Container = { diff --git a/actions-workflow-parser/src/workflows/file-provider.ts b/actions-workflow-parser/src/workflows/file-provider.ts index 0bdc01d..468fd34 100644 --- a/actions-workflow-parser/src/workflows/file-provider.ts +++ b/actions-workflow-parser/src/workflows/file-provider.ts @@ -1,3 +1,5 @@ +import {File} from "./file"; + export interface FileProvider { getFileContent(path: string): Promise; } diff --git a/actions-workflow-parser/src/workflows/workflow-parser.ts b/actions-workflow-parser/src/workflows/workflow-parser.ts index f291717..ef32027 100644 --- a/actions-workflow-parser/src/workflows/workflow-parser.ts +++ b/actions-workflow-parser/src/workflows/workflow-parser.ts @@ -3,7 +3,6 @@ import * as templateReader from "../templates/template-reader"; import {TemplateToken} from "../templates/tokens/template-token"; import {TraceWriter} from "../templates/trace-writer"; import {File} from "./file"; -import {FileProvider} from "./file-provider"; import {WORKFLOW_ROOT} from "./workflow-constants"; import {getWorkflowSchema} from "./workflow-schema"; import {YamlObjectReader} from "./yaml-object-reader"; @@ -12,8 +11,13 @@ export interface ParseWorkflowResult { value: TemplateToken | undefined; } -export function parseWorkflow(entryFile: File, trace: TraceWriter, fileProvider?: FileProvider): ParseWorkflowResult { - const context = new TemplateContext(new TemplateValidationErrors(), getWorkflowSchema(), trace); +export function parseWorkflow(entryFile: File, trace: TraceWriter): ParseWorkflowResult; +export function parseWorkflow(entryFile: File, context: TemplateContext): ParseWorkflowResult; +export function parseWorkflow(entryFile: File, contextOrTrace: TraceWriter | TemplateContext): ParseWorkflowResult { + const context = + contextOrTrace instanceof TemplateContext + ? contextOrTrace + : new TemplateContext(new TemplateValidationErrors(), getWorkflowSchema(), contextOrTrace); const fileId = context.getFileId(entryFile.name); const reader = new YamlObjectReader(context, fileId, entryFile.content); diff --git a/actions-workflow-parser/src/xlang.test.ts b/actions-workflow-parser/src/xlang.test.ts index a52fcf6..4b2fee9 100644 --- a/actions-workflow-parser/src/xlang.test.ts +++ b/actions-workflow-parser/src/xlang.test.ts @@ -3,6 +3,8 @@ import * as path from "path"; import * as YAML from "yaml"; import {convertWorkflowTemplate} from "./model/convert"; import {TraceWriter} from "./templates/trace-writer"; +import {File} from "./workflows/file"; +import {FileProvider} from "./workflows/file-provider"; import {parseWorkflow} from "./workflows/workflow-parser"; interface TestOptions { @@ -41,17 +43,34 @@ describe("x-lang tests", () => { const testOptions: TestOptions = YAML.parse(testDocs[0]); const unsupportedTest = contains(testOptions.skip, "TypeScript"); - const test = () => { - let testFileName = ".github/workflows" + fileName.substring(fileName.lastIndexOf("/")); - let testInput = testDocs[1]; - let expectedTemplate = testDocs[2].trim(); - // TODO: when reusable workflows are implemented, implement correctly + const test = async () => { + const testFileName = ".github/workflows" + fileName.substring(fileName.lastIndexOf("/")); + const testInput = testDocs[1]; + const expectedTemplate = testDocs[testDocs.length - 1].trim(); + + // For reusable workflow tests, additional workflows are passed in as pairs of + // file names and file contents + const reusableWorkflows: Record = {}; if (fileName.indexOf("reusable") !== -1) { - testFileName = testDocs[1]; - testInput = testDocs[2]; - expectedTemplate = testDocs[3].trim(); + for (let i = 2; i < testDocs.length - 1; i = i + 2) { + reusableWorkflows[testDocs[i]] = { + name: testDocs[i], + content: testDocs[i + 1] + }; + } } + const testFileProvider: FileProvider = { + getFileContent: async (fileName: string) => { + const file = reusableWorkflows[fileName]; + if (file) { + return file; + } + + throw new Error("File not found: " + fileName); + } + }; + const parseResult = parseWorkflow( { name: testFileName, @@ -62,7 +81,15 @@ describe("x-lang tests", () => { expect(parseResult.value).not.toBeUndefined(); - const workflowTemplate = convertWorkflowTemplate(parseResult.context, parseResult.value!); + const workflowTemplate = await convertWorkflowTemplate( + parseResult.context, + parseResult.value!, + undefined, + testFileProvider, + { + fetchReusableWorkflowDepth: 1 + } + ); // Unless this tests is only used by TypeScript, remove the events for now. // TODO: Remove this once we parse events everywhere diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml index b812f32..dac0d5a 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-secrets.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml index 60c8c3c..3e67c56 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-name.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml index 959dfc1..d129cdb 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-multiple.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml index df0edad..e07bb6b 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-no-inputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: From f28384e7eaa21416ee4774a7c3ae6f79a439c0e3 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 15:39:44 -0500 Subject: [PATCH 35/52] Add a type to represent local and remote files --- actions-workflow-parser/src/model/convert.ts | 3 +- .../src/workflows/file-provider.ts | 3 +- .../src/workflows/file-reference.test.ts | 55 +++++++++++++++++++ .../src/workflows/file-reference.ts | 42 ++++++++++++++ actions-workflow-parser/src/xlang.test.ts | 5 +- 5 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 actions-workflow-parser/src/workflows/file-reference.test.ts create mode 100644 actions-workflow-parser/src/workflows/file-reference.ts diff --git a/actions-workflow-parser/src/model/convert.ts b/actions-workflow-parser/src/model/convert.ts index 197926b..944ba75 100644 --- a/actions-workflow-parser/src/model/convert.ts +++ b/actions-workflow-parser/src/model/convert.ts @@ -1,6 +1,7 @@ import {TemplateContext} from "../templates/template-context"; import {TemplateToken, TemplateTokenError} from "../templates/tokens/template-token"; import {FileProvider} from "../workflows/file-provider"; +import {parseFileReference} from "../workflows/file-reference"; import {parseWorkflow} from "../workflows/workflow-parser"; import {convertConcurrency} from "./converter/concurrency"; import {convertOn} from "./converter/events"; @@ -97,7 +98,7 @@ export async function convertWorkflowTemplate( } try { - const file = await fileProvider.getFileContent(job.ref.value); + const file = await fileProvider.getFileContent(parseFileReference(job.ref.value)); const workflow = parseWorkflow(file, context); if (!workflow.value) { continue; diff --git a/actions-workflow-parser/src/workflows/file-provider.ts b/actions-workflow-parser/src/workflows/file-provider.ts index 468fd34..097d464 100644 --- a/actions-workflow-parser/src/workflows/file-provider.ts +++ b/actions-workflow-parser/src/workflows/file-provider.ts @@ -1,5 +1,6 @@ import {File} from "./file"; +import {FileReference} from "./file-reference"; export interface FileProvider { - getFileContent(path: string): Promise; + getFileContent(ref: FileReference): Promise; } diff --git a/actions-workflow-parser/src/workflows/file-reference.test.ts b/actions-workflow-parser/src/workflows/file-reference.test.ts new file mode 100644 index 0000000..f1cff01 --- /dev/null +++ b/actions-workflow-parser/src/workflows/file-reference.test.ts @@ -0,0 +1,55 @@ +import {parseFileReference} from "./file-reference"; + +describe("parseFileReference", () => { + it("parses local file reference", () => { + const ref = parseFileReference("./workflow/path"); + expect(ref).toEqual({ + path: "workflow/path" + }); + }); + + it("parses local file references with an empty path", () => { + const ref = parseFileReference("./"); + expect(ref).toEqual({ + path: "" + }); + }); + + it("parses remote file reference", () => { + const ref = parseFileReference("owner/repo/path@version"); + expect(ref).toEqual({ + owner: "owner", + repository: "repo", + path: "path", + version: "version" + }); + }); + + it("parses remote file reference with an empty path", () => { + const ref = parseFileReference("owner/repo@version"); + expect(ref).toEqual({ + owner: "owner", + repository: "repo", + path: "", + version: "version" + }); + }); + + it("parses remote file reference with slashes in the version", () => { + const ref = parseFileReference("owner/repo@feature-branch/dev"); + expect(ref).toEqual({ + owner: "owner", + repository: "repo", + path: "", + version: "feature-branch/dev" + }); + }); + + it("throws for malformed remote file references", () => { + expect(() => parseFileReference("owner/repo/path")).toThrowError("Invalid file reference: owner/repo/path"); + + expect(() => parseFileReference("owner/repo/path@")).toThrowError("Invalid file reference: owner/repo/path@"); + + expect(() => parseFileReference("owner@")).toThrowError("Invalid file reference: owner@"); + }); +}); diff --git a/actions-workflow-parser/src/workflows/file-reference.ts b/actions-workflow-parser/src/workflows/file-reference.ts new file mode 100644 index 0000000..3b51ca0 --- /dev/null +++ b/actions-workflow-parser/src/workflows/file-reference.ts @@ -0,0 +1,42 @@ +export type FileReference = LocalFileReference | RemoteFileReference; + +export type LocalFileReference = { + path: string; +}; + +export type RemoteFileReference = { + repository: string; + owner: string; + path: string; + version: string; +}; + +export function parseFileReference(ref: string): FileReference { + if (ref.startsWith("./")) { + return { + path: ref.substring(2) + }; + } + + const [remotePath, version] = ref.split("@"); + const [owner, repository, ...pathSegments] = remotePath.split("/").filter(s => s.length > 0); + + if (!owner || !repository || !version) { + throw new Error(`Invalid file reference: ${ref}`); + } + + return { + repository, + owner, + path: pathSegments.join("/"), + version + }; +} + +export function fileIdentifier(ref: FileReference): string { + if (!("repository" in ref)) { + return "./" + ref.path; + } + + return `${ref.owner}/${ref.repository}/${ref.path}@${ref.version}`; +} diff --git a/actions-workflow-parser/src/xlang.test.ts b/actions-workflow-parser/src/xlang.test.ts index 4b2fee9..e9e2ab1 100644 --- a/actions-workflow-parser/src/xlang.test.ts +++ b/actions-workflow-parser/src/xlang.test.ts @@ -5,6 +5,7 @@ import {convertWorkflowTemplate} from "./model/convert"; import {TraceWriter} from "./templates/trace-writer"; import {File} from "./workflows/file"; import {FileProvider} from "./workflows/file-provider"; +import {fileIdentifier, FileReference} from "./workflows/file-reference"; import {parseWorkflow} from "./workflows/workflow-parser"; interface TestOptions { @@ -61,8 +62,8 @@ describe("x-lang tests", () => { } const testFileProvider: FileProvider = { - getFileContent: async (fileName: string) => { - const file = reusableWorkflows[fileName]; + getFileContent: async (ref: FileReference) => { + const file = reusableWorkflows[fileIdentifier(ref)]; if (file) { return file; } From 9b0c8a971eca9c16c17cc5291e384c3752dcd4c9 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 17:06:42 -0500 Subject: [PATCH 36/52] Support reusable workflow `inputs` and `outputs` --- .../src/model/converter/job.ts | 10 +++- .../src/model/converter/job/inputs.ts | 54 +++++++++++++++++++ .../src/model/converter/referencedWorkflow.ts | 13 +++-- .../src/model/workflow-template.ts | 2 +- ...-reusable-workflow-job-inputs-required.yml | 1 - .../reader/reusable-workflow-inputs.yml | 1 - ...able-workflow-job-inputs-type-coercion.yml | 1 - .../reader/reusable-workflow-job-strategy.yml | 1 - .../reader/reusable-workflow-outputs.yml | 1 - 9 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 actions-workflow-parser/src/model/converter/job/inputs.ts diff --git a/actions-workflow-parser/src/model/converter/job.ts b/actions-workflow-parser/src/model/converter/job.ts index a7f1776..ee5f30e 100644 --- a/actions-workflow-parser/src/model/converter/job.ts +++ b/actions-workflow-parser/src/model/converter/job.ts @@ -20,6 +20,7 @@ export function convertJob(context: TemplateContext, jobKey: StringToken, token: let needs: StringToken[] | undefined = undefined; let steps: Step[] = []; let workflowJobRef: StringToken | undefined; + let workflowJobInputs: MappingToken | undefined; for (const item of token) { const propertyName = item.key.assertString("job property name"); @@ -88,7 +89,11 @@ export function convertJob(context: TemplateContext, jobKey: StringToken, token: break; case "uses": - workflowJobRef = item.value.assertString("job item uses"); + workflowJobRef = item.value.assertString("job uses value"); + break; + + case "with": + workflowJobInputs = item.value.assertMapping("uses-with value"); break; } } @@ -101,6 +106,9 @@ export function convertJob(context: TemplateContext, jobKey: StringToken, token: needs: needs ?? [], if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, undefined), ref: workflowJobRef, + "input-definitions": undefined, + "input-values": workflowJobInputs, + outputs: undefined, concurrency, strategy }; diff --git a/actions-workflow-parser/src/model/converter/job/inputs.ts b/actions-workflow-parser/src/model/converter/job/inputs.ts new file mode 100644 index 0000000..6b5d366 --- /dev/null +++ b/actions-workflow-parser/src/model/converter/job/inputs.ts @@ -0,0 +1,54 @@ +import {TemplateContext} from "../../../templates/template-context"; +import {MappingToken, TemplateToken} from "../../../templates/tokens"; +import {ReusableWorkflowJob} from "../../workflow-template"; + +type TokenMap = Map; + +export function convertWorkflowJobInputs(context: TemplateContext, job: ReusableWorkflowJob) { + const inputDefinitions = createTokenMap( + job["input-definitions"]?.assertMapping("workflow job input definitions"), + "inputs" + ); + + const inputValues = createTokenMap(job["input-values"]?.assertMapping("workflow job input values"), "with"); + + if (inputDefinitions !== undefined) { + for (const [_, [name, value]] of inputDefinitions) { + const inputSpec = createTokenMap(value.assertMapping(`input ${name}`), `input ${name} key`)!; + + const inputTypeToken = inputSpec.get("type")?.[1]; + if (!inputTypeToken) { + // This should be validated by the template reader per the schema + continue; + } + + const inputSet = inputValues !== undefined && inputValues.has(name.toLowerCase()); + const required = inputSpec.get("required")?.[1].assertBoolean(`input ${name} required`).value; + if (required && !inputSet) { + context.error(job.ref, `Input ${name} is required, but not provided while calling.`); + } + } + } + + if (inputValues !== undefined) { + for (const [_, [name, value]] of inputValues) { + if (inputDefinitions !== undefined && !inputDefinitions.has(name.toLowerCase())) { + context.error(value, `Invalid input, ${name} is not defined in the referenced workflow.`); + } + } + } +} + +function createTokenMap(mapping: MappingToken | undefined, description: string): TokenMap | undefined { + if (!mapping) { + return undefined; + } + + const result = new Map(); + for (const item of mapping) { + const name = item.key.assertString(`${description} key`); + result.set(name.value.toLowerCase(), [name.value, item.value]); + } + + return result; +} diff --git a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts index e557d82..b2b1762 100644 --- a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts +++ b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts @@ -4,6 +4,7 @@ import {TokenType} from "../../templates/tokens/types"; import {ReusableWorkflowJob} from "../workflow-template"; import {convertOn} from "./events"; import {handleTemplateTokenErrors} from "./handle-errors"; +import {convertWorkflowJobInputs} from "./job/inputs"; import {convertJobs} from "./jobs"; export function convertReferencedWorkflow( @@ -45,7 +46,7 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken case TokenType.String: { const event = on.assertString("Reference workflow on value").value; if (event === "workflow_call") { - // TODO: Validate workflow job trigger + handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } break; @@ -56,7 +57,7 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken for (const eventToken of events) { const event = eventToken.assertString(`Reference workflow on value ${eventToken}`).value; if (event === "workflow_call") { - // TODO: Validate workflow job trigger + handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } } @@ -73,7 +74,7 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken } if (pair.value.templateTokenType === TokenType.Null) { - // TODO: Validate workflow job trigger + handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } @@ -84,10 +85,14 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken case "inputs": job["input-definitions"] = definition.value.assertMapping(`on-workflow_call-${definition.key}`); break; + + case "outputs": + job.outputs = definition.value.assertMapping(`on-workflow_call-${definition.key}`); + break; } } - // TODO: Validate workflow job trigger + handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } break; diff --git a/actions-workflow-parser/src/model/workflow-template.ts b/actions-workflow-parser/src/model/workflow-template.ts index 094e209..660fdea 100644 --- a/actions-workflow-parser/src/model/workflow-template.ts +++ b/actions-workflow-parser/src/model/workflow-template.ts @@ -40,6 +40,7 @@ export type BaseJob = { if: BasicExpressionToken; concurrency?: TemplateToken; strategy?: TemplateToken; + outputs?: MappingToken; }; // `job-factory` in the schema @@ -50,7 +51,6 @@ export type Job = BaseJob & { "runs-on"?: TemplateToken; container?: TemplateToken; services?: TemplateToken; - outputs?: MappingToken; steps: Step[]; }; diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml index df6d826..6f1d9fb 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-required.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml index cd82fa4..3604796 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-inputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml index dbe138c..0afcc09 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-inputs-type-coercion.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml index cd35281..c343684 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-job-strategy.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: diff --git a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml index c567cac..62501c2 100644 --- a/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml +++ b/actions-workflow-parser/testdata/reader/reusable-workflow-outputs.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: From 99d82473aeabd930ff982c609a89c09be4a50d3d Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 22:11:28 +0000 Subject: [PATCH 37/52] v0.1.119 --- 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 59ce57d..bc5834f 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.118", + "version": "0.1.119", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 505e242..abae537 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.118", + "version": "0.1.119", "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.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-languageservice": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "@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 b19d16d..72bd7c2 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.118", + "version": "0.1.119", "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.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-expressions": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "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 784b2ec..c21a549 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.118", + "version": "0.1.119", "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.118", + "@github/actions-expressions": "^0.1.119", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 93567c9..cf63c34 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.118", + "version": "0.1.119", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.118", + "@github/actions-languageserver": "^0.1.119", "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 e49754b..d353ad9 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.118" + "version": "0.1.119" } diff --git a/package-lock.json b/package-lock.json index 6e3c44f..46094bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.118", + "version": "0.1.119", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.118", + "version": "0.1.119", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-languageservice": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "@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.118", + "version": "0.1.119", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-expressions": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "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.118", + "version": "0.1.119", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.118", + "@github/actions-expressions": "^0.1.119", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.118", + "version": "0.1.119", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.118", + "@github/actions-languageserver": "^0.1.119", "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.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-languageservice": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "@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.118", - "@github/actions-workflow-parser": "^0.1.118", + "@github/actions-expressions": "^0.1.119", + "@github/actions-workflow-parser": "^0.1.119", "@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.118", + "@github/actions-expressions": "^0.1.119", "@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.118", + "@github/actions-languageserver": "^0.1.119", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From ce19439ed82666bc5dd76e5eb8e70a98d179b600 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 17:11:46 -0500 Subject: [PATCH 38/52] Remove unnecessary extra event conversion --- .../src/model/converter/referencedWorkflow.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts index e557d82..0ac6f91 100644 --- a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts +++ b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts @@ -2,7 +2,6 @@ import {TemplateContext} from "../../templates/template-context"; import {TemplateToken} from "../../templates/tokens"; import {TokenType} from "../../templates/tokens/types"; import {ReusableWorkflowJob} from "../workflow-template"; -import {convertOn} from "./events"; import {handleTemplateTokenErrors} from "./handle-errors"; import {convertJobs} from "./jobs"; @@ -29,15 +28,6 @@ export function convertReferencedWorkflow( } } } - - if (!onToken) { - return; - } - - const events = convertOn(context, onToken); - if (events.workflow_call === undefined) { - context.error(onToken, "workflow_call key is not defined in the referenced workflow."); - } } function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken, job: ReusableWorkflowJob) { From 8f826c59f856e34563aeb6668626b43cba739fac Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 6 Feb 2023 17:20:30 -0500 Subject: [PATCH 39/52] Fix tests that now require `await` --- actions-languageserver/src/context-providers/steps.test.ts | 4 ++-- .../src/description-providers/action-input.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actions-languageserver/src/context-providers/steps.test.ts b/actions-languageserver/src/context-providers/steps.test.ts index 0120216..019a612 100644 --- a/actions-languageserver/src/context-providers/steps.test.ts +++ b/actions-languageserver/src/context-providers/steps.test.ts @@ -56,7 +56,7 @@ const actionMetadata = { }; it("returns default context when job is undefined", async () => { - const workflowContext = createWorkflowContext(workflow, undefined); + const workflowContext = await createWorkflowContext(workflow, undefined); const defaultContext = getDefaultStepsContext(workflowContext); const stepsContext = await getStepsContext(new Octokit(), new TTLCache(), defaultContext, workflowContext); @@ -68,7 +68,7 @@ it("adds action outputs", async () => { .sandbox() .getOnce("https://api.github.com/repos/actions/cache/contents/action.yml?ref=v3", actionMetadata); - const workflowContext = createWorkflowContext(workflow, "build"); + const workflowContext = await createWorkflowContext(workflow, "build"); const defaultContext = getDefaultStepsContext(workflowContext); const stepsContext = await getStepsContext( diff --git a/actions-languageserver/src/description-providers/action-input.test.ts b/actions-languageserver/src/description-providers/action-input.test.ts index d1bd0eb..9912982 100644 --- a/actions-languageserver/src/description-providers/action-input.test.ts +++ b/actions-languageserver/src/description-providers/action-input.test.ts @@ -60,7 +60,7 @@ const actionMetadata = { }; async function getDescription(input: string, mock: fetchMock.FetchMockSandbox) { - const workflowContext = createWorkflowContext(workflow, "build", 0); + const workflowContext = await createWorkflowContext(workflow, "build", 0); return await getActionInputDescription( new Octokit({ From 0f01fae09a6987f524843c22b7c13803e4bbfc7b Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 22:25:56 +0000 Subject: [PATCH 40/52] v0.1.120 --- 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 bc5834f..b50f792 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.119", + "version": "0.1.120", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index abae537..5f8c2b3 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.119", + "version": "0.1.120", "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.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-languageservice": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "@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 72bd7c2..cb0cbc9 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.119", + "version": "0.1.120", "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.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-expressions": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "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 c21a549..dec4584 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.119", + "version": "0.1.120", "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.119", + "@github/actions-expressions": "^0.1.120", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index cf63c34..efd89a0 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.119", + "version": "0.1.120", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.119", + "@github/actions-languageserver": "^0.1.120", "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 d353ad9..7e2a40a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.119" + "version": "0.1.120" } diff --git a/package-lock.json b/package-lock.json index 46094bd..ff5a9a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.119", + "version": "0.1.120", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.119", + "version": "0.1.120", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-languageservice": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "@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.119", + "version": "0.1.120", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-expressions": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "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.119", + "version": "0.1.120", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.119", + "@github/actions-expressions": "^0.1.120", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.119", + "version": "0.1.120", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.119", + "@github/actions-languageserver": "^0.1.120", "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.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-languageservice": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "@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.119", - "@github/actions-workflow-parser": "^0.1.119", + "@github/actions-expressions": "^0.1.120", + "@github/actions-workflow-parser": "^0.1.120", "@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.119", + "@github/actions-expressions": "^0.1.120", "@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.119", + "@github/actions-languageserver": "^0.1.120", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 4774b671f930c7a9373893c7b1a5c17e1a034b8f Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 22:32:51 +0000 Subject: [PATCH 41/52] v0.1.121 --- 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 b50f792..d6c0848 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.120", + "version": "0.1.121", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 5f8c2b3..689cf2b 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.120", + "version": "0.1.121", "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.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-languageservice": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "@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 cb0cbc9..052a1fa 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.120", + "version": "0.1.121", "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.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-expressions": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "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 dec4584..d11ccd2 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.120", + "version": "0.1.121", "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.120", + "@github/actions-expressions": "^0.1.121", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index efd89a0..82c9394 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.120", + "version": "0.1.121", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.120", + "@github/actions-languageserver": "^0.1.121", "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 7e2a40a..b39ac0a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.120" + "version": "0.1.121" } diff --git a/package-lock.json b/package-lock.json index ff5a9a8..352a03f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.120", + "version": "0.1.121", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.120", + "version": "0.1.121", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-languageservice": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "@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.120", + "version": "0.1.121", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-expressions": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "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.120", + "version": "0.1.121", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.120", + "@github/actions-expressions": "^0.1.121", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.120", + "version": "0.1.121", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.120", + "@github/actions-languageserver": "^0.1.121", "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.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-languageservice": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "@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.120", - "@github/actions-workflow-parser": "^0.1.120", + "@github/actions-expressions": "^0.1.121", + "@github/actions-workflow-parser": "^0.1.121", "@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.120", + "@github/actions-expressions": "^0.1.121", "@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.120", + "@github/actions-languageserver": "^0.1.121", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 9949c06c55b81ba1b9a0039a10c3b399d282ef3f Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Mon, 6 Feb 2023 16:46:10 -0800 Subject: [PATCH 42/52] Remove old TODO --- actions-languageservice/src/validate.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/actions-languageservice/src/validate.ts b/actions-languageservice/src/validate.ts index 22c3b5e..d46c779 100644 --- a/actions-languageservice/src/validate.ts +++ b/actions-languageservice/src/validate.ts @@ -43,11 +43,7 @@ export type ValidationConfig = { * @param textDocument Document to validate * @returns Array of diagnostics */ -export async function validate( - textDocument: TextDocument, - config?: ValidationConfig - // TODO: Support multiple files, context for API calls -): Promise { +export async function validate(textDocument: TextDocument, config?: ValidationConfig): Promise { const file: File = { name: textDocument.uri, content: textDocument.getText() From b524fd84f93391615b98c0378f4e209568a020b1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 15:40:47 +0000 Subject: [PATCH 43/52] v0.1.122 --- 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 d6c0848..d586d53 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.121", + "version": "0.1.122", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 689cf2b..160fc54 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.121", + "version": "0.1.122", "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.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-languageservice": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "@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 052a1fa..e410620 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.121", + "version": "0.1.122", "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.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-expressions": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "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 d11ccd2..4951f54 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.121", + "version": "0.1.122", "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.121", + "@github/actions-expressions": "^0.1.122", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 82c9394..230d62f 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.121", + "version": "0.1.122", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.121", + "@github/actions-languageserver": "^0.1.122", "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 b39ac0a..ba7ac85 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.121" + "version": "0.1.122" } diff --git a/package-lock.json b/package-lock.json index 352a03f..3007aad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.121", + "version": "0.1.122", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.121", + "version": "0.1.122", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-languageservice": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "@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.121", + "version": "0.1.122", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-expressions": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "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.121", + "version": "0.1.122", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.121", + "@github/actions-expressions": "^0.1.122", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.121", + "version": "0.1.122", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.121", + "@github/actions-languageserver": "^0.1.122", "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.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-languageservice": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "@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.121", - "@github/actions-workflow-parser": "^0.1.121", + "@github/actions-expressions": "^0.1.122", + "@github/actions-workflow-parser": "^0.1.122", "@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.121", + "@github/actions-expressions": "^0.1.122", "@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.121", + "@github/actions-languageserver": "^0.1.122", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 1e4b7f6015e1bfd630ef4072f6fab6a8388a757d Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 11:21:06 -0500 Subject: [PATCH 44/52] Validate inputs when none are defined --- actions-workflow-parser/src/model/converter/job/inputs.ts | 2 +- .../reader/errors-reusable-workflow-job-inputs-undefined.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/actions-workflow-parser/src/model/converter/job/inputs.ts b/actions-workflow-parser/src/model/converter/job/inputs.ts index 6b5d366..92a6b88 100644 --- a/actions-workflow-parser/src/model/converter/job/inputs.ts +++ b/actions-workflow-parser/src/model/converter/job/inputs.ts @@ -32,7 +32,7 @@ export function convertWorkflowJobInputs(context: TemplateContext, job: Reusable if (inputValues !== undefined) { for (const [_, [name, value]] of inputValues) { - if (inputDefinitions !== undefined && !inputDefinitions.has(name.toLowerCase())) { + if (inputDefinitions === undefined || !inputDefinitions.has(name.toLowerCase())) { context.error(value, `Invalid input, ${name} is not defined in the referenced workflow.`); } } diff --git a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml index 7611a4c..87c5b82 100644 --- a/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml +++ b/actions-workflow-parser/testdata/reader/errors-reusable-workflow-job-inputs-undefined.yml @@ -1,7 +1,6 @@ include-source: false # Drop file/line/col from output skip: - Go - - TypeScript --- on: push jobs: From b6d667ade41894ea0724d6e363ea892a7f883406 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 16:42:17 +0000 Subject: [PATCH 45/52] v0.1.123 --- 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 d586d53..bb15e5f 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.122", + "version": "0.1.123", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 160fc54..f4691d2 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.122", + "version": "0.1.123", "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.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-languageservice": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "@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 e410620..d795433 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.122", + "version": "0.1.123", "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.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-expressions": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "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 4951f54..a37f312 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.122", + "version": "0.1.123", "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.122", + "@github/actions-expressions": "^0.1.123", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 230d62f..832980e 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.122", + "version": "0.1.123", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.122", + "@github/actions-languageserver": "^0.1.123", "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 ba7ac85..ab39e2d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.122" + "version": "0.1.123" } diff --git a/package-lock.json b/package-lock.json index 3007aad..dc6eefd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.122", + "version": "0.1.123", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.122", + "version": "0.1.123", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-languageservice": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "@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.122", + "version": "0.1.123", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-expressions": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "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.122", + "version": "0.1.123", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.122", + "@github/actions-expressions": "^0.1.123", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.122", + "version": "0.1.123", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.122", + "@github/actions-languageserver": "^0.1.123", "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.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-languageservice": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "@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.122", - "@github/actions-workflow-parser": "^0.1.122", + "@github/actions-expressions": "^0.1.123", + "@github/actions-workflow-parser": "^0.1.123", "@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.122", + "@github/actions-expressions": "^0.1.123", "@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.122", + "@github/actions-languageserver": "^0.1.123", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 813c66c3c1a8af1df5b37c392415005d3a5886d5 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 12:10:21 -0500 Subject: [PATCH 46/52] Validate inputs when none are defined --- actions-workflow-parser/src/model/converter/job/inputs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions-workflow-parser/src/model/converter/job/inputs.ts b/actions-workflow-parser/src/model/converter/job/inputs.ts index 92a6b88..ebd9467 100644 --- a/actions-workflow-parser/src/model/converter/job/inputs.ts +++ b/actions-workflow-parser/src/model/converter/job/inputs.ts @@ -32,7 +32,7 @@ export function convertWorkflowJobInputs(context: TemplateContext, job: Reusable if (inputValues !== undefined) { for (const [_, [name, value]] of inputValues) { - if (inputDefinitions === undefined || !inputDefinitions.has(name.toLowerCase())) { + if (!inputDefinitions?.has(name.toLowerCase())) { context.error(value, `Invalid input, ${name} is not defined in the referenced workflow.`); } } From 17a92c54966bee91d7f566a38a73a481870094e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 17:19:35 +0000 Subject: [PATCH 47/52] v0.1.124 --- 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 bb15e5f..628819e 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.123", + "version": "0.1.124", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index f4691d2..a42e112 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.123", + "version": "0.1.124", "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.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-languageservice": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "@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 d795433..bf8da24 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.123", + "version": "0.1.124", "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.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-expressions": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "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 a37f312..2561225 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.123", + "version": "0.1.124", "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.123", + "@github/actions-expressions": "^0.1.124", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index 832980e..d95be90 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.123", + "version": "0.1.124", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.123", + "@github/actions-languageserver": "^0.1.124", "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 ab39e2d..34ed38a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.123" + "version": "0.1.124" } diff --git a/package-lock.json b/package-lock.json index dc6eefd..b295b2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.123", + "version": "0.1.124", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.123", + "version": "0.1.124", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-languageservice": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "@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.123", + "version": "0.1.124", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-expressions": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "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.123", + "version": "0.1.124", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.123", + "@github/actions-expressions": "^0.1.124", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.123", + "version": "0.1.124", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.123", + "@github/actions-languageserver": "^0.1.124", "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.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-languageservice": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "@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.123", - "@github/actions-workflow-parser": "^0.1.123", + "@github/actions-expressions": "^0.1.124", + "@github/actions-workflow-parser": "^0.1.124", "@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.123", + "@github/actions-expressions": "^0.1.124", "@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.123", + "@github/actions-languageserver": "^0.1.124", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 2598e318c9aa5811e4597fead230c57bcb1fd5f9 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 13:42:41 -0500 Subject: [PATCH 48/52] Validate workflow references and inputs --- actions-languageservice/src/validate.ts | 12 +- .../src/validate.workflow-references.test.ts | 208 ++++++++++++++++++ .../src/model/converter/referencedWorkflow.ts | 20 +- 3 files changed, 231 insertions(+), 9 deletions(-) create mode 100644 actions-languageservice/src/validate.workflow-references.test.ts diff --git a/actions-languageservice/src/validate.ts b/actions-languageservice/src/validate.ts index d46c779..ca91193 100644 --- a/actions-languageservice/src/validate.ts +++ b/actions-languageservice/src/validate.ts @@ -14,6 +14,7 @@ import {BasicExpressionToken} from "@github/actions-workflow-parser/templates/to import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; import {File} from "@github/actions-workflow-parser/workflows/file"; +import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; import {TextDocument} from "vscode-languageserver-textdocument"; import {Diagnostic, DiagnosticSeverity, URI} from "vscode-languageserver-types"; import {ActionInputs, ActionReference} from "./action"; @@ -35,6 +36,7 @@ export type ValidationConfig = { valueProviderConfig?: ValueProviderConfig; contextProviderConfig?: ContextProviderConfig; getActionInputs?(action: ActionReference): Promise; + fileProvider?: FileProvider; }; /** @@ -55,7 +57,15 @@ export async function validate(textDocument: TextDocument, config?: ValidationCo const result: ParseWorkflowResult = parseWorkflow(file, nullTrace); if (result.value) { // Errors will be updated in the context. Attempt to do the conversion anyway in order to give the user more information - 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 + } + ); // Validate expressions and value providers await additionalValidations(diagnostics, textDocument.uri, template, result.value, config); diff --git a/actions-languageservice/src/validate.workflow-references.test.ts b/actions-languageservice/src/validate.workflow-references.test.ts new file mode 100644 index 0000000..e9f256a --- /dev/null +++ b/actions-languageservice/src/validate.workflow-references.test.ts @@ -0,0 +1,208 @@ +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 {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 = ` +on: push + +jobs: + build: + uses: monalisa/octocat/.github/workflows/non-reusable-workflow.yaml@main +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([ + { + message: "workflow_call key is not defined in the referenced workflow.", + range: { + start: { + character: 10, + line: 5 + }, + end: { + character: 76, + line: 5 + } + } + } + ]); + }); + + it("reference to a non-reusable workflow", async () => { + const input = ` +on: push + +jobs: + build: + uses: monalisa/octocat/workflow.yaml@not-a-branch +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([ + { + message: "Unable to find reusable workflow", + range: { + start: { + character: 10, + line: 5 + }, + end: { + character: 53, + line: 5 + } + } + } + ]); + }); + + it("valid reference to a reusable workflow", async () => { + const input = ` +on: push + +jobs: + build: + uses: monalisa/octocat/workflow.yaml@main +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([]); + }); + + it("valid reference to a local workflow", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow.yaml +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([]); + }); + + it("workflow reference without required inputs", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow-with-inputs.yaml +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([ + { + message: "Input username is required, but not provided while calling.", + range: { + start: { + character: 10, + line: 5 + }, + end: { + character: 46, + line: 5 + } + } + } + ]); + }); + + it("workflow reference with required inputs", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow-with-inputs.yaml + with: + username: monalisa +`; + const result = await validate(createDocument("wf.yaml", input), { + fileProvider: testFileProvider + }); + + expect(result).toEqual([]); + }); +}); diff --git a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts index b40f739..9de9b49 100644 --- a/actions-workflow-parser/src/model/converter/referencedWorkflow.ts +++ b/actions-workflow-parser/src/model/converter/referencedWorkflow.ts @@ -13,18 +13,21 @@ export function convertReferencedWorkflow( ) { const mapping = referencedWorkflow.assertMapping("root"); - let onToken: TemplateToken | undefined; + // The language service doesn't currently handles on other documents, + // So use the ref in the original workflow as the error location + const tokenForErrors = job.ref; + for (const pair of mapping) { const key = pair.key.assertString("root key"); switch (key.value) { case "on": { - handleTemplateTokenErrors(mapping, context, undefined, () => + handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertReferencedWorkflowOn(context, pair.value, job) ); break; } case "jobs": { - job.jobs = handleTemplateTokenErrors(mapping, context, [], () => convertJobs(context, pair.value)); + job.jobs = handleTemplateTokenErrors(tokenForErrors, context, [], () => convertJobs(context, pair.value)); break; } } @@ -32,11 +35,12 @@ export function convertReferencedWorkflow( } function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken, job: ReusableWorkflowJob) { + const tokenForErrors = job.ref; switch (on.templateTokenType) { case TokenType.String: { const event = on.assertString("Reference workflow on value").value; if (event === "workflow_call") { - handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); + handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } break; @@ -47,7 +51,7 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken for (const eventToken of events) { const event = eventToken.assertString(`Reference workflow on value ${eventToken}`).value; if (event === "workflow_call") { - handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); + handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } } @@ -64,7 +68,7 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken } if (pair.value.templateTokenType === TokenType.Null) { - handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); + handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } @@ -82,12 +86,12 @@ function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken } } - handleTemplateTokenErrors(on, context, undefined, () => convertWorkflowJobInputs(context, job)); + handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job)); return; } break; } } - context.error(on, "workflow_call key is not defined in the referenced workflow."); + context.error(tokenForErrors, "workflow_call key is not defined in the referenced workflow."); } From d5a8de7b8fcad7396a7ca6c6ac03cf6534351904 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 13:48:33 -0500 Subject: [PATCH 49/52] Support fetching remote reusable workflows --- actions-languageserver/src/connection.ts | 4 +- actions-languageserver/src/file-provider.ts | 54 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 actions-languageserver/src/file-provider.ts diff --git a/actions-languageserver/src/connection.ts b/actions-languageserver/src/connection.ts index 0a047f0..cb35490 100644 --- a/actions-languageserver/src/connection.ts +++ b/actions-languageserver/src/connection.ts @@ -20,6 +20,7 @@ import {getClient} from "./client"; import {Commands} from "./commands"; import {contextProviders} from "./context-providers"; import {descriptionProvider} from "./description-provider"; +import {getFileProvider} from "./file-provider"; import {InitializationOptions, RepositoryContext} from "./initializationOptions"; import {onCompletion} from "./on-completion"; import {TTLCache} from "./utils/cache"; @@ -106,7 +107,8 @@ export function initConnection(connection: Connection) { } return undefined; - } + }, + fileProvider: getFileProvider(client, cache) }; const result = await validate(textDocument, config); diff --git a/actions-languageserver/src/file-provider.ts b/actions-languageserver/src/file-provider.ts new file mode 100644 index 0000000..7c01cd1 --- /dev/null +++ b/actions-languageserver/src/file-provider.ts @@ -0,0 +1,54 @@ +import {File} from "@github/actions-workflow-parser/workflows/file"; +import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; +import {fileIdentifier} from "@github/actions-workflow-parser/workflows/file-reference"; +import {Octokit} from "@octokit/rest"; +import {TTLCache} from "./utils/cache"; + +export function getFileProvider(client: Octokit | undefined, cache: TTLCache): FileProvider | undefined { + if (!client) { + return undefined; + } + + return { + getFileContent: async (ref): Promise => { + if (!("repository" in ref)) { + throw new Error("Only remote file references are supported right now"); + } + + return await cache.get(`file-content-${fileIdentifier(ref)}`, undefined, () => + fetchWorkflowFile(client, ref.owner, ref.repository, ref.path, ref.version) + ); + } + }; +} + +async function fetchWorkflowFile( + client: Octokit, + owner: string, + repo: string, + path: string, + version: string +): Promise { + const resp = await client.repos.getContent({ + owner, + repo, + path, + ref: version + }); + + // https://docs.github.com/rest/repos/contents?apiVersion=2022-11-28 + // Ignore directories (array of files) and non-file content + if ( + resp.data === undefined || + Array.isArray(resp.data) || + resp.data.type !== "file" || + resp.data.content === undefined + ) { + throw new Error("Not a file"); + } + + return { + name: path, + content: Buffer.from(resp.data.content, "base64").toString("utf8") + }; +} From f9ee7ae11a2719962b27d58cac0e55da61c8f8e4 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 7 Feb 2023 15:46:50 -0500 Subject: [PATCH 50/52] Support local workflow references --- actions-languageserver/src/connection.ts | 4 ++- actions-languageserver/src/file-provider.ts | 35 ++++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/actions-languageserver/src/connection.ts b/actions-languageserver/src/connection.ts index cb35490..d061b4e 100644 --- a/actions-languageserver/src/connection.ts +++ b/actions-languageserver/src/connection.ts @@ -108,7 +108,9 @@ export function initConnection(connection: Connection) { return undefined; }, - fileProvider: getFileProvider(client, cache) + fileProvider: getFileProvider(client, cache, repoContext?.workspaceUri, async path => { + return await connection.sendRequest("actions/readFile", {path}); + }) }; const result = await validate(textDocument, config); diff --git a/actions-languageserver/src/file-provider.ts b/actions-languageserver/src/file-provider.ts index 7c01cd1..398dd3c 100644 --- a/actions-languageserver/src/file-provider.ts +++ b/actions-languageserver/src/file-provider.ts @@ -2,22 +2,43 @@ import {File} from "@github/actions-workflow-parser/workflows/file"; import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; import {fileIdentifier} from "@github/actions-workflow-parser/workflows/file-reference"; import {Octokit} from "@octokit/rest"; +import path from "path"; import {TTLCache} from "./utils/cache"; -export function getFileProvider(client: Octokit | undefined, cache: TTLCache): FileProvider | undefined { - if (!client) { +export function getFileProvider( + client: Octokit | undefined, + cache: TTLCache, + workspace: string | undefined, + readFile: (path: string) => Promise +): FileProvider | undefined { + if (!client && !workspace) { return undefined; } return { getFileContent: async (ref): Promise => { - if (!("repository" in ref)) { - throw new Error("Only remote file references are supported right now"); + if ("repository" in ref) { + if (!client) { + throw new Error("Remote file references are not supported with this configuration"); + } + + return await cache.get(`file-content-${fileIdentifier(ref)}`, undefined, () => + fetchWorkflowFile(client, ref.owner, ref.repository, ref.path, ref.version) + ); } - return await cache.get(`file-content-${fileIdentifier(ref)}`, undefined, () => - fetchWorkflowFile(client, ref.owner, ref.repository, ref.path, ref.version) - ); + if (!workspace) { + throw new Error("Local file references are not supported with this configuration"); + } + + const file = await readFile(path.join(workspace, ref.path)); + if (!file) { + throw new Error(`File not found: ${ref.path}`); + } + return { + name: ref.path, + content: file + }; } }; } From a4453b1c23997c302bd8c8759c5812e8319e983c Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 21:08:30 +0000 Subject: [PATCH 51/52] v0.1.125 --- 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 628819e..d9205ae 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.124", + "version": "0.1.125", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index a42e112..11db1de 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.124", + "version": "0.1.125", "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.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-languageservice": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "@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 bf8da24..96c082b 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.124", + "version": "0.1.125", "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.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-expressions": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "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 2561225..038ad49 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.124", + "version": "0.1.125", "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.124", + "@github/actions-expressions": "^0.1.125", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index d95be90..c9d4a15 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.124", + "version": "0.1.125", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.124", + "@github/actions-languageserver": "^0.1.125", "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 34ed38a..6a6dfa3 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.124" + "version": "0.1.125" } diff --git a/package-lock.json b/package-lock.json index b295b2e..97d9aed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.124", + "version": "0.1.125", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.124", + "version": "0.1.125", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-languageservice": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "@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.124", + "version": "0.1.125", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-expressions": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "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.124", + "version": "0.1.125", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.124", + "@github/actions-expressions": "^0.1.125", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.124", + "version": "0.1.125", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.124", + "@github/actions-languageserver": "^0.1.125", "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.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-languageservice": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "@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.124", - "@github/actions-workflow-parser": "^0.1.124", + "@github/actions-expressions": "^0.1.125", + "@github/actions-workflow-parser": "^0.1.125", "@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.124", + "@github/actions-expressions": "^0.1.125", "@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.124", + "@github/actions-languageserver": "^0.1.125", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2", From 05605c80c7c4fb3da36aed359040bbe59cf281da Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Feb 2023 21:11:58 +0000 Subject: [PATCH 52/52] v0.1.126 --- 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 d9205ae..15c566c 100755 --- a/actions-expressions/package.json +++ b/actions-expressions/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-expressions", - "version": "0.1.125", + "version": "0.1.126", "license": "MIT", "type": "module", "source": "./src/index.ts", diff --git a/actions-languageserver/package.json b/actions-languageserver/package.json index 11db1de..3b355cf 100644 --- a/actions-languageserver/package.json +++ b/actions-languageserver/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageserver", - "version": "0.1.125", + "version": "0.1.126", "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.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-languageservice": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "@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 96c082b..0a94fd9 100644 --- a/actions-languageservice/package.json +++ b/actions-languageservice/package.json @@ -1,6 +1,6 @@ { "name": "@github/actions-languageservice", - "version": "0.1.125", + "version": "0.1.126", "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.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-expressions": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "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 038ad49..5a007f1 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.125", + "version": "0.1.126", "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.125", + "@github/actions-expressions": "^0.1.126", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, diff --git a/browser-playground/package.json b/browser-playground/package.json index c9d4a15..0170c9a 100644 --- a/browser-playground/package.json +++ b/browser-playground/package.json @@ -1,12 +1,12 @@ { "name": "browser-playground", - "version": "0.1.125", + "version": "0.1.126", "description": "", "private": true, "main": "index.js", "type": "module", "dependencies": { - "@github/actions-languageserver": "^0.1.125", + "@github/actions-languageserver": "^0.1.126", "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 6a6dfa3..ca156aa 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "0.1.125" + "version": "0.1.126" } diff --git a/package-lock.json b/package-lock.json index 97d9aed..13332ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "actions-expressions": { "name": "@github/actions-expressions", - "version": "0.1.125", + "version": "0.1.126", "license": "MIT", "devDependencies": { "@types/jest": "^29.0.3", @@ -34,11 +34,11 @@ }, "actions-languageserver": { "name": "@github/actions-languageserver", - "version": "0.1.125", + "version": "0.1.126", "license": "MIT", "dependencies": { - "@github/actions-languageservice": "^0.1.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-languageservice": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "@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.125", + "version": "0.1.126", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-expressions": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "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.125", + "version": "0.1.126", "license": "MIT", "dependencies": { - "@github/actions-expressions": "^0.1.125", + "@github/actions-expressions": "^0.1.126", "cronstrue": "^2.21.0", "yaml": "^2.0.0-8" }, @@ -105,10 +105,10 @@ } }, "browser-playground": { - "version": "0.1.125", + "version": "0.1.126", "license": "MIT", "dependencies": { - "@github/actions-languageserver": "^0.1.125", + "@github/actions-languageserver": "^0.1.126", "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.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-languageservice": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "@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.125", - "@github/actions-workflow-parser": "^0.1.125", + "@github/actions-expressions": "^0.1.126", + "@github/actions-workflow-parser": "^0.1.126", "@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.125", + "@github/actions-expressions": "^0.1.126", "@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.125", + "@github/actions-languageserver": "^0.1.126", "css-loader": "^6.7.2", "monaco-editor-webpack-plugin": "^7.0.1", "monaco-editor-workers": "^0.34.2",