main 98594d0

convert.mjs RawHistoryFolder

1// SPDX-License-Identifier: MIT
2//
3// Generates testdata/convert.json: for each workflow in testdata/convert/*.yml,
4// the errors and the model summary that @actions/workflow-parser 0.3.61 (MIT,
5// GitHub) produces. convert_test.go replays the files and compares.
6//
7//   gen/regen.sh
8//
9// which installs the versions pinned in gen/package-lock.json and runs this
10// script with the loader of gen/register.mjs (the package imports its JSON
11// schema without the import attribute recent Node versions require). A dist
12// path may be given as the first argument.
13
14import { pathToFileURL } from "node:url";
15import path from "node:path";
16import fs from "node:fs";
17
18const dist = path.resolve(process.argv[2] ?? new URL("../../gen/node_modules/@actions/workflow-parser/dist", import.meta.url).pathname);
19const imp = p => import(pathToFileURL(path.join(dist, p)).href);
20const { parseWorkflow } = await imp("workflows/workflow-parser.js");
21const { NoOperationTraceWriter } = await imp("templates/trace-writer.js");
22const { convertWorkflowTemplate } = await imp("model/convert.js");
23
24const dir = new URL("../testdata/convert/", import.meta.url);
25const out = {};
26for (const f of fs.readdirSync(dir).sort()) {
27  if (!f.endsWith(".yml")) continue;
28  const content = fs.readFileSync(new URL(f, dir), "utf8");
29  const r = parseWorkflow({ name: f, content }, new NoOperationTraceWriter());
30  const res = { errors: [] };
31  if (!r.value) {
32    res.errors = r.context.errors.getErrors().map(e => e.message);
33  } else {
34    // Default options: ReturnErrorsOnly, i.e. the converter does not run when the
35    // schema reported errors.
36    const t = await convertWorkflowTemplate(r.context, r.value);
37    res.errors = (t.errors || []).map(e => e.Message);
38    res.jobs = (t.jobs || []).map(j => ({
39      id: j.id.value,
40      name: String(j.name),
41      if: j.if?.expression,
42      needs: (j.needs || []).map(n => n.value),
43      steps: (j.steps || []).map(s => ({ id: s.id, if: s.if?.expression })),
44    }));
45    res.events = t.events;
46  }
47  out[f] = res;
48}
49console.log(JSON.stringify(out, null, 1));

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 3

↑↓ moveenter openesc close