extension 4.1.34 → 4.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/597.cjs +4 -0
- package/dist/browsers.cjs +101 -27
- package/dist/cli.cjs +545 -308
- package/dist/extension/browsers/browsers-lib/official-chrome.d.ts +2 -0
- package/dist/extension/browsers/browsers-lib/rename-with-retry.d.ts +6 -0
- package/dist/extension/browsers/run-chromium/cdp/cdp-extension-controller/ensure.d.ts +1 -0
- package/dist/extension/config-types.d.ts +6 -0
- package/dist/extension/helpers/cli-argv.d.ts +1 -0
- package/dist/extension/helpers/cli-failure.d.ts +1 -0
- package/dist/extension/helpers/dependency-install-outcome.d.ts +9 -0
- package/dist/extension/helpers/exit-after-drain.d.ts +1 -0
- package/dist/extension/helpers/known-commands.d.ts +2 -0
- package/dist/extension/helpers/messages.d.ts +3 -1
- package/dist/extension/helpers/messaging.d.ts +1 -0
- package/dist/extension/helpers/node-version-guard.d.ts +1 -0
- package/dist/extension/helpers/project-name-prompt.d.ts +4 -0
- package/dist/extension/helpers/telemetry-cli.d.ts +7 -4
- package/dist/extension/helpers/telemetry.d.ts +5 -0
- package/dist/extension/helpers/template-catalog.d.ts +1 -1
- package/dist/extension/helpers/template-corpus.generated.d.ts +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -120,6 +120,7 @@ Useful flags:
|
|
|
120
120
|
- `--zip` packages the build into a ZIP ready for store upload
|
|
121
121
|
- `--zip-source` includes source files for store source-code review
|
|
122
122
|
- `--zip-filename <name>` controls the output filename, written as `dist/<name>-<browser>.zip`
|
|
123
|
+
- `--out-dir <path>` writes the build to `<path>/<browser>` instead of `dist/<browser>`, so a build can run beside a dev session
|
|
123
124
|
- `--polyfill` enables the cross-browser webextension polyfill
|
|
124
125
|
|
|
125
126
|
## Manage browser binaries
|
package/dist/597.cjs
CHANGED
|
@@ -81,6 +81,10 @@ exports.modules = {
|
|
|
81
81
|
if (PROTOCOL_ERROR_CODES.has(result.code) || !result.message) return {
|
|
82
82
|
status: 'unknown'
|
|
83
83
|
};
|
|
84
|
+
if ('number' != typeof result.code) return {
|
|
85
|
+
status: 'unknown',
|
|
86
|
+
transportError: result.message
|
|
87
|
+
};
|
|
84
88
|
return {
|
|
85
89
|
status: 'refused',
|
|
86
90
|
reason: result.message
|
package/dist/browsers.cjs
CHANGED
|
@@ -507,7 +507,8 @@ var __webpack_modules__ = {
|
|
|
507
507
|
var _helpers_messaging__rspack_import_9 = __webpack_require__("./helpers/messaging.ts");
|
|
508
508
|
var _run_firefox_firefox_launch_librewolf_overrides__rspack_import_10 = __webpack_require__("./browsers/run-firefox/firefox-launch/librewolf-overrides.ts");
|
|
509
509
|
var _browser_family__rspack_import_11 = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
|
|
510
|
-
var
|
|
510
|
+
var _official_chrome__rspack_import_12 = __webpack_require__("./browsers/browsers-lib/official-chrome.ts");
|
|
511
|
+
var _output_binaries_resolver__rspack_import_13 = __webpack_require__("./browsers/browsers-lib/output-binaries-resolver.ts");
|
|
511
512
|
const require1 = (0, node_module__rspack_import_1.createRequire)(__rslib_import_meta_url__);
|
|
512
513
|
function getLoggingPrefix(type) {
|
|
513
514
|
return (0, _helpers_messaging__rspack_import_9.Pl)(type);
|
|
@@ -591,7 +592,7 @@ var __webpack_modules__ = {
|
|
|
591
592
|
if (opts?.pinned) return '';
|
|
592
593
|
const managedKey = 'chromium' === browser || 'chromium-based' === browser ? 'chromium' : 'chrome' === browser || 'edge' === browser || 'firefox' === browser ? browser : void 0;
|
|
593
594
|
if (managedKey) try {
|
|
594
|
-
const managed = (0,
|
|
595
|
+
const managed = (0, _output_binaries_resolver__rspack_import_13.kI)({}, managedKey);
|
|
595
596
|
if (managed && node_fs__rspack_import_0.existsSync(managed)) {
|
|
596
597
|
if ('chromium' === managedKey) return (0, chromium_location__rspack_import_5.getChromiumVersion)(managed) || 'Chromium';
|
|
597
598
|
if ('chrome' === managedKey) return (0, chrome_location2__rspack_import_4.getChromeVersion)(managed) || 'Chrome';
|
|
@@ -602,22 +603,23 @@ var __webpack_modules__ = {
|
|
|
602
603
|
try {
|
|
603
604
|
if ('chromium' === browser || 'chromium-based' === browser) {
|
|
604
605
|
const p = chromium_location__rspack_import_5_default()(true, {
|
|
605
|
-
env: (0,
|
|
606
|
+
env: (0, _output_binaries_resolver__rspack_import_13.Gg)('chromium')
|
|
606
607
|
});
|
|
607
608
|
if (p && 'string' == typeof p && node_fs__rspack_import_0.existsSync(p)) return (0, chromium_location__rspack_import_5.getChromiumVersion)(p) || 'Chromium';
|
|
608
609
|
} else if ('chrome' === browser) {
|
|
609
610
|
const p = chrome_location2__rspack_import_4_default()(true, {
|
|
610
|
-
env: (0,
|
|
611
|
+
env: (0, _output_binaries_resolver__rspack_import_13.Gg)('chrome')
|
|
611
612
|
});
|
|
613
|
+
if (p && 'string' == typeof p && (0, _official_chrome__rspack_import_12.g)(p)) return '';
|
|
612
614
|
if (p && 'string' == typeof p && node_fs__rspack_import_0.existsSync(p)) return (0, chrome_location2__rspack_import_4.getChromeVersion)(p) || 'Chrome';
|
|
613
615
|
} else if ('edge' === browser) {
|
|
614
616
|
const p = edge_location__rspack_import_6_default()(true, {
|
|
615
|
-
env: (0,
|
|
617
|
+
env: (0, _output_binaries_resolver__rspack_import_13.Gg)('edge')
|
|
616
618
|
});
|
|
617
619
|
if (p && 'string' == typeof p && node_fs__rspack_import_0.existsSync(p)) return (0, edge_location__rspack_import_6.getEdgeVersion)(p) || 'Microsoft Edge';
|
|
618
620
|
} else if ('firefox' === browser) {
|
|
619
621
|
const p = firefox_location2__rspack_import_7_default()(true, {
|
|
620
|
-
env: (0,
|
|
622
|
+
env: (0, _output_binaries_resolver__rspack_import_13.Gg)('firefox')
|
|
621
623
|
});
|
|
622
624
|
if (p && 'string' == typeof p && node_fs__rspack_import_0.existsSync(p)) return (0, firefox_location2__rspack_import_7.getFirefoxVersion)(p) || 'Firefox';
|
|
623
625
|
}
|
|
@@ -1339,6 +1341,24 @@ var __webpack_modules__ = {
|
|
|
1339
1341
|
c: ()=>manifestDeclaresNewtabOverride
|
|
1340
1342
|
});
|
|
1341
1343
|
},
|
|
1344
|
+
"./browsers/browsers-lib/official-chrome.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
1345
|
+
var _wsl_support__rspack_import_0 = __webpack_require__("./browsers/browsers-lib/wsl-support.ts");
|
|
1346
|
+
function looksOfficialChromeBinaryPath(bin) {
|
|
1347
|
+
const p = String(bin || '');
|
|
1348
|
+
if (!p) return false;
|
|
1349
|
+
if (/\/Applications\/Google Chrome(?: (?:Beta|Dev|Canary))?\.app\/Contents\/MacOS\/Google Chrome/i.test(p)) return true;
|
|
1350
|
+
if (/\\Google\\Chrome\\Application\\chrome\.exe$/i.test(p)) return true;
|
|
1351
|
+
if (/\/opt\/google\/chrome\//i.test(p)) return true;
|
|
1352
|
+
if (/\/google-chrome(?:-stable)?$/i.test(p)) return true;
|
|
1353
|
+
return false;
|
|
1354
|
+
}
|
|
1355
|
+
function isRefusedOfficialChrome(bin) {
|
|
1356
|
+
return looksOfficialChromeBinaryPath(bin) && !(0, _wsl_support__rspack_import_0.EV)();
|
|
1357
|
+
}
|
|
1358
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
1359
|
+
g: ()=>isRefusedOfficialChrome
|
|
1360
|
+
});
|
|
1361
|
+
},
|
|
1342
1362
|
"./browsers/browsers-lib/output-binaries-resolver.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
1343
1363
|
var node_fs__rspack_import_0 = __webpack_require__("node:fs");
|
|
1344
1364
|
var node_path__rspack_import_1 = __webpack_require__("node:path");
|
|
@@ -1795,11 +1815,12 @@ var __webpack_modules__ = {
|
|
|
1795
1815
|
var external_node_fs_ = __webpack_require__("node:fs");
|
|
1796
1816
|
var external_node_path_ = __webpack_require__("node:path");
|
|
1797
1817
|
var messaging = __webpack_require__("./helpers/messaging.ts");
|
|
1818
|
+
var rename_with_retry = __webpack_require__("./browsers/browsers-lib/rename-with-retry.ts");
|
|
1798
1819
|
function writeJsonAtomic(filePath, value) {
|
|
1799
1820
|
const tmpPath = `${filePath}.tmp-${process.pid}`;
|
|
1800
1821
|
try {
|
|
1801
1822
|
external_node_fs_.writeFileSync(tmpPath, JSON.stringify(value, null, 2), 'utf-8');
|
|
1802
|
-
|
|
1823
|
+
(0, rename_with_retry.O)(tmpPath, filePath);
|
|
1803
1824
|
return true;
|
|
1804
1825
|
} catch {
|
|
1805
1826
|
try {
|
|
@@ -1891,7 +1912,10 @@ var __webpack_modules__ = {
|
|
|
1891
1912
|
if ('number' == typeof details?.browserPid && Number.isFinite(details.browserPid)) ready.browserPid = details.browserPid;
|
|
1892
1913
|
if ('number' == typeof details?.launcherPid && Number.isFinite(details.launcherPid)) ready.launcherPid = details.launcherPid;
|
|
1893
1914
|
const extensionId = String(details?.extensionId || '').trim();
|
|
1894
|
-
if (extensionId
|
|
1915
|
+
if (extensionId && 'browser' !== ready.extensionIdSource) {
|
|
1916
|
+
ready.extensionId = extensionId;
|
|
1917
|
+
ready.extensionIdSource = 'derived';
|
|
1918
|
+
}
|
|
1895
1919
|
const binary = String(details?.binary || '').trim();
|
|
1896
1920
|
if (binary) ready.binary = binary;
|
|
1897
1921
|
const provenance = String(details?.binaryProvenance || '').trim();
|
|
@@ -1953,8 +1977,9 @@ var __webpack_modules__ = {
|
|
|
1953
1977
|
const readyPath = readyPathFor(extensionOutputPath);
|
|
1954
1978
|
if (!external_node_fs_.existsSync(readyPath)) return;
|
|
1955
1979
|
const ready = JSON.parse(external_node_fs_.readFileSync(readyPath, 'utf-8'));
|
|
1956
|
-
if (ready.extensionId === id) return;
|
|
1980
|
+
if (ready.extensionId === id && 'browser' === ready.extensionIdSource) return;
|
|
1957
1981
|
ready.extensionId = id;
|
|
1982
|
+
ready.extensionIdSource = 'browser';
|
|
1958
1983
|
writeJsonAtomic(readyPath, ready);
|
|
1959
1984
|
} catch {}
|
|
1960
1985
|
}
|
|
@@ -2013,6 +2038,42 @@ var __webpack_modules__ = {
|
|
|
2013
2038
|
} catch {}
|
|
2014
2039
|
}
|
|
2015
2040
|
},
|
|
2041
|
+
"./browsers/browsers-lib/rename-with-retry.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
2042
|
+
var node_fs__rspack_import_0 = __webpack_require__("node:fs");
|
|
2043
|
+
const RETRYABLE_RENAME_CODES = new Set([
|
|
2044
|
+
'EPERM',
|
|
2045
|
+
'EACCES',
|
|
2046
|
+
'EBUSY'
|
|
2047
|
+
]);
|
|
2048
|
+
const RENAME_RETRY_DELAYS_MS = [
|
|
2049
|
+
10,
|
|
2050
|
+
20,
|
|
2051
|
+
40,
|
|
2052
|
+
80,
|
|
2053
|
+
160,
|
|
2054
|
+
320
|
|
2055
|
+
];
|
|
2056
|
+
function sleepSync(ms) {
|
|
2057
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
2058
|
+
}
|
|
2059
|
+
function renameSyncWithRetry(from, to, options = {}) {
|
|
2060
|
+
const platform = options.platform ?? process.platform;
|
|
2061
|
+
const rename = options.rename ?? node_fs__rspack_import_0.renameSync;
|
|
2062
|
+
const sleep = options.sleep ?? sleepSync;
|
|
2063
|
+
for(let attempt = 0;; attempt++)try {
|
|
2064
|
+
rename(from, to);
|
|
2065
|
+
return;
|
|
2066
|
+
} catch (error) {
|
|
2067
|
+
const code = error?.code;
|
|
2068
|
+
const delay = RENAME_RETRY_DELAYS_MS[attempt];
|
|
2069
|
+
if ('win32' !== platform || !code || !RETRYABLE_RENAME_CODES.has(code) || void 0 === delay) throw error;
|
|
2070
|
+
sleep(delay);
|
|
2071
|
+
}
|
|
2072
|
+
}
|
|
2073
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
2074
|
+
O: ()=>renameSyncWithRetry
|
|
2075
|
+
});
|
|
2076
|
+
},
|
|
2016
2077
|
"./browsers/browsers-lib/resolve-live-pid.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
2017
2078
|
var node_child_process__rspack_import_0 = __webpack_require__("node:child_process");
|
|
2018
2079
|
var node_fs__rspack_import_1 = __webpack_require__("node:fs");
|
|
@@ -2448,22 +2509,33 @@ var __webpack_modules__ = {
|
|
|
2448
2509
|
}
|
|
2449
2510
|
function mergeChromiumFeatureSwitches(flags) {
|
|
2450
2511
|
const merged = [];
|
|
2512
|
+
const prefixes = [
|
|
2513
|
+
'--enable-features=',
|
|
2514
|
+
'--disable-features='
|
|
2515
|
+
];
|
|
2451
2516
|
const featureValues = {
|
|
2452
2517
|
'--enable-features=': [],
|
|
2453
2518
|
'--disable-features=': []
|
|
2454
2519
|
};
|
|
2520
|
+
const featureName = (value)=>value.split(/[<:]/)[0].trim();
|
|
2455
2521
|
for (const flag of flags){
|
|
2456
|
-
const prefix =
|
|
2522
|
+
const prefix = prefixes.find((p)=>flag.startsWith(p));
|
|
2457
2523
|
if (!prefix) {
|
|
2458
2524
|
merged.push(flag);
|
|
2459
2525
|
continue;
|
|
2460
2526
|
}
|
|
2461
2527
|
for (const value of flag.slice(prefix.length).split(',')){
|
|
2462
2528
|
const trimmed = value.trim();
|
|
2463
|
-
if (
|
|
2529
|
+
if (!trimmed) continue;
|
|
2530
|
+
const name = featureName(trimmed);
|
|
2531
|
+
for (const other of prefixes)featureValues[other] = featureValues[other].filter((existing)=>featureName(existing) !== name);
|
|
2532
|
+
featureValues[prefix].push(trimmed);
|
|
2464
2533
|
}
|
|
2465
2534
|
}
|
|
2466
|
-
for (const
|
|
2535
|
+
for (const prefix of prefixes){
|
|
2536
|
+
const values = featureValues[prefix];
|
|
2537
|
+
if (values.length) merged.push(`${prefix}${values.join(',')}`);
|
|
2538
|
+
}
|
|
2467
2539
|
return merged;
|
|
2468
2540
|
}
|
|
2469
2541
|
async function findAvailablePortNear(startPort, maxAttempts = 20, host = '127.0.0.1') {
|
|
@@ -3268,8 +3340,8 @@ var __webpack_modules__ = {
|
|
|
3268
3340
|
var messaging = __webpack_require__("./helpers/messaging.ts");
|
|
3269
3341
|
var banner = __webpack_require__("./browsers/browsers-lib/banner.ts");
|
|
3270
3342
|
var browser_family = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
|
|
3271
|
-
|
|
3272
|
-
var external_node_readline_default = /*#__PURE__*/ __webpack_require__.n(
|
|
3343
|
+
var external_node_readline_ = __webpack_require__("node:readline");
|
|
3344
|
+
var external_node_readline_default = /*#__PURE__*/ __webpack_require__.n(external_node_readline_);
|
|
3273
3345
|
var browser_install_outcome = __webpack_require__("./helpers/browser-install-outcome.ts");
|
|
3274
3346
|
var messages = __webpack_require__("./browsers/browsers-lib/messages.ts");
|
|
3275
3347
|
var output_binaries_resolver = __webpack_require__("./browsers/browsers-lib/output-binaries-resolver.ts");
|
|
@@ -3548,6 +3620,7 @@ var __webpack_modules__ = {
|
|
|
3548
3620
|
return false;
|
|
3549
3621
|
}
|
|
3550
3622
|
}
|
|
3623
|
+
var official_chrome = __webpack_require__("./browsers/browsers-lib/official-chrome.ts");
|
|
3551
3624
|
var pinned_binary = __webpack_require__("./browsers/browsers-lib/pinned-binary.ts");
|
|
3552
3625
|
var process_teardown = __webpack_require__("./browsers/browsers-lib/process-teardown.ts");
|
|
3553
3626
|
var ready_message = __webpack_require__("./browsers/browsers-lib/ready-message.ts");
|
|
@@ -4281,15 +4354,6 @@ var __webpack_modules__ = {
|
|
|
4281
4354
|
}
|
|
4282
4355
|
if (!binaryPinnedByFlag) browserBinaryLocation = preferRealChromeBinary(browserBinaryLocation);
|
|
4283
4356
|
const getBrowserVersionLine = (bin)=>(0, version_probe.yO)(bin, String(browser || ''));
|
|
4284
|
-
const looksOfficialChromeBinaryPath = (bin)=>{
|
|
4285
|
-
const p = String(bin || '');
|
|
4286
|
-
if (!p) return false;
|
|
4287
|
-
if (/\/Applications\/Google Chrome(?: (?:Beta|Dev|Canary))?\.app\/Contents\/MacOS\/Google Chrome/i.test(p)) return true;
|
|
4288
|
-
if (/\\Google\\Chrome\\Application\\chrome\.exe$/i.test(p)) return true;
|
|
4289
|
-
if (/\/opt\/google\/chrome\//i.test(p)) return true;
|
|
4290
|
-
if (/\/google-chrome(?:-stable)?$/i.test(p)) return true;
|
|
4291
|
-
return false;
|
|
4292
|
-
};
|
|
4293
4357
|
const managedCacheRoot = output_binaries_resolver.LB(compilation);
|
|
4294
4358
|
const managedEnvFor = (b)=>(0, locator_env.i)(process.env, output_binaries_resolver.$4(String(managedCacheRoot), b));
|
|
4295
4359
|
const isAuthorMode = (0, messaging._o)();
|
|
@@ -4303,7 +4367,7 @@ var __webpack_modules__ = {
|
|
|
4303
4367
|
if (!located) throw new Error(getInstallGuidanceText('chrome'));
|
|
4304
4368
|
const normalized = normalizePath(located || null);
|
|
4305
4369
|
if (isUsableBinary(normalized)) {
|
|
4306
|
-
if (
|
|
4370
|
+
if ((0, official_chrome.g)(normalized)) {
|
|
4307
4371
|
printInstallGuidance(getInstallGuidanceText('chrome'), browser);
|
|
4308
4372
|
return null;
|
|
4309
4373
|
}
|
|
@@ -4317,7 +4381,7 @@ var __webpack_modules__ = {
|
|
|
4317
4381
|
}) || null;
|
|
4318
4382
|
const normalized = normalizePath(candidate || null);
|
|
4319
4383
|
if (normalized) {
|
|
4320
|
-
if (
|
|
4384
|
+
if ((0, official_chrome.g)(normalized)) {
|
|
4321
4385
|
printInstallGuidance(getInstallGuidanceText('chrome'), browser);
|
|
4322
4386
|
candidate = null;
|
|
4323
4387
|
}
|
|
@@ -5884,7 +5948,10 @@ var __webpack_modules__ = {
|
|
|
5884
5948
|
await client.connect(port);
|
|
5885
5949
|
this.client = client;
|
|
5886
5950
|
this.invalidateConnectionScopedCaches();
|
|
5887
|
-
client.on('reconnected', ()=>
|
|
5951
|
+
client.on('reconnected', ()=>{
|
|
5952
|
+
this.invalidateConnectionScopedCaches();
|
|
5953
|
+
if (this.loggingAttached) attachConsoleListeners(client);
|
|
5954
|
+
});
|
|
5888
5955
|
return client;
|
|
5889
5956
|
} catch (error) {
|
|
5890
5957
|
if (isErrorWithCode('ECONNREFUSED', error)) {
|
|
@@ -6837,6 +6904,7 @@ var __webpack_modules__ = {
|
|
|
6837
6904
|
var node_fs__rspack_import_0 = __webpack_require__("node:fs");
|
|
6838
6905
|
var node_path__rspack_import_1 = __webpack_require__("node:path");
|
|
6839
6906
|
__webpack_require__("./browsers/browsers-lib/output-binaries-resolver.ts");
|
|
6907
|
+
var _browsers_lib_rename_with_retry__rspack_import_3 = __webpack_require__("./browsers/browsers-lib/rename-with-retry.ts");
|
|
6840
6908
|
const MANAGED_GECKO_POLICIES = {
|
|
6841
6909
|
DisableAppUpdate: true
|
|
6842
6910
|
};
|
|
@@ -6917,7 +6985,9 @@ var __webpack_modules__ = {
|
|
|
6917
6985
|
recursive: true
|
|
6918
6986
|
});
|
|
6919
6987
|
fs.writeFileSync(tempPath, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
|
|
6920
|
-
|
|
6988
|
+
(0, _browsers_lib_rename_with_retry__rspack_import_3.O)(tempPath, policyPath, {
|
|
6989
|
+
rename: (from, to)=>fs.renameSync(from, to)
|
|
6990
|
+
});
|
|
6921
6991
|
return {
|
|
6922
6992
|
status: 'written',
|
|
6923
6993
|
policyPath
|
|
@@ -9762,6 +9832,7 @@ function describeButton(b) {
|
|
|
9762
9832
|
E_POLYFILL_NOT_FOUND: 'E_POLYFILL_NOT_FOUND',
|
|
9763
9833
|
E_LOCALES_LAYOUT: 'E_LOCALES_LAYOUT',
|
|
9764
9834
|
E_WAR_INVALID: 'E_WAR_INVALID',
|
|
9835
|
+
E_DEV_SESSION_DIST_SHARED: 'E_DEV_SESSION_DIST_SHARED',
|
|
9765
9836
|
E_BACKGROUND_REQUIRED: 'E_BACKGROUND_REQUIRED',
|
|
9766
9837
|
E_CONTENT_SCRIPT_SYNTAX: 'E_CONTENT_SCRIPT_SYNTAX',
|
|
9767
9838
|
E_NO_ENTRYPOINTS: 'E_NO_ENTRYPOINTS',
|
|
@@ -9876,6 +9947,9 @@ function describeButton(b) {
|
|
|
9876
9947
|
"node:path" (module) {
|
|
9877
9948
|
module.exports = require("node:path");
|
|
9878
9949
|
},
|
|
9950
|
+
"node:readline" (module) {
|
|
9951
|
+
module.exports = require("node:readline");
|
|
9952
|
+
},
|
|
9879
9953
|
pintor (module) {
|
|
9880
9954
|
module.exports = require("pintor");
|
|
9881
9955
|
},
|