@extenshi/cli 0.0.6 → 0.0.8
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/dist/cli.js +47 -1
- package/dist/cli.js.map +1 -1
- package/dist/publish.d.ts +50 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +178 -0
- package/dist/publish.js.map +1 -0
- package/dist/render.d.ts +66 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +172 -56
- package/dist/render.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.js
CHANGED
|
@@ -19,7 +19,8 @@ import { createRequire } from 'node:module';
|
|
|
19
19
|
import * as readline from 'node:readline/promises';
|
|
20
20
|
import { program } from 'commander';
|
|
21
21
|
import { checkAutoUpdate } from './auto-update.js';
|
|
22
|
-
import { loadConfig, saveConfig } from './config.js';
|
|
22
|
+
import { loadConfig, loadDotEnv, saveConfig } from './config.js';
|
|
23
|
+
import { runPublish } from './publish.js';
|
|
23
24
|
import { runScan } from './scan.js';
|
|
24
25
|
const MISSING_KEY_HELP = 'Error: API key not found.\n' +
|
|
25
26
|
'Provide it in any of these ways:\n' +
|
|
@@ -71,6 +72,51 @@ program
|
|
|
71
72
|
process.exit(1);
|
|
72
73
|
}
|
|
73
74
|
});
|
|
75
|
+
program
|
|
76
|
+
.command('publish <artifact>')
|
|
77
|
+
.description('Publish an extension artifact to Chrome Web Store / Firefox AMO / Edge Add-ons. ' +
|
|
78
|
+
'Free — uploads go straight from this machine to the store APIs with your own store credentials; ' +
|
|
79
|
+
'no Extenshi API key needed.')
|
|
80
|
+
.option('--stores <list>', 'Comma-separated stores: chrome,firefox,edge (default: every store with complete credentials)')
|
|
81
|
+
.option('--firefox-artifact <path>', 'Separate .xpi for Firefox (default: the main artifact)')
|
|
82
|
+
.option('--release-notes <text>', 'Release notes passed to stores that accept them')
|
|
83
|
+
.option('--validate', 'Only validate store credentials, publish nothing')
|
|
84
|
+
.option('--no-wait', 'Edge: return after commit without polling the operation to a terminal status')
|
|
85
|
+
.option('--json', 'Output raw JSON result')
|
|
86
|
+
.action(async (artifact, opts) => {
|
|
87
|
+
try {
|
|
88
|
+
// Pick up store credentials from a local .env, same as scan config.
|
|
89
|
+
loadDotEnv();
|
|
90
|
+
await checkAutoUpdate();
|
|
91
|
+
const stores = opts.stores
|
|
92
|
+
?.split(',')
|
|
93
|
+
.map((s) => s.trim().toLowerCase())
|
|
94
|
+
.filter(Boolean);
|
|
95
|
+
const valid = new Set(['chrome', 'firefox', 'edge']);
|
|
96
|
+
if (stores?.some((s) => !valid.has(s))) {
|
|
97
|
+
console.error(`Error: unknown store in --stores (allowed: chrome, firefox, edge)`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
await runPublish({
|
|
101
|
+
artifactPath: artifact,
|
|
102
|
+
stores: stores,
|
|
103
|
+
firefoxArtifactPath: opts.firefoxArtifact,
|
|
104
|
+
releaseNotes: opts.releaseNotes,
|
|
105
|
+
validateOnly: opts.validate ?? false,
|
|
106
|
+
wait: opts.wait ?? true,
|
|
107
|
+
outputJson: opts.json ?? false,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof Error) {
|
|
112
|
+
console.error(`Error: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.error('Unexpected error:', err);
|
|
116
|
+
}
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
74
120
|
program
|
|
75
121
|
.command('login')
|
|
76
122
|
.description('Save your Extenshi API key to ~/.extenshi/config.json')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi publish` — multi-store publishing (Chrome Web Store, Firefox AMO,
|
|
3
|
+
* Edge Add-ons) via @extenshi/publisher.
|
|
4
|
+
*
|
|
5
|
+
* Free for everyone: the upload goes from this machine directly to the store
|
|
6
|
+
* APIs with YOUR store credentials — nothing passes through Extenshi servers
|
|
7
|
+
* and no Extenshi API key is required.
|
|
8
|
+
*
|
|
9
|
+
* Credentials come from env vars (or a .env in the working directory):
|
|
10
|
+
* Chrome : CHROME_APP_ID, CHROME_CLIENT_ID, CHROME_CLIENT_SECRET, CHROME_REFRESH_TOKEN
|
|
11
|
+
* Firefox: FIREFOX_ADDON_GUID, FIREFOX_JWT_ISSUER, FIREFOX_JWT_SECRET
|
|
12
|
+
* Edge : EDGE_PRODUCT_ID, EDGE_CLIENT_ID, EDGE_CLIENT_SECRET, EDGE_TENANT_ID
|
|
13
|
+
*/
|
|
14
|
+
import { type StoreType } from '@extenshi/publisher';
|
|
15
|
+
export interface PublishCommandOptions {
|
|
16
|
+
artifactPath: string;
|
|
17
|
+
/** Explicit store list; default = every store with complete credentials. */
|
|
18
|
+
stores?: StoreType[];
|
|
19
|
+
/** Firefox wants an .xpi; defaults to the main artifact. */
|
|
20
|
+
firefoxArtifactPath?: string;
|
|
21
|
+
releaseNotes?: string;
|
|
22
|
+
/** Only check credentials against the store APIs, publish nothing. */
|
|
23
|
+
validateOnly: boolean;
|
|
24
|
+
/** Poll Edge commit operation to terminal status (default true). */
|
|
25
|
+
wait: boolean;
|
|
26
|
+
outputJson: boolean;
|
|
27
|
+
}
|
|
28
|
+
interface StoreCredentials {
|
|
29
|
+
chrome?: {
|
|
30
|
+
appId: string;
|
|
31
|
+
clientId: string;
|
|
32
|
+
clientSecret: string;
|
|
33
|
+
refreshToken: string;
|
|
34
|
+
};
|
|
35
|
+
firefox?: {
|
|
36
|
+
addonGuid: string;
|
|
37
|
+
jwtIssuer: string;
|
|
38
|
+
jwtSecret: string;
|
|
39
|
+
};
|
|
40
|
+
edge?: {
|
|
41
|
+
productId: string;
|
|
42
|
+
clientId: string;
|
|
43
|
+
clientSecret: string;
|
|
44
|
+
tenantId: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export declare function readStoreCredentials(env?: NodeJS.ProcessEnv): StoreCredentials;
|
|
48
|
+
export declare function runPublish(opts: PublishCommandOptions): Promise<void>;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAKN,KAAK,SAAS,EAGd,MAAM,qBAAqB,CAAA;AAG5B,MAAM,WAAW,qBAAqB;IACrC,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sEAAsE;IACtE,YAAY,EAAE,OAAO,CAAA;IACrB,oEAAoE;IACpE,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,gBAAgB;IACzB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACxF,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IACrE,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CACtF;AAQD,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,gBAAgB,CA0B3F;AAMD,wBAAsB,UAAU,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D3E"}
|
package/dist/publish.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi publish` — multi-store publishing (Chrome Web Store, Firefox AMO,
|
|
3
|
+
* Edge Add-ons) via @extenshi/publisher.
|
|
4
|
+
*
|
|
5
|
+
* Free for everyone: the upload goes from this machine directly to the store
|
|
6
|
+
* APIs with YOUR store credentials — nothing passes through Extenshi servers
|
|
7
|
+
* and no Extenshi API key is required.
|
|
8
|
+
*
|
|
9
|
+
* Credentials come from env vars (or a .env in the working directory):
|
|
10
|
+
* Chrome : CHROME_APP_ID, CHROME_CLIENT_ID, CHROME_CLIENT_SECRET, CHROME_REFRESH_TOKEN
|
|
11
|
+
* Firefox: FIREFOX_ADDON_GUID, FIREFOX_JWT_ISSUER, FIREFOX_JWT_SECRET
|
|
12
|
+
* Edge : EDGE_PRODUCT_ID, EDGE_CLIENT_ID, EDGE_CLIENT_SECRET, EDGE_TENANT_ID
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import { ChromeAPI, EdgeAPI, FirefoxAPI, publishToStores, } from '@extenshi/publisher';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
const ENV_DOCS = {
|
|
18
|
+
chrome: ['CHROME_APP_ID', 'CHROME_CLIENT_ID', 'CHROME_CLIENT_SECRET', 'CHROME_REFRESH_TOKEN'],
|
|
19
|
+
firefox: ['FIREFOX_ADDON_GUID', 'FIREFOX_JWT_ISSUER', 'FIREFOX_JWT_SECRET'],
|
|
20
|
+
edge: ['EDGE_PRODUCT_ID', 'EDGE_CLIENT_ID', 'EDGE_CLIENT_SECRET', 'EDGE_TENANT_ID'],
|
|
21
|
+
};
|
|
22
|
+
export function readStoreCredentials(env = process.env) {
|
|
23
|
+
const creds = {};
|
|
24
|
+
if (env.CHROME_APP_ID && env.CHROME_CLIENT_ID && env.CHROME_CLIENT_SECRET && env.CHROME_REFRESH_TOKEN) {
|
|
25
|
+
creds.chrome = {
|
|
26
|
+
appId: env.CHROME_APP_ID,
|
|
27
|
+
clientId: env.CHROME_CLIENT_ID,
|
|
28
|
+
clientSecret: env.CHROME_CLIENT_SECRET,
|
|
29
|
+
refreshToken: env.CHROME_REFRESH_TOKEN,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (env.FIREFOX_ADDON_GUID && env.FIREFOX_JWT_ISSUER && env.FIREFOX_JWT_SECRET) {
|
|
33
|
+
creds.firefox = {
|
|
34
|
+
addonGuid: env.FIREFOX_ADDON_GUID,
|
|
35
|
+
jwtIssuer: env.FIREFOX_JWT_ISSUER,
|
|
36
|
+
jwtSecret: env.FIREFOX_JWT_SECRET,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (env.EDGE_PRODUCT_ID && env.EDGE_CLIENT_ID && env.EDGE_CLIENT_SECRET && env.EDGE_TENANT_ID) {
|
|
40
|
+
creds.edge = {
|
|
41
|
+
productId: env.EDGE_PRODUCT_ID,
|
|
42
|
+
clientId: env.EDGE_CLIENT_ID,
|
|
43
|
+
clientSecret: env.EDGE_CLIENT_SECRET,
|
|
44
|
+
tenantId: env.EDGE_TENANT_ID,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return creds;
|
|
48
|
+
}
|
|
49
|
+
function missingEnvHelp(store) {
|
|
50
|
+
return ` ${store}: set ${ENV_DOCS[store].join(', ')}`;
|
|
51
|
+
}
|
|
52
|
+
export async function runPublish(opts) {
|
|
53
|
+
if (!fs.existsSync(opts.artifactPath)) {
|
|
54
|
+
throw new Error(`Artifact not found: ${opts.artifactPath}`);
|
|
55
|
+
}
|
|
56
|
+
if (opts.firefoxArtifactPath && !fs.existsSync(opts.firefoxArtifactPath)) {
|
|
57
|
+
throw new Error(`Firefox artifact not found: ${opts.firefoxArtifactPath}`);
|
|
58
|
+
}
|
|
59
|
+
const creds = readStoreCredentials();
|
|
60
|
+
const configured = ['chrome', 'firefox', 'edge'].filter((s) => creds[s]);
|
|
61
|
+
const stores = opts.stores?.length ? opts.stores : configured;
|
|
62
|
+
if (!stores.length) {
|
|
63
|
+
throw new Error('No store credentials found. Publishing is free and runs from your machine —\n' +
|
|
64
|
+
'set credentials for at least one store (env vars or .env):\n' +
|
|
65
|
+
['chrome', 'firefox', 'edge'].map(missingEnvHelp).join('\n') +
|
|
66
|
+
'\nDocs: https://dojo.extenshi.io/tools/publish');
|
|
67
|
+
}
|
|
68
|
+
const missing = stores.filter((s) => !creds[s]);
|
|
69
|
+
if (missing.length) {
|
|
70
|
+
throw new Error(`Missing credentials for: ${missing.join(', ')}\n${missing.map(missingEnvHelp).join('\n')}`);
|
|
71
|
+
}
|
|
72
|
+
if (opts.validateOnly) {
|
|
73
|
+
await validateCredentials(stores, creds, opts.outputJson);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const options = {
|
|
77
|
+
extensionId: creds.chrome?.appId ?? creds.firefox?.addonGuid ?? creds.edge?.productId ?? 'extension',
|
|
78
|
+
stores,
|
|
79
|
+
packagePaths: {
|
|
80
|
+
chrome: stores.includes('chrome') ? opts.artifactPath : undefined,
|
|
81
|
+
firefox: stores.includes('firefox') ? (opts.firefoxArtifactPath ?? opts.artifactPath) : undefined,
|
|
82
|
+
edge: stores.includes('edge') ? opts.artifactPath : undefined,
|
|
83
|
+
},
|
|
84
|
+
storeConfigs: {
|
|
85
|
+
chrome: creds.chrome,
|
|
86
|
+
firefox: creds.firefox,
|
|
87
|
+
edge: creds.edge ? { ...creds.edge, ...(opts.wait ? {} : { waitForCompletion: false }) } : undefined,
|
|
88
|
+
},
|
|
89
|
+
releaseNotes: opts.releaseNotes,
|
|
90
|
+
parallel: true,
|
|
91
|
+
};
|
|
92
|
+
console.error(chalk.dim(`Publishing ${opts.artifactPath} → ${stores.join(', ')}…`));
|
|
93
|
+
const result = await publishToStores(options);
|
|
94
|
+
if (opts.outputJson) {
|
|
95
|
+
console.log(JSON.stringify(result, null, 2));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
renderResult(result);
|
|
99
|
+
}
|
|
100
|
+
if (!result.success) {
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function validateCredentials(stores, creds, outputJson) {
|
|
105
|
+
const checks = await Promise.all(stores.map(async (store) => {
|
|
106
|
+
let valid = false;
|
|
107
|
+
if (store === 'chrome' && creds.chrome) {
|
|
108
|
+
valid = await ChromeAPI.validateCredentials(creds.chrome.clientId, creds.chrome.clientSecret, creds.chrome.refreshToken);
|
|
109
|
+
}
|
|
110
|
+
else if (store === 'firefox' && creds.firefox) {
|
|
111
|
+
valid = await FirefoxAPI.validateCredentials(creds.firefox.jwtIssuer, creds.firefox.jwtSecret);
|
|
112
|
+
}
|
|
113
|
+
else if (store === 'edge' && creds.edge) {
|
|
114
|
+
valid = await EdgeAPI.validateCredentials(creds.edge.clientId, creds.edge.clientSecret, creds.edge.tenantId);
|
|
115
|
+
}
|
|
116
|
+
return { store, valid };
|
|
117
|
+
}));
|
|
118
|
+
if (outputJson) {
|
|
119
|
+
console.log(JSON.stringify({ checks }, null, 2));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
for (const c of checks) {
|
|
123
|
+
console.log(c.valid
|
|
124
|
+
? `${chalk.green('✓')} ${c.store}: credentials valid`
|
|
125
|
+
: `${chalk.red('✗')} ${c.store}: credentials rejected by the store API`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (checks.some((c) => !c.valid)) {
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function renderResult(result) {
|
|
133
|
+
const rows = [
|
|
134
|
+
{ store: 'chrome', r: result.results.chrome },
|
|
135
|
+
{ store: 'firefox', r: result.results.firefox },
|
|
136
|
+
{ store: 'edge', r: result.results.edge },
|
|
137
|
+
];
|
|
138
|
+
console.log('');
|
|
139
|
+
for (const { store, r } of rows) {
|
|
140
|
+
if (!r)
|
|
141
|
+
continue;
|
|
142
|
+
if (r.success) {
|
|
143
|
+
console.log(`${chalk.green('✓')} ${chalk.bold(store)} — published`);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
console.log(`${chalk.red('✗')} ${chalk.bold(store)} — failed`);
|
|
147
|
+
}
|
|
148
|
+
const detail = r;
|
|
149
|
+
for (const key of [
|
|
150
|
+
'itemId',
|
|
151
|
+
'uploadState',
|
|
152
|
+
'uuid',
|
|
153
|
+
'version',
|
|
154
|
+
'submissionId',
|
|
155
|
+
'operationId',
|
|
156
|
+
'status',
|
|
157
|
+
'statusDetail',
|
|
158
|
+
'statusMessage',
|
|
159
|
+
]) {
|
|
160
|
+
if (detail[key] !== undefined && detail[key] !== null && detail[key] !== '') {
|
|
161
|
+
console.log(chalk.dim(` ${key}: ${String(detail[key])}`));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!r.success && detail.errorMessage) {
|
|
165
|
+
console.log(` ${chalk.red(String(detail.errorMessage))}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log('');
|
|
169
|
+
const { successful, failed, total } = result.summary;
|
|
170
|
+
const summary = `${successful}/${total} stores published${failed ? `, ${failed} failed` : ''}`;
|
|
171
|
+
console.log(result.success ? chalk.green(summary) : chalk.red(summary));
|
|
172
|
+
if (result.summary.errors.length) {
|
|
173
|
+
for (const e of result.summary.errors) {
|
|
174
|
+
console.log(chalk.red(` • ${e}`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts
CHANGED
|
@@ -5,6 +5,72 @@
|
|
|
5
5
|
* then by scanner, using chalk for colour.
|
|
6
6
|
*
|
|
7
7
|
* Invoked only when --json flag is NOT set.
|
|
8
|
+
*
|
|
9
|
+
* Schema tolerance
|
|
10
|
+
* ----------------
|
|
11
|
+
* The scan-worker returns the dags `ScannerResult.to_dict()` shape, NOT a
|
|
12
|
+
* normalised one (see services/extenshi-scan-worker/orchestrator + dags
|
|
13
|
+
* scanners/base_scanner.py). Concretely:
|
|
14
|
+
* - scanner objects use `scanner_name` (not `scanner`) and a lowercase
|
|
15
|
+
* `status` from the `ScanStatus` enum: `completed` / `failed` / `timeout`
|
|
16
|
+
* / `malformed_output` / `skipped` (plus the orchestrator's `error`) —
|
|
17
|
+
* never `SUCCESS`.
|
|
18
|
+
* - each scanner emits its OWN finding shape: the identifier is `rule_id`
|
|
19
|
+
* (semgrep/static_scan/yara/library_hash), `type` (jsluice/wallet_chain),
|
|
20
|
+
* `pattern` (jstap), or `id` (obfuscation); the message is `message` /
|
|
21
|
+
* `description` / `summary` / `url`; the category is `category` /
|
|
22
|
+
* `analyzer` / `kind` / `tags`; severity is mixed-case.
|
|
23
|
+
* So we read every field through a fallback chain instead of a single key —
|
|
24
|
+
* otherwise every finding renders as "(no rule)" / "[unknown]" and the
|
|
25
|
+
* success count reads 0/N (the bug this module had before).
|
|
26
|
+
*/
|
|
27
|
+
interface Finding {
|
|
28
|
+
severity?: string;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
interface ScannerResult {
|
|
32
|
+
/** dags shape */
|
|
33
|
+
scanner_name?: string;
|
|
34
|
+
/** legacy/normalised shape */
|
|
35
|
+
scanner?: string;
|
|
36
|
+
status?: string;
|
|
37
|
+
findings?: Finding[];
|
|
38
|
+
error?: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
}
|
|
41
|
+
export declare function isScannerOk(status: unknown): boolean;
|
|
42
|
+
/** Scanner display name: dags `scanner_name`, else legacy `scanner`, else unknown. */
|
|
43
|
+
export declare function scannerLabel(s: ScannerResult): string;
|
|
44
|
+
/** Headline = identifier, falling back to category, never empty (no more "(no rule)"). */
|
|
45
|
+
export declare function findingHeadline(f: Finding): string;
|
|
46
|
+
export interface FindingView {
|
|
47
|
+
scanner: string;
|
|
48
|
+
severity: string;
|
|
49
|
+
headline: string;
|
|
50
|
+
message: string;
|
|
51
|
+
location: string;
|
|
52
|
+
extras: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ScannerIssue {
|
|
55
|
+
scanner: string;
|
|
56
|
+
status: string;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ReportSummary {
|
|
60
|
+
total: number;
|
|
61
|
+
critHigh: number;
|
|
62
|
+
scannersRun: number;
|
|
63
|
+
scannersOk: number;
|
|
64
|
+
jobId?: string;
|
|
65
|
+
findings: FindingView[];
|
|
66
|
+
issues: ScannerIssue[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reduce a raw scan report to a render-ready summary. Pure — no I/O — so the
|
|
70
|
+
* schema-tolerance logic (the part that regressed) is unit-testable against a
|
|
71
|
+
* fixture without spying on console.log.
|
|
8
72
|
*/
|
|
73
|
+
export declare function summarizeReport(body: Record<string, unknown>): ReportSummary;
|
|
9
74
|
export declare function renderReport(body: Record<string, unknown>): void;
|
|
75
|
+
export {};
|
|
10
76
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,UAAU,OAAO;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAED,UAAU,aAAa;IACtB,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAaD,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAIrD;AAiBD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAElD;AAyED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,YAAY,EAAE,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CA6C5E;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAwDhE"}
|
package/dist/render.js
CHANGED
|
@@ -5,8 +5,97 @@
|
|
|
5
5
|
* then by scanner, using chalk for colour.
|
|
6
6
|
*
|
|
7
7
|
* Invoked only when --json flag is NOT set.
|
|
8
|
+
*
|
|
9
|
+
* Schema tolerance
|
|
10
|
+
* ----------------
|
|
11
|
+
* The scan-worker returns the dags `ScannerResult.to_dict()` shape, NOT a
|
|
12
|
+
* normalised one (see services/extenshi-scan-worker/orchestrator + dags
|
|
13
|
+
* scanners/base_scanner.py). Concretely:
|
|
14
|
+
* - scanner objects use `scanner_name` (not `scanner`) and a lowercase
|
|
15
|
+
* `status` from the `ScanStatus` enum: `completed` / `failed` / `timeout`
|
|
16
|
+
* / `malformed_output` / `skipped` (plus the orchestrator's `error`) —
|
|
17
|
+
* never `SUCCESS`.
|
|
18
|
+
* - each scanner emits its OWN finding shape: the identifier is `rule_id`
|
|
19
|
+
* (semgrep/static_scan/yara/library_hash), `type` (jsluice/wallet_chain),
|
|
20
|
+
* `pattern` (jstap), or `id` (obfuscation); the message is `message` /
|
|
21
|
+
* `description` / `summary` / `url`; the category is `category` /
|
|
22
|
+
* `analyzer` / `kind` / `tags`; severity is mixed-case.
|
|
23
|
+
* So we read every field through a fallback chain instead of a single key —
|
|
24
|
+
* otherwise every finding renders as "(no rule)" / "[unknown]" and the
|
|
25
|
+
* success count reads 0/N (the bug this module had before).
|
|
8
26
|
*/
|
|
9
27
|
import chalk from 'chalk';
|
|
28
|
+
// ── Schema-tolerant field readers ───────────────────────────────────────────────
|
|
29
|
+
/** Statuses that count as a successful scanner run (case-insensitive). */
|
|
30
|
+
const OK_STATUSES = new Set(['completed', 'success', 'ok', 'passed']);
|
|
31
|
+
export function isScannerOk(status) {
|
|
32
|
+
return typeof status === 'string' && OK_STATUSES.has(status.toLowerCase());
|
|
33
|
+
}
|
|
34
|
+
/** Scanner display name: dags `scanner_name`, else legacy `scanner`, else unknown. */
|
|
35
|
+
export function scannerLabel(s) {
|
|
36
|
+
if (typeof s.scanner_name === 'string' && s.scanner_name.trim())
|
|
37
|
+
return s.scanner_name;
|
|
38
|
+
if (typeof s.scanner === 'string' && s.scanner.trim())
|
|
39
|
+
return s.scanner;
|
|
40
|
+
return 'unknown';
|
|
41
|
+
}
|
|
42
|
+
/** First key whose value is a non-empty string (or first element of a string array). */
|
|
43
|
+
function firstString(f, keys) {
|
|
44
|
+
for (const k of keys) {
|
|
45
|
+
const v = f[k];
|
|
46
|
+
if (typeof v === 'string' && v.trim())
|
|
47
|
+
return v;
|
|
48
|
+
if (Array.isArray(v) && typeof v[0] === 'string' && v[0].trim())
|
|
49
|
+
return v[0];
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const HEADLINE_KEYS = ['rule', 'rule_id', 'ruleId', 'check_id', 'type', 'pattern', 'id'];
|
|
54
|
+
const MESSAGE_KEYS = ['message', 'description', 'desc', 'title', 'summary', 'url'];
|
|
55
|
+
const CATEGORY_KEYS = ['category', 'analyzer', 'kind', 'tags'];
|
|
56
|
+
const FILE_KEYS = ['file_path', 'file', 'files', 'path'];
|
|
57
|
+
/** Headline = identifier, falling back to category, never empty (no more "(no rule)"). */
|
|
58
|
+
export function findingHeadline(f) {
|
|
59
|
+
return firstString(f, HEADLINE_KEYS) ?? firstString(f, CATEGORY_KEYS) ?? 'finding';
|
|
60
|
+
}
|
|
61
|
+
function findingMessage(f) {
|
|
62
|
+
return firstString(f, MESSAGE_KEYS) ?? '';
|
|
63
|
+
}
|
|
64
|
+
function findingLocation(f) {
|
|
65
|
+
const file = firstString(f, FILE_KEYS);
|
|
66
|
+
if (!file)
|
|
67
|
+
return '';
|
|
68
|
+
const lineRaw = f.line_number ?? f.line;
|
|
69
|
+
const line = typeof lineRaw === 'number' || (typeof lineRaw === 'string' && lineRaw.trim()) ? String(lineRaw) : '';
|
|
70
|
+
return line ? `${file}:${line}` : file;
|
|
71
|
+
}
|
|
72
|
+
// Keys already surfaced via a dedicated channel — excluded from the "extras" dump.
|
|
73
|
+
const CONSUMED_KEYS = new Set([
|
|
74
|
+
...HEADLINE_KEYS,
|
|
75
|
+
...MESSAGE_KEYS,
|
|
76
|
+
...FILE_KEYS,
|
|
77
|
+
'severity',
|
|
78
|
+
'line',
|
|
79
|
+
'line_number',
|
|
80
|
+
'column',
|
|
81
|
+
'location',
|
|
82
|
+
]);
|
|
83
|
+
/** Remaining scalar fields worth showing (confidence, count, category, is_external, …). */
|
|
84
|
+
function findingExtras(f, max = 3) {
|
|
85
|
+
const parts = [];
|
|
86
|
+
for (const [k, v] of Object.entries(f)) {
|
|
87
|
+
if (CONSUMED_KEYS.has(k))
|
|
88
|
+
continue;
|
|
89
|
+
if (v === null || v === undefined)
|
|
90
|
+
continue;
|
|
91
|
+
if (typeof v === 'object')
|
|
92
|
+
continue; // skip nested dicts/arrays — too noisy for a one-liner
|
|
93
|
+
parts.push(`${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`);
|
|
94
|
+
if (parts.length >= max)
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return parts.join(' ');
|
|
98
|
+
}
|
|
10
99
|
// ── Severity ordering ──────────────────────────────────────────────────────────
|
|
11
100
|
const SEVERITY_ORDER = {
|
|
12
101
|
CRITICAL: 0,
|
|
@@ -34,94 +123,121 @@ function severityColour(s) {
|
|
|
34
123
|
return chalk.dim(s ?? 'UNKNOWN');
|
|
35
124
|
}
|
|
36
125
|
}
|
|
37
|
-
|
|
38
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Reduce a raw scan report to a render-ready summary. Pure — no I/O — so the
|
|
128
|
+
* schema-tolerance logic (the part that regressed) is unit-testable against a
|
|
129
|
+
* fixture without spying on console.log.
|
|
130
|
+
*/
|
|
131
|
+
export function summarizeReport(body) {
|
|
39
132
|
const report = body;
|
|
40
|
-
const scanners = report.scanners
|
|
41
|
-
const
|
|
133
|
+
const scanners = Array.isArray(report.scanners) ? report.scanners : [];
|
|
134
|
+
const findings = [];
|
|
135
|
+
const issues = [];
|
|
42
136
|
let scannersRun = 0;
|
|
43
137
|
let scannersOk = 0;
|
|
44
138
|
for (const s of scanners) {
|
|
45
139
|
scannersRun++;
|
|
46
|
-
if (s.status
|
|
140
|
+
if (isScannerOk(s.status)) {
|
|
47
141
|
scannersOk++;
|
|
48
142
|
}
|
|
143
|
+
else {
|
|
144
|
+
issues.push({
|
|
145
|
+
scanner: scannerLabel(s),
|
|
146
|
+
status: typeof s.status === 'string' ? s.status : 'unknown',
|
|
147
|
+
error: typeof s.error === 'string' && s.error.trim() ? s.error : undefined,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const name = scannerLabel(s);
|
|
49
151
|
for (const f of s.findings ?? []) {
|
|
50
|
-
|
|
152
|
+
findings.push({
|
|
153
|
+
scanner: name,
|
|
154
|
+
severity: f.severity?.toUpperCase() ?? 'UNKNOWN',
|
|
155
|
+
headline: findingHeadline(f),
|
|
156
|
+
message: findingMessage(f),
|
|
157
|
+
location: findingLocation(f),
|
|
158
|
+
extras: findingExtras(f),
|
|
159
|
+
});
|
|
51
160
|
}
|
|
52
161
|
}
|
|
53
|
-
|
|
54
|
-
|
|
162
|
+
findings.sort((a, b) => severityRank(a.severity) - severityRank(b.severity));
|
|
163
|
+
const critHigh = findings.filter((f) => severityRank(f.severity) <= 1).length;
|
|
164
|
+
return {
|
|
165
|
+
total: findings.length,
|
|
166
|
+
critHigh,
|
|
167
|
+
scannersRun,
|
|
168
|
+
scannersOk,
|
|
169
|
+
jobId: typeof report.jobId === 'string' ? report.jobId : undefined,
|
|
170
|
+
findings,
|
|
171
|
+
issues,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ── Main render function ───────────────────────────────────────────────────────
|
|
175
|
+
export function renderReport(body) {
|
|
176
|
+
const { total, critHigh, scannersRun, scannersOk, jobId, findings, issues } = summarizeReport(body);
|
|
55
177
|
// Header
|
|
56
178
|
console.log();
|
|
57
|
-
if (
|
|
179
|
+
if (total === 0) {
|
|
58
180
|
console.log(chalk.green.bold('✓ No findings — extension looks clean.'));
|
|
59
181
|
}
|
|
60
182
|
else {
|
|
61
|
-
const
|
|
62
|
-
const label = critHigh > 0
|
|
63
|
-
? chalk.red.bold(`${allFindings.length} finding${allFindings.length !== 1 ? 's' : ''} (${critHigh} critical/high)`)
|
|
64
|
-
: chalk.yellow.bold(`${allFindings.length} finding${allFindings.length !== 1 ? 's' : ''}`);
|
|
183
|
+
const noun = `${total} finding${total !== 1 ? 's' : ''}`;
|
|
184
|
+
const label = critHigh > 0 ? chalk.red.bold(`${noun} (${critHigh} critical/high)`) : chalk.yellow.bold(noun);
|
|
65
185
|
console.log(`${chalk.bold('Scan report')} · ${label}`);
|
|
66
186
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
187
|
+
const scannersColour = scannersOk === scannersRun ? chalk.dim : chalk.yellow;
|
|
188
|
+
console.log(scannersColour(`Scanners: ${scannersOk}/${scannersRun} succeeded`));
|
|
189
|
+
if (jobId) {
|
|
190
|
+
console.log(chalk.dim(`Job: ${jobId}`));
|
|
70
191
|
}
|
|
71
192
|
console.log();
|
|
72
|
-
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Print findings grouped by severity (already sorted)
|
|
193
|
+
// Findings grouped by severity (already sorted)
|
|
76
194
|
let lastSeverity = '';
|
|
77
|
-
for (const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
console.log(chalk.bold(`── ${severityColour(sev)} ──────────────────────────`));
|
|
195
|
+
for (const f of findings) {
|
|
196
|
+
if (f.severity !== lastSeverity) {
|
|
197
|
+
lastSeverity = f.severity;
|
|
198
|
+
console.log(chalk.bold(`── ${severityColour(f.severity)} ──────────────────────────`));
|
|
82
199
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// Wrap description at 80 chars
|
|
88
|
-
const words = desc.split(' ');
|
|
89
|
-
let line = ' ';
|
|
90
|
-
for (const word of words) {
|
|
91
|
-
if (line.length + word.length + 1 > 80) {
|
|
92
|
-
console.log(chalk.dim(line));
|
|
93
|
-
line = ` ${word}`;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
line += (line === ' ' ? '' : ' ') + word;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (line.trim()) {
|
|
100
|
-
console.log(chalk.dim(line));
|
|
200
|
+
console.log(` ${chalk.bold(f.headline)} ${chalk.dim(`[${f.scanner}]`)}`);
|
|
201
|
+
if (f.message) {
|
|
202
|
+
for (const line of wrap(f.message, 80)) {
|
|
203
|
+
console.log(chalk.dim(` ${line}`));
|
|
101
204
|
}
|
|
102
205
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.filter(([k]) => !skip.has(k))
|
|
107
|
-
.map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
|
|
108
|
-
if (extras.length > 0) {
|
|
109
|
-
console.log(chalk.dim(` ${extras.slice(0, 3).join(' ')}`));
|
|
206
|
+
const meta = [f.location, f.extras].filter(Boolean).join(' ');
|
|
207
|
+
if (meta) {
|
|
208
|
+
console.log(chalk.dim(` ${meta}`));
|
|
110
209
|
}
|
|
111
210
|
console.log();
|
|
112
211
|
}
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
if (failedScanners.length > 0) {
|
|
212
|
+
// Scanners that did not complete OK (surface the error so a failure is visible)
|
|
213
|
+
if (issues.length > 0) {
|
|
116
214
|
console.log(chalk.dim('── Scanner issues ──────────────────────────'));
|
|
117
|
-
for (const
|
|
118
|
-
|
|
215
|
+
for (const i of issues) {
|
|
216
|
+
const why = i.error ? `: ${i.error}` : '';
|
|
217
|
+
console.log(chalk.dim(` ${i.scanner}: ${i.status}${why}`));
|
|
119
218
|
}
|
|
120
219
|
console.log();
|
|
121
220
|
}
|
|
122
221
|
// Exit hint
|
|
123
|
-
if (
|
|
222
|
+
if (critHigh > 0) {
|
|
124
223
|
console.log(chalk.red('⚠ Critical/high findings detected. Review before publishing.'));
|
|
125
224
|
}
|
|
126
225
|
}
|
|
226
|
+
/** Greedy word-wrap to `width` columns. */
|
|
227
|
+
function wrap(text, width) {
|
|
228
|
+
const out = [];
|
|
229
|
+
let line = '';
|
|
230
|
+
for (const word of text.split(/\s+/)) {
|
|
231
|
+
if (line && line.length + word.length + 1 > width) {
|
|
232
|
+
out.push(line);
|
|
233
|
+
line = word;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
line = line ? `${line} ${word}` : word;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (line)
|
|
240
|
+
out.push(line);
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
127
243
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@extenshi/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Pre-publish security scanner for browser extensions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"prepublishOnly": "yarn build"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
+
"@extenshi/publisher": "^0.8.0",
|
|
22
23
|
"chalk": "^5.3.0",
|
|
23
24
|
"commander": "^12.1.0",
|
|
24
25
|
"ora": "^8.1.1",
|