@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.
- package/CLAUDE.md +39 -13
- package/README.md +24 -14
- package/lib/FontTracerPool.d.ts +1 -0
- package/lib/FontTracerPool.d.ts.map +1 -1
- package/lib/FontTracerPool.js +46 -24
- package/lib/FontTracerPool.js.map +1 -1
- package/lib/HeadlessBrowser.d.ts +18 -0
- package/lib/HeadlessBrowser.d.ts.map +1 -0
- package/lib/HeadlessBrowser.js +216 -210
- package/lib/HeadlessBrowser.js.map +1 -0
- package/lib/codepointMaps.d.ts +4 -0
- package/lib/codepointMaps.d.ts.map +1 -0
- package/lib/codepointMaps.js +99 -0
- package/lib/codepointMaps.js.map +1 -0
- package/lib/collectFeatureGlyphIds.d.ts +3 -0
- package/lib/collectFeatureGlyphIds.d.ts.map +1 -0
- package/lib/collectFeatureGlyphIds.js +124 -138
- package/lib/collectFeatureGlyphIds.js.map +1 -0
- package/lib/collectTextsByPage.d.ts +41 -0
- package/lib/collectTextsByPage.d.ts.map +1 -0
- package/lib/collectTextsByPage.js +726 -965
- package/lib/collectTextsByPage.js.map +1 -0
- package/lib/concurrencyLimit.d.ts +3 -0
- package/lib/concurrencyLimit.d.ts.map +1 -0
- package/lib/concurrencyLimit.js +12 -11
- package/lib/concurrencyLimit.js.map +1 -0
- package/lib/escapeJsStringLiteral.d.ts +3 -0
- package/lib/escapeJsStringLiteral.d.ts.map +1 -0
- package/lib/escapeJsStringLiteral.js +7 -6
- package/lib/escapeJsStringLiteral.js.map +1 -0
- package/lib/extractReferencedCustomPropertyNames.d.ts +3 -0
- package/lib/extractReferencedCustomPropertyNames.d.ts.map +1 -0
- package/lib/extractReferencedCustomPropertyNames.js +15 -16
- package/lib/extractReferencedCustomPropertyNames.js.map +1 -0
- package/lib/extractVisibleText.d.ts +7 -0
- package/lib/extractVisibleText.d.ts.map +1 -0
- package/lib/extractVisibleText.js +110 -119
- package/lib/extractVisibleText.js.map +1 -0
- package/lib/findCustomPropertyDefinitions.d.ts +8 -0
- package/lib/findCustomPropertyDefinitions.d.ts.map +1 -0
- package/lib/findCustomPropertyDefinitions.js +41 -48
- package/lib/findCustomPropertyDefinitions.js.map +1 -0
- package/lib/fontConverter.d.ts +2 -0
- package/lib/fontConverter.d.ts.map +1 -0
- package/lib/fontConverter.js +40 -21
- package/lib/fontConverter.js.map +1 -0
- package/lib/fontConverterWorker.d.ts +2 -0
- package/lib/fontConverterWorker.d.ts.map +1 -0
- package/lib/fontConverterWorker.js +52 -15
- package/lib/fontConverterWorker.js.map +1 -0
- package/lib/fontFaceHelpers.d.ts +64 -0
- package/lib/fontFaceHelpers.d.ts.map +1 -0
- package/lib/fontFaceHelpers.js +237 -249
- package/lib/fontFaceHelpers.js.map +1 -0
- package/lib/fontFeatureHelpers.d.ts +30 -0
- package/lib/fontFeatureHelpers.d.ts.map +1 -0
- package/lib/fontFeatureHelpers.js +277 -212
- package/lib/fontFeatureHelpers.js.map +1 -0
- package/lib/fontTracerWorker.d.ts +11 -0
- package/lib/fontTracerWorker.d.ts.map +1 -0
- package/lib/fontTracerWorker.js +94 -60
- package/lib/fontTracerWorker.js.map +1 -0
- package/lib/gatherStylesheetsWithPredicates.d.ts +26 -0
- package/lib/gatherStylesheetsWithPredicates.d.ts.map +1 -0
- package/lib/gatherStylesheetsWithPredicates.js +75 -84
- package/lib/gatherStylesheetsWithPredicates.js.map +1 -0
- package/lib/getCssRulesByProperty.d.ts +29 -0
- package/lib/getCssRulesByProperty.d.ts.map +1 -0
- package/lib/getCssRulesByProperty.js +316 -316
- package/lib/getCssRulesByProperty.js.map +1 -0
- package/lib/getFontInfo.d.ts +11 -0
- package/lib/getFontInfo.d.ts.map +1 -0
- package/lib/getFontInfo.js +31 -33
- package/lib/getFontInfo.js.map +1 -0
- package/lib/initialValueByProp.d.ts +3 -0
- package/lib/initialValueByProp.d.ts.map +1 -0
- package/lib/initialValueByProp.js +20 -17
- package/lib/initialValueByProp.js.map +1 -0
- package/lib/injectSubsetDefinitions.d.ts +3 -0
- package/lib/injectSubsetDefinitions.d.ts.map +1 -0
- package/lib/injectSubsetDefinitions.js +55 -59
- package/lib/injectSubsetDefinitions.js.map +1 -0
- package/lib/normalizeFontPropertyValue.d.ts +3 -0
- package/lib/normalizeFontPropertyValue.d.ts.map +1 -0
- package/lib/normalizeFontPropertyValue.js +59 -54
- package/lib/normalizeFontPropertyValue.js.map +1 -0
- package/lib/parseCommandLineOptions.d.ts +9 -0
- package/lib/parseCommandLineOptions.d.ts.map +1 -0
- package/lib/parseCommandLineOptions.js +145 -149
- package/lib/parseCommandLineOptions.js.map +1 -0
- package/lib/parseFontVariationSettings.d.ts +3 -0
- package/lib/parseFontVariationSettings.d.ts.map +1 -0
- package/lib/parseFontVariationSettings.js +38 -36
- package/lib/parseFontVariationSettings.js.map +1 -0
- package/lib/progress.d.ts +27 -0
- package/lib/progress.d.ts.map +1 -0
- package/lib/progress.js +51 -54
- package/lib/progress.js.map +1 -0
- package/lib/sfntCache.d.ts +4 -0
- package/lib/sfntCache.d.ts.map +1 -0
- package/lib/sfntCache.js +67 -25
- package/lib/sfntCache.js.map +1 -0
- package/lib/stripLocalTokens.d.ts +3 -0
- package/lib/stripLocalTokens.d.ts.map +1 -0
- package/lib/stripLocalTokens.js +23 -21
- package/lib/stripLocalTokens.js.map +1 -0
- package/lib/subfont.d.ts +22 -1
- package/lib/subfont.d.ts.map +1 -1
- package/lib/subfont.js +7 -6
- package/lib/subfont.js.map +1 -1
- package/lib/subsetFontWithGlyphs.d.ts +4 -0
- package/lib/subsetFontWithGlyphs.d.ts.map +1 -1
- package/lib/subsetFontWithGlyphs.js +73 -14
- package/lib/subsetFontWithGlyphs.js.map +1 -1
- package/lib/subsetFonts.d.ts +1 -5
- package/lib/subsetFonts.d.ts.map +1 -1
- package/lib/subsetFonts.js +18 -17
- package/lib/subsetFonts.js.map +1 -1
- package/lib/subsetGeneration.d.ts +3 -6
- package/lib/subsetGeneration.d.ts.map +1 -1
- package/lib/subsetGeneration.js +42 -9
- package/lib/subsetGeneration.js.map +1 -1
- package/lib/types/shared.d.ts +11 -0
- package/lib/types/shared.d.ts.map +1 -0
- package/lib/types/shared.js +3 -0
- package/lib/types/shared.js.map +1 -0
- package/lib/unicodeRange.d.ts +3 -0
- package/lib/unicodeRange.d.ts.map +1 -0
- package/lib/unicodeRange.js +17 -30
- package/lib/unicodeRange.js.map +1 -0
- package/lib/unquote.d.ts +3 -0
- package/lib/unquote.d.ts.map +1 -0
- package/lib/unquote.js +18 -25
- package/lib/unquote.js.map +1 -0
- package/lib/variationAxes.d.ts +33 -0
- package/lib/variationAxes.d.ts.map +1 -0
- package/lib/variationAxes.js +127 -157
- package/lib/variationAxes.js.map +1 -0
- package/lib/warnAboutMissingGlyphs.d.ts +43 -0
- package/lib/warnAboutMissingGlyphs.d.ts.map +1 -0
- package/lib/warnAboutMissingGlyphs.js +139 -147
- package/lib/warnAboutMissingGlyphs.js.map +1 -0
- package/lib/wasmQueue.d.ts +3 -0
- package/lib/wasmQueue.d.ts.map +1 -0
- package/lib/wasmQueue.js +13 -10
- package/lib/wasmQueue.js.map +1 -0
- package/package.json +3 -2
package/lib/HeadlessBrowser.js
CHANGED
|
@@ -1,226 +1,232 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
+
const urlTools = __importStar(require("urltools"));
|
|
36
|
+
const puppeteer = __importStar(require("puppeteer-core"));
|
|
37
|
+
const pathModule = require("path");
|
|
38
|
+
const os = require("os");
|
|
39
|
+
const browsers_1 = require("@puppeteer/browsers");
|
|
12
40
|
async function transferResults(jsHandle) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
41
|
+
const results = await jsHandle.jsonValue();
|
|
42
|
+
for (const [i, result] of results.entries()) {
|
|
43
|
+
const resultHandle = await jsHandle.getProperty(String(i));
|
|
44
|
+
try {
|
|
45
|
+
const elementHandle = await resultHandle.getProperty('node');
|
|
46
|
+
result.node = elementHandle;
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await resultHandle.dispose();
|
|
50
|
+
}
|
|
21
51
|
}
|
|
22
|
-
|
|
23
|
-
return results;
|
|
52
|
+
return results;
|
|
24
53
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
54
|
+
async function downloadOrLocatePreferredBrowserRevision(extraArgs = [], log = console) {
|
|
55
|
+
if (process.env.PUPPETEER_EXECUTABLE_PATH) {
|
|
56
|
+
return puppeteer.launch({
|
|
57
|
+
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
|
|
58
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox', ...extraArgs],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const cacheDir = pathModule.resolve(__dirname, '..', 'puppeteer-browsers');
|
|
62
|
+
const platform = (0, browsers_1.detectBrowserPlatform)();
|
|
63
|
+
const cache = new browsers_1.Cache(cacheDir);
|
|
64
|
+
const installed = cache.getInstalledBrowsers();
|
|
65
|
+
let executablePath;
|
|
66
|
+
const chromeEntry = installed.find((b) => b.browser === browsers_1.Browser.CHROME);
|
|
67
|
+
if (chromeEntry) {
|
|
68
|
+
executablePath = chromeEntry.executablePath;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Check the default puppeteer cache (~/.cache/puppeteer) before downloading
|
|
72
|
+
const defaultCacheDir = pathModule.join(os.homedir(), '.cache', 'puppeteer');
|
|
73
|
+
const defaultCache = new browsers_1.Cache(defaultCacheDir);
|
|
74
|
+
const defaultInstalled = defaultCache.getInstalledBrowsers();
|
|
75
|
+
const defaultChromeEntry = defaultInstalled.find((b) => b.browser === browsers_1.Browser.CHROME);
|
|
76
|
+
if (defaultChromeEntry) {
|
|
77
|
+
executablePath = defaultChromeEntry.executablePath;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
log.log('Downloading Chrome');
|
|
81
|
+
const result = await (0, browsers_1.install)({
|
|
82
|
+
browser: browsers_1.Browser.CHROME,
|
|
83
|
+
buildId: 'stable',
|
|
84
|
+
cacheDir,
|
|
85
|
+
platform: platform,
|
|
86
|
+
});
|
|
87
|
+
executablePath = result.executablePath;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
31
90
|
return puppeteer.launch({
|
|
32
|
-
|
|
33
|
-
|
|
91
|
+
executablePath,
|
|
92
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox', ...extraArgs],
|
|
34
93
|
});
|
|
35
|
-
}
|
|
36
|
-
const cacheDir = pathModule.resolve(__dirname, '..', 'puppeteer-browsers');
|
|
37
|
-
const platform = detectBrowserPlatform();
|
|
38
|
-
const cache = new Cache(cacheDir);
|
|
39
|
-
const installed = cache.getInstalledBrowsers();
|
|
40
|
-
let executablePath;
|
|
41
|
-
const chromeEntry = installed.find((b) => b.browser === Browser.CHROME);
|
|
42
|
-
if (chromeEntry) {
|
|
43
|
-
executablePath = chromeEntry.executablePath;
|
|
44
|
-
} else {
|
|
45
|
-
// Check the default puppeteer cache (~/.cache/puppeteer) before downloading
|
|
46
|
-
const defaultCacheDir = pathModule.join(
|
|
47
|
-
os.homedir(),
|
|
48
|
-
'.cache',
|
|
49
|
-
'puppeteer'
|
|
50
|
-
);
|
|
51
|
-
const defaultCache = new Cache(defaultCacheDir);
|
|
52
|
-
const defaultInstalled = defaultCache.getInstalledBrowsers();
|
|
53
|
-
const defaultChromeEntry = defaultInstalled.find(
|
|
54
|
-
(b) => b.browser === Browser.CHROME
|
|
55
|
-
);
|
|
56
|
-
if (defaultChromeEntry) {
|
|
57
|
-
executablePath = defaultChromeEntry.executablePath;
|
|
58
|
-
} else {
|
|
59
|
-
log.log('Downloading Chrome');
|
|
60
|
-
const result = await install({
|
|
61
|
-
browser: Browser.CHROME,
|
|
62
|
-
buildId: 'stable',
|
|
63
|
-
cacheDir,
|
|
64
|
-
platform,
|
|
65
|
-
});
|
|
66
|
-
executablePath = result.executablePath;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return puppeteer.launch({
|
|
70
|
-
executablePath,
|
|
71
|
-
args: ['--no-sandbox', '--disable-setuid-sandbox', ...extraArgs],
|
|
72
|
-
});
|
|
73
94
|
}
|
|
74
|
-
|
|
75
95
|
class HeadlessBrowser {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
// Clear the cached promise on failure so a subsequent call can retry.
|
|
84
|
-
if (!this._launchPromise) {
|
|
85
|
-
this._launchPromise = downloadOrLocatePreferredBrowserRevision(
|
|
86
|
-
this._chromeArgs,
|
|
87
|
-
this.console
|
|
88
|
-
).catch((err) => {
|
|
89
|
-
this._launchPromise = undefined;
|
|
90
|
-
throw err;
|
|
91
|
-
});
|
|
96
|
+
console;
|
|
97
|
+
_chromeArgs;
|
|
98
|
+
_launchPromise;
|
|
99
|
+
_closed = false;
|
|
100
|
+
constructor({ console, chromeArgs = [] }) {
|
|
101
|
+
this.console = console;
|
|
102
|
+
this._chromeArgs = chromeArgs;
|
|
92
103
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
async tracePage(htmlAsset) {
|
|
97
|
-
const assetGraph = htmlAsset.assetGraph;
|
|
98
|
-
const browser = await this._launchBrowserMemoized();
|
|
99
|
-
const page = await browser.newPage();
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
// Make up a base url to map to the assetgraph root.
|
|
103
|
-
// Use the canonical root if available, so that it'll be
|
|
104
|
-
// easier to handle absolute and protocol-relative urls pointing
|
|
105
|
-
// at it, as well as fall through to the actual domain if some
|
|
106
|
-
// assets aren't found in the graph.
|
|
107
|
-
const baseUrl = assetGraph.canonicalRoot
|
|
108
|
-
? assetGraph.canonicalRoot.replace(/\/?$/, '/')
|
|
109
|
-
: 'https://example.com/';
|
|
110
|
-
|
|
111
|
-
// Intercept all requests made by the headless browser, and
|
|
112
|
-
// fake a response from the assetgraph instance if the corresponding
|
|
113
|
-
// asset is found there:
|
|
114
|
-
await page.setRequestInterception(true);
|
|
115
|
-
page.on('request', (request) => {
|
|
116
|
-
const url = request.url();
|
|
117
|
-
if (url.startsWith(baseUrl)) {
|
|
118
|
-
let agUrl = url.replace(baseUrl, assetGraph.root);
|
|
119
|
-
if (/\/$/.test(agUrl)) {
|
|
120
|
-
agUrl += 'index.html';
|
|
121
|
-
}
|
|
122
|
-
const asset = assetGraph.findAssets({
|
|
123
|
-
isLoaded: true,
|
|
124
|
-
url: agUrl,
|
|
125
|
-
})[0];
|
|
126
|
-
if (asset) {
|
|
127
|
-
request.respond({
|
|
128
|
-
status: 200,
|
|
129
|
-
contentType: asset.contentType,
|
|
130
|
-
body: asset.rawSrc,
|
|
131
|
-
});
|
|
132
|
-
} else {
|
|
133
|
-
// Asset not in graph — return 404 instead of letting the
|
|
134
|
-
// request hit the network (baseUrl is synthetic).
|
|
135
|
-
request.respond({ status: 404, body: '' });
|
|
136
|
-
}
|
|
137
|
-
return;
|
|
104
|
+
_launchBrowserMemoized() {
|
|
105
|
+
if (this._closed) {
|
|
106
|
+
return Promise.reject(new Error('HeadlessBrowser is closed'));
|
|
138
107
|
}
|
|
139
|
-
if (
|
|
140
|
-
|
|
141
|
-
|
|
108
|
+
if (!this._launchPromise) {
|
|
109
|
+
this._launchPromise = downloadOrLocatePreferredBrowserRevision(this._chromeArgs, this.console).catch((err) => {
|
|
110
|
+
this._launchPromise = undefined;
|
|
111
|
+
throw err;
|
|
112
|
+
});
|
|
142
113
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
114
|
+
return this._launchPromise;
|
|
115
|
+
}
|
|
116
|
+
async tracePage(htmlAsset) {
|
|
117
|
+
const assetGraph = htmlAsset.assetGraph;
|
|
118
|
+
const browser = await this._launchBrowserMemoized();
|
|
119
|
+
const page = await browser.newPage();
|
|
120
|
+
try {
|
|
121
|
+
// Make up a base url to map to the assetgraph root.
|
|
122
|
+
const baseUrl = assetGraph.canonicalRoot
|
|
123
|
+
? assetGraph.canonicalRoot.replace(/\/?$/, '/')
|
|
124
|
+
: '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:
|
|
128
|
+
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);
|
|
184
|
+
// Prevent the CSP of the page from rejecting our injection of font-tracer
|
|
185
|
+
await page.setBypassCSP(true);
|
|
186
|
+
await page.goto(urlTools.resolveUrl(baseUrl, urlTools.buildRelativeUrl(assetGraph.root, htmlAsset.url)), { timeout: 30000 });
|
|
187
|
+
await page.addScriptTag({
|
|
188
|
+
path: require.resolve('font-tracer/dist/fontTracer.browser.js'),
|
|
189
|
+
});
|
|
190
|
+
// The injected font-tracer.browser.js script attaches a global
|
|
191
|
+
// `fontTracer`. The closure runs inside the browser, so the global
|
|
192
|
+
// is present at runtime even though TS can't know about it.
|
|
193
|
+
const jsHandle = await page.evaluateHandle(
|
|
194
|
+
/* istanbul ignore next */
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
196
|
+
() => globalThis.fontTracer(document));
|
|
197
|
+
try {
|
|
198
|
+
// puppeteer's evaluateHandle return type is generic over the page
|
|
199
|
+
// closure; bridge it to the local minimal shape.
|
|
200
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
201
|
+
return await transferResults(jsHandle);
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
await jsHandle.dispose();
|
|
205
|
+
}
|
|
160
206
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
page.on('pageerror', (err) => {
|
|
164
|
-
// Puppeteer v24+ passes Error objects; format stack to match v19 style
|
|
165
|
-
if (err instanceof Error && err.stack) {
|
|
166
|
-
// Normalize "at <anonymous> (url:line:col)" to "at url:line:col"
|
|
167
|
-
const normalized = err.stack.replace(
|
|
168
|
-
/at <anonymous> \((.+)\)/g,
|
|
169
|
-
'at $1'
|
|
170
|
-
);
|
|
171
|
-
this.console.error(normalized);
|
|
172
|
-
} else if (err instanceof Error) {
|
|
173
|
-
this.console.error(`${err.name}: ${err.message}`);
|
|
174
|
-
} else {
|
|
175
|
-
this.console.error(err);
|
|
207
|
+
finally {
|
|
208
|
+
await page.close();
|
|
176
209
|
}
|
|
177
|
-
});
|
|
178
|
-
page.on('error', this.console.error);
|
|
179
|
-
|
|
180
|
-
// Prevent the CSP of the page from rejecting our injection of font-tracer
|
|
181
|
-
await page.setBypassCSP(true);
|
|
182
|
-
|
|
183
|
-
await page.goto(
|
|
184
|
-
urlTools.resolveUrl(
|
|
185
|
-
baseUrl,
|
|
186
|
-
urlTools.buildRelativeUrl(assetGraph.root, htmlAsset.url)
|
|
187
|
-
),
|
|
188
|
-
{ timeout: 30000 }
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
await page.addScriptTag({
|
|
192
|
-
path: require.resolve('font-tracer/dist/fontTracer.browser.js'),
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
const jsHandle = await page.evaluateHandle(
|
|
196
|
-
/* global fontTracer */
|
|
197
|
-
/* istanbul ignore next */
|
|
198
|
-
() => fontTracer(document)
|
|
199
|
-
);
|
|
200
|
-
try {
|
|
201
|
-
return await transferResults(jsHandle);
|
|
202
|
-
} finally {
|
|
203
|
-
await jsHandle.dispose();
|
|
204
|
-
}
|
|
205
|
-
} finally {
|
|
206
|
-
await page.close();
|
|
207
210
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
211
|
+
async close() {
|
|
212
|
+
// Set _closed *before* awaiting so any concurrent tracePage() that hasn't
|
|
213
|
+
// yet entered _launchBrowserMemoized fails fast instead of starting a
|
|
214
|
+
// second browser we won't clean up.
|
|
215
|
+
this._closed = true;
|
|
216
|
+
const launchPromise = this._launchPromise;
|
|
217
|
+
this._launchPromise = undefined;
|
|
218
|
+
if (launchPromise) {
|
|
219
|
+
let browser;
|
|
220
|
+
try {
|
|
221
|
+
browser = await launchPromise;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Launch failed — nothing to close
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
await browser.close();
|
|
228
|
+
}
|
|
222
229
|
}
|
|
223
|
-
}
|
|
224
230
|
}
|
|
225
|
-
|
|
226
231
|
module.exports = HeadlessBrowser;
|
|
232
|
+
//# sourceMappingURL=HeadlessBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeadlessBrowser.js","sourceRoot":"","sources":["../src/HeadlessBrowser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codepointMaps.d.ts","sourceRoot":"","sources":["../src/codepointMaps.ts"],"names":[],"mappings":"AAgFA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAarD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Codepoint range tables used to gate optional table dropping and to map
|
|
3
|
+
// codepoints to OpenType script tags. Ranges are deliberately a small
|
|
4
|
+
// hardcoded list, not a faithful transcription of every Unicode block —
|
|
5
|
+
// getting common cases right is enough; an unmapped codepoint just means
|
|
6
|
+
// we keep the table or skip the script.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.pageNeedsMathTable = pageNeedsMathTable;
|
|
9
|
+
exports.pageNeedsColorTables = pageNeedsColorTables;
|
|
10
|
+
exports.scriptsForText = scriptsForText;
|
|
11
|
+
const MATH_RANGES = [
|
|
12
|
+
{ min: 0x2190, max: 0x21ff }, // Arrows (commonly used as math operators)
|
|
13
|
+
{ min: 0x2200, max: 0x22ff }, // Mathematical Operators
|
|
14
|
+
{ min: 0x27c0, max: 0x27ef }, // Misc Mathematical Symbols-A
|
|
15
|
+
{ min: 0x2980, max: 0x29ff }, // Misc Mathematical Symbols-B
|
|
16
|
+
{ min: 0x2a00, max: 0x2aff }, // Supplemental Mathematical Operators
|
|
17
|
+
{ min: 0x1d400, max: 0x1d7ff }, // Mathematical Alphanumeric Symbols
|
|
18
|
+
];
|
|
19
|
+
const EMOJI_RANGES = [
|
|
20
|
+
{ min: 0x2600, max: 0x26ff }, // Misc Symbols (☀, ☂, ☎, …)
|
|
21
|
+
{ min: 0x2700, max: 0x27bf }, // Dingbats
|
|
22
|
+
{ min: 0x1f000, max: 0x1f02f }, // Mahjong Tiles
|
|
23
|
+
{ min: 0x1f0a0, max: 0x1f0ff }, // Playing Cards
|
|
24
|
+
{ min: 0x1f300, max: 0x1f5ff }, // Misc Symbols and Pictographs
|
|
25
|
+
{ min: 0x1f600, max: 0x1f64f }, // Emoticons
|
|
26
|
+
{ min: 0x1f680, max: 0x1f6ff }, // Transport and Map Symbols
|
|
27
|
+
{ min: 0x1f700, max: 0x1f77f }, // Alchemical Symbols
|
|
28
|
+
{ min: 0x1f900, max: 0x1f9ff }, // Supplemental Symbols and Pictographs
|
|
29
|
+
{ min: 0x1fa70, max: 0x1faff }, // Symbols and Pictographs Extended-A
|
|
30
|
+
];
|
|
31
|
+
// Latin ranges are intentionally omitted: scriptsForText() always seeds
|
|
32
|
+
// the result set with 'latn', so any Latin codepoint already counts.
|
|
33
|
+
const SCRIPT_RANGES = [
|
|
34
|
+
{ min: 0x0370, max: 0x03ff, tag: 'grek' }, // Greek and Coptic
|
|
35
|
+
{ min: 0x1f00, max: 0x1fff, tag: 'grek' }, // Greek Extended
|
|
36
|
+
{ min: 0x0400, max: 0x052f, tag: 'cyrl' }, // Cyrillic + Supplement
|
|
37
|
+
{ min: 0x2de0, max: 0x2dff, tag: 'cyrl' }, // Cyrillic Extended-A
|
|
38
|
+
{ min: 0xa640, max: 0xa69f, tag: 'cyrl' }, // Cyrillic Extended-B
|
|
39
|
+
{ min: 0x0590, max: 0x05ff, tag: 'hebr' }, // Hebrew
|
|
40
|
+
{ min: 0x0600, max: 0x06ff, tag: 'arab' }, // Arabic
|
|
41
|
+
{ min: 0x0750, max: 0x077f, tag: 'arab' }, // Arabic Supplement
|
|
42
|
+
{ min: 0xfb50, max: 0xfdff, tag: 'arab' }, // Arabic Presentation Forms-A
|
|
43
|
+
{ min: 0xfe70, max: 0xfeff, tag: 'arab' }, // Arabic Presentation Forms-B
|
|
44
|
+
{ min: 0x0900, max: 0x097f, tag: 'deva' }, // Devanagari
|
|
45
|
+
{ min: 0x0980, max: 0x09ff, tag: 'beng' }, // Bengali
|
|
46
|
+
{ min: 0x0a00, max: 0x0a7f, tag: 'guru' }, // Gurmukhi (Punjabi)
|
|
47
|
+
{ min: 0x0a80, max: 0x0aff, tag: 'gujr' }, // Gujarati
|
|
48
|
+
{ min: 0x0b80, max: 0x0bff, tag: 'taml' }, // Tamil
|
|
49
|
+
{ min: 0x0c00, max: 0x0c7f, tag: 'telu' }, // Telugu
|
|
50
|
+
{ min: 0x0c80, max: 0x0cff, tag: 'knda' }, // Kannada
|
|
51
|
+
{ min: 0x0d00, max: 0x0d7f, tag: 'mlym' }, // Malayalam
|
|
52
|
+
{ min: 0x3040, max: 0x30ff, tag: 'kana' }, // Hiragana / Katakana
|
|
53
|
+
{ min: 0x1100, max: 0x11ff, tag: 'hang' }, // Hangul Jamo
|
|
54
|
+
{ min: 0x3130, max: 0x318f, tag: 'hang' }, // Hangul Compatibility Jamo
|
|
55
|
+
{ min: 0xac00, max: 0xd7af, tag: 'hang' }, // Hangul Syllables
|
|
56
|
+
{ min: 0x3400, max: 0x4dbf, tag: 'hani' }, // CJK Extension A
|
|
57
|
+
{ min: 0x4e00, max: 0x9fff, tag: 'hani' }, // CJK Unified Ideographs
|
|
58
|
+
{ min: 0xf900, max: 0xfaff, tag: 'hani' }, // CJK Compatibility Ideographs
|
|
59
|
+
{ min: 0x20000, max: 0x2a6df, tag: 'hani' }, // CJK Extension B
|
|
60
|
+
];
|
|
61
|
+
function inRange(cp, r) {
|
|
62
|
+
return cp >= r.min && cp <= r.max;
|
|
63
|
+
}
|
|
64
|
+
function textHitsRanges(text, ranges) {
|
|
65
|
+
for (const ch of text) {
|
|
66
|
+
const cp = ch.codePointAt(0);
|
|
67
|
+
if (cp === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
for (const r of ranges)
|
|
70
|
+
if (inRange(cp, r))
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
function pageNeedsMathTable(text) {
|
|
76
|
+
return textHitsRanges(text, MATH_RANGES);
|
|
77
|
+
}
|
|
78
|
+
function pageNeedsColorTables(text) {
|
|
79
|
+
return textHitsRanges(text, EMOJI_RANGES);
|
|
80
|
+
}
|
|
81
|
+
// Returns the OpenType script tags exercised by `text`, plus the safety
|
|
82
|
+
// pair `DFLT` (default script) and `latn` (most fonts ship Latin fallback
|
|
83
|
+
// even when used for other scripts).
|
|
84
|
+
function scriptsForText(text) {
|
|
85
|
+
const tags = new Set(['DFLT', 'latn']);
|
|
86
|
+
for (const ch of text) {
|
|
87
|
+
const cp = ch.codePointAt(0);
|
|
88
|
+
if (cp === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
for (const r of SCRIPT_RANGES) {
|
|
91
|
+
if (inRange(cp, r)) {
|
|
92
|
+
tags.add(r.tag);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return [...tags];
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=codepointMaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codepointMaps.js","sourceRoot":"","sources":["../src/codepointMaps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectFeatureGlyphIds.d.ts","sourceRoot":"","sources":["../src/collectFeatureGlyphIds.ts"],"names":[],"mappings":"AAiJA,iBAAS,sBAAsB,CAC7B,UAAU,EAAE,MAAM,GAAG,UAAU,EAC/B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAInB;AAED,SAAS,sBAAsB,CAAC"}
|