extension 4.1.26 → 4.1.27

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/dist/browsers.cjs CHANGED
@@ -442,7 +442,8 @@ var __webpack_modules__ = {
442
442
  var pintor__rspack_import_8 = __webpack_require__("pintor");
443
443
  var pintor__rspack_import_8_default = /*#__PURE__*/ __webpack_require__.n(pintor__rspack_import_8);
444
444
  var _helpers_messaging__rspack_import_9 = __webpack_require__("./helpers/messaging.ts");
445
- var _browser_family__rspack_import_10 = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
445
+ var _run_firefox_firefox_launch_librewolf_overrides__rspack_import_10 = __webpack_require__("./browsers/run-firefox/firefox-launch/librewolf-overrides.ts");
446
+ var _browser_family__rspack_import_11 = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
446
447
  const require1 = (0, node_module__rspack_import_1.createRequire)(__rslib_import_meta_url__);
447
448
  function getLoggingPrefix(type) {
448
449
  return (0, _helpers_messaging__rspack_import_9.Pl)(type);
@@ -518,7 +519,7 @@ var __webpack_modules__ = {
518
519
  return browser;
519
520
  }
520
521
  function capitalizedBrowserName(browser) {
521
- return `${browser.charAt(0).toUpperCase() + browser.slice(1)}`;
522
+ return (0, _helpers_messaging__rspack_import_9.QZ)(String(browser));
522
523
  }
523
524
  function resolveBrowserVersionLine(browser, pinnedLine, opts) {
524
525
  const pinned = String(pinnedLine || '').trim();
@@ -567,6 +568,10 @@ var __webpack_modules__ = {
567
568
  })();
568
569
  return `${getLoggingPrefix('error')} ${isUnreachable}${pintor__rspack_import_8_default().gray('NOT FOUND')} ${pintor__rspack_import_8_default().underline(browserBinaryLocation || `${capitalizedBrowserName(browser)}BROWSER`)}\nInstall the missing browser, or choose another one with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<chrome|edge|firefox>')}.` + wslHint;
569
570
  }
571
+ function geckoForkNotInstalled(browser, guidance) {
572
+ const steps = String(guidance || '').split('\n').map((line)=>line.trimEnd()).filter((line)=>line && !/^We couldn't find/i.test(line)).filter((line)=>!/^Re-run your command/i.test(line)).join('\n');
573
+ return `${getLoggingPrefix('error')} ${capitalizedBrowserName(browser)} isn't installed.\n${steps}\nOr point at a binary with ${pintor__rspack_import_8_default().blue('--gecko-binary')} ${pintor__rspack_import_8_default().gray('<path>')}, or choose another browser with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<firefox|waterfox|librewolf|zen|floorp>')}.`;
574
+ }
570
575
  function usingManagedChromiumFamilyFallback(requestedBrowser, _fallbackBrowser, _binaryPath) {
571
576
  return `${getLoggingPrefix('warn')} ${managedBrowserDisplayName(requestedBrowser)} isn't installed.\nRun ${pintor__rspack_import_8_default().blue(`npx extension install ${requestedBrowser}`)} to use ${managedBrowserDisplayName(requestedBrowser)} itself.`;
572
577
  }
@@ -707,8 +712,11 @@ var __webpack_modules__ = {
707
712
  body.push("Run your command again after the install finishes.");
708
713
  return `${body.join('\n')}\n`;
709
714
  }
710
- function firefoxLaunchCalled() {
711
- return `${getLoggingPrefix('debug')} browser launch browser=firefox`;
715
+ function firefoxLaunchCalled(browser = 'firefox') {
716
+ return `${getLoggingPrefix('debug')} browser launch browser=${browser}`;
717
+ }
718
+ function librewolfRemoteDebuggingLocked(overridesPath) {
719
+ return `${getLoggingPrefix('error')} LibreWolf keeps remote debugging off, so Extension.js can't reach it.\nLibreWolf resets ${pintor__rspack_import_8_default().gray('devtools.debugger.remote-enabled')} to false at every start. Add these two lines to ${pintor__rspack_import_8_default().underline(overridesPath)} and run the command again:\n` + _run_firefox_firefox_launch_librewolf_overrides__rspack_import_10.Tu.map((line)=>` ${pintor__rspack_import_8_default().blue(line)}\n`).join('') + `Or choose another browser with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<firefox|waterfox|zen|floorp>')}.`;
712
720
  }
713
721
  function firefoxFailedToStart(error) {
714
722
  return `${getLoggingPrefix('error')} Firefox failed to start.\n${pintor__rspack_import_8_default().red(errorDetail(error))}`;
@@ -857,7 +865,7 @@ var __webpack_modules__ = {
857
865
  }
858
866
  function pinnedBinaryFlag(browser) {
859
867
  const name = String(browser || '');
860
- if ((0, _browser_family__rspack_import_10.M_)(name)) return '--gecko-binary';
868
+ if ((0, _browser_family__rspack_import_11.M_)(name)) return '--gecko-binary';
861
869
  if ('safari' === name || 'webkit-based' === name) return '--safari-binary';
862
870
  return '--chromium-binary';
863
871
  }
@@ -873,11 +881,8 @@ var __webpack_modules__ = {
873
881
  case 'edge':
874
882
  browserDevToolsUrl = 'edge://extensions';
875
883
  break;
876
- case 'firefox':
877
- browserDevToolsUrl = 'about:debugging#/runtime/this-firefox';
878
- break;
879
884
  default:
880
- browserDevToolsUrl = '';
885
+ browserDevToolsUrl = (0, _browser_family__rspack_import_11.M_)(browser) ? 'about:debugging#/runtime/this-firefox' : '';
881
886
  }
882
887
  if (!message.data) return `${getLoggingPrefix('error')} No client data received for ${manifestName}.\n\n${pintor__rspack_import_8_default().red("Extension.js can't read data from your extension.")}\n${pintor__rspack_import_8_default().red('To fix, ensure that:')}\n\n- Your extension is enabled in ${pintor__rspack_import_8_default().underline(browserDevToolsUrl)}\n- No previous ${capitalize(browser)} browser instance is open\n\nIf both hold, restart the ${pintor__rspack_import_8_default().yellow(manifest.name || '')} and the\n${pintor__rspack_import_8_default().yellow('Manager Extension')} in ${pintor__rspack_import_8_default().underline(browserDevToolsUrl)} and try again.\nIf the issue persists, report a bug:\n` + pintor__rspack_import_8_default().underline("https://github.com/extension-js/extension.js/issues");
883
888
  const { id = '', management } = message.data;
@@ -1046,6 +1051,7 @@ var __webpack_modules__ = {
1046
1051
  _D: ()=>browserLaunchError,
1047
1052
  aI: ()=>devChromeProfilePath,
1048
1053
  aO: ()=>safariOpenHint,
1054
+ bC: ()=>librewolfRemoteDebuggingLocked,
1049
1055
  bv: ()=>cdpUnifiedExtensionLog,
1050
1056
  cD: ()=>targetActorHasActiveRequestError,
1051
1057
  cF: ()=>safariRebuilt,
@@ -1083,6 +1089,7 @@ var __webpack_modules__ = {
1083
1089
  sP: ()=>mv2NotSupportedByChromium,
1084
1090
  sY: ()=>creatingUserProfile,
1085
1091
  uK: ()=>safariConverting,
1092
+ v5: ()=>geckoForkNotInstalled,
1086
1093
  wk: ()=>chromeFailedToSpawn,
1087
1094
  xX: ()=>binaryProvenanceNote,
1088
1095
  xy: ()=>chromeInitializingEnhancedReload,
@@ -3754,10 +3761,11 @@ var __webpack_modules__ = {
3754
3761
  stderrStream.on('error', ()=>{});
3755
3762
  }
3756
3763
  let disposeSignalHandlers;
3757
- child.on('close', (code)=>{
3764
+ child.on('close', (code, signal)=>{
3758
3765
  if ((0, messaging._o)()) this.logger.info(messages.nn(code || 0));
3766
+ const how = null == code ? `signal ${signal || 'unknown'}` : `code ${code}`;
3759
3767
  if (!(0, process_teardown.Op)(child)) {
3760
- this.logger.error(this.closeHandlerContext?.isDevMode ? `[browser] ${this.options.browser} exited mid-session (code ${code ?? 'unknown'}). The dev server is still running but reloads cannot be delivered, restart "extension dev" to relaunch the browser.` : `[browser] ${this.options.browser} exited (code ${code ?? 'unknown'}); the preview session is over.`);
3768
+ this.logger.error(this.closeHandlerContext?.isDevMode ? `[browser] ${this.options.browser} exited mid-session (${how}). The dev server is still running but reloads cannot be delivered, restart "extension dev" to relaunch the browser.` : `[browser] ${this.options.browser} exited (${how}); the preview session is over.`);
3761
3769
  (0, ready_stamp.Wi)(this.closeHandlerContext?.extensionOutputPath, code);
3762
3770
  }
3763
3771
  disposeSignalHandlers?.();
@@ -4378,12 +4386,30 @@ var __webpack_modules__ = {
4378
4386
  extensionsToLoad
4379
4387
  };
4380
4388
  }
4389
+ function attachChildOutput(child, opts) {
4390
+ const sinks = opts.sinks || {
4391
+ stdout: process.stdout,
4392
+ stderr: process.stderr
4393
+ };
4394
+ for (const [stream, sink] of [
4395
+ [
4396
+ child.stdout,
4397
+ sinks.stdout
4398
+ ],
4399
+ [
4400
+ child.stderr,
4401
+ sinks.stderr
4402
+ ]
4403
+ ])if (stream) if (opts.debug) stream.pipe(sink);
4404
+ else stream.resume();
4405
+ }
4381
4406
  function logFirefoxDryRun(browserBinaryLocation, launchArgs) {
4382
4407
  if ((0, messaging._o)()) (0, messaging._w)(messages.A9());
4383
4408
  (0, messaging._w)(messages.qn());
4384
4409
  (0, messaging._w)(messages.LD(browserBinaryLocation));
4385
4410
  (0, messaging._w)(messages.lO(launchArgs.join(' ')));
4386
4411
  }
4412
+ var librewolf_overrides = __webpack_require__("./browsers/run-firefox/firefox-launch/librewolf-overrides.ts");
4387
4413
  const activeInstances = new Set();
4388
4414
  let globalHandlersInstalled = false;
4389
4415
  async function attemptCleanup(instance) {
@@ -5390,7 +5416,7 @@ var __webpack_modules__ = {
5390
5416
  }
5391
5417
  } catch {}
5392
5418
  this.lastInstalledAddonPath = primaryAddonPath;
5393
- const bannerPrinted = await printRunningInDevelopmentSummary(candidateAddonPaths, 'firefox', this.derivedExtensionId, this.options.browserVersionLine, {
5419
+ const bannerPrinted = await printRunningInDevelopmentSummary(candidateAddonPaths, this.options.browser, this.derivedExtensionId, this.options.browserVersionLine, {
5394
5420
  profilePath: this.options.launchProfilePath,
5395
5421
  binaryPath: this.options.launchBinaryPath,
5396
5422
  binaryProvenance: this.options.launchBinaryProvenance
@@ -5642,12 +5668,13 @@ var __webpack_modules__ = {
5642
5668
  async launch(compilation, options) {
5643
5669
  const compilationErrors = compilation?.errors || [];
5644
5670
  if (compilationErrors.length > 0) return void this.ctx.logger?.info?.(messages.y7());
5645
- if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.A9());
5671
+ if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.A9(this.host.browser));
5646
5672
  const normalizePath = (value)=>{
5647
5673
  const normalized = value ? (0, wsl_support.f7)(value) : null;
5648
5674
  return normalized && external_node_fs_.existsSync(normalized) ? normalized : null;
5649
5675
  };
5650
- const resolveManagedBinary = ()=>normalizePath((0, output_binaries_resolver.kI)(compilation, 'firefox') || null);
5676
+ const isNamedGeckoFork = 'waterfox' === this.host.browser || 'librewolf' === this.host.browser || 'zen' === this.host.browser || 'floorp' === this.host.browser;
5677
+ const resolveManagedBinary = ()=>isNamedGeckoFork ? null : normalizePath((0, output_binaries_resolver.kI)(compilation, 'firefox') || null);
5651
5678
  const resolveWslFallback = ()=>resolveWslWindowsBinary();
5652
5679
  const getInstallGuidanceText = ()=>{
5653
5680
  try {
@@ -5677,6 +5704,14 @@ var __webpack_modules__ = {
5677
5704
  const dryRun = Boolean(this.host.dryRun);
5678
5705
  if (inTestRunner && !dryRun) return void logFirefoxDryRun('firefox-mock-binary', []);
5679
5706
  if (inTestRunner && dryRun) return void await this.printDryRunPlan(compilation, options, this.host.geckoBinary ? (0, wsl_support.f7)(String(this.host.geckoBinary)) : 'firefox-mock-binary');
5707
+ if ('librewolf' === this.host.browser) {
5708
+ const remoteDebugging = (0, librewolf_overrides.u5)(external_node_fs_, process.env, process.platform);
5709
+ if (!remoteDebugging.enabled) {
5710
+ (0, messaging.Gg)(messages.bC(remoteDebugging.expectedPath));
5711
+ if (inTestRunner) throw new Error('LibreWolf remote debugging is disabled');
5712
+ process.exit(1);
5713
+ }
5714
+ }
5680
5715
  let browserBinaryLocation = resolveManagedBinary();
5681
5716
  let skipDetection = Boolean(browserBinaryLocation);
5682
5717
  const engineBased = 'gecko-based' === this.host.browser || 'firefox-based' === this.host.browser;
@@ -5898,9 +5933,9 @@ var __webpack_modules__ = {
5898
5933
  });
5899
5934
  }
5900
5935
  pipeChildOutput(child) {
5901
- if (!(0, messaging._o)()) return;
5902
- child.stdout?.pipe(process.stdout);
5903
- child.stderr?.pipe(process.stderr);
5936
+ attachChildOutput(child, {
5937
+ debug: (0, messaging._o)()
5938
+ });
5904
5939
  }
5905
5940
  wireChildLifecycle() {
5906
5941
  const child = this.child;
@@ -5910,15 +5945,15 @@ var __webpack_modules__ = {
5910
5945
  if (process.env.VITEST || process.env.VITEST_WORKER_ID) throw new Error('Firefox startup timed out');
5911
5946
  process.exit(1);
5912
5947
  });
5913
- child.on('close', (code)=>{
5948
+ child.on('close', (code, signal)=>{
5914
5949
  const expected = (0, process_teardown.Op)(child);
5915
5950
  if (!expected && this.adoptHandedOffBrowser()) return;
5916
- this.onBrowserGone(code, expected);
5951
+ this.onBrowserGone(code, expected, signal);
5917
5952
  });
5918
5953
  this.pipeChildOutput(child);
5919
5954
  this.disposeProcessHandlers = setupFirefoxProcessHandlers(this.host.browser, ()=>this.child, ()=>this.cleanupInstance(), ()=>this.livePid);
5920
5955
  }
5921
- onBrowserGone(code, expected) {
5956
+ onBrowserGone(code, expected, signal) {
5922
5957
  if (this.browserGone) return;
5923
5958
  this.browserGone = true;
5924
5959
  if (this.watchTimeout) {
@@ -5932,7 +5967,7 @@ var __webpack_modules__ = {
5932
5967
  if (this.host.launchProfilePath) (0, shared_utils.sW)(this.host.launchProfilePath);
5933
5968
  if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.Th(this.host.browser));
5934
5969
  if (!expected) {
5935
- this.ctx.logger?.error?.(`[browser] ${this.host.browser} exited (code ${code ?? 'unknown'}) without being asked to. The add-on may have been rejected or the browser crashed; the session cannot be driven.`);
5970
+ this.ctx.logger?.error?.(`[browser] ${this.host.browser} exited (${null == code ? `signal ${signal || 'unknown'}` : `code ${code}`}) without being asked to. The add-on may have been rejected or the browser crashed; the session cannot be driven.`);
5936
5971
  (0, ready_stamp.Wi)(this.extensionOutputPath, code);
5937
5972
  }
5938
5973
  this.cleanupInstance().catch((err)=>{
@@ -6048,6 +6083,8 @@ var __webpack_modules__ = {
6048
6083
  if ('function' == typeof this.watchTimeout.unref) this.watchTimeout.unref();
6049
6084
  }
6050
6085
  printInstallHint(compilation, raw) {
6086
+ const forkGuidance = geckoForkInstallGuidance(this.host.browser);
6087
+ if (null !== forkGuidance) return void (0, messaging.Gg)(messages.v5(this.host.browser, forkGuidance));
6051
6088
  try {
6052
6089
  const displayCacheDir = (0, output_binaries_resolver.LB)(compilation);
6053
6090
  const pretty = messages.MG(this.host.browser || 'firefox', raw, displayCacheDir);
@@ -6070,6 +6107,69 @@ var __webpack_modules__ = {
6070
6107
  this.ctx = ctx;
6071
6108
  }
6072
6109
  }
6110
+ function geckoForkInstallGuidance(browser) {
6111
+ const read = (fn)=>{
6112
+ try {
6113
+ return fn();
6114
+ } catch {
6115
+ return '';
6116
+ }
6117
+ };
6118
+ switch(browser){
6119
+ case 'waterfox':
6120
+ return read(()=>(0, external_waterfox_location_namespaceObject.getInstallGuidance)());
6121
+ case 'librewolf':
6122
+ return read(()=>(0, external_librewolf_location_namespaceObject.getInstallGuidance)());
6123
+ case 'zen':
6124
+ return read(()=>(0, external_zen_location_namespaceObject.getInstallGuidance)());
6125
+ case 'floorp':
6126
+ return read(()=>(0, external_floorp_location_namespaceObject.getInstallGuidance)());
6127
+ default:
6128
+ return null;
6129
+ }
6130
+ }
6131
+ },
6132
+ "./browsers/run-firefox/firefox-launch/librewolf-overrides.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
6133
+ var node_path__rspack_import_0 = __webpack_require__("node:path");
6134
+ const LIBREWOLF_REMOTE_DEBUGGING_LINES = [
6135
+ 'pref("devtools.debugger.remote-enabled", true);',
6136
+ 'pref("devtools.debugger.prompt-connection", false);'
6137
+ ];
6138
+ const OVERRIDES_FILE = 'librewolf.overrides.cfg';
6139
+ function librewolfOverridesCandidates(env, platform) {
6140
+ const home = String(env.HOME || env.USERPROFILE || '').trim();
6141
+ const candidates = [];
6142
+ if ('win32' === platform) {
6143
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.librewolf', OVERRIDES_FILE));
6144
+ return candidates;
6145
+ }
6146
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.librewolf', OVERRIDES_FILE));
6147
+ const xdg = String(env.XDG_CONFIG_HOME || '').trim();
6148
+ if (xdg) candidates.push(node_path__rspack_import_0.join(xdg, 'librewolf', 'librewolf', OVERRIDES_FILE));
6149
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.config', 'librewolf', 'librewolf', OVERRIDES_FILE));
6150
+ return candidates;
6151
+ }
6152
+ function librewolfRemoteDebuggingEnabled(fsLike, env, platform) {
6153
+ const candidates = librewolfOverridesCandidates(env, platform);
6154
+ const expectedPath = candidates[0] || node_path__rspack_import_0.join('~', '.librewolf', OVERRIDES_FILE);
6155
+ const enabledLine = /^\s*(?:pref|defaultPref|lockPref)\(\s*"devtools\.debugger\.remote-enabled"\s*,\s*true\s*\)/m;
6156
+ for (const candidate of candidates)try {
6157
+ if (!fsLike.existsSync(candidate)) continue;
6158
+ if (enabledLine.test(fsLike.readFileSync(candidate, 'utf-8'))) return {
6159
+ enabled: true,
6160
+ expectedPath: candidate
6161
+ };
6162
+ } catch {}
6163
+ return {
6164
+ enabled: false,
6165
+ expectedPath
6166
+ };
6167
+ }
6168
+ __webpack_require__.d(__webpack_exports__, {
6169
+ u5: ()=>librewolfRemoteDebuggingEnabled
6170
+ }, {
6171
+ Tu: LIBREWOLF_REMOTE_DEBUGGING_LINES
6172
+ });
6073
6173
  },
6074
6174
  "./browsers/run-only.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
6075
6175
  var node_fs__rspack_import_0 = __webpack_require__("node:fs");
@@ -6913,9 +7013,20 @@ var __webpack_modules__ = {
6913
7013
  ...body
6914
7014
  ].join('\n');
6915
7015
  }
6916
- function browserRowValue(browser, versionLine) {
7016
+ const BRAND_SPELLINGS = {
7017
+ librewolf: 'LibreWolf',
7018
+ chromium: 'Chromium',
7019
+ 'chromium-based': 'Chromium-based',
7020
+ 'gecko-based': 'Gecko-based',
7021
+ 'firefox-based': 'Firefox-based',
7022
+ 'webkit-based': 'WebKit-based'
7023
+ };
7024
+ function browserDisplayName(browser) {
6917
7025
  const name = String(browser || '').trim() || 'unknown';
6918
- const display = name.charAt(0).toUpperCase() + name.slice(1);
7026
+ return BRAND_SPELLINGS[name] || name.charAt(0).toUpperCase() + name.slice(1);
7027
+ }
7028
+ function browserRowValue(browser, versionLine) {
7029
+ const display = browserDisplayName(browser);
6919
7030
  const line = String(versionLine || '').trim();
6920
7031
  if (!line) return display;
6921
7032
  if (!/[a-zA-Z]/.test(line)) return `${display} ${line}`;
@@ -6954,6 +7065,7 @@ var __webpack_modules__ = {
6954
7065
  Gg: ()=>humanError,
6955
7066
  Nr: ()=>card,
6956
7067
  Pl: ()=>prefix,
7068
+ QZ: ()=>browserDisplayName,
6957
7069
  T_: ()=>artifactNoun,
6958
7070
  VR: ()=>isCardKeyClaimed,
6959
7071
  _o: ()=>isDebug,
package/dist/cli.cjs CHANGED
@@ -443,7 +443,8 @@ var __webpack_modules__ = {
443
443
  var pintor__rspack_import_8 = __webpack_require__("pintor");
444
444
  var pintor__rspack_import_8_default = /*#__PURE__*/ __webpack_require__.n(pintor__rspack_import_8);
445
445
  var _helpers_messaging__rspack_import_9 = __webpack_require__("./helpers/messaging.ts");
446
- var _browser_family__rspack_import_10 = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
446
+ var _run_firefox_firefox_launch_librewolf_overrides__rspack_import_10 = __webpack_require__("./browsers/run-firefox/firefox-launch/librewolf-overrides.ts");
447
+ var _browser_family__rspack_import_11 = __webpack_require__("./browsers/browsers-lib/browser-family.ts");
447
448
  const require1 = (0, node_module__rspack_import_1.createRequire)(__rslib_import_meta_url__);
448
449
  function getLoggingPrefix(type) {
449
450
  return (0, _helpers_messaging__rspack_import_9.Pl)(type);
@@ -519,7 +520,7 @@ var __webpack_modules__ = {
519
520
  return browser;
520
521
  }
521
522
  function capitalizedBrowserName(browser) {
522
- return `${browser.charAt(0).toUpperCase() + browser.slice(1)}`;
523
+ return (0, _helpers_messaging__rspack_import_9.QZ)(String(browser));
523
524
  }
524
525
  function resolveBrowserVersionLine(browser, pinnedLine, opts) {
525
526
  const pinned = String(pinnedLine || '').trim();
@@ -568,6 +569,10 @@ var __webpack_modules__ = {
568
569
  })();
569
570
  return `${getLoggingPrefix('error')} ${isUnreachable}${pintor__rspack_import_8_default().gray('NOT FOUND')} ${pintor__rspack_import_8_default().underline(browserBinaryLocation || `${capitalizedBrowserName(browser)}BROWSER`)}\nInstall the missing browser, or choose another one with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<chrome|edge|firefox>')}.` + wslHint;
570
571
  }
572
+ function geckoForkNotInstalled(browser, guidance) {
573
+ const steps = String(guidance || '').split('\n').map((line)=>line.trimEnd()).filter((line)=>line && !/^We couldn't find/i.test(line)).filter((line)=>!/^Re-run your command/i.test(line)).join('\n');
574
+ return `${getLoggingPrefix('error')} ${capitalizedBrowserName(browser)} isn't installed.\n${steps}\nOr point at a binary with ${pintor__rspack_import_8_default().blue('--gecko-binary')} ${pintor__rspack_import_8_default().gray('<path>')}, or choose another browser with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<firefox|waterfox|librewolf|zen|floorp>')}.`;
575
+ }
571
576
  function usingManagedChromiumFamilyFallback(requestedBrowser, _fallbackBrowser, _binaryPath) {
572
577
  return `${getLoggingPrefix('warn')} ${managedBrowserDisplayName(requestedBrowser)} isn't installed.\nRun ${pintor__rspack_import_8_default().blue(`npx extension install ${requestedBrowser}`)} to use ${managedBrowserDisplayName(requestedBrowser)} itself.`;
573
578
  }
@@ -708,8 +713,11 @@ var __webpack_modules__ = {
708
713
  body.push("Run your command again after the install finishes.");
709
714
  return `${body.join('\n')}\n`;
710
715
  }
711
- function firefoxLaunchCalled() {
712
- return `${getLoggingPrefix('debug')} browser launch browser=firefox`;
716
+ function firefoxLaunchCalled(browser = 'firefox') {
717
+ return `${getLoggingPrefix('debug')} browser launch browser=${browser}`;
718
+ }
719
+ function librewolfRemoteDebuggingLocked(overridesPath) {
720
+ return `${getLoggingPrefix('error')} LibreWolf keeps remote debugging off, so Extension.js can't reach it.\nLibreWolf resets ${pintor__rspack_import_8_default().gray('devtools.debugger.remote-enabled')} to false at every start. Add these two lines to ${pintor__rspack_import_8_default().underline(overridesPath)} and run the command again:\n` + _run_firefox_firefox_launch_librewolf_overrides__rspack_import_10.Tu.map((line)=>` ${pintor__rspack_import_8_default().blue(line)}\n`).join('') + `Or choose another browser with ${pintor__rspack_import_8_default().blue('--browser')} ${pintor__rspack_import_8_default().gray('<firefox|waterfox|zen|floorp>')}.`;
713
721
  }
714
722
  function firefoxFailedToStart(error) {
715
723
  return `${getLoggingPrefix('error')} Firefox failed to start.\n${pintor__rspack_import_8_default().red(errorDetail(error))}`;
@@ -858,7 +866,7 @@ var __webpack_modules__ = {
858
866
  }
859
867
  function pinnedBinaryFlag(browser) {
860
868
  const name = String(browser || '');
861
- if ((0, _browser_family__rspack_import_10.M_)(name)) return '--gecko-binary';
869
+ if ((0, _browser_family__rspack_import_11.M_)(name)) return '--gecko-binary';
862
870
  if ('safari' === name || 'webkit-based' === name) return '--safari-binary';
863
871
  return '--chromium-binary';
864
872
  }
@@ -874,11 +882,8 @@ var __webpack_modules__ = {
874
882
  case 'edge':
875
883
  browserDevToolsUrl = 'edge://extensions';
876
884
  break;
877
- case 'firefox':
878
- browserDevToolsUrl = 'about:debugging#/runtime/this-firefox';
879
- break;
880
885
  default:
881
- browserDevToolsUrl = '';
886
+ browserDevToolsUrl = (0, _browser_family__rspack_import_11.M_)(browser) ? 'about:debugging#/runtime/this-firefox' : '';
882
887
  }
883
888
  if (!message.data) return `${getLoggingPrefix('error')} No client data received for ${manifestName}.\n\n${pintor__rspack_import_8_default().red("Extension.js can't read data from your extension.")}\n${pintor__rspack_import_8_default().red('To fix, ensure that:')}\n\n- Your extension is enabled in ${pintor__rspack_import_8_default().underline(browserDevToolsUrl)}\n- No previous ${capitalize(browser)} browser instance is open\n\nIf both hold, restart the ${pintor__rspack_import_8_default().yellow(manifest.name || '')} and the\n${pintor__rspack_import_8_default().yellow('Manager Extension')} in ${pintor__rspack_import_8_default().underline(browserDevToolsUrl)} and try again.\nIf the issue persists, report a bug:\n` + pintor__rspack_import_8_default().underline("https://github.com/extension-js/extension.js/issues");
884
889
  const { id = '', management } = message.data;
@@ -1047,6 +1052,7 @@ var __webpack_modules__ = {
1047
1052
  _D: ()=>browserLaunchError,
1048
1053
  aI: ()=>devChromeProfilePath,
1049
1054
  aO: ()=>safariOpenHint,
1055
+ bC: ()=>librewolfRemoteDebuggingLocked,
1050
1056
  bv: ()=>cdpUnifiedExtensionLog,
1051
1057
  cD: ()=>targetActorHasActiveRequestError,
1052
1058
  cF: ()=>safariRebuilt,
@@ -1084,6 +1090,7 @@ var __webpack_modules__ = {
1084
1090
  sP: ()=>mv2NotSupportedByChromium,
1085
1091
  sY: ()=>creatingUserProfile,
1086
1092
  uK: ()=>safariConverting,
1093
+ v5: ()=>geckoForkNotInstalled,
1087
1094
  wk: ()=>chromeFailedToSpawn,
1088
1095
  xX: ()=>binaryProvenanceNote,
1089
1096
  xy: ()=>chromeInitializingEnhancedReload,
@@ -3745,10 +3752,11 @@ var __webpack_modules__ = {
3745
3752
  stderrStream.on('error', ()=>{});
3746
3753
  }
3747
3754
  let disposeSignalHandlers;
3748
- child.on('close', (code)=>{
3755
+ child.on('close', (code, signal)=>{
3749
3756
  if ((0, messaging._o)()) this.logger.info(messages.nn(code || 0));
3757
+ const how = null == code ? `signal ${signal || 'unknown'}` : `code ${code}`;
3750
3758
  if (!(0, process_teardown.Op)(child)) {
3751
- this.logger.error(this.closeHandlerContext?.isDevMode ? `[browser] ${this.options.browser} exited mid-session (code ${code ?? 'unknown'}). The dev server is still running but reloads cannot be delivered, restart "extension dev" to relaunch the browser.` : `[browser] ${this.options.browser} exited (code ${code ?? 'unknown'}); the preview session is over.`);
3759
+ this.logger.error(this.closeHandlerContext?.isDevMode ? `[browser] ${this.options.browser} exited mid-session (${how}). The dev server is still running but reloads cannot be delivered, restart "extension dev" to relaunch the browser.` : `[browser] ${this.options.browser} exited (${how}); the preview session is over.`);
3752
3760
  (0, ready_stamp.Wi)(this.closeHandlerContext?.extensionOutputPath, code);
3753
3761
  }
3754
3762
  disposeSignalHandlers?.();
@@ -4369,12 +4377,30 @@ var __webpack_modules__ = {
4369
4377
  extensionsToLoad
4370
4378
  };
4371
4379
  }
4380
+ function attachChildOutput(child, opts) {
4381
+ const sinks = opts.sinks || {
4382
+ stdout: process.stdout,
4383
+ stderr: process.stderr
4384
+ };
4385
+ for (const [stream, sink] of [
4386
+ [
4387
+ child.stdout,
4388
+ sinks.stdout
4389
+ ],
4390
+ [
4391
+ child.stderr,
4392
+ sinks.stderr
4393
+ ]
4394
+ ])if (stream) if (opts.debug) stream.pipe(sink);
4395
+ else stream.resume();
4396
+ }
4372
4397
  function logFirefoxDryRun(browserBinaryLocation, launchArgs) {
4373
4398
  if ((0, messaging._o)()) (0, messaging._w)(messages.A9());
4374
4399
  (0, messaging._w)(messages.qn());
4375
4400
  (0, messaging._w)(messages.LD(browserBinaryLocation));
4376
4401
  (0, messaging._w)(messages.lO(launchArgs.join(' ')));
4377
4402
  }
4403
+ var librewolf_overrides = __webpack_require__("./browsers/run-firefox/firefox-launch/librewolf-overrides.ts");
4378
4404
  const activeInstances = new Set();
4379
4405
  let globalHandlersInstalled = false;
4380
4406
  async function attemptCleanup(instance) {
@@ -5381,7 +5407,7 @@ var __webpack_modules__ = {
5381
5407
  }
5382
5408
  } catch {}
5383
5409
  this.lastInstalledAddonPath = primaryAddonPath;
5384
- const bannerPrinted = await printRunningInDevelopmentSummary(candidateAddonPaths, 'firefox', this.derivedExtensionId, this.options.browserVersionLine, {
5410
+ const bannerPrinted = await printRunningInDevelopmentSummary(candidateAddonPaths, this.options.browser, this.derivedExtensionId, this.options.browserVersionLine, {
5385
5411
  profilePath: this.options.launchProfilePath,
5386
5412
  binaryPath: this.options.launchBinaryPath,
5387
5413
  binaryProvenance: this.options.launchBinaryProvenance
@@ -5633,12 +5659,13 @@ var __webpack_modules__ = {
5633
5659
  async launch(compilation, options) {
5634
5660
  const compilationErrors = compilation?.errors || [];
5635
5661
  if (compilationErrors.length > 0) return void this.ctx.logger?.info?.(messages.y7());
5636
- if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.A9());
5662
+ if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.A9(this.host.browser));
5637
5663
  const normalizePath = (value)=>{
5638
5664
  const normalized = value ? (0, wsl_support.f7)(value) : null;
5639
5665
  return normalized && external_node_fs_.existsSync(normalized) ? normalized : null;
5640
5666
  };
5641
- const resolveManagedBinary = ()=>normalizePath((0, output_binaries_resolver.kI)(compilation, 'firefox') || null);
5667
+ const isNamedGeckoFork = 'waterfox' === this.host.browser || 'librewolf' === this.host.browser || 'zen' === this.host.browser || 'floorp' === this.host.browser;
5668
+ const resolveManagedBinary = ()=>isNamedGeckoFork ? null : normalizePath((0, output_binaries_resolver.kI)(compilation, 'firefox') || null);
5642
5669
  const resolveWslFallback = ()=>resolveWslWindowsBinary();
5643
5670
  const getInstallGuidanceText = ()=>{
5644
5671
  try {
@@ -5668,6 +5695,14 @@ var __webpack_modules__ = {
5668
5695
  const dryRun = Boolean(this.host.dryRun);
5669
5696
  if (inTestRunner && !dryRun) return void logFirefoxDryRun('firefox-mock-binary', []);
5670
5697
  if (inTestRunner && dryRun) return void await this.printDryRunPlan(compilation, options, this.host.geckoBinary ? (0, wsl_support.f7)(String(this.host.geckoBinary)) : 'firefox-mock-binary');
5698
+ if ('librewolf' === this.host.browser) {
5699
+ const remoteDebugging = (0, librewolf_overrides.u5)(external_node_fs_, process.env, process.platform);
5700
+ if (!remoteDebugging.enabled) {
5701
+ (0, messaging.Gg)(messages.bC(remoteDebugging.expectedPath));
5702
+ if (inTestRunner) throw new Error('LibreWolf remote debugging is disabled');
5703
+ process.exit(1);
5704
+ }
5705
+ }
5671
5706
  let browserBinaryLocation = resolveManagedBinary();
5672
5707
  let skipDetection = Boolean(browserBinaryLocation);
5673
5708
  const engineBased = 'gecko-based' === this.host.browser || 'firefox-based' === this.host.browser;
@@ -5889,9 +5924,9 @@ var __webpack_modules__ = {
5889
5924
  });
5890
5925
  }
5891
5926
  pipeChildOutput(child) {
5892
- if (!(0, messaging._o)()) return;
5893
- child.stdout?.pipe(process.stdout);
5894
- child.stderr?.pipe(process.stderr);
5927
+ attachChildOutput(child, {
5928
+ debug: (0, messaging._o)()
5929
+ });
5895
5930
  }
5896
5931
  wireChildLifecycle() {
5897
5932
  const child = this.child;
@@ -5901,15 +5936,15 @@ var __webpack_modules__ = {
5901
5936
  if (process.env.VITEST || process.env.VITEST_WORKER_ID) throw new Error('Firefox startup timed out');
5902
5937
  process.exit(1);
5903
5938
  });
5904
- child.on('close', (code)=>{
5939
+ child.on('close', (code, signal)=>{
5905
5940
  const expected = (0, process_teardown.Op)(child);
5906
5941
  if (!expected && this.adoptHandedOffBrowser()) return;
5907
- this.onBrowserGone(code, expected);
5942
+ this.onBrowserGone(code, expected, signal);
5908
5943
  });
5909
5944
  this.pipeChildOutput(child);
5910
5945
  this.disposeProcessHandlers = setupFirefoxProcessHandlers(this.host.browser, ()=>this.child, ()=>this.cleanupInstance(), ()=>this.livePid);
5911
5946
  }
5912
- onBrowserGone(code, expected) {
5947
+ onBrowserGone(code, expected, signal) {
5913
5948
  if (this.browserGone) return;
5914
5949
  this.browserGone = true;
5915
5950
  if (this.watchTimeout) {
@@ -5923,7 +5958,7 @@ var __webpack_modules__ = {
5923
5958
  if (this.host.launchProfilePath) (0, shared_utils.sW)(this.host.launchProfilePath);
5924
5959
  if ((0, messaging._o)()) this.ctx.logger?.info?.(messages.Th(this.host.browser));
5925
5960
  if (!expected) {
5926
- this.ctx.logger?.error?.(`[browser] ${this.host.browser} exited (code ${code ?? 'unknown'}) without being asked to. The add-on may have been rejected or the browser crashed; the session cannot be driven.`);
5961
+ this.ctx.logger?.error?.(`[browser] ${this.host.browser} exited (${null == code ? `signal ${signal || 'unknown'}` : `code ${code}`}) without being asked to. The add-on may have been rejected or the browser crashed; the session cannot be driven.`);
5927
5962
  (0, ready_stamp.Wi)(this.extensionOutputPath, code);
5928
5963
  }
5929
5964
  this.cleanupInstance().catch((err)=>{
@@ -6039,6 +6074,8 @@ var __webpack_modules__ = {
6039
6074
  if ('function' == typeof this.watchTimeout.unref) this.watchTimeout.unref();
6040
6075
  }
6041
6076
  printInstallHint(compilation, raw) {
6077
+ const forkGuidance = geckoForkInstallGuidance(this.host.browser);
6078
+ if (null !== forkGuidance) return void (0, messaging.Gg)(messages.v5(this.host.browser, forkGuidance));
6042
6079
  try {
6043
6080
  const displayCacheDir = (0, output_binaries_resolver.LB)(compilation);
6044
6081
  const pretty = messages.MG(this.host.browser || 'firefox', raw, displayCacheDir);
@@ -6061,6 +6098,69 @@ var __webpack_modules__ = {
6061
6098
  this.ctx = ctx;
6062
6099
  }
6063
6100
  }
6101
+ function geckoForkInstallGuidance(browser) {
6102
+ const read = (fn)=>{
6103
+ try {
6104
+ return fn();
6105
+ } catch {
6106
+ return '';
6107
+ }
6108
+ };
6109
+ switch(browser){
6110
+ case 'waterfox':
6111
+ return read(()=>(0, external_waterfox_location_namespaceObject.getInstallGuidance)());
6112
+ case 'librewolf':
6113
+ return read(()=>(0, external_librewolf_location_namespaceObject.getInstallGuidance)());
6114
+ case 'zen':
6115
+ return read(()=>(0, external_zen_location_namespaceObject.getInstallGuidance)());
6116
+ case 'floorp':
6117
+ return read(()=>(0, external_floorp_location_namespaceObject.getInstallGuidance)());
6118
+ default:
6119
+ return null;
6120
+ }
6121
+ }
6122
+ },
6123
+ "./browsers/run-firefox/firefox-launch/librewolf-overrides.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
6124
+ var node_path__rspack_import_0 = __webpack_require__("node:path");
6125
+ const LIBREWOLF_REMOTE_DEBUGGING_LINES = [
6126
+ 'pref("devtools.debugger.remote-enabled", true);',
6127
+ 'pref("devtools.debugger.prompt-connection", false);'
6128
+ ];
6129
+ const OVERRIDES_FILE = 'librewolf.overrides.cfg';
6130
+ function librewolfOverridesCandidates(env, platform) {
6131
+ const home = String(env.HOME || env.USERPROFILE || '').trim();
6132
+ const candidates = [];
6133
+ if ('win32' === platform) {
6134
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.librewolf', OVERRIDES_FILE));
6135
+ return candidates;
6136
+ }
6137
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.librewolf', OVERRIDES_FILE));
6138
+ const xdg = String(env.XDG_CONFIG_HOME || '').trim();
6139
+ if (xdg) candidates.push(node_path__rspack_import_0.join(xdg, 'librewolf', 'librewolf', OVERRIDES_FILE));
6140
+ if (home) candidates.push(node_path__rspack_import_0.join(home, '.config', 'librewolf', 'librewolf', OVERRIDES_FILE));
6141
+ return candidates;
6142
+ }
6143
+ function librewolfRemoteDebuggingEnabled(fsLike, env, platform) {
6144
+ const candidates = librewolfOverridesCandidates(env, platform);
6145
+ const expectedPath = candidates[0] || node_path__rspack_import_0.join('~', '.librewolf', OVERRIDES_FILE);
6146
+ const enabledLine = /^\s*(?:pref|defaultPref|lockPref)\(\s*"devtools\.debugger\.remote-enabled"\s*,\s*true\s*\)/m;
6147
+ for (const candidate of candidates)try {
6148
+ if (!fsLike.existsSync(candidate)) continue;
6149
+ if (enabledLine.test(fsLike.readFileSync(candidate, 'utf-8'))) return {
6150
+ enabled: true,
6151
+ expectedPath: candidate
6152
+ };
6153
+ } catch {}
6154
+ return {
6155
+ enabled: false,
6156
+ expectedPath
6157
+ };
6158
+ }
6159
+ __webpack_require__.d(__webpack_exports__, {
6160
+ u5: ()=>librewolfRemoteDebuggingEnabled
6161
+ }, {
6162
+ Tu: LIBREWOLF_REMOTE_DEBUGGING_LINES
6163
+ });
6064
6164
  },
6065
6165
  "./browsers/run-only.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
6066
6166
  var node_fs__rspack_import_0 = __webpack_require__("node:fs");
@@ -6957,9 +7057,20 @@ var __webpack_modules__ = {
6957
7057
  ...body
6958
7058
  ].join('\n');
6959
7059
  }
6960
- function browserRowValue(browser, versionLine) {
7060
+ const BRAND_SPELLINGS = {
7061
+ librewolf: 'LibreWolf',
7062
+ chromium: 'Chromium',
7063
+ 'chromium-based': 'Chromium-based',
7064
+ 'gecko-based': 'Gecko-based',
7065
+ 'firefox-based': 'Firefox-based',
7066
+ 'webkit-based': 'WebKit-based'
7067
+ };
7068
+ function browserDisplayName(browser) {
6961
7069
  const name = String(browser || '').trim() || 'unknown';
6962
- const display = name.charAt(0).toUpperCase() + name.slice(1);
7070
+ return BRAND_SPELLINGS[name] || name.charAt(0).toUpperCase() + name.slice(1);
7071
+ }
7072
+ function browserRowValue(browser, versionLine) {
7073
+ const display = browserDisplayName(browser);
6963
7074
  const line = String(versionLine || '').trim();
6964
7075
  if (!line) return display;
6965
7076
  if (!/[a-zA-Z]/.test(line)) return `${display} ${line}`;
@@ -7162,6 +7273,7 @@ var __webpack_modules__ = {
7162
7273
  Gg: ()=>humanError,
7163
7274
  Nr: ()=>card,
7164
7275
  Pl: ()=>prefix,
7276
+ QZ: ()=>browserDisplayName,
7165
7277
  Qi: ()=>hasChannelPrefix,
7166
7278
  T_: ()=>artifactNoun,
7167
7279
  VR: ()=>isCardKeyClaimed,
@@ -11,6 +11,7 @@ export declare function bestEffortBannerPrintFailed(message: string): string;
11
11
  export declare function firefoxRdpRuntimeCapabilitySummary(state: 'available' | 'unavailable'): string;
12
12
  export declare function skippingBrowserLaunchDueToCompileErrors(): string;
13
13
  export declare function browserNotInstalledError(browser: Browser, browserBinaryLocation: string): string;
14
+ export declare function geckoForkNotInstalled(browser: Browser, guidance: string): string;
14
15
  export declare function usingManagedChromiumFamilyFallback(requestedBrowser: Browser, _fallbackBrowser: Browser, _binaryPath: string): string;
15
16
  export declare function preferringSystemBrowserOverSnapshot(_systemBinary: string, _snapshotBinary: string): string;
16
17
  export declare function mv2NotSupportedByChromium(extensionPath: string): string;
@@ -52,7 +53,8 @@ export declare function chromiumDryRunNotLaunching(): string;
52
53
  export declare function chromiumDryRunBinary(path: string): string;
53
54
  export declare function chromiumDryRunFlags(flags: string): string;
54
55
  export declare function prettyPuppeteerInstallGuidance(browser: Browser, rawGuidance: string, cacheDir: string): string;
55
- export declare function firefoxLaunchCalled(): string;
56
+ export declare function firefoxLaunchCalled(browser?: Browser | string): string;
57
+ export declare function librewolfRemoteDebuggingLocked(overridesPath: string): string;
56
58
  export declare function firefoxBinaryArgsExtracted(args: string): string;
57
59
  export declare function firefoxNoBinaryArgsFound(): string;
58
60
  export declare function firefoxFailedToStart(error: unknown): string;
@@ -0,0 +1,11 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { Writable } from 'node:stream';
3
+ type ChildStreams = Pick<ChildProcess, 'stdout' | 'stderr'>;
4
+ export declare function attachChildOutput(child: ChildStreams, opts: {
5
+ debug: boolean;
6
+ sinks?: {
7
+ stdout: Writable;
8
+ stderr: Writable;
9
+ };
10
+ }): void;
11
+ export {};
@@ -0,0 +1,11 @@
1
+ type FsLike = {
2
+ existsSync: (p: string) => boolean;
3
+ readFileSync: (p: string, encoding: 'utf-8') => string;
4
+ };
5
+ export declare const LIBREWOLF_REMOTE_DEBUGGING_LINES: string[];
6
+ export declare function librewolfOverridesCandidates(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string[];
7
+ export declare function librewolfRemoteDebuggingEnabled(fsLike: FsLike, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): {
8
+ enabled: boolean;
9
+ expectedPath: string;
10
+ };
11
+ export {};
@@ -1,4 +1,5 @@
1
- export declare function printRunningInDevelopmentSummary(candidateAddonPaths: string[], browser: 'firefox', extensionId?: string, browserVersionLine?: string, launchIdentity?: {
1
+ import type { BrowserType } from '../../../browsers-types.js';
2
+ export declare function printRunningInDevelopmentSummary(candidateAddonPaths: string[], browser: BrowserType, extensionId?: string, browserVersionLine?: string, launchIdentity?: {
2
3
  profilePath?: string;
3
4
  binaryPath?: string;
4
5
  binaryProvenance?: 'managed' | 'pinned' | 'system' | 'snapshot';
@@ -26,6 +26,7 @@ export interface CardInput {
26
26
  }
27
27
  export declare const MAX_CARD_ROWS = 3;
28
28
  export declare function card(input?: CardInput): string;
29
+ export declare function browserDisplayName(browser: string): string;
29
30
  export declare function browserRowValue(browser: string, versionLine?: string): string;
30
31
  export declare function isCardKeyClaimed(key: string): boolean;
31
32
  export declare function claimCardKey(key: string): boolean;
package/package.json CHANGED
@@ -38,7 +38,7 @@
38
38
  "extension": "./bin/extension.cjs"
39
39
  },
40
40
  "name": "extension",
41
- "version": "4.1.26",
41
+ "version": "4.1.27",
42
42
  "description": "The cross-browser extension framework. Build Chrome, Edge, Firefox, and Safari extensions with no build configuration.",
43
43
  "homepage": "https://extension.js.org/",
44
44
  "funding": "https://github.com/sponsors/cezaraugusto",
@@ -104,9 +104,9 @@
104
104
  "chromium-location": "2.1.2",
105
105
  "commander": "^15.0.0",
106
106
  "edge-location": "2.3.1",
107
- "extension-create": "4.1.26",
108
- "extension-develop": "4.1.26",
109
- "extension-install": "4.1.26",
107
+ "extension-create": "4.1.27",
108
+ "extension-develop": "4.1.27",
109
+ "extension-install": "4.1.27",
110
110
  "firefox-location2": "3.1.1",
111
111
  "floorp-location": "1.0.0",
112
112
  "librewolf-location": "1.2.1",