@extenshi/cli 0.24.0 → 0.25.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 +1 -1
- package/dist/amo-source.d.ts.map +1 -1
- package/dist/amo-source.js +5 -0
- package/dist/amo-source.js.map +1 -1
- package/dist/amowebstore-md.d.ts +26 -0
- package/dist/amowebstore-md.d.ts.map +1 -1
- package/dist/amowebstore-md.js +32 -3
- package/dist/amowebstore-md.js.map +1 -1
- package/dist/auto-update.d.ts +46 -3
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +94 -19
- package/dist/auto-update.js.map +1 -1
- package/dist/chromewebstore-md.d.ts +7 -0
- package/dist/chromewebstore-md.d.ts.map +1 -1
- package/dist/chromewebstore-md.js +20 -3
- package/dist/chromewebstore-md.js.map +1 -1
- package/dist/cli.js +31 -9
- package/dist/cli.js.map +1 -1
- package/dist/edgewebstore-md.d.ts +14 -0
- package/dist/edgewebstore-md.d.ts.map +1 -1
- package/dist/edgewebstore-md.js +20 -5
- package/dist/edgewebstore-md.js.map +1 -1
- package/dist/evidence-ingest.d.ts +67 -5
- package/dist/evidence-ingest.d.ts.map +1 -1
- package/dist/evidence-ingest.js +146 -21
- package/dist/evidence-ingest.js.map +1 -1
- package/dist/generate-listing.d.ts +18 -6
- package/dist/generate-listing.d.ts.map +1 -1
- package/dist/generate-listing.js +62 -19
- package/dist/generate-listing.js.map +1 -1
- package/dist/json-ld.d.ts +43 -5
- package/dist/json-ld.d.ts.map +1 -1
- package/dist/json-ld.js +53 -1
- package/dist/json-ld.js.map +1 -1
- package/dist/landing-sections.d.ts +21 -3
- package/dist/landing-sections.d.ts.map +1 -1
- package/dist/landing-sections.js +63 -17
- package/dist/landing-sections.js.map +1 -1
- package/dist/listing-data-flows.d.ts +140 -0
- package/dist/listing-data-flows.d.ts.map +1 -0
- package/dist/listing-data-flows.js +454 -0
- package/dist/listing-data-flows.js.map +1 -0
- package/dist/localize-parity.d.ts +26 -0
- package/dist/localize-parity.d.ts.map +1 -0
- package/dist/localize-parity.js +227 -0
- package/dist/localize-parity.js.map +1 -0
- package/dist/localize.d.ts +6 -0
- package/dist/localize.d.ts.map +1 -1
- package/dist/localize.js +4 -4
- package/dist/localize.js.map +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +1 -2
- package/dist/media.js.map +1 -1
- package/dist/package.d.ts +13 -0
- package/dist/package.d.ts.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/page.d.ts +16 -0
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +49 -4
- package/dist/page.js.map +1 -1
- package/dist/permission-justifications.d.ts +19 -1
- package/dist/permission-justifications.d.ts.map +1 -1
- package/dist/permission-justifications.js +129 -0
- package/dist/permission-justifications.js.map +1 -1
- package/dist/png.d.ts.map +1 -1
- package/dist/png.js +92 -34
- package/dist/png.js.map +1 -1
- package/dist/review-checks.d.ts +6 -0
- package/dist/review-checks.d.ts.map +1 -1
- package/dist/review-checks.js +8 -5
- package/dist/review-checks.js.map +1 -1
- package/dist/screenshots.d.ts.map +1 -1
- package/dist/screenshots.js +2 -3
- package/dist/screenshots.js.map +1 -1
- package/dist/smoke.d.ts +54 -6
- package/dist/smoke.d.ts.map +1 -1
- package/dist/smoke.js +302 -26
- package/dist/smoke.js.map +1 -1
- package/dist/store-assets.d.ts +20 -3
- package/dist/store-assets.d.ts.map +1 -1
- package/dist/store-assets.js +13 -7
- package/dist/store-assets.js.map +1 -1
- package/package.json +1 -1
package/dist/evidence-ingest.js
CHANGED
|
@@ -13,11 +13,19 @@
|
|
|
13
13
|
* the run exists in the project's bound repository, at this commit, with this
|
|
14
14
|
* conclusion, and has COMPLETED — so this must run from a `workflow_run`
|
|
15
15
|
* follow-up, not inside the run it attests. Source `ci` is written only there.
|
|
16
|
+
*
|
|
17
|
+
* Beyond the action: `--run-attempt` (the follow-up's own GITHUB_RUN_ATTEMPT is
|
|
18
|
+
* not the attested run's), `--require-report` (attest only a package whose smoke
|
|
19
|
+
* report passed — a local gate, the server stores no reports yet) and `--dry-run`
|
|
20
|
+
* (validate and print the request, no secret needed). Neither changes the body
|
|
21
|
+
* or the key the action would send for the same inputs.
|
|
16
22
|
*/
|
|
17
23
|
import { createHash, createHmac } from 'node:crypto';
|
|
18
24
|
import fs from 'node:fs';
|
|
25
|
+
import path from 'node:path';
|
|
19
26
|
import { InvalidInputError } from './expected-error.js';
|
|
20
27
|
import { resolvePackagedArtifact } from './package.js';
|
|
28
|
+
import { ENGINE_BROWSER } from './smoke.js';
|
|
21
29
|
const CI_KINDS = ['tests', 'scan', 'installed'];
|
|
22
30
|
const CI_BROWSERS = ['chrome', 'firefox', 'edge'];
|
|
23
31
|
const CI_CONCLUSIONS = [
|
|
@@ -38,11 +46,25 @@ export function uuidv5(name, namespace = URL_NAMESPACE) {
|
|
|
38
46
|
const hex = hash.toString('hex');
|
|
39
47
|
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
40
48
|
}
|
|
41
|
-
/**
|
|
42
|
-
|
|
49
|
+
/**
|
|
50
|
+
* What the idempotency key is derived from. EVERY writer of this evidence
|
|
51
|
+
* derives it the same way — the action (tools/extenshi-evidence-action), this
|
|
52
|
+
* command, and any hand-written step: an empty locale still contributes an empty
|
|
53
|
+
* segment (`…:chrome::<digest>`), and the attempt is the attempt of the run being
|
|
54
|
+
* attested. A copy that drops the empty segment or hardcodes the attempt writes a
|
|
55
|
+
* different key for the same evidence — the server dedupes by key, so that is a
|
|
56
|
+
* second record, not a replay. `--dry-run` prints this string so a copy can be
|
|
57
|
+
* diffed against it.
|
|
58
|
+
*/
|
|
59
|
+
export function ingestIdempotencyName(parts) {
|
|
60
|
+
return `${parts.repository}:${parts.runId}:${parts.runAttempt}:${parts.kind}:${parts.browser}:${parts.locale ?? ''}:${parts.artifactDigest}`;
|
|
61
|
+
}
|
|
62
|
+
/** The exact body the action sends, and the key it carries. No secret is involved. */
|
|
63
|
+
export function buildIngestBody(input) {
|
|
43
64
|
const artifactDigest = createHash('sha256').update(input.artifactBytes).digest('hex');
|
|
44
65
|
const locale = input.locale ?? '';
|
|
45
|
-
const
|
|
66
|
+
const idempotencyName = ingestIdempotencyName({ ...input, locale, artifactDigest });
|
|
67
|
+
const idempotencyKey = uuidv5(idempotencyName);
|
|
46
68
|
const serverUrl = input.serverUrl ?? 'https://github.com';
|
|
47
69
|
const body = JSON.stringify({
|
|
48
70
|
projectId: input.projectId,
|
|
@@ -58,19 +80,77 @@ export function buildIngestRequest(input, timestamp = Date.now().toString()) {
|
|
|
58
80
|
runUrl: `${serverUrl}/${input.repository}/actions/runs/${input.runId}`,
|
|
59
81
|
reports: [],
|
|
60
82
|
});
|
|
83
|
+
return { artifactDigest, idempotencyName, idempotencyKey, body };
|
|
84
|
+
}
|
|
85
|
+
/** The headers the action sends for `body`. `timestamp` is injectable for tests. */
|
|
86
|
+
export function signIngestBody(body, secret, timestamp = Date.now().toString()) {
|
|
61
87
|
// The server stores only sha256(secret) and verifies with that hash.
|
|
62
|
-
const key = createHash('sha256').update(
|
|
88
|
+
const key = createHash('sha256').update(secret, 'utf8').digest('hex');
|
|
63
89
|
const signature = createHmac('sha256', key).update(`${timestamp}.${body}`).digest('hex');
|
|
64
90
|
return {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
'content-type': 'application/json',
|
|
69
|
-
'x-extenshi-timestamp': timestamp,
|
|
70
|
-
'x-extenshi-signature': `sha256=${signature}`,
|
|
71
|
-
},
|
|
91
|
+
'content-type': 'application/json',
|
|
92
|
+
'x-extenshi-timestamp': timestamp,
|
|
93
|
+
'x-extenshi-signature': `sha256=${signature}`,
|
|
72
94
|
};
|
|
73
95
|
}
|
|
96
|
+
/** The exact body + headers the action sends. */
|
|
97
|
+
export function buildIngestRequest(input, timestamp = Date.now().toString()) {
|
|
98
|
+
const built = buildIngestBody(input);
|
|
99
|
+
return { ...built, headers: signIngestBody(built.body, input.secret, timestamp) };
|
|
100
|
+
}
|
|
101
|
+
const sha12 = (digest) => `${digest.slice(0, 12)}…`;
|
|
102
|
+
/**
|
|
103
|
+
* `--require-report`: the package may be attested only when the smoke report of
|
|
104
|
+
* THIS package passed. Accepts what `extenshi test smoke --json` writes
|
|
105
|
+
* (`status: "passed"`, `sha256`, `browser`) and the `passed: true` + `sha256`
|
|
106
|
+
* shape a hand-written smoke script emits. Local gate only: the ingest schema has
|
|
107
|
+
* a `reports` array, but the server does not store it yet, so the report is
|
|
108
|
+
* checked here and not sent.
|
|
109
|
+
*/
|
|
110
|
+
export function checkSmokeReport(file, artifactDigest, browser) {
|
|
111
|
+
let raw;
|
|
112
|
+
try {
|
|
113
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const code = error.code;
|
|
117
|
+
throw new InvalidInputError(code === 'ENOENT'
|
|
118
|
+
? `--require-report: ${file} does not exist — nothing is attested without the smoke report of this package.`
|
|
119
|
+
: `--require-report: ${file} could not be read (${code ?? error.message}).`);
|
|
120
|
+
}
|
|
121
|
+
let report;
|
|
122
|
+
try {
|
|
123
|
+
report = JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new InvalidInputError(`--require-report: ${file} is not valid JSON: ${error.message}`);
|
|
127
|
+
}
|
|
128
|
+
if (!report || typeof report !== 'object' || Array.isArray(report))
|
|
129
|
+
throw new InvalidInputError(`--require-report: ${file} is not a smoke report (expected a JSON object).`);
|
|
130
|
+
const { status, passed, sha256, browser: reported } = report;
|
|
131
|
+
const byStatus = typeof status === 'string' ? status === 'passed' : undefined;
|
|
132
|
+
const byFlag = typeof passed === 'boolean' ? passed : undefined;
|
|
133
|
+
// A report that carries both verdicts must agree with itself.
|
|
134
|
+
if (byStatus !== undefined && byFlag !== undefined && byStatus !== byFlag)
|
|
135
|
+
throw new InvalidInputError(`--require-report: ${file} contradicts itself (status "${status}", passed: ${passed}) — not attesting ${browser}.`);
|
|
136
|
+
if (!(byStatus ?? byFlag))
|
|
137
|
+
throw new InvalidInputError(`--require-report: ${file} does not show a pass (${byStatus === false ? `status "${status}"` : byFlag === false ? 'passed: false' : 'it has neither status nor passed'}) — not attesting ${browser}.`);
|
|
138
|
+
if (typeof sha256 !== 'string' || sha256.toLowerCase() !== artifactDigest)
|
|
139
|
+
throw new InvalidInputError(typeof sha256 === 'string'
|
|
140
|
+
? `--require-report: ${file} is the smoke report of ${sha12(sha256)}, not of this package (${sha12(artifactDigest)}).`
|
|
141
|
+
: `--require-report: ${file} has no sha256, so it cannot be tied to this package (${sha12(artifactDigest)}).`);
|
|
142
|
+
// `extenshi test smoke` names the engine (chromium), the store browser is chrome.
|
|
143
|
+
const reportedBrowser = typeof reported === 'string' ? (ENGINE_BROWSER[reported] ?? reported) : undefined;
|
|
144
|
+
if (reportedBrowser && reportedBrowser !== browser)
|
|
145
|
+
throw new InvalidInputError(`--require-report: ${file} is a ${reported} smoke report but --browser is ${browser}.`);
|
|
146
|
+
return `smoke report ${path.basename(file)} passed for ${sha12(artifactDigest)}`;
|
|
147
|
+
}
|
|
148
|
+
/** The attempt of the run being attested: a positive integer, never NaN in the key. */
|
|
149
|
+
function parseRunAttempt(value, source) {
|
|
150
|
+
if (!/^[1-9][0-9]{0,8}$/.test(value.trim()))
|
|
151
|
+
throw new InvalidInputError(`${source} must be a positive integer (got "${value}")`);
|
|
152
|
+
return Number(value);
|
|
153
|
+
}
|
|
74
154
|
export async function runEvidenceIngest(artifact, options, env = process.env) {
|
|
75
155
|
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(options.project))
|
|
76
156
|
throw new InvalidInputError('--project must be the Dojo project UUID');
|
|
@@ -81,41 +161,68 @@ export async function runEvidenceIngest(artifact, options, env = process.env) {
|
|
|
81
161
|
const conclusion = options.conclusion ?? 'success';
|
|
82
162
|
if (!CI_CONCLUSIONS.includes(conclusion))
|
|
83
163
|
throw new InvalidInputError(`--conclusion must be one of: ${CI_CONCLUSIONS.join(', ')}`);
|
|
84
|
-
// A flag would put the secret in the process list and shell history.
|
|
164
|
+
// A flag would put the secret in the process list and shell history. A dry run
|
|
165
|
+
// signs and sends nothing, so it does not need one.
|
|
85
166
|
const secret = env.EXTENSHI_EVIDENCE_SECRET;
|
|
86
|
-
if (!secret)
|
|
167
|
+
if (!secret && !options.dryRun)
|
|
87
168
|
throw new InvalidInputError('Set EXTENSHI_EVIDENCE_SECRET (the project CI ingest secret) in the environment.');
|
|
88
169
|
const repository = env.GITHUB_REPOSITORY;
|
|
89
170
|
const commit = options.commit || env.GITHUB_SHA;
|
|
90
171
|
const runId = Number(options.runId || env.GITHUB_RUN_ID);
|
|
91
172
|
if (!repository || !commit || !Number.isInteger(runId) || runId <= 0)
|
|
92
|
-
throw new InvalidInputError('GITHUB_REPOSITORY, the commit and the run id are required — run inside GitHub Actions, and from a workflow_run follow-up pass --run-id/--commit of the completed run.');
|
|
173
|
+
throw new InvalidInputError('GITHUB_REPOSITORY, the commit and the run id are required — run inside GitHub Actions, and from a workflow_run follow-up pass --run-id/--run-attempt/--commit of the completed run.');
|
|
174
|
+
// GITHUB_RUN_ATTEMPT is the follow-up run's own, not the attested run's: a
|
|
175
|
+
// workflow_run follow-up passes the flag (github.event.workflow_run.run_attempt).
|
|
176
|
+
const runAttempt = options.runAttempt !== undefined
|
|
177
|
+
? parseRunAttempt(options.runAttempt, '--run-attempt')
|
|
178
|
+
: parseRunAttempt(env.GITHUB_RUN_ATTEMPT || '1', 'GITHUB_RUN_ATTEMPT');
|
|
179
|
+
// What ciEvidenceIngestSchema checks, so a dry run fails where the request would.
|
|
180
|
+
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repository))
|
|
181
|
+
throw new InvalidInputError(`GITHUB_REPOSITORY must be owner/repo (got "${repository}")`);
|
|
182
|
+
if (!/^[a-f0-9]{40,64}$/.test(commit))
|
|
183
|
+
throw new InvalidInputError('--commit must be the full lowercase git SHA (40 hex characters)');
|
|
184
|
+
if (options.locale !== undefined && (options.locale.length < 2 || options.locale.length > 35))
|
|
185
|
+
throw new InvalidInputError('--locale must be 2–35 characters');
|
|
93
186
|
const { artifactPath } = resolvePackagedArtifact(artifact, options.browser);
|
|
94
|
-
const
|
|
187
|
+
const built = buildIngestBody({
|
|
95
188
|
projectId: options.project,
|
|
96
189
|
artifactBytes: fs.readFileSync(artifactPath),
|
|
97
|
-
secret,
|
|
98
190
|
repository,
|
|
99
191
|
commit,
|
|
100
192
|
runId,
|
|
101
|
-
runAttempt
|
|
193
|
+
runAttempt,
|
|
102
194
|
kind: options.kind,
|
|
103
195
|
browser: options.browser,
|
|
104
196
|
locale: options.locale,
|
|
105
197
|
conclusion,
|
|
106
198
|
serverUrl: env.GITHUB_SERVER_URL,
|
|
107
199
|
});
|
|
200
|
+
// Before any request: a package without a passing smoke report is not attested.
|
|
201
|
+
const report = options.requireReport
|
|
202
|
+
? checkSmokeReport(options.requireReport, built.artifactDigest, options.browser)
|
|
203
|
+
: undefined;
|
|
108
204
|
const bffUrl = (options.bffUrl ?? env.EXTENSHI_BFF_URL ?? 'https://bff.extenshi.io').replace(/\/$/, '');
|
|
109
|
-
const
|
|
205
|
+
const result = {
|
|
206
|
+
artifactDigest: built.artifactDigest,
|
|
207
|
+
idempotencyKey: built.idempotencyKey,
|
|
208
|
+
idempotencyName: built.idempotencyName,
|
|
209
|
+
url: `${bffUrl}/projects/${options.project}/evidence/ingest`,
|
|
210
|
+
body: built.body,
|
|
211
|
+
report,
|
|
212
|
+
};
|
|
213
|
+
// `!secret` only holds in a dry run — the check above refused it otherwise.
|
|
214
|
+
if (options.dryRun || !secret)
|
|
215
|
+
return { ...result, status: null, answer: '' };
|
|
216
|
+
const response = await fetch(result.url, {
|
|
110
217
|
method: 'POST',
|
|
111
|
-
headers:
|
|
112
|
-
body:
|
|
218
|
+
headers: signIngestBody(built.body, secret),
|
|
219
|
+
body: built.body,
|
|
113
220
|
signal: AbortSignal.timeout(30_000),
|
|
114
221
|
});
|
|
115
222
|
const answer = await response.text().catch(() => '');
|
|
116
223
|
if (!response.ok)
|
|
117
224
|
throw new Error(`ingest rejected (${response.status}): ${answer.slice(0, 500)}`);
|
|
118
|
-
return {
|
|
225
|
+
return { ...result, status: response.status, answer };
|
|
119
226
|
}
|
|
120
227
|
export function registerEvidenceIngest(program, run) {
|
|
121
228
|
const evidence = program.commands.find((c) => c.name() === 'evidence') ?? program.command('evidence');
|
|
@@ -129,11 +236,29 @@ export function registerEvidenceIngest(program, run) {
|
|
|
129
236
|
.option('--locale <locale>', 'Optional locale the evidence is scoped to')
|
|
130
237
|
.option('--conclusion <conclusion>', 'Run conclusion to attest (the server cross-checks it)', 'success')
|
|
131
238
|
.option('--run-id <id>', 'The completed run to attest (default GITHUB_RUN_ID — rejected while in progress)')
|
|
239
|
+
.option('--run-attempt <n>', 'Attempt of that run (default GITHUB_RUN_ATTEMPT, which in a workflow_run follow-up is the ' +
|
|
240
|
+
"follow-up's own — pass github.event.workflow_run.run_attempt); part of the idempotency key")
|
|
132
241
|
.option('--commit <sha>', 'The built commit (default GITHUB_SHA)')
|
|
242
|
+
.option('--require-report <file>', 'Attest only if this smoke report (extenshi test smoke --json) exists, passed and is for this exact ' +
|
|
243
|
+
'package; checked locally, not sent — the server does not store reports yet. For attesting a pass: ' +
|
|
244
|
+
'a failed report exits 1, so leave the flag out to record a red run')
|
|
245
|
+
.option('--dry-run', 'Validate and print the request (URL, idempotency key, body) without the signature; sends nothing, needs no secret')
|
|
133
246
|
.option('--bff-url <url>', 'Extenshi BFF base URL', undefined)
|
|
134
247
|
.action(async (artifact, options) => {
|
|
135
248
|
await run('evidence ingest', async () => {
|
|
136
249
|
const result = await runEvidenceIngest(artifact, options);
|
|
250
|
+
if (options.dryRun) {
|
|
251
|
+
console.log('extenshi-evidence (dry run): validated — nothing was sent, no secret was used.');
|
|
252
|
+
console.log(`POST ${result.url}`);
|
|
253
|
+
console.log(`idempotency key: ${result.idempotencyKey}`);
|
|
254
|
+
console.log(` = uuidv5(url namespace, "${result.idempotencyName}")`);
|
|
255
|
+
if (result.report)
|
|
256
|
+
console.log(result.report);
|
|
257
|
+
console.log(`body (the signature header is added when sending):\n${result.body}`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (result.report)
|
|
261
|
+
console.log(`extenshi-evidence: ${result.report}`);
|
|
137
262
|
console.log(`extenshi-evidence: recorded ${options.kind} for ${result.artifactDigest.slice(0, 12)}… — ${result.answer.slice(0, 300)}`);
|
|
138
263
|
});
|
|
139
264
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-ingest.js","sourceRoot":"","sources":["../src/evidence-ingest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evidence-ingest.js","sourceRoot":"","sources":["../src/evidence-ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,18 +3,23 @@
|
|
|
3
3
|
* a per-store listing draft from a live package (ROADMAP it.2 T11; Edge/AMO
|
|
4
4
|
* added as part of the "Edge and Firefox are first-class" gap-analysis item).
|
|
5
5
|
*
|
|
6
|
-
* Pure transform: listing text (manifest + optional `--listing`) +
|
|
7
|
-
* justification
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* Pure transform: listing text (manifest + optional `--listing`) + one
|
|
7
|
+
* justification question per requested permission and host pattern (the it.1
|
|
8
|
+
* T6 prompts for sensitive ones) + data-usage questions from the package's data
|
|
9
|
+
* flows (the it.2 T5 permission checklist, bundled Extenshi SDKs, storage
|
|
10
|
+
* areas, remote hosts, the Firefox data_collection_permissions — see
|
|
11
|
+
* listing-data-flows.ts) + reviewer notes + (edge/firefox) store-specific
|
|
12
|
+
* manifest facts → markdown. The CLI only loads the artifact and writes the
|
|
13
|
+
* file. It does NOT write listing / Privacy / visibility into any store
|
|
14
|
+
* dashboard.
|
|
11
15
|
*
|
|
12
16
|
* `review-risk --listing <file>` is the consumer for all three outputs — they
|
|
13
17
|
* share the Name / Short description / Description / Single purpose headings
|
|
14
18
|
* with CHROMEWEBSTORE.md, so `listingDraftFromChromeWebStoreMd` (keyed on
|
|
15
19
|
* headings, not filename) parses EDGE.md/AMO.md exactly the same way.
|
|
16
20
|
*/
|
|
17
|
-
import { type
|
|
21
|
+
import { type PaymentMode } from './listing-data-flows.js';
|
|
22
|
+
import type { FileMap, Manifest } from './review-checks.js';
|
|
18
23
|
export type ListingStore = 'chrome' | 'edge' | 'firefox';
|
|
19
24
|
export interface GenerateListingInput {
|
|
20
25
|
manifest: Manifest;
|
|
@@ -22,6 +27,11 @@ export interface GenerateListingInput {
|
|
|
22
27
|
listingPath?: string;
|
|
23
28
|
/** Which store's draft to render. Defaults to `'chrome'` for backward compatibility. */
|
|
24
29
|
store?: ListingStore;
|
|
30
|
+
/**
|
|
31
|
+
* Overrides "requires payment", which otherwise follows the Pay SDK found in
|
|
32
|
+
* the package. Same vocabulary as `project release --payment`.
|
|
33
|
+
*/
|
|
34
|
+
payment?: PaymentMode;
|
|
25
35
|
}
|
|
26
36
|
/**
|
|
27
37
|
* Assemble a listing draft from an already-loaded package. No I/O except
|
|
@@ -37,6 +47,8 @@ export interface GenerateListingOptions {
|
|
|
37
47
|
listingPath?: string;
|
|
38
48
|
/** Which store's draft to render. Defaults to `'chrome'` for backward compatibility. */
|
|
39
49
|
store?: ListingStore;
|
|
50
|
+
/** `--payment required|not-used`; omitted = follow the Pay SDK found in the package. */
|
|
51
|
+
payment?: string;
|
|
40
52
|
}
|
|
41
53
|
export declare function runGenerateListing(opts: GenerateListingOptions): Promise<string>;
|
|
42
54
|
//# sourceMappingURL=generate-listing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-listing.d.ts","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate-listing.d.ts","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,OAAO,EAMN,KAAK,WAAW,EAMhB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAQ3D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAMxD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;CACrB;AAsBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAqEhF;AAED,mHAAmH;AACnH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,sBAAsB;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BtF"}
|
package/dist/generate-listing.js
CHANGED
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|
* a per-store listing draft from a live package (ROADMAP it.2 T11; Edge/AMO
|
|
4
4
|
* added as part of the "Edge and Firefox are first-class" gap-analysis item).
|
|
5
5
|
*
|
|
6
|
-
* Pure transform: listing text (manifest + optional `--listing`) +
|
|
7
|
-
* justification
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* Pure transform: listing text (manifest + optional `--listing`) + one
|
|
7
|
+
* justification question per requested permission and host pattern (the it.1
|
|
8
|
+
* T6 prompts for sensitive ones) + data-usage questions from the package's data
|
|
9
|
+
* flows (the it.2 T5 permission checklist, bundled Extenshi SDKs, storage
|
|
10
|
+
* areas, remote hosts, the Firefox data_collection_permissions — see
|
|
11
|
+
* listing-data-flows.ts) + reviewer notes + (edge/firefox) store-specific
|
|
12
|
+
* manifest facts → markdown. The CLI only loads the artifact and writes the
|
|
13
|
+
* file. It does NOT write listing / Privacy / visibility into any store
|
|
14
|
+
* dashboard.
|
|
11
15
|
*
|
|
12
16
|
* `review-risk --listing <file>` is the consumer for all three outputs — they
|
|
13
17
|
* share the Name / Short description / Description / Single purpose headings
|
|
@@ -17,13 +21,13 @@
|
|
|
17
21
|
import fs from 'node:fs';
|
|
18
22
|
import path from 'node:path';
|
|
19
23
|
import { detectMinifiedFiles } from './amo-source-detect.js';
|
|
20
|
-
import { AMO_FILENAME, renderAmoMd } from './amowebstore-md.js';
|
|
24
|
+
import { AMO_FILENAME, AMO_REVIEWER_GUIDANCE, renderAmoMd } from './amowebstore-md.js';
|
|
21
25
|
import { CHROMEWEBSTORE_FILENAME, renderChromeWebStoreMd } from './chromewebstore-md.js';
|
|
22
|
-
import { EDGE_FILENAME, renderEdgeMd } from './edgewebstore-md.js';
|
|
26
|
+
import { EDGE_CERTIFICATION_GUIDANCE, EDGE_FILENAME, renderEdgeMd } from './edgewebstore-md.js';
|
|
23
27
|
import { assembleListing } from './listing.js';
|
|
24
|
-
import {
|
|
28
|
+
import { AMO_APPROVAL_NOTES_MAX, buildDataUsage, buildReviewerNotes, detectDataFlows, payEvidence, privacyPolicyNeed, renderDataUsage, renderReviewerNotes, reviewAmoDataCollection, } from './listing-data-flows.js';
|
|
29
|
+
import { buildListingJustifications } from './permission-justifications.js';
|
|
25
30
|
import { loadArtifact } from './review-archive.js';
|
|
26
|
-
import { privacyPracticesForManifest } from './review-checks.js';
|
|
27
31
|
const MAX_SIZE = 50 * 1024 * 1024;
|
|
28
32
|
const MAX_ENTRY_BYTES = 4 * 1024 * 1024;
|
|
29
33
|
const MAX_TOTAL_BYTES = 40 * 1024 * 1024;
|
|
@@ -39,6 +43,18 @@ function filenameForStore(store) {
|
|
|
39
43
|
return AMO_FILENAME;
|
|
40
44
|
return CHROMEWEBSTORE_FILENAME;
|
|
41
45
|
}
|
|
46
|
+
/** `### <permission>` body: host patterns with their source, the question, the example, what the package uses. */
|
|
47
|
+
function justificationPrompt(row, flows) {
|
|
48
|
+
const parts = [];
|
|
49
|
+
if (row.patterns)
|
|
50
|
+
parts.push(`Patterns: ${row.patterns.map((p) => `\`${p.pattern}\` (\`${p.source}\`)`).join(', ')}`);
|
|
51
|
+
parts.push(row.question);
|
|
52
|
+
if (row.example)
|
|
53
|
+
parts.push(`Example: ${row.example}`);
|
|
54
|
+
if (row.permission === 'storage' && flows.storage.length > 0)
|
|
55
|
+
parts.push(`Used in the package: ${flows.storage.map((s) => `\`storage.${s.area}\` (${s.files.length} file${s.files.length === 1 ? '' : 's'})`).join(', ')}.`);
|
|
56
|
+
return parts.join('\n\n');
|
|
57
|
+
}
|
|
42
58
|
/**
|
|
43
59
|
* Assemble a listing draft from an already-loaded package. No I/O except
|
|
44
60
|
* reading `--listing` through `assembleListing` when a path is passed.
|
|
@@ -46,24 +62,29 @@ function filenameForStore(store) {
|
|
|
46
62
|
export function generateListingMdFromPackage(input) {
|
|
47
63
|
const store = input.store ?? 'chrome';
|
|
48
64
|
const listing = assembleListing(input.manifest, input.files, input.listingPath);
|
|
49
|
-
const
|
|
65
|
+
const flows = detectDataFlows(input.manifest, input.files, { payment: input.payment });
|
|
66
|
+
const justifications = buildListingJustifications(input.manifest).map((row) => ({
|
|
50
67
|
permission: row.permission,
|
|
51
|
-
prompt:
|
|
68
|
+
prompt: justificationPrompt(row, flows),
|
|
52
69
|
}));
|
|
53
70
|
const loc = listing?.locales.find((l) => l.locale === listing.defaultLocale) ?? listing?.locales[0];
|
|
54
71
|
const singlePurpose = loc?.shortDescription ?? loc?.name ?? '';
|
|
55
72
|
if (store === 'edge') {
|
|
56
|
-
const
|
|
73
|
+
const usage = buildDataUsage(input.manifest, flows);
|
|
57
74
|
return renderEdgeMd({
|
|
58
75
|
listing,
|
|
59
76
|
justifications,
|
|
60
|
-
|
|
77
|
+
dataUsage: renderDataUsage(usage),
|
|
78
|
+
privacyPolicy: privacyPolicyNeed(usage),
|
|
79
|
+
certificationNotes: renderReviewerNotes(buildReviewerNotes(input.manifest, input.files, flows), EDGE_CERTIFICATION_GUIDANCE),
|
|
61
80
|
singlePurpose,
|
|
62
81
|
});
|
|
63
82
|
}
|
|
64
83
|
if (store === 'firefox') {
|
|
65
84
|
const gecko = input.manifest.browser_specific_settings?.gecko;
|
|
66
|
-
const required =
|
|
85
|
+
const required = flows.firefoxDataCollection?.required;
|
|
86
|
+
const optional = flows.firefoxDataCollection?.optional;
|
|
87
|
+
const pay = payEvidence(flows);
|
|
67
88
|
return renderAmoMd({
|
|
68
89
|
listing,
|
|
69
90
|
justifications,
|
|
@@ -72,21 +93,42 @@ export function generateListingMdFromPackage(input) {
|
|
|
72
93
|
id: gecko?.id,
|
|
73
94
|
isPlaceholder: gecko?.id ? PLACEHOLDER_GECKO_IDS.has(gecko.id.toLowerCase()) : false,
|
|
74
95
|
strictMinVersion: gecko?.strict_min_version,
|
|
75
|
-
dataCollectionRequired:
|
|
76
|
-
|
|
77
|
-
: undefined,
|
|
96
|
+
dataCollectionRequired: required && required.length > 0 ? required : undefined,
|
|
97
|
+
dataCollectionOptional: optional && optional.length > 0 ? optional : undefined,
|
|
78
98
|
},
|
|
79
99
|
minifiedFiles: detectMinifiedFiles(input.files),
|
|
100
|
+
dataCollectionReview: reviewAmoDataCollection(flows),
|
|
101
|
+
requiresPayment: flows.paid ? 'yes' : input.payment === 'not-used' ? 'no' : 'unknown',
|
|
102
|
+
paymentEvidence: input.payment
|
|
103
|
+
? `Set with --payment ${input.payment}.`
|
|
104
|
+
: pay
|
|
105
|
+
? `${pay.charAt(0).toUpperCase()}${pay.slice(1)} is in the package.`
|
|
106
|
+
: undefined,
|
|
107
|
+
reviewerNotes: renderReviewerNotes(
|
|
108
|
+
// The facts become approvalNotes on `publish --listing AMO.md`, capped by the publisher.
|
|
109
|
+
buildReviewerNotes(input.manifest, input.files, flows, {
|
|
110
|
+
lint: true,
|
|
111
|
+
maxFactsChars: AMO_APPROVAL_NOTES_MAX,
|
|
112
|
+
}), AMO_REVIEWER_GUIDANCE),
|
|
80
113
|
});
|
|
81
114
|
}
|
|
82
|
-
const
|
|
83
|
-
return renderChromeWebStoreMd({
|
|
115
|
+
const usage = buildDataUsage(input.manifest, flows);
|
|
116
|
+
return renderChromeWebStoreMd({
|
|
117
|
+
listing,
|
|
118
|
+
justifications,
|
|
119
|
+
dataUsage: renderDataUsage(usage),
|
|
120
|
+
privacyPolicy: privacyPolicyNeed(usage),
|
|
121
|
+
singlePurpose,
|
|
122
|
+
});
|
|
84
123
|
}
|
|
85
124
|
/** @deprecated kept for existing callers/tests — same as `generateListingMdFromPackage` with `store: 'chrome'`. */
|
|
86
125
|
export function generateChromeWebStoreMdFromPackage(input) {
|
|
87
126
|
return generateListingMdFromPackage({ ...input, store: 'chrome' });
|
|
88
127
|
}
|
|
89
128
|
export async function runGenerateListing(opts) {
|
|
129
|
+
if (opts.payment !== undefined && opts.payment !== 'required' && opts.payment !== 'not-used') {
|
|
130
|
+
throw new Error(`--payment must be required or not-used (got "${opts.payment}")`);
|
|
131
|
+
}
|
|
90
132
|
if (!fs.existsSync(opts.artifactPath)) {
|
|
91
133
|
throw new Error(`Artifact file not found: ${opts.artifactPath}`);
|
|
92
134
|
}
|
|
@@ -97,6 +139,7 @@ export async function runGenerateListing(opts) {
|
|
|
97
139
|
files,
|
|
98
140
|
listingPath: opts.listingPath,
|
|
99
141
|
store,
|
|
142
|
+
payment: opts.payment,
|
|
100
143
|
});
|
|
101
144
|
const outputPath = path.resolve(opts.outputPath ?? filenameForStore(store));
|
|
102
145
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-listing.js","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate-listing.js","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"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"}
|
package/dist/json-ld.d.ts
CHANGED
|
@@ -30,6 +30,11 @@ export interface JsonLdInput {
|
|
|
30
30
|
privacyPolicyUrl?: string;
|
|
31
31
|
/** Free (default) vs paid. Paid still omits a number — we are not the store. */
|
|
32
32
|
offersPrice?: '0' | 'paid';
|
|
33
|
+
/**
|
|
34
|
+
* Real prices (an Extenshi Pay offer bound to the page). When non-empty they
|
|
35
|
+
* replace the free offer: one Offer, or an AggregateOffer for several plans.
|
|
36
|
+
*/
|
|
37
|
+
paidOffers?: JsonLdPriceInput[];
|
|
33
38
|
capabilities?: string[];
|
|
34
39
|
/** ISO date; omitted when blank. */
|
|
35
40
|
datePublished?: string;
|
|
@@ -48,17 +53,46 @@ export interface SoftwareApplicationJsonLd {
|
|
|
48
53
|
'@type': 'Organization';
|
|
49
54
|
name: string;
|
|
50
55
|
};
|
|
51
|
-
offers?:
|
|
52
|
-
'@type': 'Offer';
|
|
53
|
-
price: string;
|
|
54
|
-
priceCurrency: 'USD';
|
|
55
|
-
};
|
|
56
|
+
offers?: JsonLdOffer | JsonLdAggregateOffer | JsonLdOffer[];
|
|
56
57
|
installUrl?: string;
|
|
57
58
|
sameAs?: string[];
|
|
58
59
|
featureList?: string[];
|
|
59
60
|
privacyPolicy?: string;
|
|
60
61
|
screenshot?: string[];
|
|
61
62
|
}
|
|
63
|
+
export interface JsonLdPriceInput {
|
|
64
|
+
name?: string;
|
|
65
|
+
/** Decimal amount in major units ("4.99"). */
|
|
66
|
+
price: string;
|
|
67
|
+
/** ISO 4217 code, any case. */
|
|
68
|
+
currency: string;
|
|
69
|
+
period?: 'month' | 'year' | 'one-time' | 'lifetime';
|
|
70
|
+
}
|
|
71
|
+
export interface JsonLdOffer {
|
|
72
|
+
'@type': 'Offer';
|
|
73
|
+
name?: string;
|
|
74
|
+
price: string;
|
|
75
|
+
priceCurrency: string;
|
|
76
|
+
priceSpecification?: {
|
|
77
|
+
'@type': 'UnitPriceSpecification';
|
|
78
|
+
price: string;
|
|
79
|
+
priceCurrency: string;
|
|
80
|
+
billingDuration: 'P1M' | 'P1Y';
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export interface JsonLdAggregateOffer {
|
|
84
|
+
'@type': 'AggregateOffer';
|
|
85
|
+
lowPrice: string;
|
|
86
|
+
highPrice: string;
|
|
87
|
+
priceCurrency: string;
|
|
88
|
+
offerCount: number;
|
|
89
|
+
offers: JsonLdOffer[];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Offers for real prices: one Offer, an AggregateOffer when every plan is in
|
|
93
|
+
* one currency, else a list. Malformed entries are dropped; null when none is left.
|
|
94
|
+
*/
|
|
95
|
+
export declare function jsonLdOffers(list: readonly JsonLdPriceInput[]): JsonLdOffer | JsonLdAggregateOffer | JsonLdOffer[] | null;
|
|
62
96
|
/**
|
|
63
97
|
* Schema.org SoftwareApplication. Only fields we have evidence for are emitted —
|
|
64
98
|
* empty author / URL / install links are omitted rather than faked.
|
|
@@ -85,5 +119,9 @@ export declare function jsonLdFromLanding(input: {
|
|
|
85
119
|
homepageUrl?: string;
|
|
86
120
|
/** Absolute https screenshot URLs (JSON-LD `screenshot`). */
|
|
87
121
|
screenshots?: string[];
|
|
122
|
+
/** `paid` drops the free offer when no real price is known. Default free. */
|
|
123
|
+
offersPrice?: '0' | 'paid';
|
|
124
|
+
/** Prices of the plans the page shows (bound Pay offers). */
|
|
125
|
+
paidOffers?: JsonLdPriceInput[];
|
|
88
126
|
}): JsonLdInput;
|
|
89
127
|
//# sourceMappingURL=json-ld.d.ts.map
|
package/dist/json-ld.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-ld.d.ts","sourceRoot":"","sources":["../src/json-ld.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gFAAgF;IAChF,WAAW,CAAC,EAAE,GAAG,GAAG,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,EAAE,oBAAoB,CAAA;IAChC,OAAO,EAAE,qBAAqB,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mBAAmB,EAAE,oBAAoB,CAAA;IACzC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,MAAM,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"json-ld.d.ts","sourceRoot":"","sources":["../src/json-ld.ts"],"names":[],"mappings":"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"}
|