forgeprint 0.1.1 → 0.2.0
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/CHANGELOG.md +55 -0
- package/dist/bin.js +1 -1
- package/dist/bin.js.map +1 -1
- package/dist/changed.d.ts +17 -0
- package/dist/changed.d.ts.map +1 -0
- package/dist/changed.js +62 -0
- package/dist/changed.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +187 -25
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lint-setup.d.ts.map +1 -1
- package/dist/lint-setup.js +37 -2
- package/dist/lint-setup.js.map +1 -1
- package/dist/recipe.d.ts +43 -0
- package/dist/recipe.d.ts.map +1 -0
- package/dist/recipe.js +131 -0
- package/dist/recipe.js.map +1 -0
- package/dist/test-setup.d.ts +54 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +219 -0
- package/dist/test-setup.js.map +1 -0
- package/package.json +2 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Changelog — forgeprint
|
|
2
|
+
|
|
3
|
+
The catalog tooling. Every pipeline step is a command here, so a contributor
|
|
4
|
+
gets the same answer locally that a pull request gets in CI (ADR 0002).
|
|
5
|
+
|
|
6
|
+
## 0.2.0 — 2026-09-22
|
|
7
|
+
|
|
8
|
+
The release that makes a setup recipe executable rather than readable.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `forgeprint test-setup` — runs a recipe in a fresh temporary directory: every
|
|
13
|
+
step, then its verification, stopping at the first failure with the command
|
|
14
|
+
and its output. It checks the tools a manifest declares in `requires_tools`
|
|
15
|
+
before it starts and installs nothing; a missing tool is a refusal that names
|
|
16
|
+
the tool (ADR 0005). Flags: `--all`, `--options database=postgres,auth=jwt`,
|
|
17
|
+
`--all-options` for the full matrix, `--keep` to keep the working directory.
|
|
18
|
+
- `--changed-since <ref>` on `test-setup` — the blueprints a branch changed,
|
|
19
|
+
and every blueprint when the recipe runner itself changed. It compares
|
|
20
|
+
commits, not the working tree. When nothing changed it says so and succeeds,
|
|
21
|
+
which is what lets the recipe run be a required status check without
|
|
22
|
+
blocking pull requests that touch no blueprint.
|
|
23
|
+
- A recipe parser behind `test-setup`: a step is one command (the last code
|
|
24
|
+
span) or one file (a path in backticks followed by a fenced block), and a
|
|
25
|
+
step ends at the next heading, so the prose after a recipe is never run.
|
|
26
|
+
- `--all` on `lint-setup` and `similarity`.
|
|
27
|
+
- Two `lint-setup` rules that came out of running the recipes for real:
|
|
28
|
+
`one-action-per-step` and `write-step-needs-path`.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- `forgeprint --version` reported `0.1.0` whatever was installed. It now
|
|
33
|
+
reports the package version, and a test keeps the two in step.
|
|
34
|
+
|
|
35
|
+
## 0.1.1 — 2026-09-22
|
|
36
|
+
|
|
37
|
+
- Published unscoped as `forgeprint`. `0.1.0` went out depending on
|
|
38
|
+
`@forgeprint/cli`, which does not exist and made the package uninstallable;
|
|
39
|
+
it is deprecated on npm.
|
|
40
|
+
|
|
41
|
+
## 0.1.0 — 2026-09-22
|
|
42
|
+
|
|
43
|
+
First release.
|
|
44
|
+
|
|
45
|
+
- `validate` — schema, taxonomy, required files, one blueprint per
|
|
46
|
+
`stack + project_type + requirements`, a CHANGELOG entry per version, and
|
|
47
|
+
generated files that are committed and current.
|
|
48
|
+
- `lint-setup` — the structure and safety rules for `setup.md`: numbered steps,
|
|
49
|
+
a verification per step, pinned versions, and no `sudo`, no pipe to a shell,
|
|
50
|
+
no recursive delete, no system paths (rule 20).
|
|
51
|
+
- `similarity` — the duplicate report: tag overlap and TF-IDF text similarity
|
|
52
|
+
against the closest blueprint in the catalog.
|
|
53
|
+
- `build-index`, `build-schema`, `build-codeowners` — the generated files that
|
|
54
|
+
are committed to the repository so that Pages and CODEOWNERS work without a
|
|
55
|
+
build service.
|
package/dist/bin.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createProgram } from './cli.js';
|
|
3
3
|
try {
|
|
4
|
-
createProgram().
|
|
4
|
+
await createProgram().parseAsync(process.argv);
|
|
5
5
|
}
|
|
6
6
|
catch (error) {
|
|
7
7
|
console.error(`error ${error instanceof Error ? error.message : String(error)}`);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,CAAC;IACH,aAAa,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,CAAC;IACH,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The files that changed between `ref` and the working tree's commit.
|
|
3
|
+
*
|
|
4
|
+
* Three dots: what this branch did, not what happened on the base branch
|
|
5
|
+
* meanwhile.
|
|
6
|
+
*/
|
|
7
|
+
export declare function changedFiles(root: string, ref: string): string[];
|
|
8
|
+
/**
|
|
9
|
+
* Which of `slugs` the changed paths affect, in catalog order.
|
|
10
|
+
*
|
|
11
|
+
* Deliberately blunt: a touched blueprint folder selects that blueprint, and a
|
|
12
|
+
* touched runner selects all of them. Anything else — documentation, the site,
|
|
13
|
+
* the MCP server — selects none, and the caller reports that rather than
|
|
14
|
+
* failing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function affectedBlueprints(changed: readonly string[], slugs: readonly string[]): string[];
|
|
17
|
+
//# sourceMappingURL=changed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed.d.ts","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAQjG"}
|
package/dist/changed.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Selecting the blueprints a change actually affects.
|
|
4
|
+
*
|
|
5
|
+
* A pull request that edits the README should not spend twenty minutes
|
|
6
|
+
* building containers, and a required status check that never reports blocks
|
|
7
|
+
* the merge. So the workflow runs on every pull request and asks this module
|
|
8
|
+
* what to run, instead of a `paths:` filter deciding whether the check exists
|
|
9
|
+
* at all (see docs/repo-settings.md).
|
|
10
|
+
*
|
|
11
|
+
* The decision lives here rather than in the workflow because it has to be
|
|
12
|
+
* reproducible on a laptop: `test-setup --changed-since main` answers the same
|
|
13
|
+
* question a reviewer has (ADR 0002).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* A change under the recipe runner affects every blueprint, because it changes
|
|
17
|
+
* what "the recipe passed" means. Paths are repository-relative, the way `git
|
|
18
|
+
* diff --name-only` prints them.
|
|
19
|
+
*/
|
|
20
|
+
const RUNNER_PATHS = ['packages/cli/'];
|
|
21
|
+
const BLUEPRINT_PATH = /^blueprints\/([^/]+)\//;
|
|
22
|
+
/**
|
|
23
|
+
* The files that changed between `ref` and the working tree's commit.
|
|
24
|
+
*
|
|
25
|
+
* Three dots: what this branch did, not what happened on the base branch
|
|
26
|
+
* meanwhile.
|
|
27
|
+
*/
|
|
28
|
+
export function changedFiles(root, ref) {
|
|
29
|
+
let output;
|
|
30
|
+
try {
|
|
31
|
+
output = execFileSync('git', ['diff', '--name-only', `${ref}...HEAD`], {
|
|
32
|
+
cwd: root,
|
|
33
|
+
encoding: 'utf8',
|
|
34
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const detail = error instanceof Error ? error.message.split('\n')[0] : String(error);
|
|
39
|
+
throw new Error(`Cannot compare against "${ref}": ${detail ?? ''}\n` +
|
|
40
|
+
'The reference has to exist locally; in CI that means fetching enough history.', { cause: error });
|
|
41
|
+
}
|
|
42
|
+
return output
|
|
43
|
+
.split('\n')
|
|
44
|
+
.map((line) => line.trim())
|
|
45
|
+
.filter((line) => line !== '');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Which of `slugs` the changed paths affect, in catalog order.
|
|
49
|
+
*
|
|
50
|
+
* Deliberately blunt: a touched blueprint folder selects that blueprint, and a
|
|
51
|
+
* touched runner selects all of them. Anything else — documentation, the site,
|
|
52
|
+
* the MCP server — selects none, and the caller reports that rather than
|
|
53
|
+
* failing.
|
|
54
|
+
*/
|
|
55
|
+
export function affectedBlueprints(changed, slugs) {
|
|
56
|
+
if (changed.some((path) => RUNNER_PATHS.some((prefix) => path.startsWith(prefix)))) {
|
|
57
|
+
return [...slugs];
|
|
58
|
+
}
|
|
59
|
+
const touched = new Set(changed.map((path) => BLUEPRINT_PATH.exec(path)?.[1]).filter((slug) => slug !== undefined));
|
|
60
|
+
return slugs.filter((slug) => touched.has(slug));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=changed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,eAAe,CAAC,CAAC;AAEvC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,SAAS,CAAC,EAAE;YACrE,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,MAAM,MAAM,IAAI,EAAE,IAAI;YAClD,+EAA+E,EACjF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE,KAAwB;IACrF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAC3F,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,OAAO,UAAU,CAAC;AAM/B;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAiPvC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import {
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
3
4
|
import { Command } from 'commander';
|
|
4
5
|
import { renderCodeowners } from './build-codeowners.js';
|
|
5
6
|
import { loadBlueprints, renderIndex } from './build-index.js';
|
|
6
7
|
import { buildManifestJsonSchema } from './build-schema.js';
|
|
7
|
-
import { readBlueprintFile, readBlueprintFolder, readManifest } from './catalog.js';
|
|
8
|
+
import { listBlueprintSlugs, readBlueprintFile, readBlueprintFolder, readManifest, } from './catalog.js';
|
|
9
|
+
import { affectedBlueprints, changedFiles } from './changed.js';
|
|
8
10
|
import { CONFIG_FILE, loadConfig } from './config.js';
|
|
9
11
|
import { lintSetup } from './lint-setup.js';
|
|
12
|
+
import { checkOptions, resolveSetupOptions } from './options.js';
|
|
13
|
+
import { parseRecipe } from './recipe.js';
|
|
14
|
+
import { checkTools, runDirectoryName, runRecipe } from './test-setup.js';
|
|
10
15
|
import { compareBlueprints, DEFAULT_THRESHOLD, renderReport } from './similarity.js';
|
|
11
16
|
import { findRepoRoot, repoPaths } from './paths.js';
|
|
12
17
|
import { loadTaxonomy } from './taxonomy.js';
|
|
13
18
|
import { validateCatalog } from './validate.js';
|
|
14
|
-
export const VERSION = '0.
|
|
19
|
+
export const VERSION = '0.2.0';
|
|
15
20
|
/**
|
|
16
21
|
* Every pipeline step is a command here, so that contributors and maintainers
|
|
17
22
|
* get the same result locally that CI produces (ADR 0002).
|
|
@@ -43,29 +48,37 @@ export function createProgram() {
|
|
|
43
48
|
});
|
|
44
49
|
program
|
|
45
50
|
.command('lint-setup')
|
|
46
|
-
.argument('
|
|
51
|
+
.argument('[slug]', 'blueprint to check; omit with --all')
|
|
52
|
+
.option('--all', 'check every blueprint in the catalog')
|
|
47
53
|
.description('check a blueprint setup.md against the structure and safety rules')
|
|
48
|
-
.action((slug) => {
|
|
54
|
+
.action((slug, options) => {
|
|
49
55
|
const root = rootOf();
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
const taxonomy = loadTaxonomy(root);
|
|
57
|
+
const slugs = targets(root, slug, options.all === true);
|
|
58
|
+
let problemCount = 0;
|
|
59
|
+
for (const target of slugs) {
|
|
60
|
+
const folder = readBlueprintFolder(root, target);
|
|
61
|
+
const manifest = readManifest(taxonomy, folder);
|
|
62
|
+
const problems = lintSetup(readBlueprintFile(folder, 'setup.md'), {
|
|
63
|
+
options: manifest.options ?? {},
|
|
64
|
+
});
|
|
65
|
+
for (const problem of problems) {
|
|
66
|
+
console.error(`error ${target}/setup.md:${problem.line} ${problem.rule}: ${problem.message}`);
|
|
67
|
+
}
|
|
68
|
+
problemCount += problems.length;
|
|
57
69
|
}
|
|
58
|
-
if (
|
|
59
|
-
console.log(`ok ${
|
|
70
|
+
if (problemCount === 0) {
|
|
71
|
+
console.log(`ok ${slugs.length} setup recipe(s) pass the setup rules`);
|
|
60
72
|
return;
|
|
61
73
|
}
|
|
62
74
|
console.error(`
|
|
63
|
-
${
|
|
75
|
+
${problemCount} problem(s) in ${slugs.length} setup recipe(s)`);
|
|
64
76
|
process.exitCode = 1;
|
|
65
77
|
});
|
|
66
78
|
program
|
|
67
79
|
.command('similarity')
|
|
68
|
-
.argument('
|
|
80
|
+
.argument('[slug]', 'blueprint to compare; omit with --all')
|
|
81
|
+
.option('--all', 'report on every blueprint in the catalog')
|
|
69
82
|
.option('--threshold <ratio>', 'flag above this similarity', String(DEFAULT_THRESHOLD))
|
|
70
83
|
.option('--fail-on-flag', 'exit non-zero on a red flag, not only on a rule 9 rejection')
|
|
71
84
|
.description('report how close a blueprint is to the ones already in the catalog')
|
|
@@ -73,22 +86,110 @@ ${problems.length} problem(s) in ${slug}/setup.md`);
|
|
|
73
86
|
const root = rootOf();
|
|
74
87
|
const taxonomy = loadTaxonomy(root);
|
|
75
88
|
const blueprints = loadBlueprints(root, taxonomy);
|
|
76
|
-
const subject = blueprints.find((blueprint) => blueprint.slug === slug);
|
|
77
|
-
if (subject === undefined)
|
|
78
|
-
throw new Error(`No such blueprint: ${slug}`);
|
|
79
89
|
const threshold = Number(options.threshold);
|
|
80
90
|
if (!Number.isFinite(threshold) || threshold <= 0 || threshold > 1) {
|
|
81
91
|
throw new Error('--threshold must be a ratio between 0 and 1');
|
|
82
92
|
}
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
let rejected = false;
|
|
94
|
+
let flagged = false;
|
|
95
|
+
for (const target of targets(root, slug, options.all === true)) {
|
|
96
|
+
const subject = blueprints.find((blueprint) => blueprint.slug === target);
|
|
97
|
+
if (subject === undefined)
|
|
98
|
+
throw new Error(`No such blueprint: ${target}`);
|
|
99
|
+
const report = compareBlueprints(subject, blueprints.filter((blueprint) => blueprint.slug !== target), threshold);
|
|
100
|
+
console.log(renderReport(report));
|
|
101
|
+
console.log('');
|
|
102
|
+
rejected ||= report.closest?.sameCombination === true;
|
|
103
|
+
flagged ||= report.flagged;
|
|
104
|
+
}
|
|
85
105
|
// A red flag is a question for the reviewer, which the pull request
|
|
86
106
|
// template makes them answer (rule 11). Only the objective rule — one
|
|
87
107
|
// blueprint per stack + project_type + requirements — fails the command.
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
|
|
108
|
+
if (rejected || (options.failOnFlag === true && flagged))
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
});
|
|
111
|
+
program
|
|
112
|
+
.command('test-setup')
|
|
113
|
+
.argument('[slug]', 'blueprint to run; omit with --all')
|
|
114
|
+
.option('--all', 'run every blueprint in the catalog')
|
|
115
|
+
.option('--options <pairs>', 'option values, for example database=postgres,auth=jwt')
|
|
116
|
+
.option('--all-options', 'run every combination of the declared options')
|
|
117
|
+
.option('--changed-since <ref>', 'only the blueprints changed since this git reference')
|
|
118
|
+
.option('--keep', 'keep the working directory instead of deleting it')
|
|
119
|
+
.description('run a setup recipe in a fresh directory and verify every step')
|
|
120
|
+
.action(async (slug, flags) => {
|
|
121
|
+
const root = rootOf();
|
|
122
|
+
const taxonomy = loadTaxonomy(root);
|
|
123
|
+
let failures = 0;
|
|
124
|
+
let selected = targets(root, slug, flags.all === true);
|
|
125
|
+
if (flags.changedSince !== undefined) {
|
|
126
|
+
const ref = flags.changedSince;
|
|
127
|
+
selected = affectedBlueprints(changedFiles(root, ref), selected);
|
|
128
|
+
if (selected.length === 0) {
|
|
129
|
+
// Not a skip and not a failure: the question was asked and the
|
|
130
|
+
// answer is nothing to run. A required check has to say that out
|
|
131
|
+
// loud, or the pull request waits forever.
|
|
132
|
+
console.log(`ok no blueprint changed since ${ref}; no recipe to run`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log(`Changed since ${ref}: ${selected.join(', ')}`);
|
|
91
136
|
}
|
|
137
|
+
for (const target of selected) {
|
|
138
|
+
const folder = readBlueprintFolder(root, target);
|
|
139
|
+
const manifest = readManifest(taxonomy, folder);
|
|
140
|
+
// Nothing is installed: a missing tool is a refusal, not a guess at a
|
|
141
|
+
// different toolchain (ADR 0005).
|
|
142
|
+
const missing = await checkTools(manifest.requires_tools ?? []);
|
|
143
|
+
if (missing.length > 0) {
|
|
144
|
+
for (const problem of missing)
|
|
145
|
+
console.error(`error ${target}: ${problem.message}`);
|
|
146
|
+
console.error(`\n${target} cannot be tested on this machine. Nothing was installed.`);
|
|
147
|
+
failures += 1;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
for (const chosen of combinations(manifest, flags)) {
|
|
151
|
+
checkOptions(manifest, chosen);
|
|
152
|
+
const label = describeOptions(chosen);
|
|
153
|
+
console.log(`\n${target}${label === '' ? '' : ` ${label}`}`);
|
|
154
|
+
const resolved = resolveSetupOptions(readBlueprintFile(folder, 'setup.md'), chosen);
|
|
155
|
+
const recipe = parseRecipe(resolved.markdown);
|
|
156
|
+
if (recipe.problems.length > 0) {
|
|
157
|
+
for (const problem of recipe.problems) {
|
|
158
|
+
console.error(`error setup.md:${problem.line}: ${problem.message}`);
|
|
159
|
+
}
|
|
160
|
+
failures += 1;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const dir = mkdtempSync(join(tmpdir(), `${runDirectoryName(target, chosen)}-`));
|
|
164
|
+
const started = Date.now();
|
|
165
|
+
const result = await runRecipe(recipe.steps, {
|
|
166
|
+
dir,
|
|
167
|
+
// The step's own number can outrun the count: a branch the caller
|
|
168
|
+
// did not pick leaves a gap in the numbering of the one they did.
|
|
169
|
+
onStep: (step, position, total) => {
|
|
170
|
+
console.log(` [${String(position).padStart(2)}/${total}] ${step.number}. ${step.title}`);
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
if (result.ok) {
|
|
174
|
+
console.log(`ok ${recipe.steps.length} step(s) in ${seconds(started)}`);
|
|
175
|
+
if (flags.keep === true)
|
|
176
|
+
console.log(` working directory: ${dir}`);
|
|
177
|
+
else
|
|
178
|
+
rmSync(dir, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const failure = result.failure;
|
|
182
|
+
console.error(`\nerror step ${String(failure?.step.number)} failed during the ` +
|
|
183
|
+
`${String(failure?.phase)} (exit ${String(failure?.exitCode)})`);
|
|
184
|
+
console.error(` ${failedCommand(failure)}`);
|
|
185
|
+
console.error(indent(tail(failure?.output ?? '', 40)));
|
|
186
|
+
console.error(` working directory kept at ${dir}`);
|
|
187
|
+
failures += 1;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (failures > 0)
|
|
192
|
+
process.exitCode = 1;
|
|
92
193
|
});
|
|
93
194
|
program
|
|
94
195
|
.command('build-index')
|
|
@@ -120,6 +221,67 @@ ${problems.length} problem(s) in ${slug}/setup.md`);
|
|
|
120
221
|
});
|
|
121
222
|
return program;
|
|
122
223
|
}
|
|
224
|
+
/** Every combination of the declared options, or just the first of each. */
|
|
225
|
+
function combinations(manifest, flags) {
|
|
226
|
+
if (flags.options !== undefined)
|
|
227
|
+
return [parsePairs(flags.options)];
|
|
228
|
+
const fields = Object.entries(manifest.options ?? {});
|
|
229
|
+
if (fields.length === 0)
|
|
230
|
+
return [{}];
|
|
231
|
+
if (flags.allOptions !== true) {
|
|
232
|
+
// One run, deterministically the first value of each field. The full matrix
|
|
233
|
+
// is slow enough that making it the default would mean nobody runs it.
|
|
234
|
+
return [Object.fromEntries(fields.map(([field, values]) => [field, values[0] ?? '']))];
|
|
235
|
+
}
|
|
236
|
+
return fields.reduce((rows, [field, values]) => rows.flatMap((row) => values.map((value) => ({ ...row, [field]: value }))), [{}]);
|
|
237
|
+
}
|
|
238
|
+
function parsePairs(text) {
|
|
239
|
+
return Object.fromEntries(text.split(',').map((pair) => {
|
|
240
|
+
const [field = '', value = ''] = pair.split('=');
|
|
241
|
+
if (field.trim() === '' || value.trim() === '') {
|
|
242
|
+
throw new Error(`--options takes field=value pairs, got "${pair}"`);
|
|
243
|
+
}
|
|
244
|
+
return [field.trim(), value.trim()];
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
function describeOptions(chosen) {
|
|
248
|
+
return Object.entries(chosen)
|
|
249
|
+
.map(([field, value]) => `${field}=${value}`)
|
|
250
|
+
.join(' ');
|
|
251
|
+
}
|
|
252
|
+
/** What to show for a failure: the verification, or the action that ran. */
|
|
253
|
+
function failedCommand(failure) {
|
|
254
|
+
if (failure === undefined)
|
|
255
|
+
return '';
|
|
256
|
+
if (failure.phase === 'verify')
|
|
257
|
+
return failure.step.verify;
|
|
258
|
+
return failure.step.action.kind === 'run'
|
|
259
|
+
? failure.step.action.command
|
|
260
|
+
: `write ${failure.step.action.path}`;
|
|
261
|
+
}
|
|
262
|
+
function seconds(started) {
|
|
263
|
+
return `${((Date.now() - started) / 1000).toFixed(1)}s`;
|
|
264
|
+
}
|
|
265
|
+
function tail(text, lines) {
|
|
266
|
+
return text.split('\n').slice(-lines).join('\n');
|
|
267
|
+
}
|
|
268
|
+
function indent(text) {
|
|
269
|
+
return text
|
|
270
|
+
.split('\n')
|
|
271
|
+
.map((line) => ` | ${line}`)
|
|
272
|
+
.join('\n');
|
|
273
|
+
}
|
|
274
|
+
/** The blueprints a command should act on: one slug, or the whole catalog. */
|
|
275
|
+
function targets(root, slug, all) {
|
|
276
|
+
if (all && slug !== undefined) {
|
|
277
|
+
throw new Error('Pass a slug or --all, not both');
|
|
278
|
+
}
|
|
279
|
+
if (all)
|
|
280
|
+
return listBlueprintSlugs(root);
|
|
281
|
+
if (slug === undefined)
|
|
282
|
+
throw new Error('Pass a blueprint slug, or --all for every blueprint');
|
|
283
|
+
return [slug];
|
|
284
|
+
}
|
|
123
285
|
function write(file, contents) {
|
|
124
286
|
mkdirSync(dirname(file), { recursive: true });
|
|
125
287
|
writeFileSync(file, contents, 'utf8');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './build-codeowners.js';
|
|
|
2
2
|
export * from './build-index.js';
|
|
3
3
|
export * from './build-schema.js';
|
|
4
4
|
export * from './catalog.js';
|
|
5
|
+
export * from './changed.js';
|
|
5
6
|
export * from './cli.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './json.js';
|
|
@@ -9,7 +10,9 @@ export * from './lint-setup.js';
|
|
|
9
10
|
export * from './manifest.js';
|
|
10
11
|
export * from './options.js';
|
|
11
12
|
export * from './paths.js';
|
|
13
|
+
export * from './recipe.js';
|
|
12
14
|
export * from './similarity.js';
|
|
13
15
|
export * from './taxonomy.js';
|
|
16
|
+
export * from './test-setup.js';
|
|
14
17
|
export * from './validate.js';
|
|
15
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export * from './build-codeowners.js';
|
|
|
2
2
|
export * from './build-index.js';
|
|
3
3
|
export * from './build-schema.js';
|
|
4
4
|
export * from './catalog.js';
|
|
5
|
+
export * from './changed.js';
|
|
5
6
|
export * from './cli.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './json.js';
|
|
@@ -9,7 +10,9 @@ export * from './lint-setup.js';
|
|
|
9
10
|
export * from './manifest.js';
|
|
10
11
|
export * from './options.js';
|
|
11
12
|
export * from './paths.js';
|
|
13
|
+
export * from './recipe.js';
|
|
12
14
|
export * from './similarity.js';
|
|
13
15
|
export * from './taxonomy.js';
|
|
16
|
+
export * from './test-setup.js';
|
|
14
17
|
export * from './validate.js';
|
|
15
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
package/dist/lint-setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint-setup.d.ts","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"lint-setup.d.ts","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA8HD,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAChE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAY,EAAE,GAAE,WAAgB,GAAG,YAAY,EAAE,CA2N5F"}
|
package/dist/lint-setup.js
CHANGED
|
@@ -13,6 +13,8 @@ const STEP_PATTERN = /^(\d+)\.\s+(\S.*)$/;
|
|
|
13
13
|
const IF_PATTERN = /^<!--\s*if\s+options\.([a-z0-9-]+)\s*==\s*([a-z0-9-]+)\s*-->$/;
|
|
14
14
|
const ENDIF_PATTERN = /^<!--\s*endif\s*-->$/;
|
|
15
15
|
const ANY_GUARD_PATTERN = /^<!--\s*(if|endif)\b/;
|
|
16
|
+
/** A heading ends the step above it; the prose after a recipe is not a step. */
|
|
17
|
+
const HEADING_PATTERN = /^\s{0,3}#{1,6}\s/;
|
|
16
18
|
/** Opening or closing line of a fenced code block. */
|
|
17
19
|
const FENCE_PATTERN = /^\s*(?:```|~~~)/;
|
|
18
20
|
/** Hosts a setup step may reach: package registries and the local machine. */
|
|
@@ -138,6 +140,10 @@ export function lintSetup(source, { options = {} } = {}) {
|
|
|
138
140
|
current.body.push(text);
|
|
139
141
|
return;
|
|
140
142
|
}
|
|
143
|
+
if (HEADING_PATTERN.test(text)) {
|
|
144
|
+
closeStep();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
141
147
|
const guard = IF_PATTERN.exec(text.trim());
|
|
142
148
|
const isEndif = ENDIF_PATTERN.test(text.trim());
|
|
143
149
|
if (guard !== null) {
|
|
@@ -229,6 +235,24 @@ export function lintSetup(source, { options = {} } = {}) {
|
|
|
229
235
|
if (!step.body.some((text) => VERIFY_PATTERN.test(text))) {
|
|
230
236
|
add(step.line, 'step-needs-verification', `step ${step.number} has no "Verify: \`command\`" line`);
|
|
231
237
|
}
|
|
238
|
+
// A step that writes a file names the file in backticks and then opens a
|
|
239
|
+
// fenced block. Anything in backticks after that block is a second action,
|
|
240
|
+
// which makes the step unexecutable however clearly it reads.
|
|
241
|
+
const opening = step.body.findIndex((text) => FENCE_PATTERN.test(text));
|
|
242
|
+
if (opening !== -1) {
|
|
243
|
+
const closing = step.body.findIndex((text, at) => at > opening && FENCE_PATTERN.test(text));
|
|
244
|
+
const before = step.body.slice(0, opening).join('\n');
|
|
245
|
+
const after = step.body
|
|
246
|
+
.slice(closing === -1 ? step.body.length : closing + 1)
|
|
247
|
+
.filter((text) => !VERIFY_PATTERN.test(text))
|
|
248
|
+
.join('\n');
|
|
249
|
+
if (!/`[^`]+`/.test(before)) {
|
|
250
|
+
add(step.line, 'write-step-needs-path', `step ${step.number} writes a file but does not name it; put the path in backticks before the block`);
|
|
251
|
+
}
|
|
252
|
+
if (/`[^`]+`/.test(after)) {
|
|
253
|
+
add(step.line, 'one-action-per-step', `step ${step.number} states another action after the block; a step is one action, so give it its own step`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
232
256
|
}
|
|
233
257
|
// Only commands are linted. Prose that mentions `sudo` to warn against it is
|
|
234
258
|
// not a violation; a code span that runs it is.
|
|
@@ -270,8 +294,19 @@ function hostsIn(text) {
|
|
|
270
294
|
const authority = match[1];
|
|
271
295
|
if (authority === undefined)
|
|
272
296
|
continue;
|
|
273
|
-
|
|
274
|
-
|
|
297
|
+
// A host the shell computes at run time cannot be checked here. The rules
|
|
298
|
+
// that matter for those commands — no privilege, no pipe from a download —
|
|
299
|
+
// are checked on the command itself.
|
|
300
|
+
if (authority.includes('$'))
|
|
301
|
+
continue;
|
|
302
|
+
const authorityOnly = authority.split('@').pop() ?? authority;
|
|
303
|
+
// Backslashes come from regexes written inside a command; the port may be a
|
|
304
|
+
// pattern rather than a number, so everything after the colon goes.
|
|
305
|
+
const withoutEscapes = authorityOnly.replace(/\\/g, '');
|
|
306
|
+
const host = withoutEscapes.startsWith('[')
|
|
307
|
+
? withoutEscapes.slice(0, withoutEscapes.indexOf(']') + 1)
|
|
308
|
+
: (withoutEscapes.split(':')[0] ?? withoutEscapes);
|
|
309
|
+
hosts.push(host.toLowerCase());
|
|
275
310
|
}
|
|
276
311
|
return hosts;
|
|
277
312
|
}
|
package/dist/lint-setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint-setup.js","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lint-setup.js","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/recipe.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a `setup.md` into something executable.
|
|
3
|
+
*
|
|
4
|
+
* The recipe is written for a reader, and it has to run. Both work because a
|
|
5
|
+
* step is exactly one action: either a command, or a file written from a fenced
|
|
6
|
+
* block. `lint-setup` enforces that shape, so this parser can be strict rather
|
|
7
|
+
* than clever — anything ambiguous is reported, never guessed.
|
|
8
|
+
*/
|
|
9
|
+
export type RecipeAction = {
|
|
10
|
+
readonly kind: 'run';
|
|
11
|
+
readonly command: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'write';
|
|
14
|
+
readonly path: string;
|
|
15
|
+
readonly contents: string;
|
|
16
|
+
};
|
|
17
|
+
export interface RecipeStep {
|
|
18
|
+
readonly number: number;
|
|
19
|
+
/** Line in `setup.md`, for error messages. */
|
|
20
|
+
readonly line: number;
|
|
21
|
+
/** The step's own words, for progress output. */
|
|
22
|
+
readonly title: string;
|
|
23
|
+
readonly action: RecipeAction;
|
|
24
|
+
/** The command that proves the step worked. */
|
|
25
|
+
readonly verify: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RecipeProblem {
|
|
28
|
+
readonly line: number;
|
|
29
|
+
readonly message: string;
|
|
30
|
+
}
|
|
31
|
+
export interface Recipe {
|
|
32
|
+
readonly steps: readonly RecipeStep[];
|
|
33
|
+
/** Reasons the recipe could not be read as a script. */
|
|
34
|
+
readonly problems: readonly RecipeProblem[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse an option-resolved `setup.md`.
|
|
38
|
+
*
|
|
39
|
+
* Guards must already be resolved; one left in place means the caller did not
|
|
40
|
+
* choose an option, and a recipe with branches in it is not a script.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseRecipe(markdown: string): Recipe;
|
|
43
|
+
//# sourceMappingURL=recipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AASD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoDpD"}
|
package/dist/recipe.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a `setup.md` into something executable.
|
|
3
|
+
*
|
|
4
|
+
* The recipe is written for a reader, and it has to run. Both work because a
|
|
5
|
+
* step is exactly one action: either a command, or a file written from a fenced
|
|
6
|
+
* block. `lint-setup` enforces that shape, so this parser can be strict rather
|
|
7
|
+
* than clever — anything ambiguous is reported, never guessed.
|
|
8
|
+
*/
|
|
9
|
+
const STEP_PATTERN = /^(\d+)\.\s+(\S.*)$/;
|
|
10
|
+
const VERIFY_PATTERN = /^\s*(?:[-*]\s*)?Verify:\s*`([^`]+)`/;
|
|
11
|
+
const FENCE_PATTERN = /^(\s*)(?:```|~~~)(.*)$/;
|
|
12
|
+
const GUARD_PATTERN = /^\s*<!--\s*(?:if|endif)\b/;
|
|
13
|
+
/** A heading ends the step above it; the prose after a recipe is not a step. */
|
|
14
|
+
const HEADING_PATTERN = /^\s{0,3}#{1,6}\s/;
|
|
15
|
+
/**
|
|
16
|
+
* Parse an option-resolved `setup.md`.
|
|
17
|
+
*
|
|
18
|
+
* Guards must already be resolved; one left in place means the caller did not
|
|
19
|
+
* choose an option, and a recipe with branches in it is not a script.
|
|
20
|
+
*/
|
|
21
|
+
export function parseRecipe(markdown) {
|
|
22
|
+
const lines = markdown.split(/\r?\n/);
|
|
23
|
+
const steps = [];
|
|
24
|
+
const problems = [];
|
|
25
|
+
let current = null;
|
|
26
|
+
let inFence = false;
|
|
27
|
+
const finish = () => {
|
|
28
|
+
if (current === null)
|
|
29
|
+
return;
|
|
30
|
+
const step = readStep(current);
|
|
31
|
+
if ('message' in step)
|
|
32
|
+
problems.push({ line: current.line, message: step.message });
|
|
33
|
+
else
|
|
34
|
+
steps.push(step);
|
|
35
|
+
current = null;
|
|
36
|
+
};
|
|
37
|
+
lines.forEach((text, index) => {
|
|
38
|
+
if (FENCE_PATTERN.test(text)) {
|
|
39
|
+
inFence = !inFence;
|
|
40
|
+
current?.body.push(text);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (inFence) {
|
|
44
|
+
current?.body.push(text);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (GUARD_PATTERN.test(text)) {
|
|
48
|
+
finish();
|
|
49
|
+
problems.push({
|
|
50
|
+
line: index + 1,
|
|
51
|
+
message: 'an option guard is still in the recipe; resolve the options first',
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (HEADING_PATTERN.test(text)) {
|
|
56
|
+
finish();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const start = STEP_PATTERN.exec(text);
|
|
60
|
+
if (start !== null) {
|
|
61
|
+
finish();
|
|
62
|
+
current = { number: Number(start[1]), line: index + 1, body: [start[2] ?? ''] };
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
current?.body.push(text);
|
|
66
|
+
});
|
|
67
|
+
finish();
|
|
68
|
+
if (steps.length === 0 && problems.length === 0) {
|
|
69
|
+
problems.push({ line: 1, message: 'the recipe has no numbered steps' });
|
|
70
|
+
}
|
|
71
|
+
return { steps, problems };
|
|
72
|
+
}
|
|
73
|
+
function readStep(raw) {
|
|
74
|
+
const verifyLine = raw.body.find((text) => VERIFY_PATTERN.test(text));
|
|
75
|
+
const verify = verifyLine === undefined ? undefined : VERIFY_PATTERN.exec(verifyLine)?.[1];
|
|
76
|
+
if (verify === undefined) {
|
|
77
|
+
return { message: `step ${raw.number} has no "Verify: \`command\`" line` };
|
|
78
|
+
}
|
|
79
|
+
const body = raw.body.filter((text) => !VERIFY_PATTERN.test(text));
|
|
80
|
+
const fence = readFence(body);
|
|
81
|
+
if (fence === undefined) {
|
|
82
|
+
const command = lastCodeSpan(body.join('\n'));
|
|
83
|
+
if (command === undefined) {
|
|
84
|
+
return { message: `step ${raw.number} states no command` };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
number: raw.number,
|
|
88
|
+
line: raw.line,
|
|
89
|
+
title: summarize(body),
|
|
90
|
+
action: { kind: 'run', command },
|
|
91
|
+
verify,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const path = lastCodeSpan(body.slice(0, fence.start).join('\n'));
|
|
95
|
+
if (path === undefined) {
|
|
96
|
+
return {
|
|
97
|
+
message: `step ${raw.number} writes a file but does not name it; put the path in backticks before the block`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
number: raw.number,
|
|
102
|
+
line: raw.line,
|
|
103
|
+
title: summarize(body.slice(0, fence.start)),
|
|
104
|
+
action: { kind: 'write', path, contents: fence.contents },
|
|
105
|
+
verify,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** The first fenced block in a step body, dedented to the fence's own indent. */
|
|
109
|
+
function readFence(body) {
|
|
110
|
+
const start = body.findIndex((text) => FENCE_PATTERN.test(text));
|
|
111
|
+
if (start === -1)
|
|
112
|
+
return undefined;
|
|
113
|
+
const indent = FENCE_PATTERN.exec(body[start] ?? '')?.[1]?.length ?? 0;
|
|
114
|
+
const end = body.findIndex((text, at) => at > start && FENCE_PATTERN.test(text));
|
|
115
|
+
const inner = body.slice(start + 1, end === -1 ? undefined : end);
|
|
116
|
+
const contents = inner
|
|
117
|
+
.map((text) => (text.slice(0, indent).trim().length === 0 ? text.slice(indent) : text))
|
|
118
|
+
.join('\n')
|
|
119
|
+
.replace(/\s+$/, '');
|
|
120
|
+
return { start, contents: `${contents}\n` };
|
|
121
|
+
}
|
|
122
|
+
/** Code spans are how a recipe names a command or a path. The last one wins. */
|
|
123
|
+
function lastCodeSpan(text) {
|
|
124
|
+
const spans = [...text.matchAll(/`([^`]+)`/g)];
|
|
125
|
+
return spans.length === 0 ? undefined : spans[spans.length - 1]?.[1];
|
|
126
|
+
}
|
|
127
|
+
function summarize(body) {
|
|
128
|
+
const first = body.join(' ').replace(/\s+/g, ' ').trim();
|
|
129
|
+
return first.length > 100 ? `${first.slice(0, 97)}...` : first;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running a recipe for real.
|
|
3
|
+
*
|
|
4
|
+
* A fresh directory, the declared tools checked first, every step followed by
|
|
5
|
+
* its verification, and a stop at the first failure with enough output to fix
|
|
6
|
+
* it. The environment is a precondition, not something this provides: nothing
|
|
7
|
+
* here installs anything (ADR 0005).
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import type { RecipeStep } from './recipe.js';
|
|
11
|
+
/** A step that runs longer than this has hung; the run fails rather than waits. */
|
|
12
|
+
export declare const STEP_TIMEOUT_MS: number;
|
|
13
|
+
/** Commands are POSIX shell, so they read the same on every platform. */
|
|
14
|
+
export declare const SHELL = "bash";
|
|
15
|
+
export interface StepOutcome {
|
|
16
|
+
readonly step: RecipeStep;
|
|
17
|
+
/** Which half of the step this is: the action, or its verification. */
|
|
18
|
+
readonly phase: 'action' | 'verify';
|
|
19
|
+
readonly ok: boolean;
|
|
20
|
+
readonly exitCode: number | null;
|
|
21
|
+
readonly output: string;
|
|
22
|
+
readonly ms: number;
|
|
23
|
+
}
|
|
24
|
+
export interface RunOptions {
|
|
25
|
+
readonly dir: string;
|
|
26
|
+
/** Called before each step, for progress output: step, position, total. */
|
|
27
|
+
readonly onStep?: (step: RecipeStep, position: number, total: number) => void;
|
|
28
|
+
readonly timeoutMs?: number;
|
|
29
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
30
|
+
}
|
|
31
|
+
export interface RunResult {
|
|
32
|
+
readonly ok: boolean;
|
|
33
|
+
readonly dir: string;
|
|
34
|
+
readonly outcomes: readonly StepOutcome[];
|
|
35
|
+
/** The first failure, which is where the run stopped. */
|
|
36
|
+
readonly failure: StepOutcome | undefined;
|
|
37
|
+
}
|
|
38
|
+
export declare function runRecipe(steps: readonly RecipeStep[], options: RunOptions): Promise<RunResult>;
|
|
39
|
+
export interface ToolProblem {
|
|
40
|
+
readonly tool: string;
|
|
41
|
+
readonly message: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check the tools a blueprint declares. Nothing is installed: a missing tool is
|
|
45
|
+
* a refusal naming the tool and the version, because a run that quietly used a
|
|
46
|
+
* different toolchain would be worse than no run at all.
|
|
47
|
+
*/
|
|
48
|
+
export declare function checkTools(requires: readonly string[]): Promise<ToolProblem[]>;
|
|
49
|
+
/** Numeric comparison, part by part. Enough for the constraints a tool takes. */
|
|
50
|
+
export declare function satisfies(found: string, operator: string, wanted: string): boolean;
|
|
51
|
+
/** A directory name for a run, stable enough to recognise in a temp folder. */
|
|
52
|
+
export declare function runDirectoryName(slug: string, options: Readonly<Record<string, string>>): string;
|
|
53
|
+
export { join as joinPath };
|
|
54
|
+
//# sourceMappingURL=test-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAW,IAAI,EAAW,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,mFAAmF;AACnF,eAAO,MAAM,eAAe,QAAiB,CAAC;AAE9C,yEAAyE;AACzE,eAAO,MAAM,KAAK,SAAS,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAsFD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAWD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAqCpF;AAwBD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAwBlF;AAgBD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAMhG;AAED,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running a recipe for real.
|
|
3
|
+
*
|
|
4
|
+
* A fresh directory, the declared tools checked first, every step followed by
|
|
5
|
+
* its verification, and a stop at the first failure with enough output to fix
|
|
6
|
+
* it. The environment is a precondition, not something this provides: nothing
|
|
7
|
+
* here installs anything (ADR 0005).
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { dirname, join, resolve } from 'node:path';
|
|
12
|
+
/** A step that runs longer than this has hung; the run fails rather than waits. */
|
|
13
|
+
export const STEP_TIMEOUT_MS = 15 * 60 * 1000;
|
|
14
|
+
/** Commands are POSIX shell, so they read the same on every platform. */
|
|
15
|
+
export const SHELL = 'bash';
|
|
16
|
+
export async function runRecipe(steps, options) {
|
|
17
|
+
const outcomes = [];
|
|
18
|
+
await mkdir(options.dir, { recursive: true });
|
|
19
|
+
for (const [index, step] of steps.entries()) {
|
|
20
|
+
options.onStep?.(step, index + 1, steps.length);
|
|
21
|
+
const action = step.action.kind === 'run'
|
|
22
|
+
? await execute(step.action.command, step, 'action', options)
|
|
23
|
+
: await write(step.action.path, step.action.contents, step, options);
|
|
24
|
+
outcomes.push(action);
|
|
25
|
+
if (!action.ok)
|
|
26
|
+
return { ok: false, dir: options.dir, outcomes, failure: action };
|
|
27
|
+
const verify = await execute(step.verify, step, 'verify', options);
|
|
28
|
+
outcomes.push(verify);
|
|
29
|
+
if (!verify.ok)
|
|
30
|
+
return { ok: false, dir: options.dir, outcomes, failure: verify };
|
|
31
|
+
}
|
|
32
|
+
return { ok: true, dir: options.dir, outcomes, failure: undefined };
|
|
33
|
+
}
|
|
34
|
+
async function write(path, contents, step, options) {
|
|
35
|
+
const started = Date.now();
|
|
36
|
+
const target = resolve(options.dir, path);
|
|
37
|
+
// A recipe may not write outside its own directory. lint-setup rejects the
|
|
38
|
+
// paths that would; this is the second lock on the same door.
|
|
39
|
+
if (!target.startsWith(resolve(options.dir))) {
|
|
40
|
+
return {
|
|
41
|
+
step,
|
|
42
|
+
phase: 'action',
|
|
43
|
+
ok: false,
|
|
44
|
+
exitCode: null,
|
|
45
|
+
output: `refusing to write outside the project directory: ${path}`,
|
|
46
|
+
ms: Date.now() - started,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await mkdir(dirname(target), { recursive: true });
|
|
51
|
+
await writeFile(target, contents, 'utf8');
|
|
52
|
+
return { step, phase: 'action', ok: true, exitCode: 0, output: '', ms: Date.now() - started };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return {
|
|
56
|
+
step,
|
|
57
|
+
phase: 'action',
|
|
58
|
+
ok: false,
|
|
59
|
+
exitCode: null,
|
|
60
|
+
output: error instanceof Error ? error.message : String(error),
|
|
61
|
+
ms: Date.now() - started,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function execute(command, step, phase, options) {
|
|
66
|
+
const started = Date.now();
|
|
67
|
+
return new Promise((resolvePromise) => {
|
|
68
|
+
const child = spawn(SHELL, ['-c', command], {
|
|
69
|
+
cwd: options.dir,
|
|
70
|
+
env: { ...process.env, ...options.env },
|
|
71
|
+
windowsHide: true,
|
|
72
|
+
});
|
|
73
|
+
let output = '';
|
|
74
|
+
const collect = (chunk) => {
|
|
75
|
+
output += chunk.toString('utf8');
|
|
76
|
+
if (output.length > 200_000)
|
|
77
|
+
output = output.slice(-200_000);
|
|
78
|
+
};
|
|
79
|
+
child.stdout.on('data', collect);
|
|
80
|
+
child.stderr.on('data', collect);
|
|
81
|
+
const timer = setTimeout(() => {
|
|
82
|
+
output += `\n[timed out after ${(options.timeoutMs ?? STEP_TIMEOUT_MS) / 1000}s]`;
|
|
83
|
+
child.kill('SIGKILL');
|
|
84
|
+
}, options.timeoutMs ?? STEP_TIMEOUT_MS);
|
|
85
|
+
const done = (exitCode, failure) => {
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
resolvePromise({
|
|
88
|
+
step,
|
|
89
|
+
phase,
|
|
90
|
+
ok: exitCode === 0 && failure === undefined,
|
|
91
|
+
exitCode,
|
|
92
|
+
output: failure === undefined ? output : `${output}\n${failure.message}`,
|
|
93
|
+
ms: Date.now() - started,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
child.on('error', (error) => {
|
|
97
|
+
done(null, error);
|
|
98
|
+
});
|
|
99
|
+
child.on('close', (code) => {
|
|
100
|
+
done(code);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** How to ask a tool for its version, when `--version` is not what it takes. */
|
|
105
|
+
const VERSION_FLAG = {
|
|
106
|
+
go: 'version',
|
|
107
|
+
java: '-version',
|
|
108
|
+
};
|
|
109
|
+
const REQUIREMENT_PATTERN = /^([a-z0-9][a-z0-9.+-]*)\s*(>=|<=|==|>|<|~|\^)?\s*([0-9][0-9a-z.-]*)?$/i;
|
|
110
|
+
/**
|
|
111
|
+
* Check the tools a blueprint declares. Nothing is installed: a missing tool is
|
|
112
|
+
* a refusal naming the tool and the version, because a run that quietly used a
|
|
113
|
+
* different toolchain would be worse than no run at all.
|
|
114
|
+
*/
|
|
115
|
+
export async function checkTools(requires) {
|
|
116
|
+
const problems = [];
|
|
117
|
+
const shell = await probe(SHELL, '--version');
|
|
118
|
+
if (shell === undefined) {
|
|
119
|
+
problems.push({
|
|
120
|
+
tool: SHELL,
|
|
121
|
+
message: `${SHELL} is required: recipe commands are POSIX shell. On Windows, Git Bash provides it.`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
for (const requirement of requires) {
|
|
125
|
+
const parsed = REQUIREMENT_PATTERN.exec(requirement.trim());
|
|
126
|
+
if (parsed === null) {
|
|
127
|
+
problems.push({ tool: requirement, message: `cannot read the requirement "${requirement}"` });
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const [, tool = '', operator, wanted] = parsed;
|
|
131
|
+
const flag = VERSION_FLAG[tool] ?? '--version';
|
|
132
|
+
const reported = await probe(tool, flag);
|
|
133
|
+
if (reported === undefined) {
|
|
134
|
+
problems.push({ tool, message: `${tool} is not installed, or not on PATH` });
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (wanted === undefined || operator === undefined)
|
|
138
|
+
continue;
|
|
139
|
+
const found = firstVersion(reported);
|
|
140
|
+
if (found === undefined) {
|
|
141
|
+
problems.push({ tool, message: `could not read a version from "${reported.trim()}"` });
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (!satisfies(found, operator, wanted)) {
|
|
145
|
+
problems.push({ tool, message: `${tool} ${found} does not satisfy ${operator}${wanted}` });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return problems;
|
|
149
|
+
}
|
|
150
|
+
async function probe(tool, flag) {
|
|
151
|
+
return await new Promise((resolvePromise) => {
|
|
152
|
+
const child = spawn(tool, [flag], { windowsHide: true, shell: process.platform === 'win32' });
|
|
153
|
+
let output = '';
|
|
154
|
+
child.stdout.on('data', (chunk) => (output += chunk.toString('utf8')));
|
|
155
|
+
child.stderr.on('data', (chunk) => (output += chunk.toString('utf8')));
|
|
156
|
+
child.on('error', () => {
|
|
157
|
+
resolvePromise(undefined);
|
|
158
|
+
});
|
|
159
|
+
child.on('close', (code) => {
|
|
160
|
+
// Exit code, not output: with a shell, a missing command still prints
|
|
161
|
+
// something, and treating that as "installed" is how a run ends up using
|
|
162
|
+
// a toolchain nobody declared.
|
|
163
|
+
resolvePromise(code === 0 ? output : undefined);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function firstVersion(text) {
|
|
168
|
+
return /(\d+(?:\.\d+)*)/.exec(text)?.[1];
|
|
169
|
+
}
|
|
170
|
+
/** Numeric comparison, part by part. Enough for the constraints a tool takes. */
|
|
171
|
+
export function satisfies(found, operator, wanted) {
|
|
172
|
+
const order = compareVersions(found, wanted);
|
|
173
|
+
switch (operator) {
|
|
174
|
+
case '>=':
|
|
175
|
+
return order >= 0;
|
|
176
|
+
case '>':
|
|
177
|
+
return order > 0;
|
|
178
|
+
case '<=':
|
|
179
|
+
return order <= 0;
|
|
180
|
+
case '<':
|
|
181
|
+
return order < 0;
|
|
182
|
+
case '==':
|
|
183
|
+
return order === 0;
|
|
184
|
+
// `~` and `^` allow anything at or above the stated version that does not
|
|
185
|
+
// change the part they pin.
|
|
186
|
+
case '~':
|
|
187
|
+
case '^': {
|
|
188
|
+
if (order < 0)
|
|
189
|
+
return false;
|
|
190
|
+
const index = operator === '^' ? 0 : 1;
|
|
191
|
+
return part(found, index) === part(wanted, index);
|
|
192
|
+
}
|
|
193
|
+
default:
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function compareVersions(a, b) {
|
|
198
|
+
const left = a.split('.').map(Number);
|
|
199
|
+
const right = b.split('.').map(Number);
|
|
200
|
+
for (let at = 0; at < Math.max(left.length, right.length); at += 1) {
|
|
201
|
+
const difference = (left[at] ?? 0) - (right[at] ?? 0);
|
|
202
|
+
if (difference !== 0)
|
|
203
|
+
return difference < 0 ? -1 : 1;
|
|
204
|
+
}
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
function part(version, index) {
|
|
208
|
+
return Number(version.split('.')[index] ?? 0);
|
|
209
|
+
}
|
|
210
|
+
/** A directory name for a run, stable enough to recognise in a temp folder. */
|
|
211
|
+
export function runDirectoryName(slug, options) {
|
|
212
|
+
const suffix = Object.entries(options)
|
|
213
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
214
|
+
.map(([field, value]) => `${field}-${value}`)
|
|
215
|
+
.join('_');
|
|
216
|
+
return suffix.length === 0 ? `forgeprint-${slug}` : `forgeprint-${slug}-${suffix}`;
|
|
217
|
+
}
|
|
218
|
+
export { join as joinPath };
|
|
219
|
+
//# sourceMappingURL=test-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forgeprint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Forgeprint catalog tooling. Every pipeline step runs here, not in CI configuration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"forgeprint",
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"files": [
|
|
41
|
+
"CHANGELOG.md",
|
|
41
42
|
"dist",
|
|
42
43
|
"!dist/**/*.test.*"
|
|
43
44
|
],
|