gagen 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -14
- package/esm/pin.d.ts.map +1 -1
- package/esm/pin.js +22 -2
- package/esm/workflow.d.ts +1 -1
- package/esm/workflow.d.ts.map +1 -1
- package/esm/workflow.js +3 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# gagen
|
|
2
2
|
|
|
3
3
|
[](https://jsr.io/@david/gagen)
|
|
4
4
|
[](http://www.npmjs.com/package/gagen)
|
|
@@ -49,11 +49,11 @@ const lint = step
|
|
|
49
49
|
// only specify the leaf steps — the other steps are pulled in automatically
|
|
50
50
|
createWorkflow({
|
|
51
51
|
name: "ci",
|
|
52
|
-
on:
|
|
52
|
+
on: ["push", "pull_request"],
|
|
53
53
|
jobs: [{
|
|
54
54
|
id: "build",
|
|
55
55
|
runsOn: "ubuntu-latest",
|
|
56
|
-
steps: [
|
|
56
|
+
steps: [lint, test],
|
|
57
57
|
}],
|
|
58
58
|
}).writeOrLint({
|
|
59
59
|
filePath: new URL("./ci.yml", import.meta.url),
|
|
@@ -62,7 +62,35 @@ createWorkflow({
|
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
This generates a `ci.yml` with steps in the correct order and figures out that
|
|
65
|
-
it should only install deno when the lint step should be run
|
|
65
|
+
it should only install deno when the lint step should be run and it defers that
|
|
66
|
+
step only until it's necessary.
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
# GENERATED BY ./ci.generate.ts -- DO NOT DIRECTLY EDIT
|
|
70
|
+
|
|
71
|
+
name: ci
|
|
72
|
+
on:
|
|
73
|
+
- push
|
|
74
|
+
- pull_request
|
|
75
|
+
jobs:
|
|
76
|
+
build:
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
80
|
+
- name: Clippy
|
|
81
|
+
if: github.ref != 'refs/heads/main'
|
|
82
|
+
run: cargo clippy
|
|
83
|
+
- uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282
|
|
84
|
+
if: github.ref != 'refs/heads/main'
|
|
85
|
+
- name: Deno Lint
|
|
86
|
+
if: github.ref != 'refs/heads/main'
|
|
87
|
+
run: deno lint
|
|
88
|
+
- name: Test
|
|
89
|
+
run: cargo test
|
|
90
|
+
|
|
91
|
+
# gagen:pin actions/checkout@v6 = de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
92
|
+
# gagen:pin denoland/setup-deno@v2 = 667a34cdef165d8d2b2e98dde39547c9daac7282
|
|
93
|
+
```
|
|
66
94
|
|
|
67
95
|
When run normally, this writes `ci.yml`. When run with `--lint`, it reads the
|
|
68
96
|
existing file and compares the parsed YAML — exiting with a non-zero code if
|
|
@@ -76,12 +104,22 @@ const lintStep = step({
|
|
|
76
104
|
});
|
|
77
105
|
```
|
|
78
106
|
|
|
79
|
-
## Dependency pinning
|
|
107
|
+
## Dependency pinning—the output is a lockfile
|
|
108
|
+
|
|
109
|
+
By default, `writeOrLint` pins action references to their resolved commit hashes
|
|
110
|
+
then stores that hash value locked in the output.
|
|
111
|
+
|
|
112
|
+
For example, if you write the following step in a workflow:
|
|
80
113
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
114
|
+
<!-- deno-fmt-ignore -->
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
step({
|
|
118
|
+
uses: "actions/checkout@v6",
|
|
119
|
+
})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
It will output:
|
|
85
123
|
|
|
86
124
|
```yaml
|
|
87
125
|
steps:
|
|
@@ -89,6 +127,9 @@ steps:
|
|
|
89
127
|
# gagen:pin actions/checkout@v6 = 11bd71901bbe5b1630ceea73d27597364c9af683
|
|
90
128
|
```
|
|
91
129
|
|
|
130
|
+
Then the next time it runs, it will read the output to get a locked set of
|
|
131
|
+
dependencies.
|
|
132
|
+
|
|
92
133
|
To force re-resolving all pins, run with the `--update-pins` flag:
|
|
93
134
|
|
|
94
135
|
```sh
|
|
@@ -295,7 +336,7 @@ const preBuild = job("pre_build", {
|
|
|
295
336
|
// automatically adds needs: [pre_build] to this job
|
|
296
337
|
const wf = createWorkflow({
|
|
297
338
|
name: "ci",
|
|
298
|
-
on:
|
|
339
|
+
on: ["push", "pull_request"],
|
|
299
340
|
jobs: [
|
|
300
341
|
preBuild,
|
|
301
342
|
{
|
|
@@ -430,14 +471,14 @@ import { createWorkflow } from "gagen";
|
|
|
430
471
|
|
|
431
472
|
const wf = createWorkflow({
|
|
432
473
|
name: "ci",
|
|
433
|
-
on:
|
|
474
|
+
on: ["push", "pull_request"],
|
|
434
475
|
permissions: { contents: "read", packages: "write" },
|
|
435
476
|
});
|
|
436
477
|
|
|
437
478
|
// or use a scalar value
|
|
438
479
|
const wf2 = createWorkflow({
|
|
439
480
|
name: "ci",
|
|
440
|
-
on:
|
|
481
|
+
on: ["push", "pull_request"],
|
|
441
482
|
permissions: "read-all",
|
|
442
483
|
});
|
|
443
484
|
|
|
@@ -494,7 +535,7 @@ Call a reusable workflow from a job using `uses` instead of `runsOn`:
|
|
|
494
535
|
```ts
|
|
495
536
|
const wf = createWorkflow({
|
|
496
537
|
name: "CI",
|
|
497
|
-
on:
|
|
538
|
+
on: ["push", "pull_request"],
|
|
498
539
|
jobs: [
|
|
499
540
|
{
|
|
500
541
|
id: "build",
|
|
@@ -534,7 +575,7 @@ const deployStep = step.dependsOn(download)({
|
|
|
534
575
|
|
|
535
576
|
const wf = createWorkflow({
|
|
536
577
|
name: "CI",
|
|
537
|
-
on:
|
|
578
|
+
on: ["push", "pull_request"],
|
|
538
579
|
jobs: [
|
|
539
580
|
{ id: "build", runsOn: "ubuntu-latest", steps: [buildStep, upload] },
|
|
540
581
|
// needs: [build] is inferred automatically from the artifact link
|
package/esm/pin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcxE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,CA2BR;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,KACR,MAAM,CAAC;AAEZ,8DAA8D;AAC9D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAwB,EACjC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC1B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcxE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,CA2BR;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,KACR,MAAM,CAAC;AAEZ,8DAA8D;AAC9D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAwB,EACjC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC1B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,CAkDvC;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAO1D;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,QAAQ,EAAE,GACf,OAAO,CA8CT"}
|
package/esm/pin.js
CHANGED
|
@@ -51,12 +51,31 @@ export function pinYamlContent(yamlStr, resolve = resolveRef, cache) {
|
|
|
51
51
|
const content = yamlStr.replace(/^(\s+(?:-\s+)?uses:\s+)(.+)$/gm, (_match, prefix, usesValue) => {
|
|
52
52
|
const trimmed = usesValue.trim();
|
|
53
53
|
const parsed = parseActionUses(trimmed);
|
|
54
|
-
if (!parsed
|
|
54
|
+
if (!parsed)
|
|
55
55
|
return `${prefix}${usesValue}`;
|
|
56
|
+
if (isCommitHash(parsed.ref)) {
|
|
57
|
+
// already pinned — preserve the existing pin entry from cache
|
|
58
|
+
if (cache) {
|
|
59
|
+
for (const entry of cache) {
|
|
60
|
+
const ep = parseActionUses(entry.original);
|
|
61
|
+
if (ep &&
|
|
62
|
+
`${ep.owner}/${ep.repo}` === `${parsed.owner}/${parsed.repo}` &&
|
|
63
|
+
entry.hash === parsed.ref) {
|
|
64
|
+
if (!pins.some((p) => p.original === entry.original)) {
|
|
65
|
+
pins.push(entry);
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return `${prefix}${usesValue}`;
|
|
72
|
+
}
|
|
56
73
|
let hash = seen.get(trimmed);
|
|
57
74
|
if (!hash) {
|
|
58
75
|
hash = resolve(parsed.owner, parsed.repo, parsed.ref);
|
|
59
76
|
seen.set(trimmed, hash);
|
|
77
|
+
}
|
|
78
|
+
if (!pins.some((p) => p.original === trimmed)) {
|
|
60
79
|
pins.push({ original: trimmed, hash });
|
|
61
80
|
}
|
|
62
81
|
const pinned = trimmed.replace(`@${parsed.ref}`, `@${hash}`);
|
|
@@ -68,7 +87,8 @@ export function pinYamlContent(yamlStr, resolve = resolveRef, cache) {
|
|
|
68
87
|
export function formatPinComments(pins) {
|
|
69
88
|
if (pins.length === 0)
|
|
70
89
|
return "";
|
|
71
|
-
const
|
|
90
|
+
const sorted = [...pins].sort((a, b) => a.original < b.original ? -1 : a.original > b.original ? 1 : 0);
|
|
91
|
+
const lines = sorted.map((p) => `# gagen:pin ${p.original} = ${p.hash}`);
|
|
72
92
|
return "\n" + lines.join("\n") + "\n";
|
|
73
93
|
}
|
|
74
94
|
/** Extracts pin entries from file content. */
|
package/esm/workflow.d.ts
CHANGED
package/esm/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAgB,KAAK,MAAM,EAAgB,MAAM,UAAU,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,WAAW,CAAC;AAOnD,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
|
package/esm/workflow.js
CHANGED
|
@@ -47,7 +47,9 @@ export class Workflow {
|
|
|
47
47
|
if (__classPrivateFieldGet(this, _Workflow_config, "f").runName != null) {
|
|
48
48
|
obj["run-name"] = __classPrivateFieldGet(this, _Workflow_config, "f").runName;
|
|
49
49
|
}
|
|
50
|
-
obj.on =
|
|
50
|
+
obj.on = Array.isArray(__classPrivateFieldGet(this, _Workflow_config, "f").on)
|
|
51
|
+
? __classPrivateFieldGet(this, _Workflow_config, "f").on
|
|
52
|
+
: serializeTriggers(__classPrivateFieldGet(this, _Workflow_config, "f").on);
|
|
51
53
|
if (__classPrivateFieldGet(this, _Workflow_config, "f").permissions != null) {
|
|
52
54
|
obj.permissions = __classPrivateFieldGet(this, _Workflow_config, "f").permissions;
|
|
53
55
|
}
|