@extenshi/cli 0.23.1 → 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 +88 -17
- package/dist/amo-source.d.ts.map +1 -1
- package/dist/amo-source.js +442 -116
- 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 +73 -20
- package/dist/cli.js.map +1 -1
- package/dist/compliance-review.d.ts +5 -1
- package/dist/compliance-review.d.ts.map +1 -1
- package/dist/compliance-review.js +10 -5
- package/dist/compliance-review.js.map +1 -1
- package/dist/cws-policies.d.ts.map +1 -1
- package/dist/cws-policies.js +4 -0
- package/dist/cws-policies.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-checks.d.ts +15 -9
- package/dist/listing-checks.d.ts.map +1 -1
- package/dist/listing-checks.js +54 -46
- package/dist/listing-checks.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/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +201 -23
- package/dist/listing.js.map +1 -1
- 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 +40 -0
- package/dist/png.d.ts.map +1 -0
- package/dist/png.js +266 -0
- package/dist/png.js.map +1 -0
- package/dist/review-checks.d.ts +54 -13
- package/dist/review-checks.d.ts.map +1 -1
- package/dist/review-checks.js +367 -56
- package/dist/review-checks.js.map +1 -1
- package/dist/review-risk.d.ts +8 -3
- package/dist/review-risk.d.ts.map +1 -1
- package/dist/review-risk.js +14 -4
- package/dist/review-risk.js.map +1 -1
- package/dist/review-stores.d.ts +63 -0
- package/dist/review-stores.d.ts.map +1 -0
- package/dist/review-stores.js +92 -0
- package/dist/review-stores.js.map +1 -0
- package/dist/screenshots-scenes.d.ts +13 -0
- package/dist/screenshots-scenes.d.ts.map +1 -1
- package/dist/screenshots-scenes.js +20 -2
- package/dist/screenshots-scenes.js.map +1 -1
- package/dist/screenshots.d.ts +6 -4
- package/dist/screenshots.d.ts.map +1 -1
- package/dist/screenshots.js +31 -11
- 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 +17 -7
- package/dist/store-assets.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* write on their behalf — an invented justification submitted verbatim is a
|
|
11
11
|
* policy problem for them.
|
|
12
12
|
*/
|
|
13
|
-
import type
|
|
13
|
+
import { type Manifest } from './review-checks.js';
|
|
14
14
|
export type PermissionJustificationPrompt = {
|
|
15
15
|
question: string;
|
|
16
16
|
example: string;
|
|
@@ -36,4 +36,22 @@ export type JustificationRow = {
|
|
|
36
36
|
};
|
|
37
37
|
/** Store-justification prompts for the sensitive permissions declared. */
|
|
38
38
|
export declare function buildJustificationChecklist(manifest: Manifest): JustificationRow[];
|
|
39
|
+
export type ListingJustificationRow = {
|
|
40
|
+
/** Heading in the draft: the permission name, or `Host permissions`. */
|
|
41
|
+
permission: string;
|
|
42
|
+
question: string;
|
|
43
|
+
example?: string;
|
|
44
|
+
/** Host row only: every pattern with where the manifest declares it. */
|
|
45
|
+
patterns?: {
|
|
46
|
+
pattern: string;
|
|
47
|
+
source: string;
|
|
48
|
+
}[];
|
|
49
|
+
};
|
|
50
|
+
export declare const HOST_PERMISSIONS_ROW = "Host permissions";
|
|
51
|
+
/**
|
|
52
|
+
* One justification row per requested permission, plus one for host access.
|
|
53
|
+
* Host access comes first (the most-questioned entry), then the critical
|
|
54
|
+
* sensitive permissions, then the rest alphabetically.
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildListingJustifications(manifest: Manifest): ListingJustificationRow[];
|
|
39
57
|
//# sourceMappingURL=permission-justifications.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-justifications.d.ts","sourceRoot":"","sources":["../src/permission-justifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"permission-justifications.d.ts","sourceRoot":"","sources":["../src/permission-justifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAEN,KAAK,QAAQ,EAGb,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,6BAA6B,GAAG;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,gCAAgC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAmFpG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kCAAkC,EAAE,SAAS,MAAM,EAK/D,CAAA;AAiBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAWrE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,0EAA0E;AAC1E,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,EAAE,CAkBlF;AA2ED,MAAM,MAAM,uBAAuB,GAAG;IACrC,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAChD,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAqB,CAAA;AAsBtD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,GAAG,uBAAuB,EAAE,CAkCxF"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* write on their behalf — an invented justification submitted verbatim is a
|
|
11
11
|
* policy problem for them.
|
|
12
12
|
*/
|
|
13
|
+
import { isGlobalHost, requiredApiPermissions, requiredHostPermissions, } from './review-checks.js';
|
|
13
14
|
export const PERMISSION_JUSTIFICATION_PROMPTS = {
|
|
14
15
|
'<all_urls>': {
|
|
15
16
|
question: 'Which sites does the feature actually run on, and why can that not be expressed as a list of match patterns?',
|
|
@@ -142,4 +143,132 @@ export function buildJustificationChecklist(manifest) {
|
|
|
142
143
|
a.permission.localeCompare(b.permission));
|
|
143
144
|
return out;
|
|
144
145
|
}
|
|
146
|
+
// ── Every permission, for the listing drafts ─────────────────────────────────
|
|
147
|
+
//
|
|
148
|
+
// The store forms ask about EVERY permission, not only the sensitive ones:
|
|
149
|
+
// Chrome Web Store's Privacy practices tab lists "permissions that your
|
|
150
|
+
// extension uses (as declared in your manifest), with a field for you to state
|
|
151
|
+
// the justification for each permission"
|
|
152
|
+
// (https://developer.chrome.com/docs/webstore/cws-dashboard-privacy), and
|
|
153
|
+
// Partner Center's Privacy page carries the same per-permission list
|
|
154
|
+
// (https://learn.microsoft.com/en-us/microsoft-edge/extensions/publish/publish-extension).
|
|
155
|
+
// Content-script match patterns are permissions too — Chrome lists
|
|
156
|
+
// `content_scripts.matches` next to `host_permissions` as a way to "inject into
|
|
157
|
+
// one or more hosts" (https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions).
|
|
158
|
+
//
|
|
159
|
+
// Sensitive permissions keep the lockstep prompts above. These cover the common
|
|
160
|
+
// non-sensitive ones; anything else gets a generic question. Still questions,
|
|
161
|
+
// never answers.
|
|
162
|
+
const COMMON_PERMISSION_PROMPTS = {
|
|
163
|
+
activeTab: {
|
|
164
|
+
question: 'What does the user click or press to act on the current tab, and what do you do there?',
|
|
165
|
+
example: 'When the user clicks the toolbar icon we restyle the text of the page in that tab only.',
|
|
166
|
+
},
|
|
167
|
+
alarms: {
|
|
168
|
+
question: 'What runs on a schedule, and how often?',
|
|
169
|
+
example: 'Once a day we refresh the cached license so paid features keep working offline.',
|
|
170
|
+
},
|
|
171
|
+
bookmarks: {
|
|
172
|
+
question: 'What do you read from or change in bookmarks, and at whose request?',
|
|
173
|
+
example: 'The user saves the current page into a folder they pick; we never read other bookmarks.',
|
|
174
|
+
},
|
|
175
|
+
clipboardWrite: {
|
|
176
|
+
question: 'What do you copy to the clipboard, and what does the user do to trigger it?',
|
|
177
|
+
example: 'The Copy button puts the generated citation on the clipboard.',
|
|
178
|
+
},
|
|
179
|
+
contextMenus: {
|
|
180
|
+
question: 'Which right-click menu items do you add, and what does each one do?',
|
|
181
|
+
example: 'A "Read with ruler" item turns the reading ruler on for the selected text.',
|
|
182
|
+
},
|
|
183
|
+
declarativeNetRequest: {
|
|
184
|
+
question: 'Which requests do your rules block or modify, and where do the rules come from?',
|
|
185
|
+
example: 'A static rule set shipped in the package blocks known tracker domains; no request is read.',
|
|
186
|
+
},
|
|
187
|
+
identity: {
|
|
188
|
+
question: 'Which account do you sign the user into, and what do you do with the token?',
|
|
189
|
+
example: 'The user signs in with Google to sync their notes to their own Drive folder.',
|
|
190
|
+
},
|
|
191
|
+
notifications: {
|
|
192
|
+
question: 'What do you notify the user about, and how do they turn it off?',
|
|
193
|
+
example: 'A notification when a tracked price drops; the options page turns them off.',
|
|
194
|
+
},
|
|
195
|
+
offscreen: {
|
|
196
|
+
question: 'What does the offscreen document do that the service worker cannot?',
|
|
197
|
+
example: 'It parses the HTML of the user-selected file with DOMParser, which workers lack.',
|
|
198
|
+
},
|
|
199
|
+
sidePanel: {
|
|
200
|
+
question: 'What does the side panel show, and when does it open?',
|
|
201
|
+
example: 'The side panel shows the reading settings for the current page when the user opens it.',
|
|
202
|
+
},
|
|
203
|
+
storage: {
|
|
204
|
+
question: 'What do you store, in which storage area (local, sync, session), and does any of it leave the device?',
|
|
205
|
+
example: 'Font and ruler preferences in storage.sync so they follow the user to their other browsers.',
|
|
206
|
+
},
|
|
207
|
+
unlimitedStorage: {
|
|
208
|
+
question: 'What can grow past the default quota, and why must it be kept?',
|
|
209
|
+
example: 'Offline copies of the articles the user saved for later.',
|
|
210
|
+
},
|
|
211
|
+
webNavigation: {
|
|
212
|
+
question: 'Which navigation events do you listen to, and what do you do with them?',
|
|
213
|
+
example: 'We re-apply the user’s reading settings when a single-page app navigates without reloading.',
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
export const HOST_PERMISSIONS_ROW = 'Host permissions';
|
|
217
|
+
/** Host patterns from `host_permissions`, MV2 host-shaped `permissions`, and every `content_scripts[i].matches`. */
|
|
218
|
+
function hostPatterns(manifest) {
|
|
219
|
+
const out = [];
|
|
220
|
+
const seen = new Set();
|
|
221
|
+
const push = (pattern, source) => {
|
|
222
|
+
const key = `${pattern}\u0000${source}`;
|
|
223
|
+
if (seen.has(key))
|
|
224
|
+
return;
|
|
225
|
+
seen.add(key);
|
|
226
|
+
out.push({ pattern, source });
|
|
227
|
+
};
|
|
228
|
+
const declaredHosts = new Set(stringEntries(manifest.host_permissions));
|
|
229
|
+
for (const pattern of requiredHostPermissions(manifest)) {
|
|
230
|
+
push(pattern, declaredHosts.has(pattern) ? 'host_permissions' : 'permissions');
|
|
231
|
+
}
|
|
232
|
+
for (const [i, cs] of (manifest.content_scripts ?? []).entries()) {
|
|
233
|
+
for (const pattern of stringEntries(cs?.matches))
|
|
234
|
+
push(pattern, `content_scripts[${i}].matches`);
|
|
235
|
+
}
|
|
236
|
+
return out;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* One justification row per requested permission, plus one for host access.
|
|
240
|
+
* Host access comes first (the most-questioned entry), then the critical
|
|
241
|
+
* sensitive permissions, then the rest alphabetically.
|
|
242
|
+
*/
|
|
243
|
+
export function buildListingJustifications(manifest) {
|
|
244
|
+
const rows = [];
|
|
245
|
+
const patterns = hostPatterns(manifest);
|
|
246
|
+
if (patterns.length > 0) {
|
|
247
|
+
const global = patterns.some((p) => isGlobalHost(p.pattern));
|
|
248
|
+
const prompt = global
|
|
249
|
+
? promptFor('<all_urls>')
|
|
250
|
+
: {
|
|
251
|
+
question: 'Which feature needs these sites, and why can it not wait for activeTab (the user acting on the current tab)?',
|
|
252
|
+
example: 'We read the price on product pages of shop.example.com to draw the price-history chart there.',
|
|
253
|
+
};
|
|
254
|
+
rows.push({ permission: HOST_PERMISSIONS_ROW, ...prompt, patterns });
|
|
255
|
+
}
|
|
256
|
+
const api = [
|
|
257
|
+
...new Set(requiredApiPermissions(manifest)
|
|
258
|
+
.map((p) => p.trim())
|
|
259
|
+
.filter(Boolean)),
|
|
260
|
+
];
|
|
261
|
+
const critical = (p) => (JUSTIFICATION_CRITICAL_PERMISSIONS.includes(p) ? 0 : 1);
|
|
262
|
+
api.sort((a, b) => critical(a) - critical(b) || a.localeCompare(b));
|
|
263
|
+
for (const permission of api) {
|
|
264
|
+
const prompt = promptFor(permission) ??
|
|
265
|
+
(Object.hasOwn(COMMON_PERMISSION_PROMPTS, permission)
|
|
266
|
+
? COMMON_PERMISSION_PROMPTS[permission]
|
|
267
|
+
: undefined) ?? {
|
|
268
|
+
question: `Which user-visible feature calls the \`${permission}\` API, and what stops working without it?`,
|
|
269
|
+
};
|
|
270
|
+
rows.push({ permission, ...prompt });
|
|
271
|
+
}
|
|
272
|
+
return rows;
|
|
273
|
+
}
|
|
145
274
|
//# sourceMappingURL=permission-justifications.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-justifications.js","sourceRoot":"","sources":["../src/permission-justifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"permission-justifications.js","sourceRoot":"","sources":["../src/permission-justifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACN,YAAY,EAEZ,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,oBAAoB,CAAA;AAO3B,MAAM,CAAC,MAAM,gCAAgC,GAA4D;IACxG,YAAY,EAAE;QACb,QAAQ,EACP,8GAA8G;QAC/G,OAAO,EACN,qHAAqH;KACtH;IACD,QAAQ,EAAE;QACT,QAAQ,EAAE,6FAA6F;QACvG,OAAO,EACN,oHAAoH;KACrH;IACD,UAAU,EAAE;QACX,QAAQ,EAAE,4FAA4F;QACtG,OAAO,EACN,mJAAmJ;KACpJ;IACD,eAAe,EAAE;QAChB,QAAQ,EAAE,6FAA6F;QACvG,OAAO,EACN,gJAAgJ;KACjJ;IACD,cAAc,EAAE;QACf,QAAQ,EAAE,kFAAkF;QAC5F,OAAO,EACN,gIAAgI;KACjI;IACD,KAAK,EAAE;QACN,QAAQ,EAAE,qEAAqE;QAC/E,OAAO,EACN,qHAAqH;KACtH;IACD,OAAO,EAAE;QACR,QAAQ,EAAE,4EAA4E;QACtF,OAAO,EAAE,4FAA4F;KACrG;IACD,IAAI,EAAE;QACL,QAAQ,EACP,8GAA8G;QAC/G,OAAO,EACN,2GAA2G;KAC5G;IACD,OAAO,EAAE;QACR,QAAQ,EAAE,mFAAmF;QAC7F,OAAO,EACN,iHAAiH;KAClH;IACD,QAAQ,EAAE;QACT,QAAQ,EAAE,oEAAoE;QAC9E,OAAO,EACN,iGAAiG;KAClG;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,sEAAsE;QAChF,OAAO,EAAE,2FAA2F;KACpG;IACD,UAAU,EAAE;QACX,QAAQ,EAAE,4FAA4F;QACtG,OAAO,EACN,iGAAiG;KAClG;IACD,OAAO,EAAE;QACR,QAAQ,EAAE,iEAAiE;QAC3E,OAAO,EACN,qGAAqG;KACtG;IACD,eAAe,EAAE;QAChB,QAAQ,EAAE,6EAA6E;QACvF,OAAO,EAAE,sFAAsF;KAC/F;IACD,WAAW,EAAE;QACZ,QAAQ,EAAE,+EAA+E;QACzF,OAAO,EACN,gHAAgH;KACjH;IACD,WAAW,EAAE;QACZ,QAAQ,EAAE,uEAAuE;QACjF,OAAO,EAAE,yFAAyF;KAClG;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,mDAAmD;QAC7D,OAAO,EAAE,6FAA6F;KACtG;CACD,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAsB;IACpE,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,iBAAiB;CACjB,CAAA;AAED,SAAS,SAAS,CAAC,UAAkB;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,gCAAgC,EAAE,UAAU,CAAC;QACjE,CAAC,CAAC,gCAAgC,CAAC,UAAU,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAkB;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxE,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAAE,SAAQ;YAC5D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC1B,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAA;AAChB,CAAC;AASD,0EAA0E;AAC1E,MAAM,UAAU,2BAA2B,CAAC,QAAkB;IAC7D,MAAM,GAAG,GAAuB,EAAE,CAAA;IAClC,KAAK,MAAM,UAAU,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,GAAG,CAAC,IAAI,CAAC;YACR,UAAU;YACV,IAAI,EAAE,kCAAkC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;YACnF,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACvB,CAAC,CAAA;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CACP,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CACzC,CAAA;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED,gFAAgF;AAChF,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,+EAA+E;AAC/E,yCAAyC;AACzC,0EAA0E;AAC1E,qEAAqE;AACrE,2FAA2F;AAC3F,mEAAmE;AACnE,gFAAgF;AAChF,0GAA0G;AAC1G,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,iBAAiB;AAEjB,MAAM,yBAAyB,GAA4D;IAC1F,SAAS,EAAE;QACV,QAAQ,EAAE,wFAAwF;QAClG,OAAO,EAAE,yFAAyF;KAClG;IACD,MAAM,EAAE;QACP,QAAQ,EAAE,yCAAyC;QACnD,OAAO,EAAE,iFAAiF;KAC1F;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,qEAAqE;QAC/E,OAAO,EAAE,yFAAyF;KAClG;IACD,cAAc,EAAE;QACf,QAAQ,EAAE,6EAA6E;QACvF,OAAO,EAAE,+DAA+D;KACxE;IACD,YAAY,EAAE;QACb,QAAQ,EAAE,qEAAqE;QAC/E,OAAO,EAAE,4EAA4E;KACrF;IACD,qBAAqB,EAAE;QACtB,QAAQ,EAAE,iFAAiF;QAC3F,OAAO,EAAE,4FAA4F;KACrG;IACD,QAAQ,EAAE;QACT,QAAQ,EAAE,6EAA6E;QACvF,OAAO,EAAE,8EAA8E;KACvF;IACD,aAAa,EAAE;QACd,QAAQ,EAAE,iEAAiE;QAC3E,OAAO,EAAE,6EAA6E;KACtF;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,qEAAqE;QAC/E,OAAO,EAAE,kFAAkF;KAC3F;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,uDAAuD;QACjE,OAAO,EAAE,wFAAwF;KACjG;IACD,OAAO,EAAE;QACR,QAAQ,EACP,uGAAuG;QACxG,OAAO,EAAE,6FAA6F;KACtG;IACD,gBAAgB,EAAE;QACjB,QAAQ,EAAE,gEAAgE;QAC1E,OAAO,EAAE,0DAA0D;KACnE;IACD,aAAa,EAAE;QACd,QAAQ,EAAE,yEAAyE;QACnF,OAAO,EAAE,6FAA6F;KACtG;CACD,CAAA;AAWD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAA;AAEtD,oHAAoH;AACpH,SAAS,YAAY,CAAC,QAAkB;IACvC,MAAM,GAAG,GAA0C,EAAE,CAAA;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,EAAE;QAChD,MAAM,GAAG,GAAG,GAAG,OAAO,SAAS,MAAM,EAAE,CAAA;QACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAM;QACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9B,CAAC,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACvE,KAAK,MAAM,OAAO,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;IAC/E,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC;YAAE,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACjG,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAkB;IAC5D,MAAM,IAAI,GAA8B,EAAE,CAAA;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,MAAM;YACpB,CAAC,CAAE,SAAS,CAAC,YAAY,CAAmC;YAC5D,CAAC,CAAC;gBACA,QAAQ,EACP,8GAA8G;gBAC/G,OAAO,EACN,+FAA+F;aAChG,CAAA;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,MAAM,GAAG,GAAG;QACX,GAAG,IAAI,GAAG,CACT,sBAAsB,CAAC,QAAQ,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CACjB;KACD,CAAA;IACD,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,kCAAkC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,KAAK,MAAM,UAAU,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;YACnC,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,UAAU,CAAC;gBACpD,CAAC,CAAC,yBAAyB,CAAC,UAAU,CAAC;gBACvC,CAAC,CAAC,SAAS,CAAC,IAAI;YAChB,QAAQ,EAAE,0CAA0C,UAAU,4CAA4C;SAC1G,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC"}
|
package/dist/png.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PNG output for store artwork and screenshots: 24-bit RGB when every pixel is
|
|
3
|
+
* opaque, RGBA otherwise.
|
|
4
|
+
*
|
|
5
|
+
* resvg and Chromium both write RGBA (colour type 6) even for a fully opaque
|
|
6
|
+
* image, and the Chrome Web Store asks for screenshots and promo tiles as
|
|
7
|
+
* 24-bit PNGs with no alpha. Re-encoding is lossless — the pixels are the same,
|
|
8
|
+
* only the unused alpha byte goes.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately small: 8-bit, non-interlaced, colour types 2 and 6 — exactly
|
|
11
|
+
* what resvg and Chromium produce. Anything else passes through untouched.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Encode raw 8-bit pixels; each row gets the filter with the smallest sum of
|
|
15
|
+
* absolute values. `keep` are whole chunks (colour space, pixel density) copied
|
|
16
|
+
* from a source PNG so the re-encoded image renders the same.
|
|
17
|
+
*/
|
|
18
|
+
export declare function encodePng(data: Uint8Array, width: number, height: number, channels: 3 | 4, keep?: readonly Buffer[]): Buffer;
|
|
19
|
+
export interface DecodedPng {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
/** 3 for RGB, 4 for RGBA. */
|
|
23
|
+
channels: 3 | 4;
|
|
24
|
+
data: Uint8Array;
|
|
25
|
+
/** Colour-space and density chunks, verbatim, for a faithful re-encode. */
|
|
26
|
+
keep: Buffer[];
|
|
27
|
+
}
|
|
28
|
+
/** Decode an 8-bit, non-interlaced RGB or RGBA PNG; null for anything else. */
|
|
29
|
+
export declare function decodePng(png: Uint8Array): DecodedPng | null;
|
|
30
|
+
/** RGBA pixels → an RGB PNG when every pixel is opaque, null when any is not. */
|
|
31
|
+
export declare function rgbPngIfOpaque(rgba: Uint8Array, width: number, height: number, keep?: readonly Buffer[]): Buffer | null;
|
|
32
|
+
/**
|
|
33
|
+
* The same image as a 24-bit PNG when it is fully opaque; the input unchanged
|
|
34
|
+
* when it has transparency, is already RGB, or is a format this module does
|
|
35
|
+
* not read.
|
|
36
|
+
*/
|
|
37
|
+
export declare function opaquePngAsRgb(png: Uint8Array): Buffer;
|
|
38
|
+
/** The PNG colour type from IHDR (2 = RGB, 6 = RGBA). */
|
|
39
|
+
export declare function pngColorType(png: Uint8Array): number;
|
|
40
|
+
//# sourceMappingURL=png.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4FH;;;;GAIG;AACH,wBAAgB,SAAS,CACxB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,GAAG,CAAC,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,GAC1B,MAAM,CA0DR;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;IACf,IAAI,EAAE,UAAU,CAAA;IAChB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,EAAE,CAAA;CACd;AAKD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CA4D5D;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,SAAS,MAAM,EAAO,GAC1B,MAAM,GAAG,IAAI,CASf;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAKtD;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEpD"}
|
package/dist/png.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PNG output for store artwork and screenshots: 24-bit RGB when every pixel is
|
|
3
|
+
* opaque, RGBA otherwise.
|
|
4
|
+
*
|
|
5
|
+
* resvg and Chromium both write RGBA (colour type 6) even for a fully opaque
|
|
6
|
+
* image, and the Chrome Web Store asks for screenshots and promo tiles as
|
|
7
|
+
* 24-bit PNGs with no alpha. Re-encoding is lossless — the pixels are the same,
|
|
8
|
+
* only the unused alpha byte goes.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately small: 8-bit, non-interlaced, colour types 2 and 6 — exactly
|
|
11
|
+
* what resvg and Chromium produce. Anything else passes through untouched.
|
|
12
|
+
*/
|
|
13
|
+
import { deflateSync, inflateSync } from 'node:zlib';
|
|
14
|
+
const SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
15
|
+
const COLOR_RGB = 2;
|
|
16
|
+
const COLOR_RGBA = 6;
|
|
17
|
+
const CRC_TABLE = (() => {
|
|
18
|
+
const table = new Uint32Array(256);
|
|
19
|
+
for (let n = 0; n < 256; n++) {
|
|
20
|
+
let c = n;
|
|
21
|
+
for (let k = 0; k < 8; k++)
|
|
22
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
23
|
+
table[n] = c >>> 0;
|
|
24
|
+
}
|
|
25
|
+
return table;
|
|
26
|
+
})();
|
|
27
|
+
// zlib.crc32 needs Node 20.15/22.2; the CLI supports Node 20.0.
|
|
28
|
+
function crc32(buf) {
|
|
29
|
+
let c = 0xffffffff;
|
|
30
|
+
for (const byte of buf)
|
|
31
|
+
c = CRC_TABLE[(c ^ byte) & 0xff] ^ (c >>> 8);
|
|
32
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
33
|
+
}
|
|
34
|
+
function chunk(type, data) {
|
|
35
|
+
const head = Buffer.alloc(8);
|
|
36
|
+
head.writeUInt32BE(data.length, 0);
|
|
37
|
+
head.write(type, 4, 'ascii');
|
|
38
|
+
const crc = Buffer.alloc(4);
|
|
39
|
+
crc.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), data])), 0);
|
|
40
|
+
return Buffer.concat([head, data, crc]);
|
|
41
|
+
}
|
|
42
|
+
function paeth(a, b, c) {
|
|
43
|
+
const p = a + b - c;
|
|
44
|
+
const pa = Math.abs(p - a);
|
|
45
|
+
const pb = Math.abs(p - b);
|
|
46
|
+
const pc = Math.abs(p - c);
|
|
47
|
+
return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
|
|
48
|
+
}
|
|
49
|
+
/** A filtered byte's cost for the filter heuristic: its absolute value as a signed byte. */
|
|
50
|
+
const COST = (() => {
|
|
51
|
+
const table = new Uint8Array(256);
|
|
52
|
+
for (let v = 0; v < 256; v++)
|
|
53
|
+
table[v] = v < 128 ? v : 256 - v;
|
|
54
|
+
return table;
|
|
55
|
+
})();
|
|
56
|
+
/**
|
|
57
|
+
* Write the scanline for the row at `data[r]`: its filter type byte, then the
|
|
58
|
+
* row filtered with it. `prev[p]` is the row above — a zero row for the first.
|
|
59
|
+
* Typed-array stores wrap, so a negative difference lands as its byte value.
|
|
60
|
+
*/
|
|
61
|
+
function filterRow(out, o, type, data, r, prev, p, stride, channels) {
|
|
62
|
+
out[o++] = type;
|
|
63
|
+
if (type === 0) {
|
|
64
|
+
out.set(data.subarray(r, r + stride), o);
|
|
65
|
+
}
|
|
66
|
+
else if (type === 1) {
|
|
67
|
+
for (let i = 0; i < channels; i++)
|
|
68
|
+
out[o + i] = data[r + i];
|
|
69
|
+
for (let i = channels; i < stride; i++)
|
|
70
|
+
out[o + i] = data[r + i] - data[r + i - channels];
|
|
71
|
+
}
|
|
72
|
+
else if (type === 2) {
|
|
73
|
+
for (let i = 0; i < stride; i++)
|
|
74
|
+
out[o + i] = data[r + i] - prev[p + i];
|
|
75
|
+
}
|
|
76
|
+
else if (type === 3) {
|
|
77
|
+
for (let i = 0; i < channels; i++)
|
|
78
|
+
out[o + i] = data[r + i] - (prev[p + i] >> 1);
|
|
79
|
+
for (let i = channels; i < stride; i++)
|
|
80
|
+
out[o + i] = data[r + i] - ((data[r + i - channels] + prev[p + i]) >> 1);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Paeth with no left neighbour (a = c = 0) predicts b.
|
|
84
|
+
for (let i = 0; i < channels; i++)
|
|
85
|
+
out[o + i] = data[r + i] - prev[p + i];
|
|
86
|
+
for (let i = channels; i < stride; i++) {
|
|
87
|
+
const a = data[r + i - channels];
|
|
88
|
+
const b = prev[p + i];
|
|
89
|
+
const c = prev[p + i - channels];
|
|
90
|
+
const pa = Math.abs(b - c);
|
|
91
|
+
const pb = Math.abs(a - c);
|
|
92
|
+
const pc = Math.abs(a + b - c - c);
|
|
93
|
+
out[o + i] = data[r + i] - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Encode raw 8-bit pixels; each row gets the filter with the smallest sum of
|
|
99
|
+
* absolute values. `keep` are whole chunks (colour space, pixel density) copied
|
|
100
|
+
* from a source PNG so the re-encoded image renders the same.
|
|
101
|
+
*/
|
|
102
|
+
export function encodePng(data, width, height, channels, keep = []) {
|
|
103
|
+
const stride = width * channels;
|
|
104
|
+
const out = new Uint8Array((stride + 1) * height);
|
|
105
|
+
const zero = new Uint8Array(stride);
|
|
106
|
+
for (let y = 0; y < height; y++) {
|
|
107
|
+
const r = y * stride;
|
|
108
|
+
const prev = y > 0 ? data : zero;
|
|
109
|
+
const p = y > 0 ? r - stride : 0;
|
|
110
|
+
// Score all five filters in one pass over the row, then write only the
|
|
111
|
+
// winner: about 3× faster than filtering the row five times over.
|
|
112
|
+
let none = 0;
|
|
113
|
+
let sub = 0;
|
|
114
|
+
let up = 0;
|
|
115
|
+
let average = 0;
|
|
116
|
+
let paethCost = 0;
|
|
117
|
+
for (let i = 0; i < channels; i++) {
|
|
118
|
+
const x = data[r + i];
|
|
119
|
+
const b = prev[p + i];
|
|
120
|
+
none += COST[x];
|
|
121
|
+
sub += COST[x];
|
|
122
|
+
up += COST[(x - b) & 0xff];
|
|
123
|
+
average += COST[(x - (b >> 1)) & 0xff];
|
|
124
|
+
paethCost += COST[(x - b) & 0xff];
|
|
125
|
+
}
|
|
126
|
+
for (let i = channels; i < stride; i++) {
|
|
127
|
+
const x = data[r + i];
|
|
128
|
+
const a = data[r + i - channels];
|
|
129
|
+
const b = prev[p + i];
|
|
130
|
+
const c = prev[p + i - channels];
|
|
131
|
+
const pa = Math.abs(b - c);
|
|
132
|
+
const pb = Math.abs(a - c);
|
|
133
|
+
const pc = Math.abs(a + b - c - c);
|
|
134
|
+
none += COST[x];
|
|
135
|
+
sub += COST[(x - a) & 0xff];
|
|
136
|
+
up += COST[(x - b) & 0xff];
|
|
137
|
+
average += COST[(x - ((a + b) >> 1)) & 0xff];
|
|
138
|
+
paethCost += COST[(x - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 0xff];
|
|
139
|
+
}
|
|
140
|
+
// A tie keeps the lower filter type.
|
|
141
|
+
const costs = [none, sub, up, average, paethCost];
|
|
142
|
+
let type = 0;
|
|
143
|
+
for (let t = 1; t <= 4; t++)
|
|
144
|
+
if (costs[t] < costs[type])
|
|
145
|
+
type = t;
|
|
146
|
+
filterRow(out, y * (stride + 1), type, data, r, prev, p, stride, channels);
|
|
147
|
+
}
|
|
148
|
+
const ihdr = Buffer.alloc(13);
|
|
149
|
+
ihdr.writeUInt32BE(width, 0);
|
|
150
|
+
ihdr.writeUInt32BE(height, 4);
|
|
151
|
+
ihdr[8] = 8;
|
|
152
|
+
ihdr[9] = channels === 3 ? COLOR_RGB : COLOR_RGBA;
|
|
153
|
+
return Buffer.concat([
|
|
154
|
+
SIGNATURE,
|
|
155
|
+
chunk('IHDR', ihdr),
|
|
156
|
+
...keep,
|
|
157
|
+
// Level 6 (zlib's default), not 9: 5–8× faster on store-size screenshots
|
|
158
|
+
// for 3–4 % more bytes, and the stores have no tight size limit.
|
|
159
|
+
chunk('IDAT', deflateSync(out, { level: 6 })),
|
|
160
|
+
chunk('IEND', Buffer.alloc(0)),
|
|
161
|
+
]);
|
|
162
|
+
}
|
|
163
|
+
/** Ancillary chunks that change how the pixels are displayed — carried over on re-encode. */
|
|
164
|
+
const KEPT_CHUNKS = new Set(['sRGB', 'iCCP', 'gAMA', 'cHRM', 'pHYs']);
|
|
165
|
+
/** Decode an 8-bit, non-interlaced RGB or RGBA PNG; null for anything else. */
|
|
166
|
+
export function decodePng(png) {
|
|
167
|
+
const b = Buffer.from(png.buffer, png.byteOffset, png.byteLength);
|
|
168
|
+
if (b.length < 33 || !b.subarray(0, 8).equals(SIGNATURE))
|
|
169
|
+
return null;
|
|
170
|
+
let width = 0;
|
|
171
|
+
let height = 0;
|
|
172
|
+
let channels = 0;
|
|
173
|
+
const idat = [];
|
|
174
|
+
const keep = [];
|
|
175
|
+
for (let at = 8; at + 8 <= b.length;) {
|
|
176
|
+
const length = b.readUInt32BE(at);
|
|
177
|
+
const type = b.toString('ascii', at + 4, at + 8);
|
|
178
|
+
const data = b.subarray(at + 8, at + 8 + length);
|
|
179
|
+
if (type === 'IHDR') {
|
|
180
|
+
// A truncated IHDR would make the reads below throw; null keeps the pass-through contract.
|
|
181
|
+
if (data.length < 13)
|
|
182
|
+
return null;
|
|
183
|
+
width = data.readUInt32BE(0);
|
|
184
|
+
height = data.readUInt32BE(4);
|
|
185
|
+
const [depth, color, , , interlace] = data.subarray(8, 13);
|
|
186
|
+
if (depth !== 8 || interlace !== 0 || (color !== COLOR_RGB && color !== COLOR_RGBA))
|
|
187
|
+
return null;
|
|
188
|
+
channels = color === COLOR_RGB ? 3 : 4;
|
|
189
|
+
}
|
|
190
|
+
else if (type === 'IDAT')
|
|
191
|
+
idat.push(data);
|
|
192
|
+
else if (type === 'IEND')
|
|
193
|
+
break;
|
|
194
|
+
else if (KEPT_CHUNKS.has(type))
|
|
195
|
+
keep.push(Buffer.from(b.subarray(at, at + 12 + length)));
|
|
196
|
+
at += 12 + length;
|
|
197
|
+
}
|
|
198
|
+
if (!channels || !width || !height || idat.length === 0)
|
|
199
|
+
return null;
|
|
200
|
+
let raw;
|
|
201
|
+
try {
|
|
202
|
+
raw = inflateSync(Buffer.concat(idat));
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Truncated or corrupt pixel data: not a PNG this module can read, so the
|
|
206
|
+
// caller passes the original through instead of failing the run.
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
const stride = width * channels;
|
|
210
|
+
if (raw.length < (stride + 1) * height)
|
|
211
|
+
return null;
|
|
212
|
+
const pixels = new Uint8Array(stride * height);
|
|
213
|
+
for (let y = 0; y < height; y++) {
|
|
214
|
+
const type = raw[y * (stride + 1)];
|
|
215
|
+
if (type > 4)
|
|
216
|
+
return null;
|
|
217
|
+
const src = y * (stride + 1) + 1;
|
|
218
|
+
const row = y * stride;
|
|
219
|
+
for (let i = 0; i < stride; i++) {
|
|
220
|
+
const a = i >= channels ? pixels[row + i - channels] : 0;
|
|
221
|
+
const up = y > 0 ? pixels[row - stride + i] : 0;
|
|
222
|
+
const c = y > 0 && i >= channels ? pixels[row - stride + i - channels] : 0;
|
|
223
|
+
const x = raw[src + i];
|
|
224
|
+
pixels[row + i] =
|
|
225
|
+
(type === 0
|
|
226
|
+
? x
|
|
227
|
+
: type === 1
|
|
228
|
+
? x + a
|
|
229
|
+
: type === 2
|
|
230
|
+
? x + up
|
|
231
|
+
: type === 3
|
|
232
|
+
? x + ((a + up) >> 1)
|
|
233
|
+
: x + paeth(a, up, c)) & 0xff;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return { width, height, channels, data: pixels, keep };
|
|
237
|
+
}
|
|
238
|
+
/** RGBA pixels → an RGB PNG when every pixel is opaque, null when any is not. */
|
|
239
|
+
export function rgbPngIfOpaque(rgba, width, height, keep = []) {
|
|
240
|
+
const rgb = new Uint8Array(width * height * 3);
|
|
241
|
+
for (let p = 0, q = 0; p < rgba.length; p += 4, q += 3) {
|
|
242
|
+
if (rgba[p + 3] !== 255)
|
|
243
|
+
return null;
|
|
244
|
+
rgb[q] = rgba[p];
|
|
245
|
+
rgb[q + 1] = rgba[p + 1];
|
|
246
|
+
rgb[q + 2] = rgba[p + 2];
|
|
247
|
+
}
|
|
248
|
+
return encodePng(rgb, width, height, 3, keep);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* The same image as a 24-bit PNG when it is fully opaque; the input unchanged
|
|
252
|
+
* when it has transparency, is already RGB, or is a format this module does
|
|
253
|
+
* not read.
|
|
254
|
+
*/
|
|
255
|
+
export function opaquePngAsRgb(png) {
|
|
256
|
+
const decoded = decodePng(png);
|
|
257
|
+
const original = Buffer.from(png.buffer, png.byteOffset, png.byteLength);
|
|
258
|
+
if (!decoded || decoded.channels === 3)
|
|
259
|
+
return original;
|
|
260
|
+
return rgbPngIfOpaque(decoded.data, decoded.width, decoded.height, decoded.keep) ?? original;
|
|
261
|
+
}
|
|
262
|
+
/** The PNG colour type from IHDR (2 = RGB, 6 = RGBA). */
|
|
263
|
+
export function pngColorType(png) {
|
|
264
|
+
return Buffer.from(png.buffer, png.byteOffset, png.byteLength)[25];
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=png.js.map
|
package/dist/png.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":"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"}
|