@turntrout/subfont 1.7.1 → 1.8.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.
Files changed (147) hide show
  1. package/CLAUDE.md +39 -13
  2. package/README.md +24 -14
  3. package/lib/FontTracerPool.d.ts +1 -0
  4. package/lib/FontTracerPool.d.ts.map +1 -1
  5. package/lib/FontTracerPool.js +46 -24
  6. package/lib/FontTracerPool.js.map +1 -1
  7. package/lib/HeadlessBrowser.d.ts +18 -0
  8. package/lib/HeadlessBrowser.d.ts.map +1 -0
  9. package/lib/HeadlessBrowser.js +216 -210
  10. package/lib/HeadlessBrowser.js.map +1 -0
  11. package/lib/codepointMaps.d.ts +4 -0
  12. package/lib/codepointMaps.d.ts.map +1 -0
  13. package/lib/codepointMaps.js +99 -0
  14. package/lib/codepointMaps.js.map +1 -0
  15. package/lib/collectFeatureGlyphIds.d.ts +3 -0
  16. package/lib/collectFeatureGlyphIds.d.ts.map +1 -0
  17. package/lib/collectFeatureGlyphIds.js +124 -138
  18. package/lib/collectFeatureGlyphIds.js.map +1 -0
  19. package/lib/collectTextsByPage.d.ts +41 -0
  20. package/lib/collectTextsByPage.d.ts.map +1 -0
  21. package/lib/collectTextsByPage.js +726 -965
  22. package/lib/collectTextsByPage.js.map +1 -0
  23. package/lib/concurrencyLimit.d.ts +3 -0
  24. package/lib/concurrencyLimit.d.ts.map +1 -0
  25. package/lib/concurrencyLimit.js +12 -11
  26. package/lib/concurrencyLimit.js.map +1 -0
  27. package/lib/escapeJsStringLiteral.d.ts +3 -0
  28. package/lib/escapeJsStringLiteral.d.ts.map +1 -0
  29. package/lib/escapeJsStringLiteral.js +7 -6
  30. package/lib/escapeJsStringLiteral.js.map +1 -0
  31. package/lib/extractReferencedCustomPropertyNames.d.ts +3 -0
  32. package/lib/extractReferencedCustomPropertyNames.d.ts.map +1 -0
  33. package/lib/extractReferencedCustomPropertyNames.js +15 -16
  34. package/lib/extractReferencedCustomPropertyNames.js.map +1 -0
  35. package/lib/extractVisibleText.d.ts +7 -0
  36. package/lib/extractVisibleText.d.ts.map +1 -0
  37. package/lib/extractVisibleText.js +110 -119
  38. package/lib/extractVisibleText.js.map +1 -0
  39. package/lib/findCustomPropertyDefinitions.d.ts +8 -0
  40. package/lib/findCustomPropertyDefinitions.d.ts.map +1 -0
  41. package/lib/findCustomPropertyDefinitions.js +41 -48
  42. package/lib/findCustomPropertyDefinitions.js.map +1 -0
  43. package/lib/fontConverter.d.ts +2 -0
  44. package/lib/fontConverter.d.ts.map +1 -0
  45. package/lib/fontConverter.js +40 -21
  46. package/lib/fontConverter.js.map +1 -0
  47. package/lib/fontConverterWorker.d.ts +2 -0
  48. package/lib/fontConverterWorker.d.ts.map +1 -0
  49. package/lib/fontConverterWorker.js +52 -15
  50. package/lib/fontConverterWorker.js.map +1 -0
  51. package/lib/fontFaceHelpers.d.ts +64 -0
  52. package/lib/fontFaceHelpers.d.ts.map +1 -0
  53. package/lib/fontFaceHelpers.js +237 -249
  54. package/lib/fontFaceHelpers.js.map +1 -0
  55. package/lib/fontFeatureHelpers.d.ts +30 -0
  56. package/lib/fontFeatureHelpers.d.ts.map +1 -0
  57. package/lib/fontFeatureHelpers.js +277 -212
  58. package/lib/fontFeatureHelpers.js.map +1 -0
  59. package/lib/fontTracerWorker.d.ts +11 -0
  60. package/lib/fontTracerWorker.d.ts.map +1 -0
  61. package/lib/fontTracerWorker.js +94 -60
  62. package/lib/fontTracerWorker.js.map +1 -0
  63. package/lib/gatherStylesheetsWithPredicates.d.ts +26 -0
  64. package/lib/gatherStylesheetsWithPredicates.d.ts.map +1 -0
  65. package/lib/gatherStylesheetsWithPredicates.js +75 -84
  66. package/lib/gatherStylesheetsWithPredicates.js.map +1 -0
  67. package/lib/getCssRulesByProperty.d.ts +29 -0
  68. package/lib/getCssRulesByProperty.d.ts.map +1 -0
  69. package/lib/getCssRulesByProperty.js +316 -316
  70. package/lib/getCssRulesByProperty.js.map +1 -0
  71. package/lib/getFontInfo.d.ts +11 -0
  72. package/lib/getFontInfo.d.ts.map +1 -0
  73. package/lib/getFontInfo.js +31 -33
  74. package/lib/getFontInfo.js.map +1 -0
  75. package/lib/initialValueByProp.d.ts +3 -0
  76. package/lib/initialValueByProp.d.ts.map +1 -0
  77. package/lib/initialValueByProp.js +20 -17
  78. package/lib/initialValueByProp.js.map +1 -0
  79. package/lib/injectSubsetDefinitions.d.ts +3 -0
  80. package/lib/injectSubsetDefinitions.d.ts.map +1 -0
  81. package/lib/injectSubsetDefinitions.js +55 -59
  82. package/lib/injectSubsetDefinitions.js.map +1 -0
  83. package/lib/normalizeFontPropertyValue.d.ts +3 -0
  84. package/lib/normalizeFontPropertyValue.d.ts.map +1 -0
  85. package/lib/normalizeFontPropertyValue.js +59 -54
  86. package/lib/normalizeFontPropertyValue.js.map +1 -0
  87. package/lib/parseCommandLineOptions.d.ts +9 -0
  88. package/lib/parseCommandLineOptions.d.ts.map +1 -0
  89. package/lib/parseCommandLineOptions.js +145 -149
  90. package/lib/parseCommandLineOptions.js.map +1 -0
  91. package/lib/parseFontVariationSettings.d.ts +3 -0
  92. package/lib/parseFontVariationSettings.d.ts.map +1 -0
  93. package/lib/parseFontVariationSettings.js +38 -36
  94. package/lib/parseFontVariationSettings.js.map +1 -0
  95. package/lib/progress.d.ts +27 -0
  96. package/lib/progress.d.ts.map +1 -0
  97. package/lib/progress.js +51 -54
  98. package/lib/progress.js.map +1 -0
  99. package/lib/sfntCache.d.ts +4 -0
  100. package/lib/sfntCache.d.ts.map +1 -0
  101. package/lib/sfntCache.js +67 -25
  102. package/lib/sfntCache.js.map +1 -0
  103. package/lib/stripLocalTokens.d.ts +3 -0
  104. package/lib/stripLocalTokens.d.ts.map +1 -0
  105. package/lib/stripLocalTokens.js +23 -21
  106. package/lib/stripLocalTokens.js.map +1 -0
  107. package/lib/subfont.d.ts +22 -1
  108. package/lib/subfont.d.ts.map +1 -1
  109. package/lib/subfont.js +7 -6
  110. package/lib/subfont.js.map +1 -1
  111. package/lib/subsetFontWithGlyphs.d.ts +4 -0
  112. package/lib/subsetFontWithGlyphs.d.ts.map +1 -1
  113. package/lib/subsetFontWithGlyphs.js +73 -14
  114. package/lib/subsetFontWithGlyphs.js.map +1 -1
  115. package/lib/subsetFonts.d.ts +1 -5
  116. package/lib/subsetFonts.d.ts.map +1 -1
  117. package/lib/subsetFonts.js +18 -17
  118. package/lib/subsetFonts.js.map +1 -1
  119. package/lib/subsetGeneration.d.ts +3 -6
  120. package/lib/subsetGeneration.d.ts.map +1 -1
  121. package/lib/subsetGeneration.js +42 -9
  122. package/lib/subsetGeneration.js.map +1 -1
  123. package/lib/types/shared.d.ts +11 -0
  124. package/lib/types/shared.d.ts.map +1 -0
  125. package/lib/types/shared.js +3 -0
  126. package/lib/types/shared.js.map +1 -0
  127. package/lib/unicodeRange.d.ts +3 -0
  128. package/lib/unicodeRange.d.ts.map +1 -0
  129. package/lib/unicodeRange.js +17 -30
  130. package/lib/unicodeRange.js.map +1 -0
  131. package/lib/unquote.d.ts +3 -0
  132. package/lib/unquote.d.ts.map +1 -0
  133. package/lib/unquote.js +18 -25
  134. package/lib/unquote.js.map +1 -0
  135. package/lib/variationAxes.d.ts +33 -0
  136. package/lib/variationAxes.d.ts.map +1 -0
  137. package/lib/variationAxes.js +127 -157
  138. package/lib/variationAxes.js.map +1 -0
  139. package/lib/warnAboutMissingGlyphs.d.ts +43 -0
  140. package/lib/warnAboutMissingGlyphs.d.ts.map +1 -0
  141. package/lib/warnAboutMissingGlyphs.js +139 -147
  142. package/lib/warnAboutMissingGlyphs.js.map +1 -0
  143. package/lib/wasmQueue.d.ts +3 -0
  144. package/lib/wasmQueue.d.ts.map +1 -0
  145. package/lib/wasmQueue.js +13 -10
  146. package/lib/wasmQueue.js.map +1 -0
  147. package/package.json +3 -2
@@ -1,304 +1,292 @@
1
- const crypto = require('crypto');
2
- const stripLocalTokens = require('./stripLocalTokens');
3
- const unicodeRange = require('./unicodeRange');
4
- const normalizeFontPropertyValue = require('./normalizeFontPropertyValue');
5
-
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.stringifyFontFamily = stringifyFontFamily;
37
+ exports.maybeCssQuote = maybeCssQuote;
38
+ exports.getPreferredFontUrl = getPreferredFontUrl;
39
+ exports.getFontFaceDeclarationText = getFontFaceDeclarationText;
40
+ exports.getFontFaceForFontUsage = getFontFaceForFontUsage;
41
+ exports.getUnusedVariantsStylesheet = getUnusedVariantsStylesheet;
42
+ exports.getFontUsageStylesheet = getFontUsageStylesheet;
43
+ exports.getCodepoints = getCodepoints;
44
+ exports.cssAssetIsEmpty = cssAssetIsEmpty;
45
+ exports.parseFontWeightRange = parseFontWeightRange;
46
+ exports.parseFontStretchRange = parseFontStretchRange;
47
+ exports.uniqueChars = uniqueChars;
48
+ exports.uniqueCharsFromArray = uniqueCharsFromArray;
49
+ exports.hashHexPrefix = hashHexPrefix;
50
+ const crypto = __importStar(require("crypto"));
51
+ const stripLocalTokens = require("./stripLocalTokens");
52
+ const unicodeRange = require("./unicodeRange");
53
+ const normalizeFontPropertyValue = require("./normalizeFontPropertyValue");
6
54
  const contentTypeByFontFormat = {
7
- woff: 'font/woff', // https://tools.ietf.org/html/rfc8081#section-4.4.5
8
- woff2: 'font/woff2',
9
- truetype: 'font/ttf',
55
+ woff: 'font/woff', // https://tools.ietf.org/html/rfc8081#section-4.4.5
56
+ woff2: 'font/woff2',
57
+ truetype: 'font/ttf',
10
58
  };
11
-
12
59
  function stringifyFontFamily(name) {
13
- if (/[^a-z0-9_-]/i.test(name)) {
14
- return `"${name.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
15
- } else {
16
- return name;
17
- }
60
+ if (/[^a-z0-9_-]/i.test(name)) {
61
+ return `"${name.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
62
+ }
63
+ else {
64
+ return name;
65
+ }
18
66
  }
19
-
20
67
  function maybeCssQuote(value) {
21
- // CSS identifiers must start with a letter or underscore (or hyphen
22
- // followed by a letter/underscore), not a digit or bare hyphen.
23
- if (/^[a-zA-Z_][a-zA-Z0-9_-]*$|^-[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value)) {
24
- return value;
25
- } else {
26
- return `'${value.replace(/'/g, "\\'")}'`;
27
- }
28
- }
29
-
30
- function getPreferredFontUrl(cssFontFaceSrcRelations = []) {
31
- // Priority: woff2 > woff > truetype > opentype, preferring explicit
32
- // format() declarations over asset-type guesses.
33
- const formatPriority = { woff2: 0, woff: 1, truetype: 2, opentype: 3 };
34
- const typePriority = { Woff2: 4, Woff: 5, Ttf: 6, Otf: 7 };
35
-
36
- let bestUrl;
37
- let bestPriority = Infinity;
38
-
39
- for (const r of cssFontFaceSrcRelations) {
40
- let priority;
41
- if (r.format) {
42
- priority = formatPriority[r.format.toLowerCase()];
68
+ // CSS identifiers must start with a letter or underscore (or hyphen
69
+ // followed by a letter/underscore), not a digit or bare hyphen.
70
+ if (/^[a-zA-Z_][a-zA-Z0-9_-]*$|^-[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value)) {
71
+ return value;
43
72
  }
44
- if (priority === undefined) {
45
- priority = typePriority[r.to.type];
73
+ else {
74
+ return `'${value.replace(/'/g, "\\'")}'`;
46
75
  }
47
- if (priority !== undefined && priority < bestPriority) {
48
- bestPriority = priority;
49
- bestUrl = r.to.url;
76
+ }
77
+ function getPreferredFontUrl(cssFontFaceSrcRelations = []) {
78
+ // Priority: woff2 > woff > truetype > opentype, preferring explicit
79
+ // format() declarations over asset-type guesses.
80
+ const formatPriority = {
81
+ woff2: 0,
82
+ woff: 1,
83
+ truetype: 2,
84
+ opentype: 3,
85
+ };
86
+ const typePriority = {
87
+ Woff2: 4,
88
+ Woff: 5,
89
+ Ttf: 6,
90
+ Otf: 7,
91
+ };
92
+ let bestUrl;
93
+ let bestPriority = Infinity;
94
+ for (const r of cssFontFaceSrcRelations) {
95
+ let priority;
96
+ if (r.format) {
97
+ priority = formatPriority[r.format.toLowerCase()];
98
+ }
99
+ if (priority === undefined && r.to.type) {
100
+ priority = typePriority[r.to.type];
101
+ }
102
+ if (priority !== undefined && priority < bestPriority) {
103
+ bestPriority = priority;
104
+ bestUrl = r.to.url;
105
+ }
50
106
  }
51
- }
52
-
53
- return bestUrl;
107
+ return bestUrl;
54
108
  }
55
-
56
109
  // Temporarily switch all relation hrefs to absolute so that
57
110
  // node.toString() emits fully-qualified URLs in the @font-face src.
58
111
  function getFontFaceDeclarationText(node, relations) {
59
- const originalHrefTypeByRelation = new Map();
60
- for (const relation of relations) {
61
- originalHrefTypeByRelation.set(relation, relation.hrefType);
62
- relation.hrefType = 'absolute';
63
- }
64
-
65
- const text = node.toString();
66
- // Put the hrefTypes that were set to absolute back to their original state:
67
- for (const [
68
- relation,
69
- originalHrefType,
70
- ] of originalHrefTypeByRelation.entries()) {
71
- relation.hrefType = originalHrefType;
72
- }
73
- return text;
112
+ const originalHrefTypeByRelation = new Map();
113
+ for (const relation of relations) {
114
+ originalHrefTypeByRelation.set(relation, relation.hrefType);
115
+ relation.hrefType = 'absolute';
116
+ }
117
+ const text = node.toString();
118
+ // Put the hrefTypes that were set to absolute back to their original state:
119
+ for (const [relation, originalHrefType,] of originalHrefTypeByRelation.entries()) {
120
+ relation.hrefType = originalHrefType;
121
+ }
122
+ return text;
74
123
  }
75
-
76
124
  const fontOrder = ['woff2', 'woff', 'truetype'];
77
-
78
125
  // Cache base64-encoded data URIs keyed by the underlying Buffer. Subset
79
126
  // buffers are shared across pages (propagated from the canonical fontUsage),
80
127
  // so without this every page re-encodes the same multi-hundred-KB buffer.
81
128
  const subsetDataUrlCache = new WeakMap();
82
129
  function getSubsetDataUrls(subsetsObj) {
83
- let cached = subsetDataUrlCache.get(subsetsObj);
84
- if (cached) return cached;
85
- cached = fontOrder
86
- .filter((format) => subsetsObj[format])
87
- .map((format) => ({
88
- format,
89
- url: `data:${contentTypeByFontFormat[format]};base64,${subsetsObj[
90
- format
91
- ].toString('base64')}`,
130
+ const cached = subsetDataUrlCache.get(subsetsObj);
131
+ if (cached)
132
+ return cached;
133
+ const result = fontOrder
134
+ .filter((format) => subsetsObj[format])
135
+ .map((format) => ({
136
+ format,
137
+ url: `data:${contentTypeByFontFormat[format]};base64,${subsetsObj[format].toString('base64')}`,
92
138
  }));
93
- subsetDataUrlCache.set(subsetsObj, cached);
94
- return cached;
139
+ subsetDataUrlCache.set(subsetsObj, result);
140
+ return result;
95
141
  }
96
-
97
142
  function getFontFaceForFontUsage(fontUsage) {
98
- const subsets = getSubsetDataUrls(fontUsage.subsets);
99
-
100
- const resultString = ['@font-face {'];
101
-
102
- resultString.push(
103
- ...Object.keys(fontUsage.props)
104
- .sort()
105
- .map((prop) => {
143
+ const subsets = getSubsetDataUrls(fontUsage.subsets);
144
+ const resultString = ['@font-face {'];
145
+ resultString.push(...Object.keys(fontUsage.props)
146
+ .sort()
147
+ .map((prop) => {
106
148
  let value = fontUsage.props[prop];
107
-
108
149
  if (prop === 'font-family') {
109
- value = maybeCssQuote(`${value}__subset`);
150
+ value = maybeCssQuote(`${value}__subset`);
110
151
  }
111
-
112
152
  if (prop === 'src') {
113
- value = subsets
114
- .map((subset) => `url(${subset.url}) format('${subset.format}')`)
115
- .join(', ');
153
+ value = subsets
154
+ .map((subset) => `url(${subset.url}) format('${subset.format}')`)
155
+ .join(', ');
116
156
  }
117
-
118
157
  return `${prop}: ${value};`;
119
- })
120
- .map((str) => ` ${str}`)
121
- );
122
-
123
- // Intersect used codepoints with original (font's character set) so
124
- // the unicode-range only advertises characters actually in the subset.
125
- // This is essential for unicode-range-split fonts (e.g. CJK) where
126
- // the text may contain characters outside this font file's range.
127
- let effectiveUsedCodepoints = fontUsage.codepoints.used;
128
- if (
129
- fontUsage.codepoints.original &&
130
- fontUsage.codepoints.original.length > 0
131
- ) {
132
- const originalSet = new Set(fontUsage.codepoints.original);
133
- const filtered = fontUsage.codepoints.used.filter((cp) =>
134
- originalSet.has(cp)
135
- );
136
- if (filtered.length > 0) {
137
- effectiveUsedCodepoints = filtered;
158
+ })
159
+ .map((str) => ` ${str}`));
160
+ // Intersect used codepoints with original (font's character set) so
161
+ // the unicode-range only advertises characters actually in the subset.
162
+ let effectiveUsedCodepoints = fontUsage.codepoints.used;
163
+ if (fontUsage.codepoints.original &&
164
+ fontUsage.codepoints.original.length > 0) {
165
+ const originalSet = new Set(fontUsage.codepoints.original);
166
+ const filtered = fontUsage.codepoints.used.filter((cp) => originalSet.has(cp));
167
+ if (filtered.length > 0) {
168
+ effectiveUsedCodepoints = filtered;
169
+ }
138
170
  }
139
- }
140
- resultString.push(
141
- ` unicode-range: ${unicodeRange(effectiveUsedCodepoints)};`
142
- );
143
-
144
- resultString.push('}');
145
-
146
- return resultString.join('\n');
171
+ resultString.push(` unicode-range: ${unicodeRange(effectiveUsedCodepoints)};`);
172
+ resultString.push('}');
173
+ return resultString.join('\n');
147
174
  }
148
-
149
- function getUnusedVariantsStylesheet(
150
- fontUsages,
151
- accumulatedFontFaceDeclarations
152
- ) {
153
- // Find the available @font-face declarations where the font-family is used
154
- // (so there will be subsets created), but the specific variant isn't used.
155
- return accumulatedFontFaceDeclarations
156
- .filter(
157
- (decl) =>
158
- fontUsages.some((fontUsage) =>
159
- fontUsage.fontFamilies.has(decl['font-family'])
160
- ) &&
161
- !fontUsages.some(
162
- ({ props }) =>
163
- props['font-style'] === decl['font-style'] &&
175
+ function getUnusedVariantsStylesheet(fontUsages, accumulatedFontFaceDeclarations) {
176
+ // Find the available @font-face declarations where the font-family is used
177
+ // (so there will be subsets created), but the specific variant isn't used.
178
+ return accumulatedFontFaceDeclarations
179
+ .filter((decl) => decl['font-family'] &&
180
+ fontUsages.some((fontUsage) => fontUsage.fontFamilies.has(decl['font-family'])) &&
181
+ !fontUsages.some(({ props }) => props['font-style'] === decl['font-style'] &&
164
182
  props['font-weight'] === decl['font-weight'] &&
165
183
  props['font-stretch'] === decl['font-stretch'] &&
166
184
  props['font-family'].toLowerCase() ===
167
- decl['font-family'].toLowerCase()
168
- )
169
- )
170
- .map((props) => {
171
- let src = stripLocalTokens(props.src);
172
- if (props.relations.length > 0) {
173
- const targets = props.relations.map((relation) => relation.to.url);
174
- src = src.replace(
175
- props.relations[0].tokenRegExp,
176
- () => `url('${targets.shift().replace(/'/g, "\\'")}')`
177
- );
178
- }
179
- let rule = `@font-face{font-family:${maybeCssQuote(`${props['font-family']}__subset`)};font-stretch:${props['font-stretch']};font-style:${props['font-style']};font-weight:${props['font-weight']};src:${src}`;
180
- if (props['unicode-range']) {
181
- rule += `;unicode-range:${props['unicode-range']}`;
182
- }
183
- // Preserve @font-face metric descriptors used for CLS optimization
184
- for (const descriptor of [
185
- 'size-adjust',
186
- 'ascent-override',
187
- 'descent-override',
188
- 'line-gap-override',
189
- ]) {
190
- if (props[descriptor]) {
191
- rule += `;${descriptor}:${props[descriptor]}`;
185
+ decl['font-family'].toLowerCase()))
186
+ .map((props) => {
187
+ let src = stripLocalTokens(props.src ?? '');
188
+ const tokenRe = props.relations[0]?.tokenRegExp;
189
+ if (props.relations.length > 0 && tokenRe) {
190
+ const targets = props.relations.map((relation) => relation.to.url);
191
+ src = src.replace(tokenRe, () => `url('${targets.shift().replace(/'/g, "\\'")}')`);
192
+ }
193
+ let rule = `@font-face{font-family:${maybeCssQuote(`${props['font-family']}__subset`)};font-stretch:${props['font-stretch']};font-style:${props['font-style']};font-weight:${props['font-weight']};src:${src}`;
194
+ if (props['unicode-range']) {
195
+ rule += `;unicode-range:${props['unicode-range']}`;
196
+ }
197
+ // Preserve @font-face metric descriptors used for CLS optimization
198
+ for (const descriptor of [
199
+ 'size-adjust',
200
+ 'ascent-override',
201
+ 'descent-override',
202
+ 'line-gap-override',
203
+ ]) {
204
+ if (props[descriptor]) {
205
+ rule += `;${descriptor}:${props[descriptor]}`;
206
+ }
192
207
  }
193
- }
194
- rule += '}';
195
- return rule;
208
+ rule += '}';
209
+ return rule;
196
210
  })
197
- .join('');
211
+ .join('');
198
212
  }
199
-
200
213
  function getFontUsageStylesheet(fontUsages) {
201
- return fontUsages
202
- .filter((fontUsage) => fontUsage.subsets)
203
- .map((fontUsage) => getFontFaceForFontUsage(fontUsage))
204
- .join('');
214
+ return fontUsages
215
+ .filter((fontUsage) => fontUsage.subsets)
216
+ .map((fontUsage) => getFontFaceForFontUsage(fontUsage))
217
+ .join('');
205
218
  }
206
-
207
219
  function getCodepoints(text) {
208
- const codepointSet = new Set();
209
- for (const char of text) {
210
- codepointSet.add(char.codePointAt(0));
211
- }
212
-
213
- // Make sure that space is always part of the subset fonts (and that it's announced in unicode-range).
214
- // Prevents Chrome from going off and downloading the fallback:
215
- // https://gitter.im/assetgraph/assetgraph?at=5f01f6e13a0d3931fad4021b
216
- codepointSet.add(32);
217
-
218
- return [...codepointSet];
220
+ const codepointSet = new Set();
221
+ for (const char of text) {
222
+ const cp = char.codePointAt(0);
223
+ if (cp !== undefined)
224
+ codepointSet.add(cp);
225
+ }
226
+ // Make sure that space is always part of the subset fonts (and that it's announced in unicode-range).
227
+ // Prevents Chrome from going off and downloading the fallback:
228
+ // https://gitter.im/assetgraph/assetgraph?at=5f01f6e13a0d3931fad4021b
229
+ codepointSet.add(32);
230
+ return [...codepointSet];
219
231
  }
220
-
221
232
  function cssAssetIsEmpty(cssAsset) {
222
- return cssAsset.parseTree.nodes.every(
223
- (node) => node.type === 'comment' && !node.text.startsWith('!')
224
- );
233
+ const nodes = cssAsset.parseTree.nodes;
234
+ if (!nodes)
235
+ return true;
236
+ return nodes.every((node) => node.type === 'comment' && !(node.text ?? '').startsWith('!'));
225
237
  }
226
-
227
238
  function parseFontWeightRange(str) {
228
- if (typeof str === 'undefined' || str === 'auto') {
229
- return [-Infinity, Infinity];
230
- }
231
- let minFontWeight = 400;
232
- let maxFontWeight = 400;
233
- const fontWeightTokens = str.split(/\s+/).map((str) => parseFloat(str));
234
- if (
235
- [1, 2].includes(fontWeightTokens.length) &&
236
- !fontWeightTokens.some(isNaN)
237
- ) {
238
- minFontWeight = maxFontWeight = fontWeightTokens[0];
239
- if (fontWeightTokens.length === 2) {
240
- maxFontWeight = fontWeightTokens[1];
239
+ if (typeof str === 'undefined' || str === 'auto') {
240
+ return [-Infinity, Infinity];
241
+ }
242
+ let minFontWeight = 400;
243
+ let maxFontWeight = 400;
244
+ const fontWeightTokens = str.split(/\s+/).map((s) => parseFloat(s));
245
+ if ([1, 2].includes(fontWeightTokens.length) &&
246
+ !fontWeightTokens.some(isNaN)) {
247
+ minFontWeight = maxFontWeight = fontWeightTokens[0];
248
+ if (fontWeightTokens.length === 2) {
249
+ maxFontWeight = fontWeightTokens[1];
250
+ }
241
251
  }
242
- }
243
- return [minFontWeight, maxFontWeight];
252
+ return [minFontWeight, maxFontWeight];
244
253
  }
245
-
246
254
  function parseFontStretchRange(str) {
247
- if (typeof str === 'undefined' || str.toLowerCase() === 'auto') {
248
- return [-Infinity, Infinity];
249
- }
250
- let minFontStretch = 100;
251
- let maxFontStretch = 100;
252
- const fontStretchTokens = str
253
- .split(/\s+/)
254
- .map((str) => parseFloat(normalizeFontPropertyValue('font-stretch', str)));
255
- if (
256
- [1, 2].includes(fontStretchTokens.length) &&
257
- !fontStretchTokens.some(isNaN)
258
- ) {
259
- minFontStretch = maxFontStretch = fontStretchTokens[0];
260
- if (fontStretchTokens.length === 2) {
261
- maxFontStretch = fontStretchTokens[1];
255
+ if (typeof str === 'undefined' || str.toLowerCase() === 'auto') {
256
+ return [-Infinity, Infinity];
257
+ }
258
+ let minFontStretch = 100;
259
+ let maxFontStretch = 100;
260
+ const fontStretchTokens = str.split(/\s+/).map((s) => {
261
+ const normalized = normalizeFontPropertyValue('font-stretch', s);
262
+ return parseFloat(String(normalized));
263
+ });
264
+ if ([1, 2].includes(fontStretchTokens.length) &&
265
+ !fontStretchTokens.some(isNaN)) {
266
+ minFontStretch = maxFontStretch = fontStretchTokens[0];
267
+ if (fontStretchTokens.length === 2) {
268
+ maxFontStretch = fontStretchTokens[1];
269
+ }
262
270
  }
263
- }
264
- return [minFontStretch, maxFontStretch];
271
+ return [minFontStretch, maxFontStretch];
265
272
  }
266
-
267
273
  function uniqueChars(text) {
268
- return [...new Set(text)].sort().join('');
274
+ return [...new Set(text)].sort().join('');
269
275
  }
270
-
271
276
  function uniqueCharsFromArray(texts) {
272
- const charSet = new Set();
273
- for (const text of texts) {
274
- for (const char of text) {
275
- charSet.add(char);
277
+ const charSet = new Set();
278
+ for (const text of texts) {
279
+ for (const char of text) {
280
+ charSet.add(char);
281
+ }
276
282
  }
277
- }
278
- return [...charSet].sort().join('');
283
+ return [...charSet].sort().join('');
279
284
  }
280
-
281
285
  function hashHexPrefix(stringOrBuffer) {
282
- return crypto
283
- .createHash('sha256')
284
- .update(stringOrBuffer)
285
- .digest('hex')
286
- .slice(0, 10);
286
+ return crypto
287
+ .createHash('sha256')
288
+ .update(stringOrBuffer)
289
+ .digest('hex')
290
+ .slice(0, 10);
287
291
  }
288
-
289
- module.exports = {
290
- stringifyFontFamily,
291
- maybeCssQuote,
292
- getPreferredFontUrl,
293
- getFontFaceDeclarationText,
294
- getFontFaceForFontUsage,
295
- getUnusedVariantsStylesheet,
296
- getFontUsageStylesheet,
297
- getCodepoints,
298
- cssAssetIsEmpty,
299
- parseFontWeightRange,
300
- parseFontStretchRange,
301
- uniqueChars,
302
- uniqueCharsFromArray,
303
- hashHexPrefix,
304
- };
292
+ //# sourceMappingURL=fontFaceHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontFaceHelpers.js","sourceRoot":"","sources":["../src/fontFaceHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare const featureSettingsProps: Set<string>;
2
+ export declare const fontVariantToOTTags: Record<string, Record<string, string[]>>;
3
+ export declare const UNRESOLVED_FEATURES_SENTINEL = "<unresolved>";
4
+ export declare function extractFeatureTagsFromDecl(prop: string, value: string): Set<string>;
5
+ interface PostCssRuleNode {
6
+ type: string;
7
+ prop: string;
8
+ value: string;
9
+ }
10
+ interface PostCssRule {
11
+ nodes: PostCssRuleNode[];
12
+ }
13
+ export declare function ruleFeatureTags(rule: PostCssRule): Set<string> | null;
14
+ export declare function ruleFontFamily(rule: PostCssRule): string | null;
15
+ export declare function addTagsToMapEntry<K>(map: Map<K, Set<string>>, key: K, tags: Iterable<string>): void;
16
+ export declare function recordRuleFeatureTags(rule: PostCssRule, featureTagsByFamily: Map<string, Set<string>> | null | undefined): true | string[] | null;
17
+ interface StylesheetEntry {
18
+ asset?: {
19
+ parseTree?: {
20
+ walkRules?(cb: (rule: PostCssRule) => void): void;
21
+ };
22
+ };
23
+ }
24
+ export declare function findFontFamiliesWithFeatureSettings(stylesheetsWithPredicates: StylesheetEntry[], featureTagsByFamily: Map<string, Set<string>> | null | undefined): true | Set<string> | null;
25
+ export declare function resolveFeatureSettings(fontFamilies: Iterable<string>, fontFamiliesWithFeatureSettings: true | Set<string> | null | undefined, featureTagsByFamily: Map<string, Set<string>> | null | undefined): {
26
+ hasFontFeatureSettings: boolean;
27
+ fontFeatureTags?: string[];
28
+ };
29
+ export {};
30
+ //# sourceMappingURL=fontFeatureHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontFeatureHelpers.d.ts","sourceRoot":"","sources":["../src/fontFeatureHelpers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,aAQ/B,CAAC;AAGH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA4CxE,CAAC;AA2CF,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAM3D,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,MAAM,CAAC,CA0Cb;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAerE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAQ/D;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACxB,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GACrB,IAAI,CAON;AAID,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/D,IAAI,GAAG,MAAM,EAAE,GAAG,IAAI,CAiBxB;AAED,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE;YAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/E;AAKD,wBAAgB,mCAAmC,CACjD,yBAAyB,EAAE,eAAe,EAAE,EAC5C,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/D,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAsB3B;AAID,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC9B,+BAA+B,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACtE,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/D;IAAE,sBAAsB,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAqCjE"}