@clossys/launcher 0.3.0 → 0.4.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/README.md +1328 -60
- package/contracts/conversation-contract.md +2 -1
- package/contracts/product-ci-workflow.yml +74 -0
- package/contracts/repository-inventory.json +53 -0
- package/dist/admission-fixture.d.ts +168 -0
- package/dist/admission-fixture.d.ts.map +1 -0
- package/dist/admission-fixture.js +453 -0
- package/dist/admission-fixture.js.map +1 -0
- package/dist/admission.d.ts +124 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +799 -0
- package/dist/admission.js.map +1 -0
- package/dist/agents-guide.d.ts +9 -0
- package/dist/agents-guide.d.ts.map +1 -0
- package/dist/agents-guide.js +26 -0
- package/dist/agents-guide.js.map +1 -0
- package/dist/apply-command-options.check.d.ts +12 -0
- package/dist/apply-command-options.check.d.ts.map +1 -0
- package/dist/apply-command-options.check.js +20 -0
- package/dist/apply-command-options.check.js.map +1 -0
- package/dist/apply-plan-cli.d.ts +39 -1
- package/dist/apply-plan-cli.d.ts.map +1 -1
- package/dist/apply-plan-cli.js +432 -15
- package/dist/apply-plan-cli.js.map +1 -1
- package/dist/apply-plan.d.ts +46 -59
- package/dist/apply-plan.d.ts.map +1 -1
- package/dist/apply-plan.js +112 -97
- package/dist/apply-plan.js.map +1 -1
- package/dist/apply-step-fixture.d.ts +87 -0
- package/dist/apply-step-fixture.d.ts.map +1 -0
- package/dist/apply-step-fixture.js +199 -0
- package/dist/apply-step-fixture.js.map +1 -0
- package/dist/apply-store.d.ts +93 -0
- package/dist/apply-store.d.ts.map +1 -0
- package/dist/apply-store.js +625 -0
- package/dist/apply-store.js.map +1 -0
- package/dist/approval-sheet.d.ts +21 -0
- package/dist/approval-sheet.d.ts.map +1 -0
- package/dist/approval-sheet.js +157 -0
- package/dist/approval-sheet.js.map +1 -0
- package/dist/body-command.d.ts +42 -0
- package/dist/body-command.d.ts.map +1 -0
- package/dist/body-command.js +143 -0
- package/dist/body-command.js.map +1 -0
- package/dist/change-set-contract.d.ts +381 -0
- package/dist/change-set-contract.d.ts.map +1 -0
- package/dist/change-set-contract.js +738 -0
- package/dist/change-set-contract.js.map +1 -0
- package/dist/change-set-digest.d.ts +28 -0
- package/dist/change-set-digest.d.ts.map +1 -0
- package/dist/change-set-digest.js +65 -0
- package/dist/change-set-digest.js.map +1 -0
- package/dist/check-cli.d.ts.map +1 -1
- package/dist/check-cli.js +14 -3
- package/dist/check-cli.js.map +1 -1
- package/dist/cli.d.ts +17 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +84 -23
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +79 -22
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +843 -268
- package/dist/core.js.map +1 -1
- package/dist/dry-materialize.d.ts +63 -0
- package/dist/dry-materialize.d.ts.map +1 -0
- package/dist/dry-materialize.js +330 -0
- package/dist/dry-materialize.js.map +1 -0
- package/dist/generated/contract-schema.generated.d.ts +97 -0
- package/dist/generated/contract-schema.generated.d.ts.map +1 -0
- package/dist/generated/contract-schema.generated.js +496 -0
- package/dist/generated/contract-schema.generated.js.map +1 -0
- package/dist/generated/package-scope.generated.d.ts +6 -0
- package/dist/generated/package-scope.generated.d.ts.map +1 -0
- package/dist/generated/package-scope.generated.js +10 -0
- package/dist/generated/package-scope.generated.js.map +1 -0
- package/dist/generated/plan-contracts.generated.d.ts +3 -0
- package/dist/generated/plan-contracts.generated.d.ts.map +1 -0
- package/dist/generated/plan-contracts.generated.js +2840 -0
- package/dist/generated/plan-contracts.generated.js.map +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +11 -0
- package/dist/host.js.map +1 -1
- package/dist/identity.d.ts +15 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +48 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +34 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/inventory-adoption.d.ts +24 -5
- package/dist/inventory-adoption.d.ts.map +1 -1
- package/dist/inventory-adoption.js +70 -25
- package/dist/inventory-adoption.js.map +1 -1
- package/dist/inventory-choice.d.ts +40 -0
- package/dist/inventory-choice.d.ts.map +1 -0
- package/dist/inventory-choice.js +156 -0
- package/dist/inventory-choice.js.map +1 -0
- package/dist/inventory-contract.d.ts +89 -0
- package/dist/inventory-contract.d.ts.map +1 -0
- package/dist/inventory-contract.js +121 -0
- package/dist/inventory-contract.js.map +1 -0
- package/dist/key-editor.d.ts +30 -0
- package/dist/key-editor.d.ts.map +1 -0
- package/dist/key-editor.js +445 -0
- package/dist/key-editor.js.map +1 -0
- package/dist/ledger-contract.d.ts +187 -0
- package/dist/ledger-contract.d.ts.map +1 -0
- package/dist/ledger-contract.js +532 -0
- package/dist/ledger-contract.js.map +1 -0
- package/dist/ledger-trust.d.ts +90 -0
- package/dist/ledger-trust.d.ts.map +1 -0
- package/dist/ledger-trust.js +198 -0
- package/dist/ledger-trust.js.map +1 -0
- package/dist/lockfile-invariants.d.ts +48 -0
- package/dist/lockfile-invariants.d.ts.map +1 -0
- package/dist/lockfile-invariants.js +375 -0
- package/dist/lockfile-invariants.js.map +1 -0
- package/dist/lockfile-readers.d.ts +72 -0
- package/dist/lockfile-readers.d.ts.map +1 -0
- package/dist/lockfile-readers.js +713 -0
- package/dist/lockfile-readers.js.map +1 -0
- package/dist/lockfile-regen.d.ts +106 -0
- package/dist/lockfile-regen.d.ts.map +1 -0
- package/dist/lockfile-regen.js +760 -0
- package/dist/lockfile-regen.js.map +1 -0
- package/dist/lockfile-tool-env.d.ts +29 -0
- package/dist/lockfile-tool-env.d.ts.map +1 -0
- package/dist/lockfile-tool-env.js +111 -0
- package/dist/lockfile-tool-env.js.map +1 -0
- package/dist/materialize.d.ts +113 -0
- package/dist/materialize.d.ts.map +1 -0
- package/dist/materialize.js +840 -0
- package/dist/materialize.js.map +1 -0
- package/dist/observe-repository.d.ts +90 -0
- package/dist/observe-repository.d.ts.map +1 -0
- package/dist/observe-repository.js +1367 -0
- package/dist/observe-repository.js.map +1 -0
- package/dist/plan-bundle-setup-fixture.d.ts +68 -0
- package/dist/plan-bundle-setup-fixture.d.ts.map +1 -0
- package/dist/plan-bundle-setup-fixture.js +167 -0
- package/dist/plan-bundle-setup-fixture.js.map +1 -0
- package/dist/plan-bundle.d.ts +250 -0
- package/dist/plan-bundle.d.ts.map +1 -0
- package/dist/plan-bundle.js +827 -0
- package/dist/plan-bundle.js.map +1 -0
- package/dist/plan-command.d.ts +29 -0
- package/dist/plan-command.d.ts.map +1 -0
- package/dist/plan-command.js +493 -0
- package/dist/plan-command.js.map +1 -0
- package/dist/plan-contract.d.ts +153 -0
- package/dist/plan-contract.d.ts.map +1 -0
- package/dist/plan-contract.js +61 -0
- package/dist/plan-contract.js.map +1 -0
- package/dist/plan-digest.d.ts +25 -0
- package/dist/plan-digest.d.ts.map +1 -0
- package/dist/plan-digest.js +106 -0
- package/dist/plan-digest.js.map +1 -0
- package/dist/plan-rules.d.ts +23 -0
- package/dist/plan-rules.d.ts.map +1 -0
- package/dist/plan-rules.js +177 -0
- package/dist/plan-rules.js.map +1 -0
- package/dist/planned-bundle.d.ts +20 -0
- package/dist/planned-bundle.d.ts.map +1 -0
- package/dist/planned-bundle.js +191 -0
- package/dist/planned-bundle.js.map +1 -0
- package/dist/product-repository.d.ts +4 -0
- package/dist/product-repository.d.ts.map +1 -1
- package/dist/product-repository.js +9 -1
- package/dist/product-repository.js.map +1 -1
- package/dist/provenance-gate.d.ts +48 -0
- package/dist/provenance-gate.d.ts.map +1 -0
- package/dist/provenance-gate.js +324 -0
- package/dist/provenance-gate.js.map +1 -0
- package/dist/pull-request-body.d.ts +45 -0
- package/dist/pull-request-body.d.ts.map +1 -0
- package/dist/pull-request-body.js +232 -0
- package/dist/pull-request-body.js.map +1 -0
- package/dist/registry-snapshot.d.ts +141 -0
- package/dist/registry-snapshot.d.ts.map +1 -0
- package/dist/registry-snapshot.js +483 -0
- package/dist/registry-snapshot.js.map +1 -0
- package/dist/release-age-edit.d.ts +52 -0
- package/dist/release-age-edit.d.ts.map +1 -0
- package/dist/release-age-edit.js +413 -0
- package/dist/release-age-edit.js.map +1 -0
- package/dist/root-entries.d.ts +36 -0
- package/dist/root-entries.d.ts.map +1 -0
- package/dist/root-entries.js +80 -0
- package/dist/root-entries.js.map +1 -0
- package/dist/setup-template-scripts.d.ts +34 -0
- package/dist/setup-template-scripts.d.ts.map +1 -0
- package/dist/setup-template-scripts.js +557 -0
- package/dist/setup-template-scripts.js.map +1 -0
- package/dist/setup-templates.d.ts +54 -0
- package/dist/setup-templates.d.ts.map +1 -0
- package/dist/setup-templates.js +427 -0
- package/dist/setup-templates.js.map +1 -0
- package/dist/skills.d.ts +34 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +129 -17
- package/dist/skills.js.map +1 -1
- package/dist/status.d.ts +63 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +539 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +151 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -5
- package/skeleton/README.md +14 -9
- package/skeleton/package.json +2 -1
- package/skill/SKILL.md +20 -16
- package/skill-catalogue/advisor/SKILL.md +100 -11
- package/skill-catalogue/architect/SKILL.md +2 -13
- package/skill-catalogue/bouncer/SKILL.md +2 -13
- package/skill-catalogue/builder/SKILL.md +2 -13
- package/skill-catalogue/butler/SKILL.md +2 -13
- package/skill-catalogue/controller/SKILL.md +2 -13
- package/skill-catalogue/customer/SKILL.md +4 -13
- package/skill-catalogue/designer/SKILL.md +9 -14
- package/skill-catalogue/giver/SKILL.md +2 -13
- package/skill-catalogue/influencer/SKILL.md +2 -13
- package/skill-catalogue/inspector/SKILL.md +2 -13
- package/skill-catalogue/integrator/SKILL.md +2 -13
- package/skill-catalogue/keeper/SKILL.md +2 -13
- package/skill-catalogue/launcher/SKILL.md +20 -16
- package/skill-catalogue/locksmith/SKILL.md +2 -13
- package/skill-catalogue/messenger/SKILL.md +2 -13
- package/skill-catalogue/observer/SKILL.md +2 -13
- package/skill-catalogue/publisher/SKILL.md +11 -17
- package/skill-catalogue/starter/SKILL.md +3 -13
- package/skill-catalogue/strategist/SKILL.md +14 -17
- package/skill-catalogue/writer/SKILL.md +7 -14
- package/src/admission-fixture.ts +572 -0
- package/src/admission.ts +816 -0
- package/src/agents-guide.ts +29 -0
- package/src/apply-command-options.check.ts +27 -0
- package/src/apply-plan-cli.ts +454 -14
- package/src/apply-plan.ts +112 -124
- package/src/apply-step-fixture.ts +236 -0
- package/src/apply-store.ts +584 -0
- package/src/approval-sheet.ts +164 -0
- package/src/body-command.ts +162 -0
- package/src/change-set-contract.ts +937 -0
- package/src/change-set-digest.ts +70 -0
- package/src/check-cli.ts +14 -3
- package/src/cli.ts +90 -22
- package/src/core.ts +973 -275
- package/src/dry-materialize.ts +353 -0
- package/src/generated/contract-schema.generated.ts +520 -0
- package/src/generated/package-scope.generated.ts +10 -0
- package/src/generated/plan-contracts.generated.ts +2840 -0
- package/src/host.ts +10 -0
- package/src/identity.ts +51 -0
- package/src/index.ts +72 -3
- package/src/inventory-adoption.ts +107 -29
- package/src/inventory-choice.ts +172 -0
- package/src/inventory-contract.ts +166 -0
- package/src/key-editor.ts +446 -0
- package/src/ledger-contract.ts +637 -0
- package/src/ledger-trust.ts +267 -0
- package/src/lockfile-invariants.ts +421 -0
- package/src/lockfile-readers.ts +749 -0
- package/src/lockfile-regen.ts +851 -0
- package/src/lockfile-tool-env.ts +131 -0
- package/src/materialize.ts +886 -0
- package/src/observe-repository.ts +1365 -0
- package/src/plan-bundle-setup-fixture.ts +200 -0
- package/src/plan-bundle.ts +964 -0
- package/src/plan-command.ts +509 -0
- package/src/plan-contract.ts +179 -0
- package/src/plan-digest.ts +102 -0
- package/src/plan-rules.ts +188 -0
- package/src/planned-bundle.ts +211 -0
- package/src/product-repository.ts +10 -1
- package/src/provenance-gate.ts +352 -0
- package/src/pull-request-body.ts +261 -0
- package/src/registry-snapshot.ts +534 -0
- package/src/release-age-edit.ts +430 -0
- package/src/root-entries.ts +81 -0
- package/src/setup-template-scripts.ts +571 -0
- package/src/setup-templates.ts +471 -0
- package/src/skills.ts +161 -18
- package/src/status.ts +557 -0
- package/src/types.ts +148 -13
- package/CHANGELOG.md +0 -131
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
// Editing a repository's release-age exemption file to add the publishing
|
|
2
|
+
// scope (issue #1178, code rule C12). The surface is pnpm's
|
|
3
|
+
// `minimumReleaseAgeExclude` in pnpm-workspace.yaml or Yarn's
|
|
4
|
+
// `npmPreapprovedPackages` in .yarnrc.yml. This edits a client's file, so every
|
|
5
|
+
// ambiguity refuses: the editor adds exactly one quoted entry under the
|
|
6
|
+
// surface's key, keeps every other byte, and refuses any shape its restricted
|
|
7
|
+
// reader does not fully recognise. The reader is not a YAML parser; it is
|
|
8
|
+
// modelled on the launcher's lockfile reader (same idea, no shared code). It
|
|
9
|
+
// performs no I/O.
|
|
10
|
+
import { EXEMPTION_SURFACES } from "./change-set-contract.js";
|
|
11
|
+
import { PACKAGE_SCOPE } from "./generated/package-scope.generated.js";
|
|
12
|
+
const UNPARSEABLE = { kind: "refused", reason: "release-age-surface-unparseable" };
|
|
13
|
+
const CONFLICT = { kind: "refused", reason: "release-age-surface-conflict" };
|
|
14
|
+
const NOT_VERIFIED = { verified: false };
|
|
15
|
+
const scopeValue = () => `${PACKAGE_SCOPE.scope}/*`;
|
|
16
|
+
/** pnpm writes single quotes, Yarn double. A plain `@...` scalar is invalid YAML, so an inserted entry is always quoted. */
|
|
17
|
+
const quotedEntry = (surface) => (surface === "pnpm-workspace" ? `'${scopeValue()}'` : `"${scopeValue()}"`);
|
|
18
|
+
/** The key block appended (or created) when the key is absent, with its final newline. */
|
|
19
|
+
const keyBlock = (key, entry) => `${key}:\n - ${entry}\n`;
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// The .npmrc (pnpm only): a fixed safe grammar, never a list of bad spellings.
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/** The exclusion setting's key with `-` and `_` removed and lower-cased: the kebab and the camel-case spellings both reduce to it. */
|
|
24
|
+
const NPMRC_CONFLICT_KEY = "minimumreleaseageexclude";
|
|
25
|
+
/**
|
|
26
|
+
* Keys, reduced the same way, that point the package manager at another user
|
|
27
|
+
* config file, global config file or prefix directory. Such a line sends the
|
|
28
|
+
* reader to a file this editor is never given, which may hold the exclusion
|
|
29
|
+
* list itself, so the whole `.npmrc` is refused rather than read as clear.
|
|
30
|
+
*/
|
|
31
|
+
const NPMRC_REDIRECT_KEYS = new Set(["userconfig", "globalconfig", "prefix"]);
|
|
32
|
+
/** A character of an accepted .npmrc key: an ASCII letter or digit, or one of `@ : _ . / -`. */
|
|
33
|
+
function isNpmrcKeyCharacter(code) {
|
|
34
|
+
return ((code >= 48 && code <= 57) || // 0-9
|
|
35
|
+
(code >= 65 && code <= 90) || // A-Z
|
|
36
|
+
(code >= 97 && code <= 122) || // a-z
|
|
37
|
+
code === 64 || // @
|
|
38
|
+
code === 58 || // :
|
|
39
|
+
code === 95 || // _
|
|
40
|
+
code === 46 || // .
|
|
41
|
+
code === 47 || // /
|
|
42
|
+
code === 45 // -
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reads a pnpm surface's .npmrc under a fixed grammar. Every line must be
|
|
47
|
+
* blank (spaces only), a comment (first non-space character `#` or `;`), or a
|
|
48
|
+
* plain assignment: optional spaces, a key of ASCII letters, digits and
|
|
49
|
+
* `@ : _ . / -`, optional spaces, `=`, then any value. Any other line shape
|
|
50
|
+
* (a quoted or bracketed key, a comment before the `=`, a backslash, a tab, a
|
|
51
|
+
* section header, a key with no `=`) makes the whole file `unparseable`,
|
|
52
|
+
* because npm's ini reader could read such a line as the exclusion key. A plain
|
|
53
|
+
* key that reduces (in the same way) to `userconfig`, `globalconfig` or `prefix`
|
|
54
|
+
* is `unparseable` too: it redirects the read to a file this reader cannot
|
|
55
|
+
* see. A plain key that reduces to the exclusion setting is a `conflict`.
|
|
56
|
+
* Index scans only.
|
|
57
|
+
*/
|
|
58
|
+
function readNpmrc(surface, npmrc) {
|
|
59
|
+
if (surface !== "pnpm-workspace" || npmrc === null || npmrc === undefined)
|
|
60
|
+
return "clear";
|
|
61
|
+
const text = npmrc.startsWith("\uFEFF") ? npmrc.slice(1) : npmrc;
|
|
62
|
+
let conflict = false;
|
|
63
|
+
for (const line of text.split(/\r\n|\r|\n/)) {
|
|
64
|
+
let start = 0;
|
|
65
|
+
while (start < line.length && line[start] === " ")
|
|
66
|
+
start += 1;
|
|
67
|
+
if (start === line.length || line[start] === "#" || line[start] === ";")
|
|
68
|
+
continue;
|
|
69
|
+
let keyEnd = start;
|
|
70
|
+
while (keyEnd < line.length && isNpmrcKeyCharacter(line.charCodeAt(keyEnd)))
|
|
71
|
+
keyEnd += 1;
|
|
72
|
+
if (keyEnd === start)
|
|
73
|
+
return "unparseable";
|
|
74
|
+
let equals = keyEnd;
|
|
75
|
+
while (equals < line.length && line[equals] === " ")
|
|
76
|
+
equals += 1;
|
|
77
|
+
if (line[equals] !== "=")
|
|
78
|
+
return "unparseable";
|
|
79
|
+
const reduced = line.slice(start, keyEnd).replace(/[-_]/g, "").toLowerCase();
|
|
80
|
+
if (NPMRC_REDIRECT_KEYS.has(reduced))
|
|
81
|
+
return "unparseable";
|
|
82
|
+
if (reduced === NPMRC_CONFLICT_KEY)
|
|
83
|
+
conflict = true;
|
|
84
|
+
}
|
|
85
|
+
return conflict ? "conflict" : "clear";
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// The restricted reader: refuses everything it does not fully recognise.
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
class Refusal extends Error {
|
|
91
|
+
}
|
|
92
|
+
function refuse() {
|
|
93
|
+
throw new Refusal();
|
|
94
|
+
}
|
|
95
|
+
/** A tab, CR, byte order mark anywhere, a Unicode line break other than LF, or another control character. */
|
|
96
|
+
const FORBIDDEN_CHARACTERS = /[\t\r\uFEFF\u0085\u2028\u2029\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u;
|
|
97
|
+
const KEY_NAME = "[A-Za-z_][A-Za-z0-9_.-]*";
|
|
98
|
+
/** A top-level key line: bare, or wrapped in matching quotes (no backslash), then `:` and the end of the line or a space. */
|
|
99
|
+
const KEY_LINE = new RegExp(`^(?:(${KEY_NAME})|'(${KEY_NAME})'|"(${KEY_NAME})"):( .*)?$`);
|
|
100
|
+
const isBlankLine = (line) => /^ *$/.test(line);
|
|
101
|
+
const isCommentLine = (line) => /^ *#/.test(line);
|
|
102
|
+
/** Where the spaces around `value[from, to)` end: the bounds of the same text without its leading and trailing spaces. One pass, no backtracking. */
|
|
103
|
+
function trimmedBounds(value, from, to) {
|
|
104
|
+
let start = from;
|
|
105
|
+
while (start < to && value[start] === " ")
|
|
106
|
+
start += 1;
|
|
107
|
+
let end = to;
|
|
108
|
+
while (end > start && value[end - 1] === " ")
|
|
109
|
+
end -= 1;
|
|
110
|
+
return [start, end];
|
|
111
|
+
}
|
|
112
|
+
/** The text without its leading and trailing spaces (only U+0020). */
|
|
113
|
+
function trimSpaces(value) {
|
|
114
|
+
const [start, end] = trimmedBounds(value, 0, value.length);
|
|
115
|
+
return value.slice(start, end);
|
|
116
|
+
}
|
|
117
|
+
/** End index (exclusive) of the single-quoted scalar starting at `start`; `''` is an escaped quote. */
|
|
118
|
+
function endOfSingleQuoted(line, start) {
|
|
119
|
+
let i = start + 1;
|
|
120
|
+
while (i < line.length) {
|
|
121
|
+
if (line[i] === "'") {
|
|
122
|
+
if (line[i + 1] === "'") {
|
|
123
|
+
i += 2;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
return i + 1;
|
|
127
|
+
}
|
|
128
|
+
i += 1;
|
|
129
|
+
}
|
|
130
|
+
return refuse();
|
|
131
|
+
}
|
|
132
|
+
/** End index (exclusive) of the double-quoted scalar starting at `start`; a backslash anywhere in it refuses, as no escape is interpreted. */
|
|
133
|
+
function endOfDoubleQuoted(line, start) {
|
|
134
|
+
for (let i = start + 1; i < line.length; i += 1) {
|
|
135
|
+
if (line[i] === "\\")
|
|
136
|
+
return refuse();
|
|
137
|
+
if (line[i] === '"')
|
|
138
|
+
return i + 1;
|
|
139
|
+
}
|
|
140
|
+
return refuse();
|
|
141
|
+
}
|
|
142
|
+
/** The index of the colon ending a (possibly quoted) mapping key in a trimmed line, or undefined. */
|
|
143
|
+
function findKeyColon(content) {
|
|
144
|
+
const first = content[0];
|
|
145
|
+
if (first === "'" || first === '"') {
|
|
146
|
+
const end = first === "'" ? endOfSingleQuoted(content, 0) : endOfDoubleQuoted(content, 0);
|
|
147
|
+
return content[end] === ":" ? end : undefined;
|
|
148
|
+
}
|
|
149
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
150
|
+
if (content[i] === ":" && (i + 1 === content.length || content[i + 1] === " "))
|
|
151
|
+
return i;
|
|
152
|
+
}
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Refuses an anchor, alias, tag, block scalar, explicit key, or unterminated
|
|
157
|
+
* quote on one line, wherever in the file the line sits. Text inside quotes
|
|
158
|
+
* and after a comment start is not scanned for them.
|
|
159
|
+
*/
|
|
160
|
+
function scanForForbiddenConstructs(line) {
|
|
161
|
+
let afterSpace = true;
|
|
162
|
+
let tokenStart = true;
|
|
163
|
+
let i = 0;
|
|
164
|
+
while (i < line.length) {
|
|
165
|
+
const c = line[i];
|
|
166
|
+
if (c === " ") {
|
|
167
|
+
afterSpace = true;
|
|
168
|
+
tokenStart = true;
|
|
169
|
+
i += 1;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (c === "#" && afterSpace)
|
|
173
|
+
return;
|
|
174
|
+
if (tokenStart) {
|
|
175
|
+
if (c === "&" || c === "*" || c === "!")
|
|
176
|
+
refuse();
|
|
177
|
+
if (c === "'" || c === '"') {
|
|
178
|
+
i = c === "'" ? endOfSingleQuoted(line, i) : endOfDoubleQuoted(line, i);
|
|
179
|
+
afterSpace = false;
|
|
180
|
+
tokenStart = false;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
afterSpace = false;
|
|
185
|
+
tokenStart = c === "[" || c === "{" || c === ",";
|
|
186
|
+
i += 1;
|
|
187
|
+
}
|
|
188
|
+
// The trimmed line with every leading "- " marker (and the spaces after it) skipped, by index so a long run of markers is not re-copied.
|
|
189
|
+
const [trimmedStart, end] = trimmedBounds(line, 0, line.length);
|
|
190
|
+
let start = trimmedStart;
|
|
191
|
+
while (start < end && line[start] === "-" && (start + 1 === end || line[start + 1] === " ")) {
|
|
192
|
+
start += 1;
|
|
193
|
+
while (start < end && line[start] === " ")
|
|
194
|
+
start += 1;
|
|
195
|
+
}
|
|
196
|
+
const content = line.slice(start, end);
|
|
197
|
+
if (content === "?" || content.startsWith("? "))
|
|
198
|
+
refuse();
|
|
199
|
+
if (content.startsWith("|") || content.startsWith(">"))
|
|
200
|
+
refuse();
|
|
201
|
+
const colon = findKeyColon(content);
|
|
202
|
+
if (colon !== undefined) {
|
|
203
|
+
const value = content.slice(colon + 1).replace(/^ +/, "");
|
|
204
|
+
if (value.startsWith("|") || value.startsWith(">"))
|
|
205
|
+
refuse();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** The decoded scalar of one list item's text after its "- ": a whole single- or double-quoted scalar, or a conservative plain one. */
|
|
209
|
+
function decodeItemScalar(rest) {
|
|
210
|
+
if (rest === "")
|
|
211
|
+
return refuse();
|
|
212
|
+
if (rest.startsWith("'")) {
|
|
213
|
+
let out = "";
|
|
214
|
+
let i = 1;
|
|
215
|
+
for (;;) {
|
|
216
|
+
if (i >= rest.length)
|
|
217
|
+
return refuse();
|
|
218
|
+
if (rest[i] === "'") {
|
|
219
|
+
if (rest[i + 1] === "'") {
|
|
220
|
+
out += "'";
|
|
221
|
+
i += 2;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
return i === rest.length - 1 ? out : refuse();
|
|
225
|
+
}
|
|
226
|
+
out += rest[i];
|
|
227
|
+
i += 1;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (rest.startsWith('"')) {
|
|
231
|
+
const end = rest.indexOf('"', 1);
|
|
232
|
+
if (end !== rest.length - 1)
|
|
233
|
+
return refuse();
|
|
234
|
+
const inner = rest.slice(1, -1);
|
|
235
|
+
return inner.includes("\\") ? refuse() : inner;
|
|
236
|
+
}
|
|
237
|
+
if (/^[[\]{},&*!|>'"%@#?`-]/.test(rest))
|
|
238
|
+
return refuse();
|
|
239
|
+
if (rest.includes(": ") || rest.endsWith(":") || rest.includes(" #"))
|
|
240
|
+
return refuse();
|
|
241
|
+
if (rest.startsWith(" ") || rest.endsWith(" "))
|
|
242
|
+
return refuse();
|
|
243
|
+
return rest;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The block sequence under the target key at `keyIndex`: items of one indent,
|
|
247
|
+
* each `- ` and one scalar, contiguous from the line after the key. After the
|
|
248
|
+
* last item only blank lines and column-0 comments may precede the next key.
|
|
249
|
+
*/
|
|
250
|
+
function readTargetList(lines, keyIndex) {
|
|
251
|
+
const first = lines[keyIndex + 1];
|
|
252
|
+
const opener = first === undefined ? null : /^( *)- /.exec(first);
|
|
253
|
+
if (opener === null)
|
|
254
|
+
return refuse();
|
|
255
|
+
const indent = opener[1].length;
|
|
256
|
+
const prefix = `${" ".repeat(indent)}- `;
|
|
257
|
+
const items = [];
|
|
258
|
+
let j = keyIndex + 1;
|
|
259
|
+
while (j < lines.length && lines[j].startsWith(prefix)) {
|
|
260
|
+
items.push({ index: j, value: decodeItemScalar(lines[j].slice(prefix.length)) });
|
|
261
|
+
j += 1;
|
|
262
|
+
}
|
|
263
|
+
for (; j < lines.length; j += 1) {
|
|
264
|
+
const line = lines[j];
|
|
265
|
+
if (isBlankLine(line) || line.startsWith("#"))
|
|
266
|
+
continue;
|
|
267
|
+
if (line.startsWith(" ") || line.startsWith("-"))
|
|
268
|
+
return refuse();
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
return { indent, items };
|
|
272
|
+
}
|
|
273
|
+
function read(text, key) {
|
|
274
|
+
if (FORBIDDEN_CHARACTERS.test(text))
|
|
275
|
+
refuse();
|
|
276
|
+
const lines = text === "" ? [] : (text.endsWith("\n") ? text.slice(0, -1) : text).split("\n");
|
|
277
|
+
const seen = new Set();
|
|
278
|
+
// What the latest top-level key holds so far: nothing yet ("open"), an inline value, an indented body, or column-0 items.
|
|
279
|
+
let mode = "none";
|
|
280
|
+
let keyIndex = -1;
|
|
281
|
+
lines.forEach((line, index) => {
|
|
282
|
+
if (/^(---|\.\.\.)(\s|$)/.test(line) || line.startsWith("%"))
|
|
283
|
+
refuse();
|
|
284
|
+
scanForForbiddenConstructs(line);
|
|
285
|
+
if (isBlankLine(line) || isCommentLine(line))
|
|
286
|
+
return;
|
|
287
|
+
if (line.startsWith(" ")) {
|
|
288
|
+
if (mode === "none")
|
|
289
|
+
refuse();
|
|
290
|
+
if (mode === "open")
|
|
291
|
+
mode = "map";
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (/^-( |$)/.test(line)) {
|
|
295
|
+
if (mode !== "open" && mode !== "seq")
|
|
296
|
+
refuse();
|
|
297
|
+
mode = "seq";
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
const match = KEY_LINE.exec(line);
|
|
301
|
+
if (match === null)
|
|
302
|
+
return refuse();
|
|
303
|
+
const name = match[1] ?? match[2] ?? match[3];
|
|
304
|
+
if (seen.has(name))
|
|
305
|
+
refuse();
|
|
306
|
+
seen.add(name);
|
|
307
|
+
const rest = trimSpaces(match[4] ?? "");
|
|
308
|
+
mode = rest === "" || rest.startsWith("#") ? "open" : "inline";
|
|
309
|
+
if (name === key) {
|
|
310
|
+
if (match[4] !== undefined)
|
|
311
|
+
refuse();
|
|
312
|
+
keyIndex = index;
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
return { target: keyIndex === -1 ? null : readTargetList(lines, keyIndex) };
|
|
316
|
+
}
|
|
317
|
+
/** Reads `text` under the restricted reader; null is a refusal. */
|
|
318
|
+
function readSurface(text, key) {
|
|
319
|
+
try {
|
|
320
|
+
return read(text, key);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (error instanceof Refusal)
|
|
324
|
+
return null;
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// ---------------------------------------------------------------------------
|
|
329
|
+
// Edit and verify.
|
|
330
|
+
// ---------------------------------------------------------------------------
|
|
331
|
+
/**
|
|
332
|
+
* Adds the scope entry to the surface's exemption list. A missing file or key
|
|
333
|
+
* is created or appended with a two-space list; an existing block sequence
|
|
334
|
+
* gains one line after its last item, in its own indent, and nothing else
|
|
335
|
+
* changes. An already-present entry is unchanged. Refuses a pnpm `.npmrc`
|
|
336
|
+
* that sets the same list (conflict) or has any line outside the fixed safe
|
|
337
|
+
* grammar (unparseable), and any file the restricted reader does not fully
|
|
338
|
+
* recognise (flow lists, comments inside the list, anchors, aliases, tags,
|
|
339
|
+
* block scalars, multiple documents, tabs, CRLF, repeated keys, and more).
|
|
340
|
+
*/
|
|
341
|
+
export function editReleaseAgeExemption(input) {
|
|
342
|
+
const { surface, text } = input;
|
|
343
|
+
const npmrc = readNpmrc(surface, input.npmrc);
|
|
344
|
+
if (npmrc === "conflict")
|
|
345
|
+
return CONFLICT;
|
|
346
|
+
if (npmrc === "unparseable")
|
|
347
|
+
return UNPARSEABLE;
|
|
348
|
+
const { key } = EXEMPTION_SURFACES[surface];
|
|
349
|
+
const entry = quotedEntry(surface);
|
|
350
|
+
const block = keyBlock(key, entry);
|
|
351
|
+
if (text === null || text === "")
|
|
352
|
+
return { kind: "edited", text: block };
|
|
353
|
+
const reading = readSurface(text, key);
|
|
354
|
+
if (reading === null)
|
|
355
|
+
return UNPARSEABLE;
|
|
356
|
+
const { target } = reading;
|
|
357
|
+
if (target === null)
|
|
358
|
+
return { kind: "edited", text: text.endsWith("\n") ? text + block : `${text}\n${block.slice(0, -1)}` };
|
|
359
|
+
if (target.items.some((item) => item.value === scopeValue()))
|
|
360
|
+
return { kind: "unchanged" };
|
|
361
|
+
const last = target.items[target.items.length - 1];
|
|
362
|
+
const out = text.split("\n");
|
|
363
|
+
out.splice(last.index + 1, 0, `${" ".repeat(target.indent)}- ${entry}`);
|
|
364
|
+
return { kind: "edited", text: out.join("\n") };
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Whether `after` is `before` plus exactly the one scope entry, judged by its
|
|
368
|
+
* own structural comparison of the two texts (and, as a second check, by the
|
|
369
|
+
* edit function reproducing `after`). The entry must sit after the last
|
|
370
|
+
* existing item, in the list's indent and the surface's quoting, with every
|
|
371
|
+
* other byte, including the final newline, unchanged.
|
|
372
|
+
*/
|
|
373
|
+
export function verifyReleaseAgeExemption(input) {
|
|
374
|
+
const { surface, before, after } = input;
|
|
375
|
+
if (readNpmrc(surface, input.npmrc) !== "clear" || before === after)
|
|
376
|
+
return NOT_VERIFIED;
|
|
377
|
+
const { key } = EXEMPTION_SURFACES[surface];
|
|
378
|
+
const entry = quotedEntry(surface);
|
|
379
|
+
const value = scopeValue();
|
|
380
|
+
const afterReading = readSurface(after, key);
|
|
381
|
+
const beforeReading = before === null ? { target: null } : readSurface(before, key);
|
|
382
|
+
if (afterReading === null || beforeReading === null)
|
|
383
|
+
return NOT_VERIFIED;
|
|
384
|
+
const beforeValues = beforeReading.target?.items.map((item) => item.value) ?? [];
|
|
385
|
+
const afterValues = afterReading.target?.items.map((item) => item.value) ?? [];
|
|
386
|
+
if (beforeValues.includes(value))
|
|
387
|
+
return NOT_VERIFIED;
|
|
388
|
+
if (afterValues.length !== beforeValues.length + 1 || afterValues[afterValues.length - 1] !== value)
|
|
389
|
+
return NOT_VERIFIED;
|
|
390
|
+
if (!beforeValues.every((existing, i) => existing === afterValues[i]))
|
|
391
|
+
return NOT_VERIFIED;
|
|
392
|
+
const target = beforeReading.target;
|
|
393
|
+
if (target === null) {
|
|
394
|
+
const block = keyBlock(key, entry);
|
|
395
|
+
const expected = before === null || before === "" ? block : before.endsWith("\n") ? before + block : `${before}\n${block.slice(0, -1)}`;
|
|
396
|
+
if (after !== expected)
|
|
397
|
+
return NOT_VERIFIED;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
const b = before.split("\n");
|
|
401
|
+
const a = after.split("\n");
|
|
402
|
+
const at = target.items[target.items.length - 1].index + 1;
|
|
403
|
+
if (a.length !== b.length + 1)
|
|
404
|
+
return NOT_VERIFIED;
|
|
405
|
+
if (a[at] !== `${" ".repeat(target.indent)}- ${entry}`)
|
|
406
|
+
return NOT_VERIFIED;
|
|
407
|
+
if (!b.every((line, i) => a[i < at ? i : i + 1] === line))
|
|
408
|
+
return NOT_VERIFIED;
|
|
409
|
+
}
|
|
410
|
+
const edited = editReleaseAgeExemption(input.npmrc === undefined ? { surface, text: before } : { surface, text: before, npmrc: input.npmrc });
|
|
411
|
+
return edited.kind === "edited" && edited.text === after ? { verified: true, value } : NOT_VERIFIED;
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=release-age-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-age-edit.js","sourceRoot":"","sources":["../src/release-age-edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** What adding some paths would do to a repository profile's root vocabulary. */
|
|
2
|
+
export type RootEntriesVerdict =
|
|
3
|
+
/** No root name is refused: `vocabulary` is none when the profile has no root vocabulary Controller checks. */
|
|
4
|
+
{
|
|
5
|
+
readonly verdict: "satisfied";
|
|
6
|
+
readonly vocabulary: "none" | "checked";
|
|
7
|
+
}
|
|
8
|
+
/** Some root names would fail the check: sorted by UTF-16 code units, with no name repeated. */
|
|
9
|
+
| {
|
|
10
|
+
readonly verdict: "violated";
|
|
11
|
+
readonly undeclared: readonly string[];
|
|
12
|
+
readonly prohibited: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/** The profile cannot be read as a profile with a well-formed root vocabulary. */
|
|
15
|
+
| {
|
|
16
|
+
readonly verdict: "indeterminate";
|
|
17
|
+
readonly reason: "root-vocabulary-unknown";
|
|
18
|
+
};
|
|
19
|
+
/** Controller's rule for one direct-child name: 1 to 255 characters, trimmed, not . or .., no / or \, no control character. */
|
|
20
|
+
export declare function isRootEntryName(value: unknown): value is string;
|
|
21
|
+
/**
|
|
22
|
+
* Judges the root names `paths` introduce -- each path's first segment --
|
|
23
|
+
* against a parsed repository profile. A profile of schema version 1 or 2,
|
|
24
|
+
* or of version 3 with an empty `rootEntries`, has no root vocabulary
|
|
25
|
+
* Controller checks, so nothing is refused. A version 3 profile with entries
|
|
26
|
+
* refuses a name it does not declare, or declares as prohibited. Anything
|
|
27
|
+
* that is not a profile Controller could read this way -- not an object,
|
|
28
|
+
* another schema version, a `rootEntries` on version 1 or 2, more than
|
|
29
|
+
* 10,000 entries, or a malformed or repeated entry -- is indeterminate,
|
|
30
|
+
* never read as permissive. It judges the root vocabulary only: a profile
|
|
31
|
+
* whose other fields Controller refuses fails Controller's check whatever
|
|
32
|
+
* this returns. Throws
|
|
33
|
+
* when a path is not a safe relative path, which is a caller defect.
|
|
34
|
+
*/
|
|
35
|
+
export declare function wouldViolateRootEntries(profile: unknown, paths: readonly string[]): RootEntriesVerdict;
|
|
36
|
+
//# sourceMappingURL=root-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-entries.d.ts","sourceRoot":"","sources":["../src/root-entries.ts"],"names":[],"mappings":"AAaA,iFAAiF;AACjF,MAAM,MAAM,kBAAkB;AAC5B,+GAA+G;AAC7G;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;AAC5E,gGAAgG;GAC9F;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AAClH,kFAAkF;GAChF;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAetF,+HAA+H;AAC/H,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE/D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,kBAAkB,CA0BtG"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Whether adding paths would break a repository's Controller root
|
|
2
|
+
// vocabulary (issue #1178). A consumer repository may declare a Controller
|
|
3
|
+
// repository profile whose schema version 3 `rootEntries` is a closed list of
|
|
4
|
+
// its direct children; Controller's repository-profile check then fails on a
|
|
5
|
+
// direct child the list does not declare, or declares as prohibited. The
|
|
6
|
+
// shapes read here are Controller's (its README, "Profile schema v3" and
|
|
7
|
+
// "Pure exact-root evaluation"); this package has no runtime dependency on
|
|
8
|
+
// Controller, so this module reads only `schemaVersion` and `rootEntries`,
|
|
9
|
+
// with the same rules, and judges nothing else in the profile. It performs no
|
|
10
|
+
// I/O.
|
|
11
|
+
import { compareCodeUnits, isSafeRelativePath } from "./change-set-contract.js";
|
|
12
|
+
const CLASSIFICATIONS = new Set(["canonical", "extension", "exception", "compatibility-alias", "legacy-artifact"]);
|
|
13
|
+
const DISPOSITIONS = new Set(["required", "allowed", "prohibited"]);
|
|
14
|
+
const ENTRY_KEYS = new Set(["name", "classification", "disposition"]);
|
|
15
|
+
const UNKNOWN = { verdict: "indeterminate", reason: "root-vocabulary-unknown" };
|
|
16
|
+
/** Controller refuses a profile collection of more entries than this. */
|
|
17
|
+
const MAX_ROOT_ENTRIES = 10_000;
|
|
18
|
+
function isPlainRecord(value) {
|
|
19
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
20
|
+
return false;
|
|
21
|
+
const prototype = Object.getPrototypeOf(value);
|
|
22
|
+
return prototype === null || prototype === Object.prototype;
|
|
23
|
+
}
|
|
24
|
+
/** Controller's rule for one direct-child name: 1 to 255 characters, trimmed, not . or .., no / or \, no control character. */
|
|
25
|
+
export function isRootEntryName(value) {
|
|
26
|
+
return typeof value === "string" && value.length > 0 && value.length <= 255 && value === value.trim() && value !== "." && value !== ".." && !/[\\/\u0000-\u001f\u007f]/u.test(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Judges the root names `paths` introduce -- each path's first segment --
|
|
30
|
+
* against a parsed repository profile. A profile of schema version 1 or 2,
|
|
31
|
+
* or of version 3 with an empty `rootEntries`, has no root vocabulary
|
|
32
|
+
* Controller checks, so nothing is refused. A version 3 profile with entries
|
|
33
|
+
* refuses a name it does not declare, or declares as prohibited. Anything
|
|
34
|
+
* that is not a profile Controller could read this way -- not an object,
|
|
35
|
+
* another schema version, a `rootEntries` on version 1 or 2, more than
|
|
36
|
+
* 10,000 entries, or a malformed or repeated entry -- is indeterminate,
|
|
37
|
+
* never read as permissive. It judges the root vocabulary only: a profile
|
|
38
|
+
* whose other fields Controller refuses fails Controller's check whatever
|
|
39
|
+
* this returns. Throws
|
|
40
|
+
* when a path is not a safe relative path, which is a caller defect.
|
|
41
|
+
*/
|
|
42
|
+
export function wouldViolateRootEntries(profile, paths) {
|
|
43
|
+
paths.forEach((path, index) => {
|
|
44
|
+
if (!isSafeRelativePath(path))
|
|
45
|
+
throw new TypeError(`paths[${index}] is not a safe relative path`);
|
|
46
|
+
});
|
|
47
|
+
if (!isPlainRecord(profile))
|
|
48
|
+
return UNKNOWN;
|
|
49
|
+
const version = profile.schemaVersion;
|
|
50
|
+
const hasRoots = Object.hasOwn(profile, "rootEntries");
|
|
51
|
+
if (version === 1 || version === 2)
|
|
52
|
+
return hasRoots ? UNKNOWN : { verdict: "satisfied", vocabulary: "none" };
|
|
53
|
+
if (version !== 3 || !hasRoots)
|
|
54
|
+
return UNKNOWN;
|
|
55
|
+
const entries = profile.rootEntries;
|
|
56
|
+
if (!Array.isArray(entries) || entries.length > MAX_ROOT_ENTRIES || Object.keys(entries).length !== entries.length)
|
|
57
|
+
return UNKNOWN;
|
|
58
|
+
const dispositions = new Map();
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
if (!isPlainRecord(entry) || !Object.keys(entry).every((key) => ENTRY_KEYS.has(key)))
|
|
61
|
+
return UNKNOWN;
|
|
62
|
+
const { name, classification, disposition } = entry;
|
|
63
|
+
if (!isRootEntryName(name) || dispositions.has(name))
|
|
64
|
+
return UNKNOWN;
|
|
65
|
+
if (typeof classification !== "string" || !CLASSIFICATIONS.has(classification))
|
|
66
|
+
return UNKNOWN;
|
|
67
|
+
if (typeof disposition !== "string" || !DISPOSITIONS.has(disposition))
|
|
68
|
+
return UNKNOWN;
|
|
69
|
+
dispositions.set(name, disposition);
|
|
70
|
+
}
|
|
71
|
+
if (dispositions.size === 0)
|
|
72
|
+
return { verdict: "satisfied", vocabulary: "none" };
|
|
73
|
+
const roots = [...new Set(paths.map((path) => path.split("/")[0]))].sort(compareCodeUnits);
|
|
74
|
+
const undeclared = roots.filter((root) => !dispositions.has(root));
|
|
75
|
+
const prohibited = roots.filter((root) => dispositions.get(root) === "prohibited");
|
|
76
|
+
if (undeclared.length === 0 && prohibited.length === 0)
|
|
77
|
+
return { verdict: "satisfied", vocabulary: "checked" };
|
|
78
|
+
return { verdict: "violated", undeclared, prohibited };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=root-entries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-entries.js","sourceRoot":"","sources":["../src/root-entries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure renderers for the setup template acts' script and workflow files.
|
|
3
|
+
*
|
|
4
|
+
* Each renderer takes no input and returns the exact bytes of one file, so
|
|
5
|
+
* the text is a pure function of this module alone: no clock, no randomness,
|
|
6
|
+
* no filesystem, no environment. Everything that reads a clock or a
|
|
7
|
+
* repository does so inside the emitted script, when a workflow runs it, and
|
|
8
|
+
* never here.
|
|
9
|
+
*
|
|
10
|
+
* Files rendered here:
|
|
11
|
+
* - `.github/scripts/clossys-collect-adoption-snapshot.mjs`
|
|
12
|
+
* - `.github/workflows/clossys-adoption-evidence.yml`
|
|
13
|
+
* - `.github/workflows/clossys-path-scope.yml`
|
|
14
|
+
*
|
|
15
|
+
* The path-scope script is standalone, so it runs the same under a test as it
|
|
16
|
+
* does inside the workflow that embeds it.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* The path patterns an apply pull request may own, in the change-set
|
|
20
|
+
* contract's order. The path-scope script embeds this list.
|
|
21
|
+
*/
|
|
22
|
+
export declare const OWNED_PATH_PATTERNS: readonly string[];
|
|
23
|
+
/** The bytes of `.github/scripts/clossys-collect-adoption-snapshot.mjs`. */
|
|
24
|
+
export declare function renderSnapshotCollector(): string;
|
|
25
|
+
/** The bytes of `.github/workflows/clossys-adoption-evidence.yml`. */
|
|
26
|
+
export declare function renderAdoptionEvidenceWorkflow(): string;
|
|
27
|
+
/**
|
|
28
|
+
* The standalone path-scope script (its text ends in one LF). The
|
|
29
|
+
* path-scope workflow embeds it; a test runs it with `node` directly.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderPathScopeScript(): string;
|
|
32
|
+
/** The bytes of `.github/workflows/clossys-path-scope.yml`: the script embedded in a quoted heredoc. */
|
|
33
|
+
export declare function renderPathScopeWorkflow(): string;
|
|
34
|
+
//# sourceMappingURL=setup-template-scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-template-scripts.d.ts","sourceRoot":"","sources":["../src/setup-template-scripts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAkBhD,CAAC;AAoOF,4EAA4E;AAC5E,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAiED,sEAAsE;AACtE,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAoKD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAuDD,wGAAwG;AACxG,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD"}
|