putitoutthere 0.1.44 → 0.1.46
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 +10 -1
- package/MIGRATIONS.md +82 -5
- package/README.md +16 -42
- package/action.yml +2 -2
- package/dist/cascade.d.ts +1 -1
- package/dist/cascade.js +2 -2
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -383
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -55
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -32
- package/dist/config.js.map +1 -1
- package/dist/publish.d.ts +0 -10
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +6 -52
- package/dist/publish.js.map +1 -1
- package/dist/types.d.ts +1 -21
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
- package/dist/auth.d.ts +0 -68
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -285
- package/dist/auth.js.map +0 -1
- package/dist/doctor.d.ts +0 -115
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js +0 -292
- package/dist/doctor.js.map +0 -1
- package/dist/keyring.d.ts +0 -35
- package/dist/keyring.d.ts.map +0 -1
- package/dist/keyring.js +0 -88
- package/dist/keyring.js.map +0 -1
- package/dist/oidc-policy.d.ts +0 -145
- package/dist/oidc-policy.d.ts.map +0 -1
- package/dist/oidc-policy.js +0 -388
- package/dist/oidc-policy.js.map +0 -1
- package/dist/preflight-run.d.ts +0 -47
- package/dist/preflight-run.d.ts.map +0 -1
- package/dist/preflight-run.js +0 -197
- package/dist/preflight-run.js.map +0 -1
- package/dist/registries/crates-trust.d.ts +0 -69
- package/dist/registries/crates-trust.d.ts.map +0 -1
- package/dist/registries/crates-trust.js +0 -95
- package/dist/registries/crates-trust.js.map +0 -1
- package/dist/release.d.ts +0 -36
- package/dist/release.d.ts.map +0 -1
- package/dist/release.js +0 -102
- package/dist/release.js.map +0 -1
- package/dist/token-scope.d.ts +0 -65
- package/dist/token-scope.d.ts.map +0 -1
- package/dist/token-scope.js +0 -163
- package/dist/token-scope.js.map +0 -1
- package/dist/token.d.ts +0 -211
- package/dist/token.d.ts.map +0 -1
- package/dist/token.js +0 -719
- package/dist/token.js.map +0 -1
package/dist/oidc-policy.js
DELETED
|
@@ -1,388 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OIDC trust-policy local validation.
|
|
3
|
-
*
|
|
4
|
-
* `doctor` uses this module to check the locally-knowable structural
|
|
5
|
-
* prerequisites of OIDC trusted publishing:
|
|
6
|
-
*
|
|
7
|
-
* 1. At least one `.github/workflows/*.yml` file invokes either
|
|
8
|
-
* `putitoutthere publish` (as a `run:` command) or the composite
|
|
9
|
-
* action `thekevinscott/putitoutthere@...` with a `command:`
|
|
10
|
-
* input that implies publishing.
|
|
11
|
-
* 2. That workflow's publishing job has `permissions: id-token: write`
|
|
12
|
-
* and `contents: write` (either job-level or workflow-level).
|
|
13
|
-
* 3. The publishing job has an `environment:` key set. We cannot
|
|
14
|
-
* validate the *value* against the registry's trust policy — that
|
|
15
|
-
* requires a registry-policy-read API per registry, which is
|
|
16
|
-
* deferred (Option C, see follow-up to #162).
|
|
17
|
-
* 4. A clearly-identifiable publish step exists — defends against
|
|
18
|
-
* edge cases like commented-out steps slipping past (1).
|
|
19
|
-
*
|
|
20
|
-
* The parser is intentionally regex/line-based rather than a full YAML
|
|
21
|
-
* parse: the four checks above all reduce to substring/indentation
|
|
22
|
-
* matches within a single jobs block. Adding a YAML dependency would
|
|
23
|
-
* buy us very little here. If the check set grows beyond this (e.g.
|
|
24
|
-
* "validate the environment value against a registry's trust policy"),
|
|
25
|
-
* revisit.
|
|
26
|
-
*
|
|
27
|
-
* Issue #162 — Option D (locally-knowable checks only).
|
|
28
|
-
*/
|
|
29
|
-
import { readdirSync, readFileSync } from 'node:fs';
|
|
30
|
-
import { join } from 'node:path';
|
|
31
|
-
/**
|
|
32
|
-
* Scan `.github/workflows/*.yml` and `*.yaml` for workflows that invoke
|
|
33
|
-
* `putitoutthere publish` or the composite action in a publish mode.
|
|
34
|
-
*
|
|
35
|
-
* Permissive by design: if a workflow *mentions* piot in any way that
|
|
36
|
-
* looks like publishing, include it. Downstream checks then report
|
|
37
|
-
* specifically. The cost of a false-positive is a spurious pass/fail
|
|
38
|
-
* line in `doctor`; the cost of a false-negative is silently missing
|
|
39
|
-
* the user's real publish workflow.
|
|
40
|
-
*/
|
|
41
|
-
export function findPublishWorkflows(repoRoot) {
|
|
42
|
-
const dir = join(repoRoot, '.github', 'workflows');
|
|
43
|
-
let entries;
|
|
44
|
-
try {
|
|
45
|
-
entries = readdirSync(dir);
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
const workflows = [];
|
|
51
|
-
for (const entry of entries) {
|
|
52
|
-
if (!/\.ya?ml$/i.test(entry))
|
|
53
|
-
continue;
|
|
54
|
-
const path = join(dir, entry);
|
|
55
|
-
let source;
|
|
56
|
-
try {
|
|
57
|
-
source = readFileSync(path, 'utf8');
|
|
58
|
-
/* v8 ignore next 3 -- defensive fallback for an unreadable workflow file (permissions, TOCTOU); can't produce in tests without mocking the fs module. */
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
if (!looksLikePublishWorkflow(source))
|
|
64
|
-
continue;
|
|
65
|
-
workflows.push({
|
|
66
|
-
path,
|
|
67
|
-
filename: entry,
|
|
68
|
-
source,
|
|
69
|
-
jobs: parseJobs(source),
|
|
70
|
-
workflowPermissions: extractTopLevelBlock(source, 'permissions') ?? '',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
return workflows;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Heuristic filter. Matches:
|
|
77
|
-
* - a `run:` step that contains `putitoutthere publish`
|
|
78
|
-
* - `uses: thekevinscott/putitoutthere@...` combined with
|
|
79
|
-
* `command: publish` somewhere in the file (the composite action
|
|
80
|
-
* defaults to `plan`, so we only flag explicit `publish`)
|
|
81
|
-
*
|
|
82
|
-
* Also accepts the pre-rename slug `put-it-out-there` so workflows
|
|
83
|
-
* pinned to the old name (still routed via GitHub's redirect) continue
|
|
84
|
-
* to be recognised by `doctor`.
|
|
85
|
-
*/
|
|
86
|
-
const USES_PIOT_RE = /uses:\s*thekevinscott\/(?:putitoutthere|put-it-out-there)@/;
|
|
87
|
-
function looksLikePublishWorkflow(source) {
|
|
88
|
-
if (/\bputitoutthere\s+publish\b/.test(source))
|
|
89
|
-
return true;
|
|
90
|
-
const usesPiot = USES_PIOT_RE.test(source);
|
|
91
|
-
const commandPublish = /command:\s*['"]?publish['"]?/.test(source);
|
|
92
|
-
return usesPiot && commandPublish;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Best-effort jobs parser. Finds the top-level `jobs:` block and
|
|
96
|
-
* extracts each direct-child key + its body. We use the two-space
|
|
97
|
-
* indent convention GitHub Actions workflows follow. Workflows that
|
|
98
|
-
* deviate (tabs, four-space) would miss — but `init` emits two-space,
|
|
99
|
-
* which is what we're validating.
|
|
100
|
-
*/
|
|
101
|
-
export function parseJobs(source) {
|
|
102
|
-
const lines = source.split('\n');
|
|
103
|
-
// Find the `jobs:` top-level key (unindented).
|
|
104
|
-
let jobsStart = -1;
|
|
105
|
-
for (let i = 0; i < lines.length; i++) {
|
|
106
|
-
if (/^jobs\s*:\s*$/.test(lines[i])) {
|
|
107
|
-
jobsStart = i + 1;
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (jobsStart === -1)
|
|
112
|
-
return [];
|
|
113
|
-
const jobs = [];
|
|
114
|
-
let current = null;
|
|
115
|
-
for (let i = jobsStart; i < lines.length; i++) {
|
|
116
|
-
const line = lines[i];
|
|
117
|
-
// Another top-level key ends the jobs block.
|
|
118
|
-
if (/^\S/.test(line) && line.trim().length > 0)
|
|
119
|
-
break;
|
|
120
|
-
// A direct child job key: exactly 2-space indent + `name:`.
|
|
121
|
-
const match = /^ {2}([A-Za-z_][\w-]*)\s*:\s*$/.exec(line);
|
|
122
|
-
if (match) {
|
|
123
|
-
if (current)
|
|
124
|
-
jobs.push({ name: current.name, source: current.lines.join('\n') });
|
|
125
|
-
current = { name: match[1], lines: [] };
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
if (current)
|
|
129
|
-
current.lines.push(line);
|
|
130
|
-
}
|
|
131
|
-
if (current)
|
|
132
|
-
jobs.push({ name: current.name, source: current.lines.join('\n') });
|
|
133
|
-
return jobs;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Extract a top-level block's body (everything indented beneath a
|
|
137
|
-
* given unindented key up to the next top-level key). Returns the
|
|
138
|
-
* concatenated indented body, or `null` if the key is absent.
|
|
139
|
-
*/
|
|
140
|
-
function extractTopLevelBlock(source, key) {
|
|
141
|
-
const lines = source.split('\n');
|
|
142
|
-
const re = new RegExp(`^${key}\\s*:\\s*(.*)$`);
|
|
143
|
-
for (let i = 0; i < lines.length; i++) {
|
|
144
|
-
const m = re.exec(lines[i]);
|
|
145
|
-
if (!m)
|
|
146
|
-
continue;
|
|
147
|
-
// Inline form: `permissions: read-all`. Return the inline value.
|
|
148
|
-
if (m[1] && m[1].trim().length > 0)
|
|
149
|
-
return m[1].trim();
|
|
150
|
-
const body = [];
|
|
151
|
-
for (let j = i + 1; j < lines.length; j++) {
|
|
152
|
-
const line = lines[j];
|
|
153
|
-
if (/^\S/.test(line) && line.trim().length > 0)
|
|
154
|
-
break;
|
|
155
|
-
body.push(line);
|
|
156
|
-
}
|
|
157
|
-
return body.join('\n');
|
|
158
|
-
}
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Check that the publishing job has (or inherits) the two permissions
|
|
163
|
-
* that OIDC trusted publishing requires. The permissions may be set at
|
|
164
|
-
* workflow level (top-level `permissions:`) and/or job level; this
|
|
165
|
-
* function reports a missing permission only if *neither* scope
|
|
166
|
-
* declares it. `write-all` satisfies both.
|
|
167
|
-
*/
|
|
168
|
-
export function checkPermissions(workflow) {
|
|
169
|
-
const publishJob = findPublishJob(workflow);
|
|
170
|
-
if (publishJob === null)
|
|
171
|
-
return [];
|
|
172
|
-
const jobPerms = extractBlockFromJob(publishJob.source, 'permissions') ?? '';
|
|
173
|
-
const combined = `${workflow.workflowPermissions}\n${jobPerms}`;
|
|
174
|
-
const issues = [];
|
|
175
|
-
if (!hasPermission(combined, 'id-token', 'write')) {
|
|
176
|
-
issues.push({
|
|
177
|
-
kind: 'missing-permission',
|
|
178
|
-
workflow: workflow.filename,
|
|
179
|
-
job: publishJob.name,
|
|
180
|
-
permission: 'id-token: write',
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
if (!hasPermission(combined, 'contents', 'write')) {
|
|
184
|
-
issues.push({
|
|
185
|
-
kind: 'missing-permission',
|
|
186
|
-
workflow: workflow.filename,
|
|
187
|
-
job: publishJob.name,
|
|
188
|
-
permission: 'contents: write',
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
return issues;
|
|
192
|
-
}
|
|
193
|
-
function hasPermission(block, name, level) {
|
|
194
|
-
// `write-all` shortcut: every scope is `write`.
|
|
195
|
-
if (/\bwrite-all\b/.test(block))
|
|
196
|
-
return true;
|
|
197
|
-
const re = new RegExp(`\\b${name}\\s*:\\s*${level}\\b`);
|
|
198
|
-
return re.test(block);
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Return `{ kind: 'missing' }` when the publish job lacks an
|
|
202
|
-
* `environment:` key. Does NOT inspect the value — diff-vs-registry is
|
|
203
|
-
* Option C.
|
|
204
|
-
*/
|
|
205
|
-
export function checkEnvironment(workflow) {
|
|
206
|
-
const publishJob = findPublishJob(workflow);
|
|
207
|
-
if (publishJob === null)
|
|
208
|
-
return null;
|
|
209
|
-
if (hasKeyAtJobLevel(publishJob.source, 'environment'))
|
|
210
|
-
return null;
|
|
211
|
-
return {
|
|
212
|
-
kind: 'missing-environment',
|
|
213
|
-
workflow: workflow.filename,
|
|
214
|
-
job: publishJob.name,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Sanity check: confirm the workflow has at least one clearly-
|
|
219
|
-
* identifiable publish step. `findPublishWorkflows` already filters,
|
|
220
|
-
* but this catches weird states like a `run:` that's been edited into
|
|
221
|
-
* a comment while the composite-action `uses:` line still matches.
|
|
222
|
-
*/
|
|
223
|
-
export function checkPublishInvocation(workflow) {
|
|
224
|
-
// Strip comment-only lines and blank lines before matching. A
|
|
225
|
-
// commented-out `run: putitoutthere publish` step shouldn't count.
|
|
226
|
-
const uncommented = workflow.source
|
|
227
|
-
.split('\n')
|
|
228
|
-
.filter((l) => !/^\s*#/.test(l))
|
|
229
|
-
.join('\n');
|
|
230
|
-
const hasRunCmd = /\bputitoutthere\s+publish\b/.test(uncommented);
|
|
231
|
-
if (hasRunCmd)
|
|
232
|
-
return null;
|
|
233
|
-
// Composite-action form with `command: publish` explicitly.
|
|
234
|
-
const usesPiot = USES_PIOT_RE.test(uncommented);
|
|
235
|
-
const commandPublish = /command:\s*['"]?publish['"]?/.test(uncommented);
|
|
236
|
-
if (usesPiot && commandPublish)
|
|
237
|
-
return null;
|
|
238
|
-
return { kind: 'no-publish-step', workflow: workflow.filename };
|
|
239
|
-
}
|
|
240
|
-
/* ---------------------- #189: declared diff ---------------------- */
|
|
241
|
-
/**
|
|
242
|
-
* Extract the basename (no directory) from a bare or path-shaped string.
|
|
243
|
-
* Normalizes both slash styles so a caller feeding in a
|
|
244
|
-
* `.github/workflows/release.yml` still gets `release.yml` back.
|
|
245
|
-
*/
|
|
246
|
-
function basename(p) {
|
|
247
|
-
const normalized = p.replace(/\\/g, '/');
|
|
248
|
-
const idx = normalized.lastIndexOf('/');
|
|
249
|
-
return idx === -1 ? normalized : normalized.slice(idx + 1);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Compare `trust_policy.workflow` against the filename of the workflow
|
|
253
|
-
* that `findPublishWorkflows` identified. The declaration is always a
|
|
254
|
-
* bare filename (Zod enforces that at parse time); the comparison is
|
|
255
|
-
* case-sensitive. Returns `null` on match.
|
|
256
|
-
*/
|
|
257
|
-
export function diffWorkflowFilename(declared, workflowFilename) {
|
|
258
|
-
const actual = basename(workflowFilename);
|
|
259
|
-
if (declared === actual)
|
|
260
|
-
return null;
|
|
261
|
-
return {
|
|
262
|
-
kind: 'workflow-filename-mismatch',
|
|
263
|
-
declared,
|
|
264
|
-
actual,
|
|
265
|
-
source: 'local-workflow',
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Compare `trust_policy.environment` against the workflow's job-level
|
|
270
|
-
* `environment:` value. Absence of a declared environment is not an
|
|
271
|
-
* error — the caller decides whether to invoke this. Returns `null` on
|
|
272
|
-
* match.
|
|
273
|
-
*/
|
|
274
|
-
export function diffEnvironment(declared, workflow) {
|
|
275
|
-
const actual = extractJobEnvironment(workflow);
|
|
276
|
-
if (actual === declared)
|
|
277
|
-
return null;
|
|
278
|
-
return {
|
|
279
|
-
kind: 'environment-mismatch',
|
|
280
|
-
workflow: workflow.filename,
|
|
281
|
-
declared,
|
|
282
|
-
actual,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Read `process.env.GITHUB_WORKFLOW_REF` (populated by GitHub Actions)
|
|
287
|
-
* and parse out the workflow filename. Shape:
|
|
288
|
-
*
|
|
289
|
-
* `owner/repo/.github/workflows/release.yml@refs/heads/main`
|
|
290
|
-
*
|
|
291
|
-
* Returns `null` when the env var is absent (we're not running inside
|
|
292
|
-
* Actions) OR when the value doesn't parse — we'd rather neutral-skip
|
|
293
|
-
* the check than false-positive on an unexpected shape.
|
|
294
|
-
*/
|
|
295
|
-
export function inferFromGithubWorkflowRef(env = process.env) {
|
|
296
|
-
const ref = env.GITHUB_WORKFLOW_REF;
|
|
297
|
-
if (ref === undefined || ref.length === 0)
|
|
298
|
-
return null;
|
|
299
|
-
// Strip the `@ref` suffix, then match
|
|
300
|
-
// `<owner>/<repo>/.github/workflows/<file>`.
|
|
301
|
-
const atIdx = ref.indexOf('@');
|
|
302
|
-
const pathPart = atIdx === -1 ? ref : ref.slice(0, atIdx);
|
|
303
|
-
const m = /^([^/\s]+\/[^/\s]+)\/\.github\/workflows\/(.+)$/.exec(pathPart);
|
|
304
|
-
if (!m)
|
|
305
|
-
return null;
|
|
306
|
-
return { repository: m[1], workflow: m[2] };
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Extract the job-level `environment:` value from a workflow's publish
|
|
310
|
-
* job. Supports the inline form (`environment: release`) and the nested
|
|
311
|
-
* form (`environment:\n name: release`). Returns `null` when no
|
|
312
|
-
* environment is declared (or no publish job is found).
|
|
313
|
-
*/
|
|
314
|
-
function extractJobEnvironment(workflow) {
|
|
315
|
-
const publishJob = findPublishJob(workflow);
|
|
316
|
-
/* v8 ignore next -- caller only invokes this for workflows that have a publish job */
|
|
317
|
-
if (publishJob === null)
|
|
318
|
-
return null;
|
|
319
|
-
const raw = extractBlockFromJob(publishJob.source, 'environment');
|
|
320
|
-
if (raw === null)
|
|
321
|
-
return null;
|
|
322
|
-
const trimmed = raw.trim();
|
|
323
|
-
// Inline form: `environment: release`. Nested form: `environment:\n name: release`.
|
|
324
|
-
// The inline regex matches when the value is a single line; for nested
|
|
325
|
-
// blocks, look for the `name:` key inside the body. When neither
|
|
326
|
-
// matches the block is structurally malformed — null propagates.
|
|
327
|
-
if (!trimmed.includes('\n')) {
|
|
328
|
-
const inline = /^['"]?([^'"\n]+?)['"]?$/.exec(trimmed);
|
|
329
|
-
return inline ? inline[1].trim() : null;
|
|
330
|
-
}
|
|
331
|
-
const nested = /^\s*name\s*:\s*['"]?([^'"\n]+?)['"]?\s*$/m.exec(trimmed);
|
|
332
|
-
return nested ? nested[1].trim() : null;
|
|
333
|
-
}
|
|
334
|
-
/* ---------------------------- helpers ---------------------------- */
|
|
335
|
-
/**
|
|
336
|
-
* Pick the job within a workflow that runs publish. If only one job
|
|
337
|
-
* matches, return it. If multiple match, prefer the one whose name
|
|
338
|
-
* contains `publish`; otherwise return the first.
|
|
339
|
-
*/
|
|
340
|
-
function findPublishJob(workflow) {
|
|
341
|
-
const matches = workflow.jobs.filter((j) => jobRunsPublish(j));
|
|
342
|
-
if (matches.length === 0)
|
|
343
|
-
return null;
|
|
344
|
-
const named = matches.find((j) => /publish/i.test(j.name));
|
|
345
|
-
return named ?? matches[0];
|
|
346
|
-
}
|
|
347
|
-
function jobRunsPublish(job) {
|
|
348
|
-
if (/\bputitoutthere\s+publish\b/.test(job.source))
|
|
349
|
-
return true;
|
|
350
|
-
const usesPiot = USES_PIOT_RE.test(job.source);
|
|
351
|
-
const commandPublish = /command:\s*['"]?publish['"]?/.test(job.source);
|
|
352
|
-
return usesPiot && commandPublish;
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Whether the given job's source declares the key at the job scope
|
|
356
|
-
* (exactly 4-space indent, matching the 2-space job indent + one level
|
|
357
|
-
* further). Inline or block form both accepted.
|
|
358
|
-
*/
|
|
359
|
-
function hasKeyAtJobLevel(jobSource, key) {
|
|
360
|
-
const re = new RegExp(`^ {4}${key}\\s*:`, 'm');
|
|
361
|
-
return re.test(jobSource);
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Extract a nested block from inside a job source — `permissions:` or
|
|
365
|
-
* `environment:` below the 4-space indent.
|
|
366
|
-
*/
|
|
367
|
-
function extractBlockFromJob(jobSource, key) {
|
|
368
|
-
const lines = jobSource.split('\n');
|
|
369
|
-
const headRe = new RegExp(`^ {4}${key}\\s*:\\s*(.*)$`);
|
|
370
|
-
for (let i = 0; i < lines.length; i++) {
|
|
371
|
-
const m = headRe.exec(lines[i]);
|
|
372
|
-
if (!m)
|
|
373
|
-
continue;
|
|
374
|
-
if (m[1] && m[1].trim().length > 0)
|
|
375
|
-
return m[1].trim();
|
|
376
|
-
const body = [];
|
|
377
|
-
for (let j = i + 1; j < lines.length; j++) {
|
|
378
|
-
const line = lines[j];
|
|
379
|
-
// Any line indented 4 spaces or less (and non-empty) ends the block.
|
|
380
|
-
if (line.trim().length > 0 && /^ {0,4}\S/.test(line))
|
|
381
|
-
break;
|
|
382
|
-
body.push(line);
|
|
383
|
-
}
|
|
384
|
-
return body.join('\n');
|
|
385
|
-
}
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
//# sourceMappingURL=oidc-policy.js.map
|
package/dist/oidc-policy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oidc-policy.js","sourceRoot":"","sources":["../src/oidc-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/preflight-run.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `putitoutthere preflight` — run every pre-publish check against every
|
|
3
|
-
* package, without side effects.
|
|
4
|
-
*
|
|
5
|
-
* Lives alongside (not inside) `preflight.ts` because that module is
|
|
6
|
-
* scoped to auth-only checks that handlers delegate to. This one is
|
|
7
|
-
* the cross-cutting orchestrator that `doctor` and `publish` each use
|
|
8
|
-
* pieces of.
|
|
9
|
-
*
|
|
10
|
-
* Issue #93. Plan: §16.4.7.
|
|
11
|
-
*
|
|
12
|
-
* Check catalogue:
|
|
13
|
-
* - path: pkg.path exists on disk (resolved against opts.cwd).
|
|
14
|
-
* - manifest: the per-kind manifest file exists under pkg.path.
|
|
15
|
-
* - auth: OIDC or the per-kind token env var is set.
|
|
16
|
-
* - repository: package.json has `repository` (npm --provenance requirement).
|
|
17
|
-
* - artifact: when the package is in the cascaded plan, its artifact
|
|
18
|
-
* dir exists.
|
|
19
|
-
*
|
|
20
|
-
* Default scope is "packages cascaded by the plan". `--all` widens to
|
|
21
|
-
* every configured package (useful pre-commit or when plan can't run
|
|
22
|
-
* in a scratch checkout).
|
|
23
|
-
*/
|
|
24
|
-
import type { Kind } from './types.js';
|
|
25
|
-
export interface PreflightOptions {
|
|
26
|
-
cwd: string;
|
|
27
|
-
configPath?: string;
|
|
28
|
-
/** When true, widen scope from cascaded-only to every configured package. */
|
|
29
|
-
all?: boolean;
|
|
30
|
-
}
|
|
31
|
-
export type CheckStatus = 'ok' | 'fail' | 'skip';
|
|
32
|
-
export type CheckName = 'path' | 'manifest' | 'auth' | 'repository' | 'artifact';
|
|
33
|
-
export interface PreflightCheck {
|
|
34
|
-
package: string;
|
|
35
|
-
kind: Kind;
|
|
36
|
-
check: CheckName;
|
|
37
|
-
status: CheckStatus;
|
|
38
|
-
detail?: string;
|
|
39
|
-
}
|
|
40
|
-
export interface PreflightReport {
|
|
41
|
-
ok: boolean;
|
|
42
|
-
checks: PreflightCheck[];
|
|
43
|
-
/** Top-level issues not scoped to a package (e.g. config parse failure). */
|
|
44
|
-
issues: string[];
|
|
45
|
-
}
|
|
46
|
-
export declare function runPreflight(opts: PreflightOptions): Promise<PreflightReport>;
|
|
47
|
-
//# sourceMappingURL=preflight-run.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preflight-run.d.ts","sourceRoot":"","sources":["../src/preflight-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgEnF"}
|
package/dist/preflight-run.js
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `putitoutthere preflight` — run every pre-publish check against every
|
|
3
|
-
* package, without side effects.
|
|
4
|
-
*
|
|
5
|
-
* Lives alongside (not inside) `preflight.ts` because that module is
|
|
6
|
-
* scoped to auth-only checks that handlers delegate to. This one is
|
|
7
|
-
* the cross-cutting orchestrator that `doctor` and `publish` each use
|
|
8
|
-
* pieces of.
|
|
9
|
-
*
|
|
10
|
-
* Issue #93. Plan: §16.4.7.
|
|
11
|
-
*
|
|
12
|
-
* Check catalogue:
|
|
13
|
-
* - path: pkg.path exists on disk (resolved against opts.cwd).
|
|
14
|
-
* - manifest: the per-kind manifest file exists under pkg.path.
|
|
15
|
-
* - auth: OIDC or the per-kind token env var is set.
|
|
16
|
-
* - repository: package.json has `repository` (npm --provenance requirement).
|
|
17
|
-
* - artifact: when the package is in the cascaded plan, its artifact
|
|
18
|
-
* dir exists.
|
|
19
|
-
*
|
|
20
|
-
* Default scope is "packages cascaded by the plan". `--all` widens to
|
|
21
|
-
* every configured package (useful pre-commit or when plan can't run
|
|
22
|
-
* in a scratch checkout).
|
|
23
|
-
*/
|
|
24
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
25
|
-
import { isAbsolute, join, resolve } from 'node:path';
|
|
26
|
-
import { expectedLayout } from './completeness.js';
|
|
27
|
-
import { loadConfig } from './config.js';
|
|
28
|
-
import { plan } from './plan.js';
|
|
29
|
-
import { checkAuth } from './preflight.js';
|
|
30
|
-
export async function runPreflight(opts) {
|
|
31
|
-
const issues = [];
|
|
32
|
-
const checks = [];
|
|
33
|
-
/* v8 ignore next -- tests always pass an explicit configPath or cwd */
|
|
34
|
-
const cfgPath = opts.configPath ?? `${opts.cwd.replace(/\/+$/, '')}/putitoutthere.toml`;
|
|
35
|
-
let config;
|
|
36
|
-
try {
|
|
37
|
-
config = loadConfig(cfgPath);
|
|
38
|
-
/* v8 ignore start -- non-Error catch fallback path */
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
42
|
-
issues.push(`config: ${message}`);
|
|
43
|
-
return { ok: false, checks, issues };
|
|
44
|
-
}
|
|
45
|
-
/* v8 ignore stop */
|
|
46
|
-
// Anchor pkg.path to opts.cwd so every downstream fs op points at the
|
|
47
|
-
// right tree (mirror src/publish.ts).
|
|
48
|
-
for (const p of config.packages) {
|
|
49
|
-
if (!isAbsolute(p.path))
|
|
50
|
-
p.path = resolve(opts.cwd, p.path);
|
|
51
|
-
}
|
|
52
|
-
let matrix = [];
|
|
53
|
-
try {
|
|
54
|
-
matrix = (await plan({ cwd: opts.cwd, configPath: cfgPath }));
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
/* v8 ignore next -- non-Error catch fallback path */
|
|
58
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
-
issues.push(`plan: cannot compute matrix (${message})`);
|
|
60
|
-
}
|
|
61
|
-
const cascaded = new Set(matrix.map((r) => r.name));
|
|
62
|
-
const scope = opts.all
|
|
63
|
-
? config.packages
|
|
64
|
-
: config.packages.filter((p) => cascaded.has(p.name));
|
|
65
|
-
const auth = checkAuth(scope);
|
|
66
|
-
for (const pkg of scope) {
|
|
67
|
-
checks.push(pathCheck(pkg));
|
|
68
|
-
checks.push(manifestCheck(pkg));
|
|
69
|
-
checks.push(authCheckFor(pkg, auth));
|
|
70
|
-
if (pkg.kind === 'npm') {
|
|
71
|
-
checks.push(repositoryCheck(pkg));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Artifact check runs only against matrix rows — non-cascaded packages
|
|
75
|
-
// have no rows, and adding a per-row check against them is misleading.
|
|
76
|
-
const artifactsRoot = join(opts.cwd, 'artifacts');
|
|
77
|
-
for (const row of matrix) {
|
|
78
|
-
// Vanilla npm publishes from source; no artifact dir exists.
|
|
79
|
-
if (row.kind === 'npm' && row.target === 'noarch')
|
|
80
|
-
continue;
|
|
81
|
-
// If the cascaded row's package isn't in scope (unusual but possible
|
|
82
|
-
// with external filters), still report — artifact issues block
|
|
83
|
-
// publish regardless of `--all`.
|
|
84
|
-
checks.push(artifactCheck(row, artifactsRoot));
|
|
85
|
-
}
|
|
86
|
-
const ok = issues.length === 0 && checks.every((c) => c.status !== 'fail');
|
|
87
|
-
return { ok, checks, issues };
|
|
88
|
-
}
|
|
89
|
-
/* ----------------------------- internals ----------------------------- */
|
|
90
|
-
function pathCheck(pkg) {
|
|
91
|
-
if (existsSync(pkg.path)) {
|
|
92
|
-
return { package: pkg.name, kind: pkg.kind, check: 'path', status: 'ok', detail: pkg.path };
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
package: pkg.name,
|
|
96
|
-
kind: pkg.kind,
|
|
97
|
-
check: 'path',
|
|
98
|
-
status: 'fail',
|
|
99
|
-
detail: `pkg.path does not exist: ${pkg.path}`,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function manifestFor(kind) {
|
|
103
|
-
switch (kind) {
|
|
104
|
-
case 'crates': return 'Cargo.toml';
|
|
105
|
-
case 'pypi': return 'pyproject.toml';
|
|
106
|
-
case 'npm': return 'package.json';
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function manifestCheck(pkg) {
|
|
110
|
-
const manifest = manifestFor(pkg.kind);
|
|
111
|
-
const full = join(pkg.path, manifest);
|
|
112
|
-
if (existsSync(full)) {
|
|
113
|
-
return { package: pkg.name, kind: pkg.kind, check: 'manifest', status: 'ok', detail: manifest };
|
|
114
|
-
}
|
|
115
|
-
return {
|
|
116
|
-
package: pkg.name,
|
|
117
|
-
kind: pkg.kind,
|
|
118
|
-
check: 'manifest',
|
|
119
|
-
status: 'fail',
|
|
120
|
-
detail: `missing ${manifest} at ${full}`,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
function authCheckFor(pkg, auth) {
|
|
124
|
-
const row = auth.results.find((r) => r.package === pkg.name);
|
|
125
|
-
/* v8 ignore start -- every scoped package gets a row in checkAuth */
|
|
126
|
-
if (row === undefined) {
|
|
127
|
-
return { package: pkg.name, kind: pkg.kind, check: 'auth', status: 'skip', detail: 'no auth row' };
|
|
128
|
-
}
|
|
129
|
-
/* v8 ignore stop */
|
|
130
|
-
if (row.via === 'missing') {
|
|
131
|
-
return {
|
|
132
|
-
package: pkg.name,
|
|
133
|
-
kind: pkg.kind,
|
|
134
|
-
check: 'auth',
|
|
135
|
-
status: 'fail',
|
|
136
|
-
detail: `needs ${row.acceptedEnvVars.join(' or ')} or OIDC`,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
return { package: pkg.name, kind: pkg.kind, check: 'auth', status: 'ok', detail: row.via };
|
|
140
|
-
}
|
|
141
|
-
function repositoryCheck(pkg) {
|
|
142
|
-
const pkgJsonPath = join(pkg.path, 'package.json');
|
|
143
|
-
if (!existsSync(pkgJsonPath)) {
|
|
144
|
-
return {
|
|
145
|
-
package: pkg.name,
|
|
146
|
-
kind: pkg.kind,
|
|
147
|
-
check: 'repository',
|
|
148
|
-
status: 'skip',
|
|
149
|
-
detail: 'no package.json',
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
let parsed;
|
|
153
|
-
try {
|
|
154
|
-
parsed = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
/* v8 ignore next -- non-Error catch fallback */
|
|
158
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
-
return {
|
|
160
|
-
package: pkg.name,
|
|
161
|
-
kind: pkg.kind,
|
|
162
|
-
check: 'repository',
|
|
163
|
-
status: 'fail',
|
|
164
|
-
detail: `package.json parse error: ${message}`,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
if (!parsed.repository) {
|
|
168
|
-
return {
|
|
169
|
-
package: pkg.name,
|
|
170
|
-
kind: pkg.kind,
|
|
171
|
-
check: 'repository',
|
|
172
|
-
status: 'fail',
|
|
173
|
-
detail: '`repository` field required for `npm publish --provenance`',
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
return { package: pkg.name, kind: pkg.kind, check: 'repository', status: 'ok' };
|
|
177
|
-
}
|
|
178
|
-
function artifactCheck(row, artifactsRoot) {
|
|
179
|
-
const dir = join(artifactsRoot, row.artifact_name);
|
|
180
|
-
if (existsSync(dir)) {
|
|
181
|
-
return {
|
|
182
|
-
package: row.name,
|
|
183
|
-
kind: row.kind,
|
|
184
|
-
check: 'artifact',
|
|
185
|
-
status: 'ok',
|
|
186
|
-
detail: row.artifact_name,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
return {
|
|
190
|
-
package: row.name,
|
|
191
|
-
kind: row.kind,
|
|
192
|
-
check: 'artifact',
|
|
193
|
-
status: 'fail',
|
|
194
|
-
detail: `missing ${row.artifact_name}/; expected ${expectedLayout(row)}`,
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=preflight-run.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preflight-run.js","sourceRoot":"","sources":["../src/preflight-run.ts"],"names":[],"mappings":"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"}
|