@turntrout/subfont 1.10.2 → 1.10.3
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/lib/HeadlessBrowser.d.ts +2 -0
- package/lib/HeadlessBrowser.d.ts.map +1 -1
- package/lib/HeadlessBrowser.js +64 -58
- package/lib/HeadlessBrowser.js.map +1 -1
- package/lib/collectTextsByPage.d.ts.map +1 -1
- package/lib/collectTextsByPage.js +136 -132
- package/lib/collectTextsByPage.js.map +1 -1
- package/lib/getCssRulesByProperty.d.ts.map +1 -1
- package/lib/getCssRulesByProperty.js +234 -207
- package/lib/getCssRulesByProperty.js.map +1 -1
- package/lib/parseCommandLineOptions.d.ts.map +1 -1
- package/lib/parseCommandLineOptions.js +29 -14
- package/lib/parseCommandLineOptions.js.map +1 -1
- package/lib/subfont.d.ts.map +1 -1
- package/lib/subfont.js +347 -311
- package/lib/subfont.js.map +1 -1
- package/lib/subsetFontWithGlyphs.d.ts.map +1 -1
- package/lib/subsetFontWithGlyphs.js +60 -48
- package/lib/subsetFontWithGlyphs.js.map +1 -1
- package/lib/subsetFonts.d.ts.map +1 -1
- package/lib/subsetFonts.js +338 -280
- package/lib/subsetFonts.js.map +1 -1
- package/lib/subsetGeneration.d.ts.map +1 -1
- package/lib/subsetGeneration.js +151 -127
- package/lib/subsetGeneration.js.map +1 -1
- package/lib/warnAboutMissingGlyphs.d.ts.map +1 -1
- package/lib/warnAboutMissingGlyphs.js +132 -112
- package/lib/warnAboutMissingGlyphs.js.map +1 -1
- package/package.json +1 -1
package/lib/HeadlessBrowser.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ declare class HeadlessBrowser {
|
|
|
11
11
|
private _closed;
|
|
12
12
|
constructor({ console, chromeArgs }: HeadlessBrowserOptions);
|
|
13
13
|
private _launchBrowserMemoized;
|
|
14
|
+
private _attachRequestInterceptor;
|
|
15
|
+
private _attachErrorListeners;
|
|
14
16
|
tracePage(htmlAsset: Asset): Promise<TraceResult[]>;
|
|
15
17
|
close(): Promise<void>;
|
|
16
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessBrowser.d.ts","sourceRoot":"","sources":["../src/HeadlessBrowser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HeadlessBrowser.d.ts","sourceRoot":"","sources":["../src/HeadlessBrowser.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,YAAY,CAAC;AAKpD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2E3C,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,cAAc,CAAC,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAkB;gBAErB,EAAE,OAAO,EAAE,UAAe,EAAE,EAAE,sBAAsB;IAKhE,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,yBAAyB;IAwCjC,OAAO,CAAC,qBAAqB;IA2BvB,SAAS,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAwDnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B;AAED,SAAS,eAAe,CAAC"}
|
package/lib/HeadlessBrowser.js
CHANGED
|
@@ -113,6 +113,65 @@ class HeadlessBrowser {
|
|
|
113
113
|
}
|
|
114
114
|
return this._launchPromise;
|
|
115
115
|
}
|
|
116
|
+
_attachRequestInterceptor(page, assetGraph, baseUrl) {
|
|
117
|
+
page.on('request', (request) => {
|
|
118
|
+
const url = request.url();
|
|
119
|
+
try {
|
|
120
|
+
if (url.startsWith(baseUrl)) {
|
|
121
|
+
let agUrl = url.replace(baseUrl, assetGraph.root);
|
|
122
|
+
if (/\/$/.test(agUrl)) {
|
|
123
|
+
agUrl += 'index.html';
|
|
124
|
+
}
|
|
125
|
+
const asset = assetGraph.findAssets({
|
|
126
|
+
isLoaded: true,
|
|
127
|
+
url: agUrl,
|
|
128
|
+
})[0];
|
|
129
|
+
if (asset) {
|
|
130
|
+
request.respond({
|
|
131
|
+
status: 200,
|
|
132
|
+
contentType: asset.contentType,
|
|
133
|
+
body: asset.rawSrc,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
request.respond({ status: 404, body: '' });
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (url.startsWith('file:')) {
|
|
142
|
+
request.continue();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// External request — abort to avoid hanging on DNS/network.
|
|
146
|
+
request.abort('failed');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// Request may already be handled or page may be closing — ignore.
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
_attachErrorListeners(page) {
|
|
154
|
+
page.on('requestfailed', (request) => {
|
|
155
|
+
const failure = request.failure();
|
|
156
|
+
const reason = failure ? failure.errorText : 'unknown error';
|
|
157
|
+
this.console.error(`${request.method()} ${request.url()} failed: ${reason}`);
|
|
158
|
+
});
|
|
159
|
+
page.on('pageerror', (err) => {
|
|
160
|
+
// Puppeteer v24+ passes Error objects; format stack to match v19 style
|
|
161
|
+
if (err instanceof Error && err.stack) {
|
|
162
|
+
// Normalize "at <anonymous> (url:line:col)" to "at url:line:col"
|
|
163
|
+
const normalized = err.stack.replace(/at <anonymous> \((.+)\)/g, 'at $1');
|
|
164
|
+
this.console.error(normalized);
|
|
165
|
+
}
|
|
166
|
+
else if (err instanceof Error) {
|
|
167
|
+
this.console.error(`${err.name}: ${err.message}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.console.error(err);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
page.on('error', this.console.error);
|
|
174
|
+
}
|
|
116
175
|
async tracePage(htmlAsset) {
|
|
117
176
|
const assetGraph = htmlAsset.assetGraph;
|
|
118
177
|
const browser = await this._launchBrowserMemoized();
|
|
@@ -122,65 +181,12 @@ class HeadlessBrowser {
|
|
|
122
181
|
const baseUrl = assetGraph.canonicalRoot
|
|
123
182
|
? assetGraph.canonicalRoot.replace(/\/?$/, '/')
|
|
124
183
|
: 'https://example.com/';
|
|
125
|
-
// Intercept all requests made by the headless browser, and
|
|
126
|
-
//
|
|
127
|
-
//
|
|
184
|
+
// Intercept all requests made by the headless browser, and fake a
|
|
185
|
+
// response from the assetgraph instance if the corresponding asset
|
|
186
|
+
// is found there.
|
|
128
187
|
await page.setRequestInterception(true);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
if (url.startsWith(baseUrl)) {
|
|
133
|
-
let agUrl = url.replace(baseUrl, assetGraph.root);
|
|
134
|
-
if (/\/$/.test(agUrl)) {
|
|
135
|
-
agUrl += 'index.html';
|
|
136
|
-
}
|
|
137
|
-
const asset = assetGraph.findAssets({
|
|
138
|
-
isLoaded: true,
|
|
139
|
-
url: agUrl,
|
|
140
|
-
})[0];
|
|
141
|
-
if (asset) {
|
|
142
|
-
request.respond({
|
|
143
|
-
status: 200,
|
|
144
|
-
contentType: asset.contentType,
|
|
145
|
-
body: asset.rawSrc,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
request.respond({ status: 404, body: '' });
|
|
150
|
-
}
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (url.startsWith('file:')) {
|
|
154
|
-
request.continue();
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
// External request — abort to avoid hanging on DNS/network.
|
|
158
|
-
request.abort('failed');
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
// Request may already be handled or page may be closing — ignore.
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
page.on('requestfailed', (request) => {
|
|
165
|
-
const failure = request.failure();
|
|
166
|
-
const reason = failure ? failure.errorText : 'unknown error';
|
|
167
|
-
this.console.error(`${request.method()} ${request.url()} failed: ${reason}`);
|
|
168
|
-
});
|
|
169
|
-
page.on('pageerror', (err) => {
|
|
170
|
-
// Puppeteer v24+ passes Error objects; format stack to match v19 style
|
|
171
|
-
if (err instanceof Error && err.stack) {
|
|
172
|
-
// Normalize "at <anonymous> (url:line:col)" to "at url:line:col"
|
|
173
|
-
const normalized = err.stack.replace(/at <anonymous> \((.+)\)/g, 'at $1');
|
|
174
|
-
this.console.error(normalized);
|
|
175
|
-
}
|
|
176
|
-
else if (err instanceof Error) {
|
|
177
|
-
this.console.error(`${err.name}: ${err.message}`);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
this.console.error(err);
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
page.on('error', this.console.error);
|
|
188
|
+
this._attachRequestInterceptor(page, assetGraph, baseUrl);
|
|
189
|
+
this._attachErrorListeners(page);
|
|
184
190
|
// Prevent the CSP of the page from rejecting our injection of font-tracer
|
|
185
191
|
await page.setBypassCSP(true);
|
|
186
192
|
await page.goto(urlTools.resolveUrl(baseUrl, urlTools.buildRelativeUrl(assetGraph.root, htmlAsset.url)), { timeout: 30000 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessBrowser.js","sourceRoot":"","sources":["../src/HeadlessBrowser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAqC;AACrC,0DAA4C;
|
|
1
|
+
{"version":3,"file":"HeadlessBrowser.js","sourceRoot":"","sources":["../src/HeadlessBrowser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectTextsByPage.d.ts","sourceRoot":"","sources":["../src/collectTextsByPage.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,mCAAmC,EAEpC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAwCtD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9B,cAAc,CAAC,EAAE,KAAK,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"collectTextsByPage.d.ts","sourceRoot":"","sources":["../src/collectTextsByPage.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,mCAAmC,EAEpC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAwCtD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9B,cAAc,CAAC,EAAE,KAAK,CAAC;CACxB;AA44BD,UAAU,uBAAuB;IAC/B,cAAc,EAAE,KAAK,CAAC;IACtB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,+BAA+B,EAAE,mBAAmB,EAAE,CAAC;IACvD,+BAA+B,EAAE,UAAU,CACzC,OAAO,mCAAmC,CAC3C,CAAC;IACF,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAK9C,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AA2MD,UAAU,yBAAyB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,wBAAwB;IAChC,4BAA4B,EAAE,uBAAuB,EAAE,CAAC;IACxD,oCAAoC,EAAE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACxE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAChD;AAED,iBAAe,kBAAkB,CAC/B,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,KAAK,EAAE,EACxB,EACE,IAAI,EACJ,OAAO,EACP,OAAe,EACf,KAAa,EACb,WAAW,EACX,UAAe,GAChB,GAAE,yBAA8B,GAChC,OAAO,CAAC,wBAAwB,CAAC,CA8InC;AAED,SAAS,kBAAkB,CAAC"}
|
|
@@ -154,14 +154,7 @@ function computeSnappedGlobalEntries(declarations, globalTextByProps) {
|
|
|
154
154
|
}
|
|
155
155
|
return entries;
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
// declarations entry. No-op on repeat calls — results are shared across
|
|
159
|
-
// pages that resolve to the same @font-face set.
|
|
160
|
-
function populateGlobalFontUsages(cached, accumulatedFontFaceDeclarations, text) {
|
|
161
|
-
if (cached.fontUsageTemplates) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const snappedGlobalEntries = cached.snappedEntries;
|
|
157
|
+
function indexSnappedEntries(snappedGlobalEntries) {
|
|
165
158
|
const pageTextIndex = new Map();
|
|
166
159
|
const entriesByFontUrl = new Map();
|
|
167
160
|
const textAndPropsToFontUrl = new Map();
|
|
@@ -190,6 +183,9 @@ function populateGlobalFontUsages(cached, accumulatedFontFaceDeclarations, text)
|
|
|
190
183
|
arr.push(entry);
|
|
191
184
|
textAndPropsToFontUrl.set(entry.textAndProps, entry.fontUrl);
|
|
192
185
|
}
|
|
186
|
+
return { pageTextIndex, entriesByFontUrl, textAndPropsToFontUrl };
|
|
187
|
+
}
|
|
188
|
+
function collectExtraTextsByFontUrl(accumulatedFontFaceDeclarations, text) {
|
|
193
189
|
const extraTextsByFontUrl = new Map();
|
|
194
190
|
for (const fontFaceDeclaration of accumulatedFontFaceDeclarations) {
|
|
195
191
|
const { relations, '-subfont-text': subfontText, ...props } = fontFaceDeclaration;
|
|
@@ -197,84 +193,89 @@ function populateGlobalFontUsages(cached, accumulatedFontFaceDeclarations, text)
|
|
|
197
193
|
if (!fontUrl)
|
|
198
194
|
continue;
|
|
199
195
|
const extras = [];
|
|
200
|
-
if (subfontText !== undefined)
|
|
196
|
+
if (subfontText !== undefined)
|
|
201
197
|
extras.push(unquote(subfontText));
|
|
202
|
-
|
|
203
|
-
if (text !== undefined) {
|
|
198
|
+
if (text !== undefined)
|
|
204
199
|
extras.push(text);
|
|
200
|
+
if (extras.length === 0)
|
|
201
|
+
continue;
|
|
202
|
+
let arr = extraTextsByFontUrl.get(fontUrl);
|
|
203
|
+
if (!arr) {
|
|
204
|
+
// After destructuring out `relations` and `-subfont-text`, the
|
|
205
|
+
// remaining spread props are CSS descriptor strings.
|
|
206
|
+
arr = {
|
|
207
|
+
texts: [],
|
|
208
|
+
props: props,
|
|
209
|
+
fontRelations: relations,
|
|
210
|
+
};
|
|
211
|
+
extraTextsByFontUrl.set(fontUrl, arr);
|
|
205
212
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
213
|
+
arr.texts.push(...extras);
|
|
214
|
+
}
|
|
215
|
+
return extraTextsByFontUrl;
|
|
216
|
+
}
|
|
217
|
+
function buildFontUsageTemplate(fontUrl, fontEntries, extra) {
|
|
218
|
+
const allTexts = [];
|
|
219
|
+
if (extra)
|
|
220
|
+
allTexts.push(...extra.texts);
|
|
221
|
+
for (const e of fontEntries)
|
|
222
|
+
allTexts.push(e.textAndProps.text);
|
|
223
|
+
const fontFamilies = new Set(fontEntries.map((e) => e.props['font-family']));
|
|
224
|
+
const fontStyles = new Set(fontEntries.map((e) => e.fontStyle));
|
|
225
|
+
const fontWeights = new Set(fontEntries.map((e) => e.fontWeight));
|
|
226
|
+
const fontStretches = new Set(fontEntries.map((e) => e.fontStretch));
|
|
227
|
+
const fontVariationSettings = new Set(fontEntries
|
|
228
|
+
.map((e) => e.fontVariationSettings)
|
|
229
|
+
.filter((fvs) => typeof fvs === 'string' && fvs.toLowerCase() !== 'normal'));
|
|
230
|
+
// Use first entry's relations for size computation, or extra's if no entries
|
|
231
|
+
const fontRelations = fontEntries.length > 0
|
|
232
|
+
? fontEntries[0].fontRelations
|
|
233
|
+
: extra.fontRelations;
|
|
234
|
+
let smallestOriginalSize = 0;
|
|
235
|
+
let smallestOriginalFormat;
|
|
236
|
+
for (const relation of fontRelations) {
|
|
237
|
+
if (relation.to.isLoaded) {
|
|
238
|
+
const size = relation.to.rawSrc.length;
|
|
239
|
+
if (smallestOriginalSize === 0 || size < smallestOriginalSize) {
|
|
240
|
+
smallestOriginalSize = size;
|
|
241
|
+
smallestOriginalFormat = relation.to.type?.toLowerCase();
|
|
217
242
|
}
|
|
218
|
-
arr.texts.push(...extras);
|
|
219
243
|
}
|
|
220
244
|
}
|
|
221
|
-
|
|
222
|
-
|
|
245
|
+
const props = fontEntries.length > 0
|
|
246
|
+
? { ...fontEntries[0].props }
|
|
247
|
+
: { ...extra.props };
|
|
248
|
+
const extraTextsStr = extra ? extra.texts.join('') : '';
|
|
249
|
+
return {
|
|
250
|
+
smallestOriginalSize,
|
|
251
|
+
smallestOriginalFormat,
|
|
252
|
+
texts: allTexts,
|
|
253
|
+
text: (0, fontFaceHelpers_1.uniqueCharsFromArray)(allTexts),
|
|
254
|
+
extraTextsStr,
|
|
255
|
+
props,
|
|
256
|
+
fontUrl,
|
|
257
|
+
fontFamilies,
|
|
258
|
+
fontStyles,
|
|
259
|
+
fontStretches,
|
|
260
|
+
fontWeights,
|
|
261
|
+
fontVariationSettings,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Fill in fontUsageTemplates/pageTextIndex/preloadIndex on the cached
|
|
265
|
+
// declarations entry. No-op on repeat calls — results are shared across
|
|
266
|
+
// pages that resolve to the same @font-face set.
|
|
267
|
+
function populateGlobalFontUsages(cached, accumulatedFontFaceDeclarations, text) {
|
|
268
|
+
if (cached.fontUsageTemplates)
|
|
269
|
+
return;
|
|
270
|
+
const { pageTextIndex, entriesByFontUrl, textAndPropsToFontUrl } = indexSnappedEntries(cached.snappedEntries);
|
|
271
|
+
const extraTextsByFontUrl = collectExtraTextsByFontUrl(accumulatedFontFaceDeclarations, text);
|
|
223
272
|
const allFontUrls = new Set([
|
|
224
273
|
...entriesByFontUrl.keys(),
|
|
225
274
|
...extraTextsByFontUrl.keys(),
|
|
226
275
|
]);
|
|
276
|
+
const fontUsageTemplates = [];
|
|
227
277
|
for (const fontUrl of allFontUrls) {
|
|
228
|
-
|
|
229
|
-
const extra = extraTextsByFontUrl.get(fontUrl);
|
|
230
|
-
// Collect all texts (extras first, then global entries)
|
|
231
|
-
const allTexts = [];
|
|
232
|
-
if (extra) {
|
|
233
|
-
allTexts.push(...extra.texts);
|
|
234
|
-
}
|
|
235
|
-
for (const e of fontEntries) {
|
|
236
|
-
allTexts.push(e.textAndProps.text);
|
|
237
|
-
}
|
|
238
|
-
const fontFamilies = new Set(fontEntries.map((e) => e.props['font-family']));
|
|
239
|
-
const fontStyles = new Set(fontEntries.map((e) => e.fontStyle));
|
|
240
|
-
const fontWeights = new Set(fontEntries.map((e) => e.fontWeight));
|
|
241
|
-
const fontStretches = new Set(fontEntries.map((e) => e.fontStretch));
|
|
242
|
-
const fontVariationSettings = new Set(fontEntries
|
|
243
|
-
.map((e) => e.fontVariationSettings)
|
|
244
|
-
.filter((fvs) => typeof fvs === 'string' && fvs.toLowerCase() !== 'normal'));
|
|
245
|
-
// Use first entry's relations for size computation, or extra's if no entries
|
|
246
|
-
const fontRelations = fontEntries.length > 0
|
|
247
|
-
? fontEntries[0].fontRelations
|
|
248
|
-
: extra.fontRelations;
|
|
249
|
-
let smallestOriginalSize = 0;
|
|
250
|
-
let smallestOriginalFormat;
|
|
251
|
-
for (const relation of fontRelations) {
|
|
252
|
-
if (relation.to.isLoaded) {
|
|
253
|
-
const size = relation.to.rawSrc.length;
|
|
254
|
-
if (smallestOriginalSize === 0 || size < smallestOriginalSize) {
|
|
255
|
-
smallestOriginalSize = size;
|
|
256
|
-
smallestOriginalFormat = relation.to.type?.toLowerCase();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
const props = fontEntries.length > 0
|
|
261
|
-
? { ...fontEntries[0].props }
|
|
262
|
-
: { ...extra.props };
|
|
263
|
-
const extraTextsStr = extra ? extra.texts.join('') : '';
|
|
264
|
-
fontUsageTemplates.push({
|
|
265
|
-
smallestOriginalSize,
|
|
266
|
-
smallestOriginalFormat,
|
|
267
|
-
texts: allTexts,
|
|
268
|
-
text: (0, fontFaceHelpers_1.uniqueCharsFromArray)(allTexts),
|
|
269
|
-
extraTextsStr,
|
|
270
|
-
props,
|
|
271
|
-
fontUrl,
|
|
272
|
-
fontFamilies,
|
|
273
|
-
fontStyles,
|
|
274
|
-
fontStretches,
|
|
275
|
-
fontWeights,
|
|
276
|
-
fontVariationSettings,
|
|
277
|
-
});
|
|
278
|
+
fontUsageTemplates.push(buildFontUsageTemplate(fontUrl, entriesByFontUrl.get(fontUrl) || [], extraTextsByFontUrl.get(fontUrl)));
|
|
278
279
|
}
|
|
279
280
|
cached.fontUsageTemplates = fontUsageTemplates;
|
|
280
281
|
cached.pageTextIndex = pageTextIndex;
|
|
@@ -656,6 +657,62 @@ function planTracing(pageData, hasHeadlessBrowser) {
|
|
|
656
657
|
uniqueGroupCount: pagesByStylesheetKey.size,
|
|
657
658
|
};
|
|
658
659
|
}
|
|
660
|
+
function getOrSnapDeclCacheEntry(declCache, accumulatedFontFaceDeclarations, globalTextByProps) {
|
|
661
|
+
const declKey = getDeclarationsKey(accumulatedFontFaceDeclarations);
|
|
662
|
+
let elapsedSnap = 0;
|
|
663
|
+
if (!declCache.has(declKey)) {
|
|
664
|
+
const snapStart = Date.now();
|
|
665
|
+
declCache.set(declKey, {
|
|
666
|
+
snappedEntries: computeSnappedGlobalEntries(accumulatedFontFaceDeclarations, globalTextByProps),
|
|
667
|
+
fontUsageTemplates: null,
|
|
668
|
+
pageTextIndex: null,
|
|
669
|
+
preloadIndex: null,
|
|
670
|
+
});
|
|
671
|
+
elapsedSnap = Date.now() - snapStart;
|
|
672
|
+
}
|
|
673
|
+
return { entry: declCache.get(declKey), elapsedSnap };
|
|
674
|
+
}
|
|
675
|
+
function instantiateFontUsagesForPage(entry, declCacheEntry, uniqueCharsCache) {
|
|
676
|
+
const fontUsageTemplates = declCacheEntry.fontUsageTemplates;
|
|
677
|
+
const pageTextIndex = declCacheEntry.pageTextIndex;
|
|
678
|
+
const textAndPropsToFontUrl = declCacheEntry.preloadIndex;
|
|
679
|
+
const preloadFontUrls = new Set();
|
|
680
|
+
for (const textByPropsEntry of entry.textByProps) {
|
|
681
|
+
const fontUrl = textAndPropsToFontUrl.get(textByPropsEntry);
|
|
682
|
+
if (fontUrl)
|
|
683
|
+
preloadFontUrls.add(fontUrl);
|
|
684
|
+
}
|
|
685
|
+
const assetTexts = pageTextIndex.get(entry.htmlOrSvgAsset);
|
|
686
|
+
entry.fontUsages = fontUsageTemplates.map((template) => {
|
|
687
|
+
const pageTexts = assetTexts ? assetTexts.get(template.fontUrl) : undefined;
|
|
688
|
+
let pageTextStr = pageTexts ? pageTexts.join('') : '';
|
|
689
|
+
if (template.extraTextsStr)
|
|
690
|
+
pageTextStr += template.extraTextsStr;
|
|
691
|
+
let pageTextUnique = uniqueCharsCache.get(pageTextStr);
|
|
692
|
+
if (pageTextUnique === undefined) {
|
|
693
|
+
pageTextUnique = (0, fontFaceHelpers_1.uniqueChars)(pageTextStr);
|
|
694
|
+
uniqueCharsCache.set(pageTextStr, pageTextUnique);
|
|
695
|
+
}
|
|
696
|
+
const { hasFontFeatureSettings, fontFeatureTags } = (0, fontFeatureHelpers_1.resolveFeatureSettings)(template.fontFamilies, entry.fontFamiliesWithFeatureSettings, entry.featureTagsByFamily);
|
|
697
|
+
return {
|
|
698
|
+
smallestOriginalSize: template.smallestOriginalSize,
|
|
699
|
+
smallestOriginalFormat: template.smallestOriginalFormat,
|
|
700
|
+
texts: template.texts,
|
|
701
|
+
pageText: pageTextUnique,
|
|
702
|
+
text: template.text,
|
|
703
|
+
props: { ...template.props },
|
|
704
|
+
fontUrl: template.fontUrl,
|
|
705
|
+
fontFamilies: template.fontFamilies,
|
|
706
|
+
fontStyles: template.fontStyles,
|
|
707
|
+
fontStretches: template.fontStretches,
|
|
708
|
+
fontWeights: template.fontWeights,
|
|
709
|
+
fontVariationSettings: template.fontVariationSettings,
|
|
710
|
+
preload: preloadFontUrls.has(template.fontUrl),
|
|
711
|
+
hasFontFeatureSettings,
|
|
712
|
+
fontFeatureTags,
|
|
713
|
+
};
|
|
714
|
+
});
|
|
715
|
+
}
|
|
659
716
|
// Iterate every traced page, snap its text against the @font-face set, and
|
|
660
717
|
// emit fully-formed per-page fontUsages (one entry per font URL + props).
|
|
661
718
|
function buildPerPageFontUsages(htmlOrSvgAssetTextsWithProps, globalTextByProps, text) {
|
|
@@ -665,66 +722,13 @@ function buildPerPageFontUsages(htmlOrSvgAssetTextsWithProps, globalTextByProps,
|
|
|
665
722
|
let globalUsageTime = 0;
|
|
666
723
|
let cloningTime = 0;
|
|
667
724
|
for (const entry of htmlOrSvgAssetTextsWithProps) {
|
|
668
|
-
const {
|
|
669
|
-
|
|
670
|
-
if (!declCache.has(declKey)) {
|
|
671
|
-
const snapStart = Date.now();
|
|
672
|
-
declCache.set(declKey, {
|
|
673
|
-
snappedEntries: computeSnappedGlobalEntries(accumulatedFontFaceDeclarations, globalTextByProps),
|
|
674
|
-
fontUsageTemplates: null,
|
|
675
|
-
pageTextIndex: null,
|
|
676
|
-
preloadIndex: null,
|
|
677
|
-
});
|
|
678
|
-
snappingTime += Date.now() - snapStart;
|
|
679
|
-
}
|
|
680
|
-
const declCacheEntry = declCache.get(declKey);
|
|
725
|
+
const { entry: declCacheEntry, elapsedSnap } = getOrSnapDeclCacheEntry(declCache, entry.accumulatedFontFaceDeclarations, globalTextByProps);
|
|
726
|
+
snappingTime += elapsedSnap;
|
|
681
727
|
const globalUsageStart = Date.now();
|
|
682
|
-
populateGlobalFontUsages(declCacheEntry, accumulatedFontFaceDeclarations, text);
|
|
728
|
+
populateGlobalFontUsages(declCacheEntry, entry.accumulatedFontFaceDeclarations, text);
|
|
683
729
|
globalUsageTime += Date.now() - globalUsageStart;
|
|
684
|
-
const fontUsageTemplates = declCacheEntry.fontUsageTemplates;
|
|
685
|
-
const pageTextIndex = declCacheEntry.pageTextIndex;
|
|
686
|
-
const textAndPropsToFontUrl = declCacheEntry.preloadIndex;
|
|
687
|
-
const preloadFontUrls = new Set();
|
|
688
|
-
for (const textByPropsEntry of textByProps) {
|
|
689
|
-
const fontUrl = textAndPropsToFontUrl.get(textByPropsEntry);
|
|
690
|
-
if (fontUrl) {
|
|
691
|
-
preloadFontUrls.add(fontUrl);
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
730
|
const cloneStart = Date.now();
|
|
695
|
-
|
|
696
|
-
entry.fontUsages = fontUsageTemplates.map((template) => {
|
|
697
|
-
const pageTexts = assetTexts
|
|
698
|
-
? assetTexts.get(template.fontUrl)
|
|
699
|
-
: undefined;
|
|
700
|
-
let pageTextStr = pageTexts ? pageTexts.join('') : '';
|
|
701
|
-
if (template.extraTextsStr) {
|
|
702
|
-
pageTextStr += template.extraTextsStr;
|
|
703
|
-
}
|
|
704
|
-
let pageTextUnique = uniqueCharsCache.get(pageTextStr);
|
|
705
|
-
if (pageTextUnique === undefined) {
|
|
706
|
-
pageTextUnique = (0, fontFaceHelpers_1.uniqueChars)(pageTextStr);
|
|
707
|
-
uniqueCharsCache.set(pageTextStr, pageTextUnique);
|
|
708
|
-
}
|
|
709
|
-
const { hasFontFeatureSettings, fontFeatureTags } = (0, fontFeatureHelpers_1.resolveFeatureSettings)(template.fontFamilies, fontFamiliesWithFeatureSettings, featureTagsByFamily);
|
|
710
|
-
return {
|
|
711
|
-
smallestOriginalSize: template.smallestOriginalSize,
|
|
712
|
-
smallestOriginalFormat: template.smallestOriginalFormat,
|
|
713
|
-
texts: template.texts,
|
|
714
|
-
pageText: pageTextUnique,
|
|
715
|
-
text: template.text,
|
|
716
|
-
props: { ...template.props },
|
|
717
|
-
fontUrl: template.fontUrl,
|
|
718
|
-
fontFamilies: template.fontFamilies,
|
|
719
|
-
fontStyles: template.fontStyles,
|
|
720
|
-
fontStretches: template.fontStretches,
|
|
721
|
-
fontWeights: template.fontWeights,
|
|
722
|
-
fontVariationSettings: template.fontVariationSettings,
|
|
723
|
-
preload: preloadFontUrls.has(template.fontUrl),
|
|
724
|
-
hasFontFeatureSettings,
|
|
725
|
-
fontFeatureTags,
|
|
726
|
-
};
|
|
727
|
-
});
|
|
731
|
+
instantiateFontUsagesForPage(entry, declCacheEntry, uniqueCharsCache);
|
|
728
732
|
cloningTime += Date.now() - cloneStart;
|
|
729
733
|
}
|
|
730
734
|
return { snappingTime, globalUsageTime, cloningTime };
|