Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f1ed3a1a33 | |||
| 28ab3928fd | |||
| afbe42bffe | |||
| a324b8b9dc | |||
| 4f7d03ed0c | |||
| 4ddbbc9db7 | |||
| 3ea2cf1829 | |||
| 2c30f2f45f | |||
| cf2d9cd0b9 | |||
| 8f2f59092e | |||
| 5de89b0f8e | |||
| f4afa48ea4 | |||
| af5dd4b91e | |||
| 12d28370dc | |||
| 833b6fcac5 | |||
| cd7fabeb7f | |||
| 26da52bdf8 | |||
| 31aa95fb10 | |||
| b912482163 | |||
| 41436c6570 | |||
| 468b68840b | |||
| 57a77551b0 | |||
| a34a500176 | |||
| d7ae6f88f1 | |||
| 588c457cea | |||
| 82985934af | |||
| cb3ec583e0 | |||
| 7c3b116b19 | |||
| 4a6134be6c | |||
| 0080226132 | |||
| 896f780991 | |||
| 63b170f2a6 | |||
| 94451fa8f2 | |||
| 41e05b8ad1 | |||
| 5362fb1841 | |||
| 4e1f7cd9ac | |||
| 5c785ab41b | |||
| 9d246960f3 | |||
| eefd820cc5 | |||
| 58712f4d46 | |||
| 0bd67083ff | |||
| 40c20d5504 | |||
| c6cde72b37 | |||
| d47636092a | |||
| e292f8ca51 | |||
| 8f4080074b | |||
| b04e5db100 | |||
| 2795997f4c | |||
| 413ae51185 | |||
| 8bc0c5636e | |||
| 58bf3b35cc | |||
| 124ee84d1f | |||
| c4d478d459 | |||
| 9945ec321b | |||
| 5cb4007629 | |||
| 07fa29649e | |||
| 7bb2962bb0 | |||
| 3904c64796 | |||
| 48ad5e5251 | |||
| 317c4fcd63 | |||
| bf97052855 | |||
| dd8930fd74 | |||
| 2449e5cea1 | |||
| dba3cf5d96 | |||
| 804f83828f |
@@ -1,13 +1,18 @@
|
||||
name: Create release PR
|
||||
|
||||
run-name: Create release PR for v${{ github.event.inputs.version }}
|
||||
run-name: Create release PR for new ${{ github.event.inputs.version }} version
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
required: true
|
||||
description: "Version to bump `package.json` to (format: x.y.z)"
|
||||
type: choice
|
||||
description: "What type of release is this"
|
||||
options:
|
||||
- "major"
|
||||
- "minor"
|
||||
- "patch"
|
||||
|
||||
jobs:
|
||||
create-release-pr:
|
||||
@@ -31,21 +36,27 @@ jobs:
|
||||
git config --global user.email "github-actions@github.com"
|
||||
git config --global user.name "GitHub Actions"
|
||||
|
||||
git checkout -b release/${{ inputs.version }}
|
||||
NEW_VERSION=$(./script/workflows/increment-version.sh ${{ inputs.version }})
|
||||
|
||||
npx lerna version ${{ inputs.version }} --yes --no-push --no-git-tag-version --force-publish
|
||||
git checkout -b release/$NEW_VERSION
|
||||
|
||||
npx lerna version $NEW_VERSION --yes --no-push --no-git-tag-version --force-publish
|
||||
|
||||
git add **/package.json package-lock.json lerna.json
|
||||
git commit -m "Release extension version ${{ inputs.version }}"
|
||||
git commit -m "Release extension version $NEW_VERSION"
|
||||
|
||||
git push --set-upstream origin release/${{ inputs.version }}
|
||||
git push --set-upstream origin release/$NEW_VERSION
|
||||
|
||||
echo "new_version=$NEW_VERSION" >> $GITHUB_ENV
|
||||
|
||||
- name: Create PR
|
||||
run: |
|
||||
LAST_PR=$(gh pr list --repo ${{ github.repository }} --limit 1 --state merged --search "Release version" --json number | jq -r '.[0].number')
|
||||
./script/workflows/generate-release-notes.sh $LAST_PR ${{ env.new_version }}
|
||||
gh pr create \
|
||||
--title "Release version ${{ inputs.version }}" \
|
||||
--body "Release version ${{ inputs.version }}" \
|
||||
--title "Release version ${{ env.new_version }}" \
|
||||
--body-file releasenotes.md \
|
||||
--base main \
|
||||
--head release/${{ inputs.version }}
|
||||
--head release/${{ env.new_version }}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
*/node_modules
|
||||
*/dist
|
||||
|
||||
lerna-debug.log
|
||||
node_modules
|
||||
.DS_Store
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@actions/expressions",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"source": "./src/index.ts",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@actions/languageserver",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"description": "Language server for GitHub Actions",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
@@ -43,8 +43,8 @@
|
||||
"watch": "tsc --build tsconfig.build.json --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/languageservice": "^0.3.3",
|
||||
"@actions/workflow-parser": "^0.3.3",
|
||||
"@actions/languageservice": "^0.4.0",
|
||||
"@actions/workflow-parser": "^0.4.0",
|
||||
"@octokit/rest": "^19.0.7",
|
||||
"@octokit/types": "^9.0.0",
|
||||
"vscode-languageserver": "^8.0.2",
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import {Octokit} from "@octokit/rest";
|
||||
|
||||
export function getClient(token: string, userAgent?: string): Octokit {
|
||||
export function getClient(token: string, userAgent?: string, apiUrl?: string): Octokit {
|
||||
return new Octokit({
|
||||
auth: token,
|
||||
userAgent: userAgent || `GitHub Actions Language Server`
|
||||
userAgent: userAgent || `GitHub Actions Language Server`,
|
||||
baseUrl: apiUrl
|
||||
});
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ export function initConnection(connection: Connection) {
|
||||
const options = params.initializationOptions as InitializationOptions;
|
||||
|
||||
if (options.sessionToken) {
|
||||
client = getClient(options.sessionToken, options.userAgent);
|
||||
client = getClient(options.sessionToken, options.userAgent, options.gitHubApiUrl);
|
||||
}
|
||||
|
||||
if (options.repos) {
|
||||
|
||||
@@ -28,6 +28,7 @@ export async function getSecrets(
|
||||
}
|
||||
|
||||
const eventsConfig = workflowContext?.template?.events;
|
||||
|
||||
if (eventsConfig?.workflow_call) {
|
||||
// Unpredictable secrets may be passed in via a workflow_call trigger
|
||||
secretsContext.complete = false;
|
||||
@@ -38,6 +39,7 @@ export async function getSecrets(
|
||||
}
|
||||
|
||||
let environmentName: string | undefined;
|
||||
|
||||
if (workflowContext?.job?.environment) {
|
||||
if (isString(workflowContext.job.environment)) {
|
||||
environmentName = workflowContext.job.environment.value;
|
||||
@@ -46,10 +48,17 @@ export async function getSecrets(
|
||||
if (isString(x.key) && x.key.value === "name") {
|
||||
if (isString(x.value)) {
|
||||
environmentName = x.value.value;
|
||||
} else {
|
||||
// this means we have a dynamic enviornment, in those situations we
|
||||
// want to make sure we skip doing secret validation
|
||||
secretsContext.complete = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// if the expression is something like environment: ${{ ... }} then we want to skip validation
|
||||
secretsContext.complete = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,10 @@ import {data, DescriptionDictionary} from "@actions/expressions";
|
||||
import {Pair} from "@actions/expressions/data/expressiondata";
|
||||
import {StringData} from "@actions/expressions/data/index";
|
||||
import {WorkflowContext} from "@actions/languageservice/context/workflow-context";
|
||||
import {warn} from "@actions/languageservice/log";
|
||||
import {log, warn} from "@actions/languageservice/log";
|
||||
import {isMapping, isString} from "@actions/workflow-parser";
|
||||
import {Octokit} from "@octokit/rest";
|
||||
import {RequestError} from "@octokit/request-error";
|
||||
|
||||
import {RepositoryContext} from "../initializationOptions";
|
||||
import {TTLCache} from "../utils/cache";
|
||||
@@ -42,50 +43,58 @@ export async function getVariables(
|
||||
}
|
||||
|
||||
const variablesContext = defaultContext || new DescriptionDictionary();
|
||||
const variables = await getRemoteVariables(octokit, cache, repo, environmentName);
|
||||
try {
|
||||
const variables = await getRemoteVariables(octokit, cache, repo, environmentName);
|
||||
|
||||
// Build combined map of variables
|
||||
const variablesMap = new Map<
|
||||
string,
|
||||
{
|
||||
key: string;
|
||||
value: data.StringData;
|
||||
description?: string;
|
||||
}
|
||||
>();
|
||||
// Build combined map of variables
|
||||
const variablesMap = new Map<
|
||||
string,
|
||||
{
|
||||
key: string;
|
||||
value: data.StringData;
|
||||
description?: string;
|
||||
}
|
||||
>();
|
||||
|
||||
variables.organizationVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Organization variable`
|
||||
})
|
||||
);
|
||||
variables.organizationVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Organization variable`
|
||||
})
|
||||
);
|
||||
|
||||
// Override org variables with repo variables
|
||||
variables.repoVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Repository variable`
|
||||
})
|
||||
);
|
||||
// Override org variables with repo variables
|
||||
variables.repoVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Repository variable`
|
||||
})
|
||||
);
|
||||
|
||||
// Override repo variables with environment veriables (if defined)
|
||||
variables.environmentVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Variable for environment \`${environmentName || ""}\``
|
||||
})
|
||||
);
|
||||
// Override repo variables with environment veriables (if defined)
|
||||
variables.environmentVariables.forEach(variable =>
|
||||
variablesMap.set(variable.key.toLowerCase(), {
|
||||
key: variable.key,
|
||||
value: new data.StringData(variable.value.coerceString()),
|
||||
description: `${variable.value.coerceString()} - Variable for environment \`${environmentName || ""}\``
|
||||
})
|
||||
);
|
||||
|
||||
// Sort variables by key and add to context
|
||||
Array.from(variablesMap.values())
|
||||
.sort((a, b) => a.key.localeCompare(b.key))
|
||||
.forEach(variable => variablesContext?.add(variable.key, variable.value, variable.description));
|
||||
// Sort variables by key and add to context
|
||||
Array.from(variablesMap.values())
|
||||
.sort((a, b) => a.key.localeCompare(b.key))
|
||||
.forEach(variable => variablesContext?.add(variable.key, variable.value, variable.description));
|
||||
|
||||
return variablesContext;
|
||||
return variablesContext;
|
||||
} catch (e) {
|
||||
if (!(e instanceof RequestError)) throw e;
|
||||
if (e.name == "HttpError" && e.status == 404) {
|
||||
log("Failure to request variables. Ignore if you're using GitHub Enterprise Server below version 3.8");
|
||||
return variablesContext;
|
||||
} else throw e;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getRemoteVariables(
|
||||
|
||||
@@ -2,8 +2,8 @@ import {File} from "@actions/workflow-parser/workflows/file";
|
||||
import {FileProvider} from "@actions/workflow-parser/workflows/file-provider";
|
||||
import {fileIdentifier} from "@actions/workflow-parser/workflows/file-reference";
|
||||
import {Octokit} from "@octokit/rest";
|
||||
import path from "path";
|
||||
import {TTLCache} from "./utils/cache";
|
||||
import vscodeURI from "vscode-uri/lib/umd";
|
||||
|
||||
export function getFileProvider(
|
||||
client: Octokit | undefined,
|
||||
@@ -31,7 +31,10 @@ export function getFileProvider(
|
||||
throw new Error("Local file references are not supported with this configuration");
|
||||
}
|
||||
|
||||
const file = await readFile(path.join(workspace, ref.path));
|
||||
const workspaceURI = vscodeURI.URI.parse(workspace);
|
||||
const refURI = vscodeURI.Utils.joinPath(workspaceURI, ref.path);
|
||||
const file = await readFile(refURI.toString());
|
||||
|
||||
if (!file) {
|
||||
throw new Error(`File not found: ${ref.path}`);
|
||||
}
|
||||
|
||||
@@ -23,6 +23,11 @@ export interface InitializationOptions {
|
||||
* Desired log level
|
||||
*/
|
||||
logLevel?: LogLevel;
|
||||
|
||||
/**
|
||||
* If a GitHub Enterprise Server should be used, the URL of the API endpoint, eg "https://ghe.my-company.com/api/v3"
|
||||
*/
|
||||
gitHubApiUrl?: string;
|
||||
}
|
||||
|
||||
export interface RepositoryContext {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@actions/languageservice",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"description": "Language service for GitHub Actions",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
@@ -44,8 +44,8 @@
|
||||
"watch": "tsc --build tsconfig.build.json --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/expressions": "^0.3.3",
|
||||
"@actions/workflow-parser": "^0.3.3",
|
||||
"@actions/expressions": "^0.4.0",
|
||||
"@actions/workflow-parser": "^0.4.0",
|
||||
"vscode-languageserver-textdocument": "^1.0.7",
|
||||
"vscode-languageserver-types": "^3.17.2",
|
||||
"vscode-uri": "^3.0.7",
|
||||
|
||||
@@ -4,8 +4,8 @@ import {complete} from "./complete";
|
||||
import {registerLogger} from "./log";
|
||||
import {getPositionFromCursor} from "./test-utils/cursor-position";
|
||||
import {TestLogger} from "./test-utils/logger";
|
||||
import {ValueProviderConfig, ValueProviderKind} from "./value-providers/config";
|
||||
import {clearCache} from "./utils/workflow-cache";
|
||||
import {ValueProviderConfig, ValueProviderKind} from "./value-providers/config";
|
||||
|
||||
registerLogger(new TestLogger());
|
||||
|
||||
@@ -406,7 +406,7 @@ jobs:
|
||||
expect(result.map(e => e.label)).toContain("runs-on");
|
||||
|
||||
const textEdit = result.filter(e => e.label === "runs-on")[0].textEdit as TextEdit;
|
||||
expect(textEdit.newText).toEqual("runs-on");
|
||||
expect(textEdit.newText).toEqual("runs-on: ");
|
||||
expect(textEdit.range).toEqual({
|
||||
start: {line: 3, character: 4},
|
||||
end: {line: 3, character: 10}
|
||||
@@ -421,7 +421,7 @@ jobs:
|
||||
expect(result.map(e => e.label)).toContain("runs-on");
|
||||
|
||||
const textEdit = result.filter(e => e.label === "runs-on")[0].textEdit as TextEdit;
|
||||
expect(textEdit.newText).toEqual("runs-on");
|
||||
expect(textEdit.newText).toEqual("runs-on: ");
|
||||
expect(textEdit.range).toEqual({
|
||||
start: {line: 3, character: 4},
|
||||
end: {line: 3, character: 4}
|
||||
@@ -448,7 +448,7 @@ jobs:
|
||||
]);
|
||||
|
||||
// One-of
|
||||
expect(result.filter(x => x.label === "concurrency").map(x => x.textEdit?.newText)).toEqual(["concurrency"]);
|
||||
expect(result.filter(x => x.label === "concurrency").map(x => x.textEdit?.newText)).toEqual(["concurrency: "]);
|
||||
});
|
||||
|
||||
it("custom indentation", async () => {
|
||||
@@ -471,11 +471,11 @@ jobs:
|
||||
]);
|
||||
|
||||
// One-of
|
||||
expect(result.filter(x => x.label === "concurrency").map(x => x.textEdit?.newText)).toEqual(["concurrency"]);
|
||||
expect(result.filter(x => x.label === "concurrency").map(x => x.textEdit?.newText)).toEqual(["concurrency: "]);
|
||||
});
|
||||
});
|
||||
|
||||
it("adds a new line and indentation for mapping keys", async () => {
|
||||
it("adds a new line and indentation for mapping keys when the key is given", async () => {
|
||||
const input = "concurrency: |";
|
||||
|
||||
const result = await complete(...getPositionFromCursor(input));
|
||||
@@ -485,4 +485,36 @@ jobs:
|
||||
]);
|
||||
expect(result.filter(x => x.label === "group").map(x => x.textEdit?.newText)).toEqual(["\n group: "]);
|
||||
});
|
||||
|
||||
it("does not add new line if no key in line", async () => {
|
||||
const input = "run-n|";
|
||||
|
||||
const result = await complete(...getPositionFromCursor(input));
|
||||
|
||||
expect(result.filter(x => x.label === "run-name").map(x => x.textEdit?.newText)).toEqual(["run-name: "]);
|
||||
});
|
||||
|
||||
it("adds new line for nested mapping", async () => {
|
||||
const input = "on:\n workflow_dispatch: in|";
|
||||
|
||||
const result = await complete(...getPositionFromCursor(input));
|
||||
|
||||
expect(result.filter(x => x.label === "inputs").map(x => x.textEdit?.newText)).toEqual(["\n inputs:\n "]);
|
||||
});
|
||||
|
||||
it("adds : for one-of", async () => {
|
||||
const input = "on:\n check_run:\n ty|";
|
||||
|
||||
const result = await complete(...getPositionFromCursor(input));
|
||||
|
||||
expect(result.filter(x => x.label === "types").map(x => x.textEdit?.newText)).toEqual(["types: "]);
|
||||
});
|
||||
|
||||
it("does not add : for one-of in key mode", async () => {
|
||||
const input = "on:\n check_run: ty|";
|
||||
|
||||
const result = await complete(...getPositionFromCursor(input));
|
||||
|
||||
expect(result.filter(x => x.label === "types").map(x => x.textEdit?.newText)).toEqual(["types"]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -24,7 +24,7 @@ import {isPlaceholder, transform} from "./utils/transform";
|
||||
import {fetchOrConvertWorkflowTemplate, fetchOrParseWorkflow} from "./utils/workflow-cache";
|
||||
import {Value, ValueProviderConfig} from "./value-providers/config";
|
||||
import {defaultValueProviders} from "./value-providers/default";
|
||||
import {definitionValues} from "./value-providers/definition";
|
||||
import {DefinitionValueMode, definitionValues} from "./value-providers/definition";
|
||||
|
||||
export function getExpressionInput(input: string, pos: number): string {
|
||||
// Find start marker around the cursor position
|
||||
@@ -180,7 +180,7 @@ async function getValues(
|
||||
return [];
|
||||
}
|
||||
|
||||
const values = definitionValues(def, indentation);
|
||||
const values = definitionValues(def, indentation, keyToken ? DefinitionValueMode.Key : DefinitionValueMode.Parent);
|
||||
return filterAndSortCompletionOptions(values, existingValues);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,15 +9,30 @@ import {getWorkflowSchema} from "@actions/workflow-parser/workflows/workflow-sch
|
||||
import {Value} from "./config";
|
||||
import {stringsToValues} from "./strings-to-values";
|
||||
|
||||
export function definitionValues(def: Definition, indentation: string): Value[] {
|
||||
export enum DefinitionValueMode {
|
||||
/**
|
||||
* We're getting completion options for a parent token
|
||||
* foo:
|
||||
* ba|
|
||||
*/
|
||||
Parent,
|
||||
|
||||
/**
|
||||
* We're getting completion options for a key token. For example:
|
||||
* foo: |
|
||||
*/
|
||||
Key
|
||||
}
|
||||
|
||||
export function definitionValues(def: Definition, indentation: string, mode: DefinitionValueMode): Value[] {
|
||||
const schema = getWorkflowSchema();
|
||||
|
||||
if (def instanceof MappingDefinition) {
|
||||
return mappingValues(def, schema.definitions, indentation);
|
||||
return mappingValues(def, schema.definitions, indentation, mode);
|
||||
}
|
||||
|
||||
if (def instanceof OneOfDefinition) {
|
||||
return oneOfValues(def, schema.definitions, indentation);
|
||||
return oneOfValues(def, schema.definitions, indentation, mode);
|
||||
}
|
||||
|
||||
if (def instanceof BooleanDefinition) {
|
||||
@@ -36,7 +51,7 @@ export function definitionValues(def: Definition, indentation: string): Value[]
|
||||
if (def instanceof SequenceDefinition) {
|
||||
const itemDef = schema.getDefinition(def.itemType);
|
||||
if (itemDef) {
|
||||
return definitionValues(itemDef, indentation);
|
||||
return definitionValues(itemDef, indentation, mode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +61,8 @@ export function definitionValues(def: Definition, indentation: string): Value[]
|
||||
function mappingValues(
|
||||
mappingDefinition: MappingDefinition,
|
||||
definitions: {[key: string]: Definition},
|
||||
indentation: string
|
||||
indentation: string,
|
||||
mode: DefinitionValueMode
|
||||
): Value[] {
|
||||
const properties: Value[] = [];
|
||||
for (const [key, value] of Object.entries(mappingDefinition.properties)) {
|
||||
@@ -60,21 +76,38 @@ function mappingValues(
|
||||
if (typeDef) {
|
||||
switch (typeDef.definitionType) {
|
||||
case DefinitionType.Sequence:
|
||||
insertText = `${key}:\n${indentation}- `;
|
||||
if (mode == DefinitionValueMode.Key) {
|
||||
insertText = `\n${indentation}${key}:\n${indentation}${indentation}- `;
|
||||
} else {
|
||||
insertText = `${key}:\n${indentation}- `;
|
||||
}
|
||||
break;
|
||||
|
||||
case DefinitionType.Mapping:
|
||||
insertText = `${key}:\n${indentation}`;
|
||||
if (mode == DefinitionValueMode.Key) {
|
||||
insertText = `\n${indentation}${key}:\n${indentation}${indentation}`;
|
||||
} else {
|
||||
insertText = `${key}:\n${indentation}`;
|
||||
}
|
||||
break;
|
||||
|
||||
case DefinitionType.OneOf:
|
||||
// No special insertText in this case
|
||||
if (mode == DefinitionValueMode.Parent) {
|
||||
insertText = `${key}: `;
|
||||
} else {
|
||||
// No special insertText in this case
|
||||
}
|
||||
break;
|
||||
|
||||
case DefinitionType.String:
|
||||
case DefinitionType.Boolean:
|
||||
insertText = `\n${indentation}${key}: `;
|
||||
if (mode == DefinitionValueMode.Key) {
|
||||
insertText = `\n${indentation}${key}: `;
|
||||
} else {
|
||||
insertText = `${key}: `;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
insertText = `${key}: `;
|
||||
}
|
||||
@@ -93,11 +126,12 @@ function mappingValues(
|
||||
function oneOfValues(
|
||||
oneOfDefinition: OneOfDefinition,
|
||||
definitions: {[key: string]: Definition},
|
||||
indentation: string
|
||||
indentation: string,
|
||||
mode: DefinitionValueMode
|
||||
): Value[] {
|
||||
const values: Value[] = [];
|
||||
for (const key of oneOfDefinition.oneOf) {
|
||||
values.push(...definitionValues(definitions[key], indentation));
|
||||
values.push(...definitionValues(definitions[key], indentation, mode));
|
||||
}
|
||||
return distinctValues(values);
|
||||
}
|
||||
|
||||
+7
-2
@@ -1,5 +1,10 @@
|
||||
{
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
||||
"useWorkspaces": true,
|
||||
"version": "0.3.3"
|
||||
"packages": [
|
||||
"expressions",
|
||||
"workflow-parser",
|
||||
"languageservice",
|
||||
"languageserver"
|
||||
],
|
||||
"version": "0.4.0"
|
||||
}
|
||||
|
||||
Generated
+12
-11
@@ -135,7 +135,7 @@
|
||||
},
|
||||
"expressions": {
|
||||
"name": "@actions/expressions",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/jest": "^29.0.3",
|
||||
@@ -395,11 +395,11 @@
|
||||
},
|
||||
"languageserver": {
|
||||
"name": "@actions/languageserver",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/languageservice": "^0.3.3",
|
||||
"@actions/workflow-parser": "^0.3.3",
|
||||
"@actions/languageservice": "^0.4.0",
|
||||
"@actions/workflow-parser": "^0.4.0",
|
||||
"@octokit/rest": "^19.0.7",
|
||||
"@octokit/types": "^9.0.0",
|
||||
"vscode-languageserver": "^8.0.2",
|
||||
@@ -678,11 +678,11 @@
|
||||
},
|
||||
"languageservice": {
|
||||
"name": "@actions/languageservice",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/expressions": "^0.3.3",
|
||||
"@actions/workflow-parser": "^0.3.3",
|
||||
"@actions/expressions": "^0.4.0",
|
||||
"@actions/workflow-parser": "^0.4.0",
|
||||
"vscode-languageserver-textdocument": "^1.0.7",
|
||||
"vscode-languageserver-types": "^3.17.2",
|
||||
"vscode-uri": "^3.0.7",
|
||||
@@ -11668,8 +11668,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/yaml": {
|
||||
"version": "2.1.3",
|
||||
"license": "ISC",
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
|
||||
"integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
|
||||
"engines": {
|
||||
"node": ">= 14"
|
||||
}
|
||||
@@ -11720,10 +11721,10 @@
|
||||
},
|
||||
"workflow-parser": {
|
||||
"name": "@actions/workflow-parser",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/expressions": "^0.3.3",
|
||||
"@actions/expressions": "^0.4.0",
|
||||
"cronstrue": "^2.21.0",
|
||||
"yaml": "^2.0.0-8"
|
||||
},
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Release 0.3.5
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
# this script is used to generate release notes for a given release
|
||||
# first argument is the pull request id for the last release
|
||||
# the second is the new release number
|
||||
|
||||
# the script then grabs every pull request merged since that pull request
|
||||
# and outputs a string of release notes
|
||||
|
||||
# get the new release number
|
||||
NEW_RELEASE=$2
|
||||
|
||||
echo "Generating release notes for $NEW_RELEASE"
|
||||
|
||||
# get the last release pull request id
|
||||
LAST_RELEASE_PR=$1
|
||||
|
||||
|
||||
|
||||
#get when the last release was merged
|
||||
LAST_RELEASE_MERGED_AT=$(gh pr view $LAST_RELEASE_PR --repo actions/languageservices --json mergedAt | jq -r '.mergedAt')
|
||||
|
||||
CHANGELIST=$(gh pr list --repo actions/languageservices --base main --state merged --json title --search "merged:>$LAST_RELEASE_MERGED_AT -label:no-release")
|
||||
|
||||
# store the release notes in a variable so we can use it later
|
||||
|
||||
echo "Release $NEW_RELEASE" >> releasenotes.md
|
||||
|
||||
echo $CHANGELIST | jq -r '.[].title' | while read line; do
|
||||
echo " - $line" >> releasenotes.md
|
||||
done
|
||||
|
||||
echo " "
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
VERSION=$(cat lerna.json | jq -r '.version')
|
||||
|
||||
MAJOR=$(echo $VERSION | cut -d. -f1)
|
||||
MINOR=$(echo $VERSION | cut -d. -f2)
|
||||
PATCH=$(echo $VERSION | cut -d. -f3)
|
||||
|
||||
if [ "$1" == "major" ]; then
|
||||
MAJOR=$((MAJOR+1))
|
||||
MINOR=0
|
||||
PATCH=0
|
||||
elif [ "$1" == "minor" ]; then
|
||||
MINOR=$((MINOR+1))
|
||||
PATCH=0
|
||||
elif [ "$1" == "patch" ]; then
|
||||
PATCH=$((PATCH+1))
|
||||
else
|
||||
echo "Invalid version type. Use 'major', 'minor' or 'patch'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
|
||||
echo $NEW_VERSION
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
);
|
||||
```
|
||||
|
||||
`convertWorkflowTemplate` then takes that intermediate representation and converts it to a [`WorkflowTemplate`](./src/workflow-template.ts) object, which is a more convenient representation for working with workflows.
|
||||
`convertWorkflowTemplate` then takes that intermediate representation and converts it to a [`WorkflowTemplate`](./src/model/workflow-template.ts) object, which is a more convenient representation for working with workflows.
|
||||
|
||||
```typescript
|
||||
const workflowTemplate = await convertWorkflowTemplate(result.context, result.value);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@actions/workflow-parser",
|
||||
"version": "0.3.3",
|
||||
"version": "0.4.0",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"source": "./src/index.ts",
|
||||
@@ -43,7 +43,7 @@
|
||||
"watch": "tsc --build tsconfig.build.json --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/expressions": "^0.3.3",
|
||||
"@actions/expressions": "^0.4.0",
|
||||
"cronstrue": "^2.21.0",
|
||||
"yaml": "^2.0.0-8"
|
||||
},
|
||||
|
||||
@@ -577,7 +577,8 @@
|
||||
"mapping": {
|
||||
"properties": {
|
||||
"types": "merge-group-activity",
|
||||
"branches": "event-branches"
|
||||
"branches": "event-branches",
|
||||
"branches-ignore": "event-branches-ignore"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1182,7 +1183,7 @@
|
||||
]
|
||||
},
|
||||
"workflow-run-activity": {
|
||||
"description": "The types of workflow run activity that trigger the workflow. Suupported activity types: `completed`, `requested`, `in_progress`.",
|
||||
"description": "The types of workflow run activity that trigger the workflow. Supported activity types: `completed`, `requested`, `in_progress`.",
|
||||
"one-of": [
|
||||
"workflow-run-activity-type",
|
||||
"workflow-run-activity-types"
|
||||
@@ -2488,7 +2489,7 @@
|
||||
"string": {
|
||||
"require-non-empty": true
|
||||
},
|
||||
"description": "Use `shell` to override the default shell settings in the runner's operating system. You can use built-in shell keywords, or you can define a custom set of shell options. The shell command that is run internally executes a temporary file that contains the comands specified in `run`."
|
||||
"description": "Use `shell` to override the default shell settings in the runner's operating system. You can use built-in shell keywords, or you can define a custom set of shell options. The shell command that is run internally executes a temporary file that contains the commands specified in `run`."
|
||||
},
|
||||
"working-directory": {
|
||||
"string": {
|
||||
|
||||
+7
-2
@@ -73,8 +73,10 @@ on:
|
||||
- deleted
|
||||
merge_group:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- master
|
||||
- main
|
||||
branches-ignore:
|
||||
- develop
|
||||
types:
|
||||
- checks_requested
|
||||
milestone:
|
||||
@@ -321,6 +323,9 @@ jobs:
|
||||
"master",
|
||||
"main"
|
||||
],
|
||||
"branches-ignore": [
|
||||
"develop"
|
||||
],
|
||||
"types": [
|
||||
"checks_requested"
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user