@turntrout/subfont 1.10.1 → 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.
Files changed (41) hide show
  1. package/lib/HeadlessBrowser.d.ts +2 -0
  2. package/lib/HeadlessBrowser.d.ts.map +1 -1
  3. package/lib/HeadlessBrowser.js +64 -58
  4. package/lib/HeadlessBrowser.js.map +1 -1
  5. package/lib/collectTextsByPage.d.ts.map +1 -1
  6. package/lib/collectTextsByPage.js +136 -132
  7. package/lib/collectTextsByPage.js.map +1 -1
  8. package/lib/concurrencyLimit.d.ts.map +1 -1
  9. package/lib/concurrencyLimit.js +6 -8
  10. package/lib/concurrencyLimit.js.map +1 -1
  11. package/lib/extractVisibleText.d.ts.map +1 -1
  12. package/lib/extractVisibleText.js +58 -30
  13. package/lib/extractVisibleText.js.map +1 -1
  14. package/lib/fontConverter.d.ts.map +1 -1
  15. package/lib/fontConverter.js +27 -23
  16. package/lib/fontConverter.js.map +1 -1
  17. package/lib/getCssRulesByProperty.d.ts.map +1 -1
  18. package/lib/getCssRulesByProperty.js +234 -207
  19. package/lib/getCssRulesByProperty.js.map +1 -1
  20. package/lib/injectSubsetDefinitions.d.ts.map +1 -1
  21. package/lib/injectSubsetDefinitions.js +24 -21
  22. package/lib/injectSubsetDefinitions.js.map +1 -1
  23. package/lib/parseCommandLineOptions.d.ts.map +1 -1
  24. package/lib/parseCommandLineOptions.js +29 -14
  25. package/lib/parseCommandLineOptions.js.map +1 -1
  26. package/lib/subfont.d.ts.map +1 -1
  27. package/lib/subfont.js +347 -311
  28. package/lib/subfont.js.map +1 -1
  29. package/lib/subsetFontWithGlyphs.d.ts.map +1 -1
  30. package/lib/subsetFontWithGlyphs.js +60 -48
  31. package/lib/subsetFontWithGlyphs.js.map +1 -1
  32. package/lib/subsetFonts.d.ts.map +1 -1
  33. package/lib/subsetFonts.js +338 -280
  34. package/lib/subsetFonts.js.map +1 -1
  35. package/lib/subsetGeneration.d.ts.map +1 -1
  36. package/lib/subsetGeneration.js +151 -127
  37. package/lib/subsetGeneration.js.map +1 -1
  38. package/lib/warnAboutMissingGlyphs.d.ts.map +1 -1
  39. package/lib/warnAboutMissingGlyphs.js +132 -112
  40. package/lib/warnAboutMissingGlyphs.js.map +1 -1
  41. package/package.json +1 -1
@@ -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":"AAWA,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;IAgBxB,SAAS,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgHnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B;AAED,SAAS,eAAe,CAAC"}
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"}
@@ -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
- // fake a response from the assetgraph instance if the corresponding
127
- // asset is found there:
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
- page.on('request', (request) => {
130
- const url = request.url();
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":"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"}
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;AAq3BD,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;AAoMD,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"}
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
- // Fill in fontUsageTemplates/pageTextIndex/preloadIndex on the cached
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
- if (extras.length > 0) {
207
- let arr = extraTextsByFontUrl.get(fontUrl);
208
- if (!arr) {
209
- // After destructuring out `relations` and `-subfont-text`, the
210
- // remaining spread props are CSS descriptor strings.
211
- arr = {
212
- texts: [],
213
- props: props,
214
- fontRelations: relations,
215
- };
216
- extraTextsByFontUrl.set(fontUrl, arr);
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
- // Build the global fontUsage template for each fontUrl
222
- const fontUsageTemplates = [];
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
- const fontEntries = entriesByFontUrl.get(fontUrl) || [];
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 { htmlOrSvgAsset, textByProps, accumulatedFontFaceDeclarations, fontFamiliesWithFeatureSettings, featureTagsByFamily, } = entry;
669
- const declKey = getDeclarationsKey(accumulatedFontFaceDeclarations);
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
- const assetTexts = pageTextIndex.get(htmlOrSvgAsset);
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 };