Add first default value provider

This commit is contained in:
Christopher Schleiden
2022-11-15 15:59:14 -08:00
parent 82f29eb216
commit 35d706334e
5 changed files with 71 additions and 27 deletions
@@ -1,31 +1,19 @@
import {data} from "@github/actions-expressions/.";
import {data} from "@github/actions-expressions";
import {complete, getExpressionInput} from "./complete";
import {ContextProviderConfig} from "./context-providers/config";
import {getPositionFromCursor} from "./test-utils/cursor-position";
const contextProviderConfig: ContextProviderConfig = {
async getContext(contexts: string[]): Promise<data.Dictionary | undefined> {
const context = new data.Dictionary();
for (const contextName of contexts) {
switch (contextName) {
case "github":
context.add(
"github",
new data.Dictionary({
key: "event",
value: new data.StringData("push")
})
);
break;
default:
context.add(contextName, new data.Dictionary());
break;
}
getContext: async (context: string) => {
switch (context) {
case "github":
return new data.Dictionary({
key: "event",
value: new data.StringData("push")
});
}
return context;
return undefined;
}
};
@@ -102,5 +90,13 @@ describe("expressions", () => {
expect(result.map(x => x.label)).toEqual(["event"]);
});
it("using default context provider", async () => {
const input =
"on: push\njobs:\n build:\n runs-on: ubuntu-latest\n environment:\n url: ${{ runner.| }}\n steps:\n - run: echo";
const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig);
expect(result.map(x => x.label)).toEqual(["arch", "name", "os", "temp", "tool_cache"]);
});
});
});
+3 -3
View File
@@ -1,4 +1,4 @@
import {complete as completeExpression, data} from "@github/actions-expressions";
import {complete as completeExpression} from "@github/actions-expressions";
import {isSequence, isString, parseWorkflow} from "@github/actions-workflow-parser";
import {CLOSE_EXPRESSION, OPEN_EXPRESSION} from "@github/actions-workflow-parser/templates/template-constants";
import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/index";
@@ -9,6 +9,7 @@ import {File} from "@github/actions-workflow-parser/workflows/file";
import {Position, TextDocument} from "vscode-languageserver-textdocument";
import {CompletionItem} from "vscode-languageserver-types";
import {ContextProviderConfig} from "./context-providers/config";
import {getContext} from "./context-providers/default";
import {nullTrace} from "./nulltrace";
import {findInnerTokenAndParent} from "./utils/find-token";
import {transform} from "./utils/transform";
@@ -61,8 +62,7 @@ export async function complete(
const expressionInput = (getExpressionInput(currentInput, relCharPos) || "").trim();
const context =
(await contextProviderConfig?.getContext(innerToken.definition!.readerContext)) || new data.Dictionary();
const context = await getContext(innerToken.definition?.readerContext || [], contextProviderConfig);
return completeExpression(expressionInput, context, []);
}
@@ -2,9 +2,9 @@ import {data} from "@github/actions-expressions";
import {Dictionary} from "@github/actions-expressions/data/dictionary";
import {ExpressionData, Pair} from "@github/actions-expressions/data/expressiondata";
export interface ContextProviderConfig {
getContext(contexts: string[]): Promise<data.Dictionary | undefined>;
}
export type ContextProviderConfig = {
getContext: (name: string) => Promise<data.Dictionary | undefined>;
};
/**
* DynamicDictionary is a dictionary that returns an empty DynamicDictionary for
@@ -0,0 +1,48 @@
import {data} from "@github/actions-expressions";
import {ContextProviderConfig} from "./config";
export async function getContext(names: string[], config: ContextProviderConfig | undefined): Promise<data.Dictionary> {
const context = new data.Dictionary();
for (const contextName of names) {
let value: data.Dictionary | undefined;
value = await getDefaultContext(contextName);
if (!value) {
value = await config?.getContext(contextName);
}
if (!value) {
value = new data.Dictionary();
}
context.add(contextName, value);
}
return context;
}
async function getDefaultContext(name: string): Promise<data.Dictionary | undefined> {
switch (name) {
case "runner":
return objectToDictionary({
os: "Linux",
arch: "X64",
name: "GitHub Actions 2",
tool_cache: "/opt/hostedtoolcache",
temp: "/home/runner/work/_temp"
});
}
return undefined;
}
function objectToDictionary(object: {[key: string]: string}): data.Dictionary {
const dictionary = new data.Dictionary();
for (const key in object) {
dictionary.add(key, new data.StringData(object[key]));
}
return dictionary;
}