extension-develop 3.5.0-next.9 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +8 -8
  2. package/dist/323.cjs +33 -40
  3. package/dist/547.cjs +69 -6
  4. package/dist/extension-js-devtools/chrome/assets/developer-mode-off.f9a94937.jpeg +0 -0
  5. package/dist/extension-js-devtools/chrome/assets/developer-mode-on.ede80e5b.jpeg +0 -0
  6. package/dist/extension-js-devtools/chrome/background/service_worker.js +2 -2
  7. package/dist/extension-js-devtools/chrome/devtools/index.js +1 -1
  8. package/dist/extension-js-devtools/chrome/manifest.json +3 -3
  9. package/dist/extension-js-devtools/chrome/pages/centralized-logger.css +1 -1
  10. package/dist/extension-js-devtools/chrome/pages/centralized-logger.js +1 -1
  11. package/dist/extension-js-devtools/chrome/pages/welcome.css +1 -1
  12. package/dist/extension-js-devtools/chrome/pages/welcome.js +4 -78
  13. package/dist/extension-js-devtools/chrome/scripts/logger-client.js +1 -1
  14. package/dist/extension-js-devtools/chromium/assets/developer-mode-off.f9a94937.jpeg +0 -0
  15. package/dist/extension-js-devtools/chromium/assets/developer-mode-on.ede80e5b.jpeg +0 -0
  16. package/dist/extension-js-devtools/chromium/background/service_worker.js +2 -2
  17. package/dist/extension-js-devtools/chromium/devtools/index.js +1 -1
  18. package/dist/extension-js-devtools/chromium/manifest.json +3 -3
  19. package/dist/extension-js-devtools/chromium/pages/centralized-logger.css +1 -1
  20. package/dist/extension-js-devtools/chromium/pages/centralized-logger.js +1 -1
  21. package/dist/extension-js-devtools/chromium/pages/welcome.css +1 -1
  22. package/dist/extension-js-devtools/chromium/pages/welcome.js +4 -78
  23. package/dist/extension-js-devtools/chromium/scripts/logger-client.js +1 -1
  24. package/dist/extension-js-devtools/edge/assets/developer-mode-off.f9a94937.jpeg +0 -0
  25. package/dist/extension-js-devtools/edge/assets/developer-mode-on.ede80e5b.jpeg +0 -0
  26. package/dist/extension-js-devtools/edge/background/service_worker.js +2 -2
  27. package/dist/extension-js-devtools/edge/devtools/index.js +1 -1
  28. package/dist/extension-js-devtools/edge/manifest.json +3 -3
  29. package/dist/extension-js-devtools/edge/pages/centralized-logger.css +1 -1
  30. package/dist/extension-js-devtools/edge/pages/centralized-logger.js +1 -1
  31. package/dist/extension-js-devtools/edge/pages/welcome.css +1 -1
  32. package/dist/extension-js-devtools/edge/pages/welcome.js +4 -78
  33. package/dist/extension-js-devtools/edge/scripts/logger-client.js +1 -1
  34. package/dist/extension-js-devtools/firefox/assets/developer-mode-off.f9a94937.jpeg +0 -0
  35. package/dist/extension-js-devtools/firefox/assets/developer-mode-on.ede80e5b.jpeg +0 -0
  36. package/dist/extension-js-devtools/firefox/background/scripts.js +2 -2
  37. package/dist/extension-js-devtools/firefox/devtools/index.js +1 -1
  38. package/dist/extension-js-devtools/firefox/manifest.json +0 -3
  39. package/dist/extension-js-devtools/firefox/pages/centralized-logger.css +1 -1
  40. package/dist/extension-js-devtools/firefox/pages/centralized-logger.js +1 -1
  41. package/dist/extension-js-devtools/firefox/pages/welcome.css +1 -1
  42. package/dist/extension-js-devtools/firefox/pages/welcome.js +4 -78
  43. package/dist/extension-js-devtools/firefox/scripts/logger-client.js +1 -1
  44. package/dist/extension-js-theme/firefox/manifest.json +60 -1
  45. package/dist/module.cjs +481 -289
  46. package/package.json +5 -4
  47. package/webpack/webpack-lib/build-dependencies.json +24 -0
package/dist/module.cjs CHANGED
@@ -127238,14 +127238,16 @@ var __webpack_modules__ = {
127238
127238
  __webpack_require__.d(__webpack_exports__, {
127239
127239
  Bf: ()=>getLastCDPPort,
127240
127240
  Ef: ()=>getInstancePorts,
127241
- UF: ()=>setInstancePorts
127241
+ UF: ()=>setInstancePorts,
127242
+ mm: ()=>getLastRDPPort
127242
127243
  });
127243
127244
  const instanceIdToRecord = new Map();
127244
127245
  let lastCDPPort;
127246
+ let lastRDPPort;
127245
127247
  function setInstancePorts(instanceId, ports) {
127246
127248
  try {
127247
127249
  if ('number' == typeof ports.cdpPort) lastCDPPort = ports.cdpPort;
127248
- if ('number' == typeof ports.rdpPort) ports.rdpPort;
127250
+ if ('number' == typeof ports.rdpPort) lastRDPPort = ports.rdpPort;
127249
127251
  if (!instanceId) return;
127250
127252
  const prev = instanceIdToRecord.get(instanceId) || {};
127251
127253
  instanceIdToRecord.set(instanceId, {
@@ -127261,6 +127263,9 @@ var __webpack_modules__ = {
127261
127263
  function getLastCDPPort() {
127262
127264
  return lastCDPPort;
127263
127265
  }
127266
+ function getLastRDPPort() {
127267
+ return lastRDPPort;
127268
+ }
127264
127269
  },
127265
127270
  "./webpack/plugin-browsers/browsers-lib/messages.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
127266
127271
  "use strict";
@@ -127874,7 +127879,7 @@ var __webpack_modules__ = {
127874
127879
  if (!management) {
127875
127880
  if ('true' === process.env.EXTENSION_AUTHOR_MODE) return `${getLoggingPrefix('error')} No management API info received from client for ${manifestName}. Investigate.`;
127876
127881
  }
127877
- const { name = '', version: version1 = '' } = management;
127882
+ const { version: version1 = '' } = management;
127878
127883
  const extensionVersion = process.env.EXTENSION_DEVELOP_VERSION || process.env.EXTENSION_CLI_VERSION || (()=>{
127879
127884
  try {
127880
127885
  return require1('../../../package.json').version;
@@ -127928,22 +127933,15 @@ var __webpack_modules__ = {
127928
127933
  }
127929
127934
  }
127930
127935
  } catch {}
127931
- const browserLabel = effectiveBrowserLine && effectiveBrowserLine.trim().length > 0 ? effectiveBrowserLine.trim() : capitalize(String(browser || 'unknown'));
127936
+ let browserLabel = effectiveBrowserLine && effectiveBrowserLine.trim().length > 0 ? effectiveBrowserLine.trim() : capitalize(String(browser || 'unknown'));
127937
+ if (browserLabel && !/[a-zA-Z]/.test(browserLabel)) browserLabel = `${capitalize(String(browser || 'unknown'))} ${browserLabel}`;
127932
127938
  const cleanId = String(id || '').trim();
127933
- const urlScheme = 'firefox' === browser || 'gecko-based' === browser ? 'moz-extension' : 'chrome-extension';
127934
- cleanId.length;
127935
- (()=>{
127936
- if ('firefox' === browser || 'gecko-based' === browser) return 'about:debugging#/runtime/this-firefox';
127937
- if ('chrome' === browser || 'chromium' === browser || 'chromium-based' === browser || 'edge' === browser) return cleanId.length > 0 ? `chrome://extensions/?id=${cleanId}` : 'chrome://extensions';
127938
- return cleanId.length > 0 ? `${urlScheme}://${cleanId}` : '(temporary)';
127939
- })();
127940
- ('firefox' === browser || 'gecko-based' === browser) && 'true' === process.env.EXTENSION_AUTHOR_MODE && cleanId.length;
127941
- hostPermissions && hostPermissions.length;
127942
- permissions && permissions.length;
127943
127939
  const lines = [];
127944
127940
  const includeExtensionId = opts?.includeExtensionId !== false;
127945
127941
  const updateNotice = updateSuffix ? ` ${updateSuffix}` : '';
127946
- lines.push(` 🧩 ${pintor__rspack_import_3_default().brightBlue('Extension.js')} ${pintor__rspack_import_3_default().gray(`${extensionVersion}`)}${updateNotice}`, ` Browser ${pintor__rspack_import_3_default().gray(browserLabel)}`, ` Extension ${pintor__rspack_import_3_default().gray(version1 ? `${name} ${version1}` : name || manifestName)}`);
127942
+ const displayName = String(manifestName);
127943
+ const displayVersion = String(version1 || manifest.version || '');
127944
+ lines.push(` 🧩 ${pintor__rspack_import_3_default().brightBlue('Extension.js')} ${pintor__rspack_import_3_default().gray(`${extensionVersion}`)}${updateNotice}`, ` Browser ${pintor__rspack_import_3_default().gray(browserLabel)}`, ` Extension ${pintor__rspack_import_3_default().gray(displayVersion ? `${displayName} ${displayVersion}` : displayName)}`);
127947
127945
  if (includeExtensionId) lines.push(` Extension ID ${pintor__rspack_import_3_default().gray(cleanId)}`);
127948
127946
  return lines.join('\n');
127949
127947
  }
@@ -128596,6 +128594,34 @@ var __webpack_modules__ = {
128596
128594
  else obj[key] = value;
128597
128595
  return obj;
128598
128596
  }
128597
+ async function waitForManifest(outPath, timeoutMs = 8000) {
128598
+ const manifestPath = `${outPath}/manifest.json`;
128599
+ const start = Date.now();
128600
+ while(Date.now() - start < timeoutMs){
128601
+ try {
128602
+ if (external_fs_.existsSync(manifestPath)) return true;
128603
+ } catch {}
128604
+ await new Promise((resolve)=>setTimeout(resolve, 150));
128605
+ }
128606
+ return false;
128607
+ }
128608
+ async function maybePrintDevBanner(args) {
128609
+ const mode = args.compilation?.options?.mode || 'development';
128610
+ if ('development' !== mode) return;
128611
+ if (args.enableCdp) return;
128612
+ const loadExtensionFlag = args.chromiumConfig.find((flag)=>flag.startsWith('--load-extension='));
128613
+ const extensionOutputPath = (0, extension_output_path.W)(args.compilation, loadExtensionFlag);
128614
+ if (!extensionOutputPath) return;
128615
+ const ready = await waitForManifest(extensionOutputPath, 10000);
128616
+ if (!ready) return;
128617
+ await (0, banner.a)({
128618
+ browser: args.browser,
128619
+ outPath: extensionOutputPath,
128620
+ hostPort: args.hostPort,
128621
+ getInfo: async ()=>null,
128622
+ browserVersionLine: args.browserVersionLine
128623
+ });
128624
+ }
128599
128625
  class ChromiumLaunchPlugin {
128600
128626
  async runOnce(compilation, opts) {
128601
128627
  if (!this.logger) this.logger = {
@@ -128895,6 +128921,17 @@ var __webpack_modules__ = {
128895
128921
  instance_registry.UF(this.options.instanceId, {
128896
128922
  cdpPort: selectedPort
128897
128923
  });
128924
+ const enableCdp = opts?.enableCdpPostLaunch !== false;
128925
+ await maybePrintDevBanner({
128926
+ compilation,
128927
+ chromiumConfig,
128928
+ browser: this.options.browser,
128929
+ hostPort: {
128930
+ host: '127.0.0.1',
128931
+ port: selectedPort
128932
+ },
128933
+ enableCdp
128934
+ });
128898
128935
  if (this.options.dryRun) return void logChromiumDryRun(browserBinaryLocation, chromiumConfig);
128899
128936
  await this.launchWithDirectSpawn(browserBinaryLocation, chromiumConfig);
128900
128937
  try {
@@ -128905,8 +128942,8 @@ var __webpack_modules__ = {
128905
128942
  if (vLine && vLine.trim().length > 0) browserVersionLine = vLine.trim();
128906
128943
  }
128907
128944
  } catch {}
128945
+ const mode = compilation?.options?.mode || 'development';
128908
128946
  try {
128909
- const mode = compilation?.options?.mode || 'development';
128910
128947
  if ('production' === mode) {
128911
128948
  const loadExtensionFlag = chromiumConfig.find((flag)=>flag.startsWith('--load-extension='));
128912
128949
  const extensionOutputPath = (0, extension_output_path.W)(compilation, loadExtensionFlag);
@@ -128945,7 +128982,6 @@ var __webpack_modules__ = {
128945
128982
  dryRun: this.options.dryRun,
128946
128983
  browserVersionLine
128947
128984
  };
128948
- const enableCdp = opts?.enableCdpPostLaunch !== false;
128949
128985
  if (enableCdp) {
128950
128986
  const mod = await Promise.all([
128951
128987
  __webpack_require__.e("215"),
@@ -129155,41 +129191,61 @@ var __webpack_modules__ = {
129155
129191
  }
129156
129192
  var external_path_ = __webpack_require__("path");
129157
129193
  var banner = __webpack_require__("./webpack/plugin-browsers/browsers-lib/banner.ts");
129194
+ async function waitForManifest(outPath, timeoutMs = 8000) {
129195
+ const manifestPath = external_path_.join(outPath, 'manifest.json');
129196
+ const start = Date.now();
129197
+ while(Date.now() - start < timeoutMs){
129198
+ try {
129199
+ if (external_fs_.existsSync(manifestPath)) return true;
129200
+ } catch {}
129201
+ await new Promise((resolve)=>setTimeout(resolve, 150));
129202
+ }
129203
+ return false;
129204
+ }
129158
129205
  async function printRunningInDevelopmentSummary(candidateAddonPaths, browser, extensionId, browserVersionLine) {
129159
129206
  try {
129160
129207
  let chosenPath = null;
129161
129208
  for (const p of candidateAddonPaths){
129209
+ const isManager = /extensions\/[a-z-]+-manager/.test(String(p));
129210
+ const isDevtools = /extension-js-devtools/.test(String(p));
129211
+ const isThemePath = /extension-js-theme/.test(String(p));
129212
+ if (isManager || isDevtools || isThemePath) continue;
129162
129213
  const mp = external_path_.join(p, 'manifest.json');
129163
129214
  if (external_fs_.existsSync(mp)) {
129164
129215
  const mf = JSON.parse(external_fs_.readFileSync(mp, 'utf-8'));
129165
129216
  const name = mf?.name || '';
129166
- if ('string' == typeof name && !/Extension\.js DevTools/i.test(name)) {
129217
+ const isThemeManifest = mf?.theme != null || 'theme' === String(mf?.type || '');
129218
+ if ('string' == typeof name && !/Extension\.js DevTools/i.test(name) && !/theme/i.test(name) && !isThemeManifest) {
129167
129219
  chosenPath = p;
129168
129220
  break;
129169
129221
  }
129170
129222
  }
129171
129223
  }
129172
129224
  if (!chosenPath && candidateAddonPaths.length > 0) chosenPath = candidateAddonPaths[candidateAddonPaths.length - 1];
129173
- if (chosenPath) {
129174
- const manifestPath = external_path_.join(chosenPath, 'manifest.json');
129175
- if (external_fs_.existsSync(manifestPath)) {
129176
- const manifest = JSON.parse(external_fs_.readFileSync(manifestPath, 'utf-8'));
129177
- await (0, banner.a)({
129178
- browser,
129179
- outPath: chosenPath,
129180
- hostPort: {
129181
- host: '127.0.0.1'
129182
- },
129183
- getInfo: async ()=>({
129184
- extensionId: extensionId || '(temporary)',
129185
- name: manifest.name,
129186
- version: manifest.version
129187
- }),
129188
- browserVersionLine
129189
- });
129190
- }
129225
+ if (!chosenPath) return false;
129226
+ const manifestPath = external_path_.join(chosenPath, 'manifest.json');
129227
+ if (!external_fs_.existsSync(manifestPath)) {
129228
+ const ready = await waitForManifest(chosenPath, 10000);
129229
+ if (!ready) return false;
129191
129230
  }
129192
- } catch {}
129231
+ const manifest = JSON.parse(external_fs_.readFileSync(manifestPath, 'utf-8'));
129232
+ const printed = await (0, banner.a)({
129233
+ browser,
129234
+ outPath: chosenPath,
129235
+ hostPort: {
129236
+ host: '127.0.0.1'
129237
+ },
129238
+ getInfo: async ()=>({
129239
+ extensionId: extensionId || '(temporary)',
129240
+ name: manifest.name,
129241
+ version: manifest.version
129242
+ }),
129243
+ browserVersionLine
129244
+ });
129245
+ return printed;
129246
+ } catch {
129247
+ return false;
129248
+ }
129193
129249
  }
129194
129250
  function printSourceInspection(html) {
129195
129251
  console.log(messages.sew());
@@ -129223,6 +129279,9 @@ var __webpack_modules__ = {
129223
129279
  if (external_fs_.existsSync(external_path_.join(distFirefox, 'manifest.json'))) return distFirefox;
129224
129280
  return candidate;
129225
129281
  }
129282
+ function normalizeFirefoxAddonPath(addonPath) {
129283
+ return String(addonPath).replace(/\\/g, '/');
129284
+ }
129226
129285
  async function getAddonsActorWithRetry(client, cached, tries = 40, delayMs = 250) {
129227
129286
  if (cached) return cached;
129228
129287
  let addonsActor;
@@ -129247,7 +129306,7 @@ var __webpack_modules__ = {
129247
129306
  }
129248
129307
  function computeCandidateAddonPaths(compilation, extensionsToLoad, projectContext) {
129249
129308
  const projectPath = compilation.options.context || projectContext || process.cwd();
129250
- return extensionsToLoad.map((ext)=>resolveAddonDirectory(projectPath, ext));
129309
+ return extensionsToLoad.map((ext)=>normalizeFirefoxAddonPath(resolveAddonDirectory(projectPath, ext)));
129251
129310
  }
129252
129311
  async function waitForManagerWelcome(client) {
129253
129312
  for(let i = 0; i < 20; i++){
@@ -129386,6 +129445,16 @@ var __webpack_modules__ = {
129386
129445
  const MAX_RETRIES = 150;
129387
129446
  const RETRY_INTERVAL = 1000;
129388
129447
  class RemoteFirefox {
129448
+ resolveRdpPort(compilation) {
129449
+ const instanceId = this.options?.instanceId;
129450
+ const devPort = compilation?.options?.devServer?.port;
129451
+ const optionPort = this.options?.port;
129452
+ const normalizedOptionPort = 'string' == typeof optionPort ? parseInt(optionPort, 10) : optionPort;
129453
+ const basePort = normalizedOptionPort || devPort;
129454
+ const desired = (0, shared_utils.jl)(basePort, instanceId);
129455
+ const fromInstance = instanceId ? (0, instance_registry.Ef)(instanceId)?.rdpPort : void 0;
129456
+ return fromInstance || (0, instance_registry.mm)() || desired;
129457
+ }
129389
129458
  async connectClient(port) {
129390
129459
  let lastError;
129391
129460
  for (const _ of Array.from({
@@ -129422,15 +129491,13 @@ var __webpack_modules__ = {
129422
129491
  return 0;
129423
129492
  });
129424
129493
  const extensionsToLoad = userFirst;
129425
- const devPort = compilation.options?.devServer?.port;
129426
- const optionPort = this.options?.port;
129427
- const normalizedOptionPort = 'string' == typeof optionPort ? parseInt(optionPort, 10) : optionPort;
129428
- const port = normalizedOptionPort || (devPort ? devPort + 100 : 9222);
129494
+ const port = this.resolveRdpPort(compilation);
129429
129495
  const client = await this.connectClient(port);
129430
129496
  let addonsActor = await getAddonsActorWithRetry(client, this.cachedAddonsActor);
129431
129497
  if (addonsActor) this.cachedAddonsActor = addonsActor;
129432
129498
  const candidateAddonPaths = computeCandidateAddonPaths(compilation, extensionsToLoad);
129433
129499
  for (const [index, addonPath] of candidateAddonPaths.entries()){
129500
+ const isManager = /extensions\/[a-z-]+-manager/.test(String(addonPath));
129434
129501
  const isDevtoolsEnabled = 0 === index && Boolean(devtools);
129435
129502
  try {
129436
129503
  const installResponse = await installTemporaryAddon(client, String(addonsActor || ''), addonPath, isDevtoolsEnabled);
@@ -129438,7 +129505,7 @@ var __webpack_modules__ = {
129438
129505
  const maybeId = installResponse?.addon?.id;
129439
129506
  if ('string' == typeof maybeId && maybeId.length > 0) this.derivedExtensionId = maybeId;
129440
129507
  }
129441
- if (1 === index || 0 === index && /extensions\/[a-z-]+-manager/.test(String(addonPath))) await waitForManagerWelcome(client);
129508
+ if (isManager) await waitForManagerWelcome(client);
129442
129509
  } catch (err) {
129443
129510
  const message = requestErrorToMessage(err);
129444
129511
  throw new Error(messages.WVu(this.options.browser, message));
@@ -129460,7 +129527,8 @@ var __webpack_modules__ = {
129460
129527
  if (!this.derivedExtensionId) this.derivedExtensionId = await deriveMozExtensionId(client);
129461
129528
  } catch {}
129462
129529
  this.lastInstalledAddonPath = candidateAddonPaths[0];
129463
- printRunningInDevelopmentSummary(candidateAddonPaths, 'firefox', this.derivedExtensionId, this.options.browserVersionLine);
129530
+ const bannerPrinted = await printRunningInDevelopmentSummary(candidateAddonPaths, 'firefox', this.derivedExtensionId, this.options.browserVersionLine);
129531
+ if (!bannerPrinted) throw new Error(messages.WVu(this.options.browser, 'Failed to print runningInDevelopment banner; add-on may not be installed.'));
129464
129532
  }
129465
129533
  markNeedsReinstall() {
129466
129534
  this.needsReinstall = true;
@@ -129512,10 +129580,7 @@ var __webpack_modules__ = {
129512
129580
  }
129513
129581
  async hardReloadIfNeeded(compilation, changedAssets) {
129514
129582
  try {
129515
- const devPort = compilation.options.devServer?.port;
129516
- const optionPort = this.options?.port;
129517
- const normalizedOptionPort = 'string' == typeof optionPort ? parseInt(optionPort, 10) : optionPort;
129518
- const rdpPort = normalizedOptionPort || (devPort ? devPort + 100 : 9222);
129583
+ const rdpPort = this.resolveRdpPort(compilation);
129519
129584
  const client = this.client || await this.connectClient(rdpPort);
129520
129585
  const normalized = (changedAssets || []).map((n)=>String(n || '')).map((n)=>n.replace(/\\/g, '/'));
129521
129586
  const isManifestChanged = normalized.includes('manifest.json');
@@ -129540,10 +129605,7 @@ var __webpack_modules__ = {
129540
129605
  }
129541
129606
  async inspectSource(compilation, opts) {
129542
129607
  try {
129543
- const devServerPort = compilation.options.devServer?.port;
129544
- const optionPort = this.options?.port;
129545
- const normalizedOptionPort = 'string' == typeof optionPort ? parseInt(optionPort, 10) : optionPort;
129546
- const rdpPort = normalizedOptionPort || (devServerPort ? devServerPort + 100 : 9222);
129608
+ const rdpPort = this.resolveRdpPort(compilation);
129547
129609
  const client = this.client || await this.connectClient(rdpPort);
129548
129610
  const urlToInspect = 'string' == typeof opts.source && 'true' !== opts.source ? opts.source : opts.startingUrl;
129549
129611
  const tab = await (0, source_inspect.oc)(client, urlToInspect);
@@ -129559,9 +129621,7 @@ var __webpack_modules__ = {
129559
129621
  async enableUnifiedLogging(opts) {
129560
129622
  try {
129561
129623
  if (this.loggingAttached) return;
129562
- const devPort = this.options?.port;
129563
- const normalized = 'string' == typeof devPort ? parseInt(devPort, 10) : devPort;
129564
- const rdpPort = normalized || 9222;
129624
+ const rdpPort = this.resolveRdpPort();
129565
129625
  const client = this.client || await this.connectClient(rdpPort);
129566
129626
  await attachConsoleListeners(client);
129567
129627
  const wantLevel = String(opts.level || 'info').toLowerCase();
@@ -129685,6 +129745,11 @@ var __webpack_modules__ = {
129685
129745
  'browser.formfill.enable': false,
129686
129746
  'browser.link.open_newwindow': 3,
129687
129747
  'browser.sessionstore.enabled': false,
129748
+ 'browser.sessionstore.resume_from_crash': false,
129749
+ 'browser.sessionstore.max_resumed_crashes': 0,
129750
+ 'browser.sessionstore.restore_on_demand': false,
129751
+ 'browser.sessionstore.resume_session_once': false,
129752
+ 'toolkit.startup.max_resumed_crashes': -1,
129688
129753
  'browser.shell.checkDefaultBrowser': false,
129689
129754
  'browser.sync.enabled': false,
129690
129755
  'browser.startup.page': 0,
@@ -129789,29 +129854,31 @@ var __webpack_modules__ = {
129789
129854
  });
129790
129855
  profilePath = tmp;
129791
129856
  }
129792
- external_fs_.mkdirSync(profilePath, {
129793
- recursive: true
129794
- });
129795
- try {
129796
- const prefs = getPreferences(configOptions?.preferences || {});
129797
- function serializeValue(value) {
129798
- if ('string' == typeof value) return JSON.stringify(value);
129799
- if ('boolean' == typeof value) return String(value);
129800
- if ('number' == typeof value && Number.isFinite(value)) return String(value);
129801
- return JSON.stringify(value);
129802
- }
129803
- function prefsToUserJs(prefsObject) {
129804
- return Object.entries(prefsObject).map(([key, val])=>`user_pref(${JSON.stringify(key)}, ${serializeValue(val)});`).join('\n');
129805
- }
129806
- const userJsPath = external_path_.join(profilePath, 'user.js');
129807
- const userJsContent = prefsToUserJs(prefs);
129808
- external_fs_.writeFileSync(userJsPath, userJsContent);
129809
- } catch {}
129810
129857
  try {
129811
129858
  const maxAgeHours = parseInt(String(process.env.EXTENSION_TMP_PROFILE_MAX_AGE_HOURS || ''), 10);
129812
129859
  (0, shared_utils.CW)(base, external_path_.basename(profilePath), Number.isFinite(maxAgeHours) ? maxAgeHours : 12);
129813
129860
  } catch {}
129814
129861
  }
129862
+ if (profilePath) try {
129863
+ external_fs_.mkdirSync(profilePath, {
129864
+ recursive: true
129865
+ });
129866
+ } catch {}
129867
+ if (profilePath) try {
129868
+ const prefs = getPreferences(configOptions?.preferences || {});
129869
+ function serializeValue(value) {
129870
+ if ('string' == typeof value) return JSON.stringify(value);
129871
+ if ('boolean' == typeof value) return String(value);
129872
+ if ('number' == typeof value && Number.isFinite(value)) return String(value);
129873
+ return JSON.stringify(value);
129874
+ }
129875
+ function prefsToUserJs(prefsObject) {
129876
+ return Object.entries(prefsObject).map(([key, val])=>`user_pref(${JSON.stringify(key)}, ${serializeValue(val)});`).join('\n');
129877
+ }
129878
+ const userJsPath = external_path_.join(profilePath, 'user.js');
129879
+ const userJsContent = prefsToUserJs(prefs);
129880
+ external_fs_.writeFileSync(userJsPath, userJsContent);
129881
+ } catch {}
129815
129882
  const parts = [
129816
129883
  `--binary-args="${binaryArgs.join(' ')}"`,
129817
129884
  '--verbose'
@@ -129888,6 +129955,12 @@ var __webpack_modules__ = {
129888
129955
  const child = (0, external_child_process_.spawn)(bin, args, {
129889
129956
  stdio,
129890
129957
  detached: false,
129958
+ env: {
129959
+ ...process.env,
129960
+ MOZ_DISABLE_AUTO_SAFE_MODE: '1',
129961
+ MOZ_CRASHREPORTER_DISABLE: '1',
129962
+ MOZ_CRASHREPORTER: '0'
129963
+ },
129891
129964
  ...'win32' === process.platform ? {
129892
129965
  windowsHide: true
129893
129966
  } : {}
@@ -130825,9 +130898,11 @@ var __webpack_modules__ = {
130825
130898
  var path__rspack_import_0 = __webpack_require__("path");
130826
130899
  var fs__rspack_import_1 = __webpack_require__("fs");
130827
130900
  var _messages__rspack_import_2 = __webpack_require__("./webpack/plugin-css/css-lib/messages.ts");
130828
- var _webpack_lib_check_build_dependencies__rspack_import_3 = __webpack_require__("./webpack/webpack-lib/check-build-dependencies.ts");
130829
- var _webpack_lib_package_manager__rspack_import_4 = __webpack_require__("./webpack/webpack-lib/package-manager.ts");
130830
- var _webpack_lib_progress__rspack_import_5 = __webpack_require__("./webpack/webpack-lib/progress.ts");
130901
+ var pintor__rspack_import_3 = __webpack_require__("pintor");
130902
+ var pintor__rspack_import_3_default = /*#__PURE__*/ __webpack_require__.n(pintor__rspack_import_3);
130903
+ var _webpack_lib_check_build_dependencies__rspack_import_4 = __webpack_require__("./webpack/webpack-lib/check-build-dependencies.ts");
130904
+ var _webpack_lib_package_manager__rspack_import_5 = __webpack_require__("./webpack/webpack-lib/package-manager.ts");
130905
+ var _webpack_lib_progress__rspack_import_6 = __webpack_require__("./webpack/webpack-lib/progress.ts");
130831
130906
  function parseJsonSafe(text) {
130832
130907
  const s = text && 0xfeff === text.charCodeAt(0) ? text.slice(1) : text;
130833
130908
  return JSON.parse(s || '{}');
@@ -130931,13 +131006,13 @@ var __webpack_modules__ = {
130931
131006
  }
130932
131007
  async function execInstallWithFallback(command, options) {
130933
131008
  try {
130934
- await (0, _webpack_lib_package_manager__rspack_import_4.Qt)(command.command, command.args, {
131009
+ await (0, _webpack_lib_package_manager__rspack_import_5.Qt)(command.command, command.args, {
130935
131010
  cwd: options.cwd,
130936
131011
  stdio: 'inherit'
130937
131012
  });
130938
131013
  return;
130939
131014
  } catch (error) {
130940
- if (options.fallbackNpmCommand && isMissingManagerError(error)) return void await (0, _webpack_lib_package_manager__rspack_import_4.Qt)(options.fallbackNpmCommand.command, options.fallbackNpmCommand.args, {
131015
+ if (options.fallbackNpmCommand && isMissingManagerError(error)) return void await (0, _webpack_lib_package_manager__rspack_import_5.Qt)(options.fallbackNpmCommand.command, options.fallbackNpmCommand.args, {
130941
131016
  cwd: options.cwd,
130942
131017
  stdio: 'inherit'
130943
131018
  });
@@ -130945,7 +131020,7 @@ var __webpack_modules__ = {
130945
131020
  }
130946
131021
  }
130947
131022
  function resolveDevelopInstallRoot() {
130948
- const directRoot = (0, _webpack_lib_check_build_dependencies__rspack_import_3.w1)();
131023
+ const directRoot = (0, _webpack_lib_check_build_dependencies__rspack_import_4.w1)();
130949
131024
  if (directRoot) return directRoot;
130950
131025
  try {
130951
131026
  const candidateRoot = findDevelopRootFrom(__dirname);
@@ -130964,7 +131039,7 @@ var __webpack_modules__ = {
130964
131039
  }
130965
131040
  function getOptionalInstallCommand(pm, dependencies, installBaseDir) {
130966
131041
  const pmName = pm.name;
130967
- if ('yarn' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131042
+ if ('yarn' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
130968
131043
  '--silent',
130969
131044
  'add',
130970
131045
  ...dependencies,
@@ -130972,7 +131047,7 @@ var __webpack_modules__ = {
130972
131047
  installBaseDir,
130973
131048
  '--optional'
130974
131049
  ]);
130975
- if ('npm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131050
+ if ('npm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
130976
131051
  '--silent',
130977
131052
  'install',
130978
131053
  ...dependencies,
@@ -130980,7 +131055,7 @@ var __webpack_modules__ = {
130980
131055
  installBaseDir,
130981
131056
  '--save-optional'
130982
131057
  ]);
130983
- if ('pnpm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131058
+ if ('pnpm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
130984
131059
  'add',
130985
131060
  ...dependencies,
130986
131061
  '--dir',
@@ -130988,14 +131063,14 @@ var __webpack_modules__ = {
130988
131063
  '--save-optional',
130989
131064
  '--silent'
130990
131065
  ]);
130991
- if ('bun' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131066
+ if ('bun' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
130992
131067
  'add',
130993
131068
  ...dependencies,
130994
131069
  '--cwd',
130995
131070
  installBaseDir,
130996
131071
  '--optional'
130997
131072
  ]);
130998
- return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131073
+ return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
130999
131074
  '--silent',
131000
131075
  'install',
131001
131076
  ...dependencies,
@@ -131019,32 +131094,32 @@ var __webpack_modules__ = {
131019
131094
  '--prefix',
131020
131095
  installBaseDir
131021
131096
  ] : [];
131022
- if ('yarn' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131097
+ if ('yarn' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
131023
131098
  'install',
131024
131099
  '--silent',
131025
131100
  ...dirArgs
131026
131101
  ]);
131027
- if ('npm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131102
+ if ('npm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
131028
131103
  'install',
131029
131104
  '--silent',
131030
131105
  ...dirArgs
131031
131106
  ]);
131032
- if ('pnpm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131107
+ if ('pnpm' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
131033
131108
  'install',
131034
131109
  '--silent',
131035
131110
  ...dirArgs
131036
131111
  ]);
131037
- if ('bun' === pmName) return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131112
+ if ('bun' === pmName) return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
131038
131113
  'install',
131039
131114
  ...dirArgs
131040
131115
  ]);
131041
- return (0, _webpack_lib_package_manager__rspack_import_4.tj)(pm, [
131116
+ return (0, _webpack_lib_package_manager__rspack_import_5.tj)(pm, [
131042
131117
  'install',
131043
131118
  '--silent',
131044
131119
  ...dirArgs
131045
131120
  ]);
131046
131121
  }
131047
- async function installOptionalDependencies(integration, dependencies) {
131122
+ async function installOptionalDependencies(integration, dependencies, options) {
131048
131123
  if (!dependencies.length) return;
131049
131124
  let pm;
131050
131125
  let wslContext;
@@ -131052,36 +131127,44 @@ var __webpack_modules__ = {
131052
131127
  try {
131053
131128
  installBaseDir = resolveDevelopInstallRoot();
131054
131129
  if (!installBaseDir) throw new Error(_messages__rspack_import_2.eG(integration));
131055
- pm = (0, _webpack_lib_package_manager__rspack_import_4._c)({
131130
+ pm = (0, _webpack_lib_package_manager__rspack_import_5._c)({
131056
131131
  cwd: installBaseDir
131057
131132
  });
131058
131133
  wslContext = resolveWslContext(installBaseDir);
131059
131134
  if (!wslContext.useWsl) pm = await preferCorepackFallback(pm);
131060
- const installCommand = getOptionalInstallCommand(pm, dependencies, wslContext.installDir || installBaseDir);
131061
- const execCommand = wrapCommandForWsl(installCommand, wslContext);
131062
- const fallbackNpmCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_4.sX)([
131063
- '--silent',
131064
- 'install',
131065
- ...dependencies,
131066
- '--prefix',
131067
- installBaseDir,
131068
- '--save-optional'
131069
- ]);
131070
131135
  const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
131071
- const setupMessage = _messages__rspack_import_2._j([
131136
+ const setupMessages = _messages__rspack_import_2._j([
131072
131137
  integration
131073
131138
  ], integration, isAuthor);
131074
- const progressEnabled = !isAuthor && (0, _webpack_lib_progress__rspack_import_5.u)();
131075
- const progress = (0, _webpack_lib_progress__rspack_import_5.J)(setupMessage, {
131076
- enabled: progressEnabled
131139
+ const setupMessage = setupMessages[0];
131140
+ const hasIndex = Boolean(options?.index && options?.total);
131141
+ const setupMessageWithIndex = hasIndex ? setupMessage.replace('►►► ', `►►► [${options?.index}/${options?.total}] `) : setupMessage;
131142
+ const progressEnabled = !isAuthor && (0, _webpack_lib_progress__rspack_import_6.u)();
131143
+ const progress = (0, _webpack_lib_progress__rspack_import_6.J)(setupMessageWithIndex, {
131144
+ enabled: progressEnabled,
131145
+ persistLabel: true
131077
131146
  });
131078
- if (isAuthor) console.warn(setupMessage);
131079
- else if (!progressEnabled) console.log(setupMessage);
131147
+ if (isAuthor) console.warn(setupMessageWithIndex);
131148
+ else if (!progressEnabled) console.log(setupMessageWithIndex);
131080
131149
  try {
131081
- await execInstallWithFallback(execCommand, {
131082
- cwd: wslContext.useWsl ? void 0 : installBaseDir,
131083
- fallbackNpmCommand
131084
- });
131150
+ for (const dependency of dependencies){
131151
+ const installCommand = getOptionalInstallCommand(pm, [
131152
+ dependency
131153
+ ], wslContext.installDir || installBaseDir);
131154
+ const execCommand = wrapCommandForWsl(installCommand, wslContext);
131155
+ const fallbackNpmCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_5.sX)([
131156
+ '--silent',
131157
+ 'install',
131158
+ dependency,
131159
+ '--prefix',
131160
+ installBaseDir,
131161
+ '--save-optional'
131162
+ ]);
131163
+ await execInstallWithFallback(execCommand, {
131164
+ cwd: wslContext.useWsl ? void 0 : installBaseDir,
131165
+ fallbackNpmCommand
131166
+ });
131167
+ }
131085
131168
  } finally{
131086
131169
  progress.stop();
131087
131170
  }
@@ -131090,7 +131173,7 @@ var __webpack_modules__ = {
131090
131173
  console.log(_messages__rspack_import_2.cr(integration));
131091
131174
  const rootInstall = getRootInstallCommand(pm, wslContext.useWsl ? wslContext.installDir : void 0);
131092
131175
  const rootCommand = wrapCommandForWsl(rootInstall, wslContext);
131093
- const rootFallbackCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_4.sX)([
131176
+ const rootFallbackCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_5.sX)([
131094
131177
  '--silent',
131095
131178
  'install',
131096
131179
  '--prefix',
@@ -131126,85 +131209,17 @@ var __webpack_modules__ = {
131126
131209
  return false;
131127
131210
  }
131128
131211
  }
131129
- async function installOptionalDependenciesBatch(integration, dependencies, integrations) {
131130
- if (!dependencies.length) return;
131131
- let pm;
131132
- let wslContext;
131133
- let installBaseDir;
131134
- try {
131135
- installBaseDir = resolveDevelopInstallRoot();
131136
- if (!installBaseDir) throw new Error(_messages__rspack_import_2.eG(integration));
131137
- pm = (0, _webpack_lib_package_manager__rspack_import_4._c)({
131138
- cwd: installBaseDir
131212
+ async function installOptionalDependenciesBatch(plans) {
131213
+ if (!plans.length) return;
131214
+ console.log(`${pintor__rspack_import_3_default().gray('►►►')} Found ${pintor__rspack_import_3_default().yellow(String(plans.length))} specialized integration${1 === plans.length ? '' : 's'} needing installation...`);
131215
+ for (const [index, plan] of plans.entries()){
131216
+ const didInstall = await installOptionalDependencies(plan.integration, plan.dependencies, {
131217
+ index: index + 1,
131218
+ total: plans.length
131139
131219
  });
131140
- wslContext = resolveWslContext(installBaseDir);
131141
- if (!wslContext.useWsl) pm = await preferCorepackFallback(pm);
131142
- const installCommand = getOptionalInstallCommand(pm, dependencies, wslContext.installDir || installBaseDir);
131143
- const execCommand = wrapCommandForWsl(installCommand, wslContext);
131144
- const fallbackNpmCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_4.sX)([
131145
- '--silent',
131146
- 'install',
131147
- ...dependencies,
131148
- '--prefix',
131149
- installBaseDir,
131150
- '--save-optional'
131151
- ]);
131152
- const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
131153
- const setupMessage = _messages__rspack_import_2._j(integrations, integration, isAuthor);
131154
- const progressEnabled = !isAuthor && (0, _webpack_lib_progress__rspack_import_5.u)();
131155
- const progress = (0, _webpack_lib_progress__rspack_import_5.J)(setupMessage, {
131156
- enabled: progressEnabled
131157
- });
131158
- if (isAuthor) console.warn(setupMessage);
131159
- else if (!progressEnabled) console.log(setupMessage);
131160
- try {
131161
- await execInstallWithFallback(execCommand, {
131162
- cwd: wslContext.useWsl ? void 0 : installBaseDir,
131163
- fallbackNpmCommand
131164
- });
131165
- } finally{
131166
- progress.stop();
131167
- }
131168
- await new Promise((resolve)=>setTimeout(resolve, 500));
131169
- if (isAuthor) {
131170
- console.log(_messages__rspack_import_2.cr(integration));
131171
- const rootInstall = getRootInstallCommand(pm, wslContext.useWsl ? wslContext.installDir : void 0);
131172
- const rootCommand = wrapCommandForWsl(rootInstall, wslContext);
131173
- const rootFallbackCommand = wslContext.useWsl ? void 0 : (0, _webpack_lib_package_manager__rspack_import_4.sX)([
131174
- '--silent',
131175
- 'install',
131176
- '--prefix',
131177
- installBaseDir
131178
- ]);
131179
- await execInstallWithFallback(rootCommand, {
131180
- cwd: wslContext.useWsl ? void 0 : installBaseDir,
131181
- fallbackNpmCommand: rootFallbackCommand
131182
- });
131183
- console.log(_messages__rspack_import_2.ys(integration));
131184
- }
131185
- return true;
131186
- } catch (error) {
131187
- console.error('[extension.js][optional-deps] debug', {
131188
- platform: process.platform,
131189
- execPath: process.execPath,
131190
- cwd: process.cwd(),
131191
- path: process.env.PATH || process.env.Path,
131192
- comspec: process.env.ComSpec,
131193
- systemRoot: process.env.SystemRoot,
131194
- npm_execpath: process.env.npm_execpath,
131195
- npm_config_user_agent: process.env.npm_config_user_agent,
131196
- npm_config_prefix: process.env.npm_config_prefix,
131197
- npm_config_cache: process.env.npm_config_cache,
131198
- npm_config_userconfig: process.env.npm_config_userconfig,
131199
- installBaseDir,
131200
- wslContext,
131201
- pm
131202
- });
131203
- const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
131204
- if (isMissingManagerError(error)) console.error(_messages__rspack_import_2.Vo(integration));
131205
- else console.error(_messages__rspack_import_2.DX(integration, error, isAuthor));
131206
- return false;
131220
+ if (!didInstall) return false;
131207
131221
  }
131222
+ return true;
131208
131223
  }
131209
131224
  function hasDependency(projectPath, dependency) {
131210
131225
  const findNearestPackageJsonDirectory = (startPath)=>{
@@ -131282,14 +131297,12 @@ var __webpack_modules__ = {
131282
131297
  return `${pintor__rspack_import_0_default().green('►►►')} ${name} installation completed.`;
131283
131298
  }
131284
131299
  function optionalToolingSetup(integrations, fallback, isAuthor) {
131285
- const formatList = (items)=>{
131286
- if (1 === items.length) return items[0];
131287
- if (2 === items.length) return `${items[0]} and ${items[1]}`;
131288
- return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;
131289
- };
131290
- const list = integrations && integrations.length > 0 ? formatList(integrations) : fallback;
131300
+ const list = integrations && integrations.length > 0 ? integrations : [
131301
+ fallback
131302
+ ];
131291
131303
  const prefix = isAuthor ? pintor__rspack_import_0_default().brightMagenta('►►► Author says') : pintor__rspack_import_0_default().gray('►►►');
131292
- return `${prefix} Installing project integrations for ${list} (this is a one time operation)`;
131304
+ const suffix = 'true' === process.env.EXTENSION_ONE_TIME_INSTALL_HINT ? ' (this is a one time operation)' : '';
131305
+ return list.map((integration)=>`${prefix} Installing specialized dependencies for ${integration}...${suffix}`);
131293
131306
  }
131294
131307
  function optionalToolingRootInstall(integration) {
131295
131308
  return `${pintor__rspack_import_0_default().brightMagenta('►►► Author says')} [${integration}] Installing root dependencies for dev...`;
@@ -132291,6 +132304,7 @@ var __webpack_modules__ = {
132291
132304
  });
132292
132305
  var path__rspack_import_0 = __webpack_require__("path");
132293
132306
  var fs__rspack_import_1 = __webpack_require__("fs");
132307
+ var module__rspack_import_2 = __webpack_require__("module");
132294
132308
  function findExtensionDevelopRoot() {
132295
132309
  const webpackLibDir = __dirname;
132296
132310
  const webpackDir = path__rspack_import_0.resolve(webpackLibDir, '..');
@@ -132312,9 +132326,20 @@ var __webpack_modules__ = {
132312
132326
  throw new Error(`Failed to load build-dependencies.json: ${error.message}`);
132313
132327
  }
132314
132328
  }
132329
+ const require1 = (0, module__rspack_import_2.createRequire)(__rslib_import_meta_url__);
132315
132330
  function isDependencyInstalled(dependency, packageRoot) {
132316
132331
  const nodeModulesPath = path__rspack_import_0.join(packageRoot, 'node_modules', dependency);
132317
- return fs__rspack_import_1.existsSync(nodeModulesPath);
132332
+ if (fs__rspack_import_1.existsSync(nodeModulesPath)) return true;
132333
+ try {
132334
+ require1.resolve(dependency, {
132335
+ paths: [
132336
+ packageRoot
132337
+ ]
132338
+ });
132339
+ return true;
132340
+ } catch {
132341
+ return false;
132342
+ }
132318
132343
  }
132319
132344
  function areBuildDependenciesInstalled(packageRoot) {
132320
132345
  const dependencies = loadBuildDependencies();
@@ -132695,6 +132720,126 @@ var __webpack_modules__ = {
132695
132720
  return list;
132696
132721
  }
132697
132722
  },
132723
+ "./webpack/webpack-lib/install-cache.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
132724
+ "use strict";
132725
+ __webpack_require__.d(__webpack_exports__, {
132726
+ Q: ()=>hasInstallMarker,
132727
+ h: ()=>writeInstallMarker
132728
+ });
132729
+ var path__rspack_import_0 = __webpack_require__("path");
132730
+ var fs__rspack_import_1 = __webpack_require__("fs");
132731
+ var crypto__rspack_import_2 = __webpack_require__("crypto");
132732
+ var _package_json__rspack_import_3 = __webpack_require__("./package.json");
132733
+ var _plugin_css_css_lib_integrations__rspack_import_4 = __webpack_require__("./webpack/plugin-css/css-lib/integrations.ts");
132734
+ function getInstallCacheDir(packageRoot) {
132735
+ return path__rspack_import_0.join(packageRoot, '.cache', 'extensionjs', 'install');
132736
+ }
132737
+ function getProjectKey(projectPath) {
132738
+ return (0, crypto__rspack_import_2.createHash)('sha1').update(path__rspack_import_0.resolve(projectPath)).digest('hex');
132739
+ }
132740
+ function getCacheVersionPath(cacheDir) {
132741
+ return path__rspack_import_0.join(cacheDir, 'version.json');
132742
+ }
132743
+ function getProjectDepsHash(projectPath) {
132744
+ try {
132745
+ const packageJsonPath = path__rspack_import_0.join(projectPath, 'package.json');
132746
+ if (!fs__rspack_import_1.existsSync(packageJsonPath)) return 'no-package-json';
132747
+ const raw = fs__rspack_import_1.readFileSync(packageJsonPath, 'utf8');
132748
+ const parsed = JSON.parse(raw || '{}');
132749
+ const deps = parsed?.dependencies || {};
132750
+ const devDeps = parsed?.devDependencies || {};
132751
+ const normalize = (input)=>{
132752
+ const sortedKeys = Object.keys(input).sort();
132753
+ const normalized = {};
132754
+ for (const key of sortedKeys)normalized[key] = input[key];
132755
+ return normalized;
132756
+ };
132757
+ const stable = JSON.stringify({
132758
+ dependencies: normalize(deps),
132759
+ devDependencies: normalize(devDeps)
132760
+ });
132761
+ return (0, crypto__rspack_import_2.createHash)('sha1').update(stable).digest('hex');
132762
+ } catch {
132763
+ return 'invalid-package-json';
132764
+ }
132765
+ }
132766
+ function ensureCacheVersion(cacheDir) {
132767
+ const versionPath = getCacheVersionPath(cacheDir);
132768
+ const expectedVersion = _package_json__rspack_import_3.rE;
132769
+ try {
132770
+ if (!fs__rspack_import_1.existsSync(versionPath)) return true;
132771
+ const raw = fs__rspack_import_1.readFileSync(versionPath, 'utf8');
132772
+ const data = JSON.parse(raw || '{}');
132773
+ if (data?.version !== expectedVersion) {
132774
+ fs__rspack_import_1.rmSync(cacheDir, {
132775
+ recursive: true,
132776
+ force: true
132777
+ });
132778
+ return false;
132779
+ }
132780
+ return true;
132781
+ } catch {
132782
+ try {
132783
+ fs__rspack_import_1.rmSync(cacheDir, {
132784
+ recursive: true,
132785
+ force: true
132786
+ });
132787
+ } catch {}
132788
+ return false;
132789
+ }
132790
+ }
132791
+ function getInstallMarkerPath(projectPath) {
132792
+ const packageRoot = (0, _plugin_css_css_lib_integrations__rspack_import_4.He)();
132793
+ if (!packageRoot) return;
132794
+ const cacheDir = getInstallCacheDir(packageRoot);
132795
+ return path__rspack_import_0.join(cacheDir, `${getProjectKey(projectPath)}.json`);
132796
+ }
132797
+ function hasInstallMarker(projectPath) {
132798
+ const marker = getInstallMarkerPath(projectPath);
132799
+ if (!marker) return false;
132800
+ const cacheDir = path__rspack_import_0.dirname(marker);
132801
+ if (!ensureCacheVersion(cacheDir)) return false;
132802
+ if (!fs__rspack_import_1.existsSync(marker)) return false;
132803
+ try {
132804
+ const raw = fs__rspack_import_1.readFileSync(marker, 'utf8');
132805
+ const data = JSON.parse(raw || '{}');
132806
+ const depsHash = getProjectDepsHash(projectPath);
132807
+ if (data?.depsHash !== depsHash) {
132808
+ fs__rspack_import_1.rmSync(marker, {
132809
+ force: true
132810
+ });
132811
+ return false;
132812
+ }
132813
+ return true;
132814
+ } catch {
132815
+ try {
132816
+ fs__rspack_import_1.rmSync(marker, {
132817
+ force: true
132818
+ });
132819
+ } catch {}
132820
+ return false;
132821
+ }
132822
+ }
132823
+ function writeInstallMarker(projectPath) {
132824
+ const marker = getInstallMarkerPath(projectPath);
132825
+ if (!marker) return;
132826
+ const cacheDir = path__rspack_import_0.dirname(marker);
132827
+ try {
132828
+ fs__rspack_import_1.mkdirSync(cacheDir, {
132829
+ recursive: true
132830
+ });
132831
+ fs__rspack_import_1.writeFileSync(getCacheVersionPath(cacheDir), JSON.stringify({
132832
+ version: _package_json__rspack_import_3.rE
132833
+ }));
132834
+ fs__rspack_import_1.writeFileSync(marker, JSON.stringify({
132835
+ projectPath: path__rspack_import_0.resolve(projectPath),
132836
+ depsHash: getProjectDepsHash(projectPath),
132837
+ version: _package_json__rspack_import_3.rE,
132838
+ ts: Date.now()
132839
+ }));
132840
+ } catch {}
132841
+ }
132842
+ },
132698
132843
  "./webpack/webpack-lib/messages.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
132699
132844
  "use strict";
132700
132845
  __webpack_require__.d(__webpack_exports__, {
@@ -132800,7 +132945,8 @@ var __webpack_modules__ = {
132800
132945
  return `${getLoggingPrefix('info')} Skipping browser runner for ${capitalizedBrowserName(browser)} (no-runner).`;
132801
132946
  }
132802
132947
  function installingRequiredDependencies() {
132803
- return `${getLoggingPrefix('info')} Installing required dependencies...`;
132948
+ const suffix = 'true' === process.env.EXTENSION_ONE_TIME_INSTALL_HINT ? ' (this is a one time operation)' : '';
132949
+ return `${getLoggingPrefix('info')} Installing general build dependencies...${suffix}`;
132804
132950
  }
132805
132951
  function installingBuildDependencies(dependencies) {
132806
132952
  const list = dependencies.map((dep)=>pintor__rspack_import_2_default().gray(dep)).join(', ');
@@ -132947,7 +133093,7 @@ var __webpack_modules__ = {
132947
133093
  return `${getLoggingPrefix('info')} Using ${pintor__rspack_import_2_default().yellow(integration)}.`;
132948
133094
  }
132949
133095
  function installingDependencies() {
132950
- return `${getLoggingPrefix('info')} Installing project dependencies...`;
133096
+ return `${getLoggingPrefix('info')} Installing project dependencies... ${pintor__rspack_import_2_default().gray('(This may take a moment)')}`;
132951
133097
  }
132952
133098
  function debugDirs(manifestDir, packageJsonDir) {
132953
133099
  return `${getLoggingPrefix('info')} Directories\n${pintor__rspack_import_2_default().gray('MANIFEST_DIR')} ${pintor__rspack_import_2_default().underline(manifestDir)}\n${pintor__rspack_import_2_default().gray('PACKAGE_JSON_DIR')} ${pintor__rspack_import_2_default().underline(packageJsonDir)}`;
@@ -133077,44 +133223,18 @@ var __webpack_modules__ = {
133077
133223
  } catch {}
133078
133224
  return resolveNpmCliFromNode(process.execPath);
133079
133225
  }
133080
- function resolveWindowsCmdExe() {
133081
- if ('win32' !== process.platform) return 'cmd.exe';
133082
- const comspec = process.env.ComSpec;
133083
- if (comspec && fs__rspack_import_0.existsSync(comspec)) return comspec;
133084
- const systemRoot = process.env.SystemRoot || 'C:\\Windows';
133085
- const fallback = path__rspack_import_1.join(systemRoot, 'System32', 'cmd.exe');
133086
- if (fs__rspack_import_0.existsSync(fallback)) return fallback;
133087
- return 'cmd.exe';
133088
- }
133089
- function formatCmdArgs(command, args) {
133090
- const quotedCommand = command.includes(' ') ? `"${command}"` : command;
133091
- const quotedArgs = args.map((arg)=>arg.includes(' ') ? `"${arg}"` : arg);
133092
- return `${quotedCommand} ${quotedArgs.join(' ')}`.trim();
133093
- }
133094
133226
  function isWindowsExecutablePath(value) {
133095
133227
  if (!value || 'win32' !== process.platform) return false;
133096
133228
  return /\.(cmd|bat|exe)$/i.test(value);
133097
133229
  }
133098
- function shouldUseCmdExe(command) {
133099
- if ('win32' !== process.platform) return false;
133100
- if (/\.(cmd|bat)$/i.test(command)) return true;
133101
- return [
133102
- 'npm',
133103
- 'pnpm',
133104
- 'yarn',
133105
- 'corepack',
133106
- 'bun'
133107
- ].includes(command);
133108
- }
133109
133230
  function resolveWindowsCommandPath(command) {
133110
133231
  if ('win32' !== process.platform) return;
133111
133232
  try {
133112
- const cmdExe = resolveWindowsCmdExe();
133113
- const output = (0, child_process__rspack_import_2.execFileSync)(cmdExe, [
133114
- '/d',
133115
- '/s',
133116
- '/c',
133117
- `where ${command}`
133233
+ const systemRoot = process.env.SystemRoot || 'C:\\Windows';
133234
+ const whereExe = path__rspack_import_1.join(systemRoot, 'System32', 'where.exe');
133235
+ const whereCommand = fs__rspack_import_0.existsSync(whereExe) ? whereExe : 'where';
133236
+ const output = (0, child_process__rspack_import_2.execFileSync)(whereCommand, [
133237
+ command
133118
133238
  ], {
133119
133239
  encoding: 'utf8',
133120
133240
  stdio: [
@@ -133193,10 +133313,15 @@ var __webpack_modules__ = {
133193
133313
  ];
133194
133314
  for (const candidate of candidates){
133195
133315
  const resolved = resolveCommandOnPath(candidate);
133196
- if (resolved) return {
133197
- name: candidate,
133198
- execPath: resolved
133199
- };
133316
+ if (resolved) {
133317
+ if ('win32' === process.platform && /\.(cmd|bat)$/i.test(resolved)) return {
133318
+ name: candidate
133319
+ };
133320
+ return {
133321
+ name: candidate,
133322
+ execPath: resolved
133323
+ };
133324
+ }
133200
133325
  }
133201
133326
  const corepackPath = resolveCommandOnPath('corepack');
133202
133327
  if (corepackPath || canRunCorepack()) return {
@@ -133269,20 +133394,10 @@ var __webpack_modules__ = {
133269
133394
  };
133270
133395
  }
133271
133396
  function buildSpawnInvocation(command, args) {
133272
- if (!shouldUseCmdExe(command)) return {
133397
+ return {
133273
133398
  command,
133274
133399
  args
133275
133400
  };
133276
- const cmdExe = resolveWindowsCmdExe();
133277
- return {
133278
- command: cmdExe,
133279
- args: [
133280
- '/d',
133281
- '/s',
133282
- '/c',
133283
- formatCmdArgs(command, args)
133284
- ]
133285
- };
133286
133401
  }
133287
133402
  function execInstallCommand(command, args, options) {
133288
133403
  const invocation = buildSpawnInvocation(command, args);
@@ -133315,6 +133430,7 @@ var __webpack_modules__ = {
133315
133430
  });
133316
133431
  var fs__rspack_import_0 = __webpack_require__("fs");
133317
133432
  var path__rspack_import_1 = __webpack_require__("path");
133433
+ var _install_cache__rspack_import_2 = __webpack_require__("./webpack/webpack-lib/install-cache.ts");
133318
133434
  function asAbsolute(p) {
133319
133435
  return path__rspack_import_1.isAbsolute(p) ? p : path__rspack_import_1.resolve(p);
133320
133436
  }
@@ -133332,6 +133448,25 @@ var __webpack_modules__ = {
133332
133448
  function needsInstall(packageJsonDir) {
133333
133449
  const nm = getNodeModulesDir(packageJsonDir);
133334
133450
  try {
133451
+ const packageJsonPath = path__rspack_import_1.join(packageJsonDir, 'package.json');
133452
+ if (fs__rspack_import_0.existsSync(packageJsonPath)) {
133453
+ const raw = fs__rspack_import_0.readFileSync(packageJsonPath, 'utf-8');
133454
+ const packageJson = JSON.parse(raw);
133455
+ const depsCount = Object.keys(packageJson?.dependencies || {}).length;
133456
+ const devDepsCount = Object.keys(packageJson?.devDependencies || {}).length;
133457
+ if (depsCount + devDepsCount === 0) return false;
133458
+ if ((0, _install_cache__rspack_import_2.Q)(packageJsonDir)) return false;
133459
+ if (!fs__rspack_import_0.existsSync(nm)) return true;
133460
+ const deps = Object.keys(packageJson?.dependencies || {});
133461
+ const devDeps = Object.keys(packageJson?.devDependencies || {});
133462
+ if (fs__rspack_import_0.existsSync(path__rspack_import_1.join(nm, '.pnpm'))) return false;
133463
+ if (fs__rspack_import_0.existsSync(path__rspack_import_1.join(nm, '.modules.yaml'))) return false;
133464
+ const hasInstalledDep = [
133465
+ ...deps,
133466
+ ...devDeps
133467
+ ].some((dep)=>fs__rspack_import_0.existsSync(path__rspack_import_1.join(nm, dep)));
133468
+ return !hasInstalledDep;
133469
+ }
133335
133470
  return !fs__rspack_import_0.existsSync(nm) || 0 === fs__rspack_import_0.readdirSync(nm).length;
133336
133471
  } catch {
133337
133472
  return true;
@@ -133340,7 +133475,8 @@ var __webpack_modules__ = {
133340
133475
  function normalizeBrowser(browser, chromiumBinary, geckoBinary) {
133341
133476
  const requested = String(browser || '');
133342
133477
  if (chromiumBinary) {
133343
- if (!requested || 'chromium' === requested || 'chromium-based' === requested) return 'chromium-based';
133478
+ if (!requested || 'chromium-based' === requested) return 'chromium-based';
133479
+ if ('chromium' === requested) return 'chromium';
133344
133480
  if ('edge' === requested) return 'edge';
133345
133481
  if ('chrome' === requested) return 'chrome';
133346
133482
  }
@@ -133432,7 +133568,10 @@ var __webpack_modules__ = {
133432
133568
  return {
133433
133569
  stop: ()=>{
133434
133570
  clearInterval(timer);
133435
- if (process.stdout.isTTY) process.stdout.write(`\r${' '.repeat(lastVisibleLength)}\r`);
133571
+ if (process.stdout.isTTY) {
133572
+ process.stdout.write(`\r${' '.repeat(lastVisibleLength)}\r`);
133573
+ if (options?.persistLabel) process.stdout.write(`${label}\n`);
133574
+ }
133436
133575
  }
133437
133576
  };
133438
133577
  }
@@ -133580,7 +133719,7 @@ var __webpack_modules__ = {
133580
133719
  },
133581
133720
  "./package.json" (module) {
133582
133721
  "use strict";
133583
- module.exports = JSON.parse('{"rE":"3.5.0-next.9","El":{"@rspack/core":"^1.7.2","@rspack/dev-server":"^1.1.5","@swc/core":"^1.15.8","@swc/helpers":"^0.5.18","adm-zip":"^0.5.16","browser-extension-manifest-fields":"^2.2.1","case-sensitive-paths-webpack-plugin":"^2.4.0","chrome-location2":"4.0.0","chromium-location":"2.0.0","content-security-policy-parser":"^0.6.0","cross-spawn":"^7.0.6","dotenv":"^17.2.3","edge-location":"2.2.0","firefox-location2":"3.0.0","go-git-it":"^5.0.3","ignore":"^7.0.5","loader-utils":"^3.3.1","magic-string":"^0.30.21","parse5":"^8.0.0","parse5-utilities":"^1.0.0","pintor":"0.3.0","schema-utils":"^4.3.3","tiny-glob":"^0.2.9","unique-names-generator":"^4.7.1","webextension-polyfill":"^0.12.0","webpack-merge":"^6.0.1","webpack-target-webextension":"^2.1.3","ws":"^8.19.0"}}');
133722
+ module.exports = JSON.parse('{"rE":"3.5.1","El":{"@rspack/core":"^1.7.5","@rspack/dev-server":"^1.1.5","@swc/core":"^1.15.8","@swc/helpers":"^0.5.18","adm-zip":"^0.5.16","browser-extension-manifest-fields":"^2.2.1","case-sensitive-paths-webpack-plugin":"^2.4.0","chrome-location2":"4.0.0","chromium-location":"2.0.0","content-security-policy-parser":"^0.6.0","cross-spawn":"^7.0.6","dotenv":"^17.2.3","edge-location":"2.2.0","firefox-location2":"3.0.0","go-git-it":"^5.1.1","ignore":"^7.0.5","loader-utils":"^3.3.1","magic-string":"^0.30.21","parse5":"^8.0.0","parse5-utilities":"^1.0.0","pintor":"0.3.0","schema-utils":"^4.3.3","tiny-glob":"^0.2.9","unique-names-generator":"^4.7.1","webextension-polyfill":"^0.12.0","webpack-merge":"^6.0.1","webpack-target-webextension":"^2.1.3","ws":"^8.19.0"}}');
133584
133723
  }
133585
133724
  };
133586
133725
  var __webpack_module_cache__ = {};
@@ -133930,8 +134069,10 @@ var __webpack_exports__ = {};
133930
134069
  const stdio = isAuthor ? 'inherit' : 'ignore';
133931
134070
  const progressLabel = messages.xK(dependencies);
133932
134071
  const progressEnabled = !isAuthor && (0, webpack_lib_progress.u)();
134072
+ const persistLabel = 'true' === process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
133933
134073
  const progress = (0, webpack_lib_progress.J)(progressLabel, {
133934
- enabled: progressEnabled
134074
+ enabled: progressEnabled,
134075
+ persistLabel
133935
134076
  });
133936
134077
  if (!progressEnabled) console.log(progressLabel);
133937
134078
  if (isAuthor) console.warn(messages.TL('build dependencies'));
@@ -133952,14 +134093,28 @@ var __webpack_exports__ = {};
133952
134093
  process.chdir(originalDirectory);
133953
134094
  }
133954
134095
  }
134096
+ var install_cache = __webpack_require__("./webpack/webpack-lib/install-cache.ts");
133955
134097
  function install_dependencies_getInstallArgs() {
133956
134098
  return [
133957
134099
  'install'
133958
134100
  ];
133959
134101
  }
134102
+ async function hasDependenciesToInstall(projectPath) {
134103
+ try {
134104
+ const raw = await external_fs_.promises.readFile(external_path_.join(projectPath, 'package.json'), 'utf8');
134105
+ const packageJson = JSON.parse(raw);
134106
+ const depsCount = Object.keys(packageJson?.dependencies || {}).length;
134107
+ const devDepsCount = Object.keys(packageJson?.devDependencies || {}).length;
134108
+ return depsCount + devDepsCount > 0;
134109
+ } catch (error) {
134110
+ return true;
134111
+ }
134112
+ }
133960
134113
  async function installDependencies(projectPath) {
133961
134114
  const nodeModulesPath = external_path_.join(projectPath, 'node_modules');
133962
134115
  const originalDirectory = process.cwd();
134116
+ const shouldInstall = await hasDependenciesToInstall(projectPath);
134117
+ if (!shouldInstall) return;
133963
134118
  const progressLabel = messages.Vy();
133964
134119
  try {
133965
134120
  process.chdir(projectPath);
@@ -133977,8 +134132,10 @@ var __webpack_exports__ = {};
133977
134132
  const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
133978
134133
  const stdio = isAuthor ? 'inherit' : 'ignore';
133979
134134
  const progressEnabled = !isAuthor && (0, webpack_lib_progress.u)();
134135
+ const persistLabel = 'true' === process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
133980
134136
  const progress = (0, webpack_lib_progress.J)(progressLabel, {
133981
- enabled: progressEnabled
134137
+ enabled: progressEnabled,
134138
+ persistLabel
133982
134139
  });
133983
134140
  if (!progressEnabled) console.log(progressLabel);
133984
134141
  if (isAuthor) console.warn(messages.TL('project dependencies'));
@@ -133988,6 +134145,7 @@ var __webpack_exports__ = {};
133988
134145
  cwd: projectPath,
133989
134146
  stdio
133990
134147
  });
134148
+ (0, install_cache.h)(projectPath);
133991
134149
  } finally{
133992
134150
  progress.stop();
133993
134151
  }
@@ -134009,7 +134167,7 @@ var __webpack_exports__ = {};
134009
134167
  installedBuild: false,
134010
134168
  installedUser: false
134011
134169
  };
134012
- console.log(messages.G2());
134170
+ if (needsBuildInstall) console.log(messages.G2());
134013
134171
  if (needsBuildInstall && packageRoot) await installOwnDependencies(missingBuild, packageRoot);
134014
134172
  if (needsUserInstall && projectPath) await installDependencies(projectPath);
134015
134173
  if (opts?.showRunAgainMessage !== false) console.log(messages.Z0());
@@ -134177,7 +134335,14 @@ var __webpack_exports__ = {};
134177
134335
  return;
134178
134336
  }
134179
134337
  const missingOptionalDeps = new Set();
134338
+ const missingByIntegration = {};
134180
134339
  const usedIntegrations = [];
134340
+ const addMissing = (integration, dependency)=>{
134341
+ if (missingOptionalDeps.has(dependency)) return;
134342
+ missingOptionalDeps.add(dependency);
134343
+ if (!missingByIntegration[integration]) missingByIntegration[integration] = [];
134344
+ missingByIntegration[integration].push(dependency);
134345
+ };
134181
134346
  const usesTypeScript = (0, typescript.eE)(projectPath);
134182
134347
  const usesReact = (0, react.S)(projectPath);
134183
134348
  const usesPreact = (0, preact.K)(projectPath);
@@ -134187,31 +134352,29 @@ var __webpack_exports__ = {};
134187
134352
  const usesLess = (0, less.K)(projectPath);
134188
134353
  const usesPostCss = (0, postcss.A)(projectPath);
134189
134354
  if (usesTypeScript) {
134190
- if (!canResolveFromProject("typescript", projectPath)) {
134191
- missingOptionalDeps.add("typescript");
134192
- usedIntegrations.push('TypeScript');
134193
- }
134355
+ usedIntegrations.push('TypeScript');
134356
+ if (!canResolveFromProject("typescript", projectPath)) addMissing('TypeScript', "typescript");
134194
134357
  }
134195
134358
  if (usesReact) {
134196
- if (!canResolve('react-refresh', projectPath)) missingOptionalDeps.add('react-refresh');
134197
- if (!canResolve('@rspack/plugin-react-refresh', projectPath)) missingOptionalDeps.add('@rspack/plugin-react-refresh');
134359
+ if (!canResolve('react-refresh', projectPath)) addMissing('React', 'react-refresh');
134360
+ if (!canResolve('@rspack/plugin-react-refresh', projectPath)) addMissing('React', '@rspack/plugin-react-refresh');
134198
134361
  usedIntegrations.push('React');
134199
134362
  }
134200
134363
  if (usesPreact) {
134201
- if (!canResolve('@prefresh/core', projectPath)) missingOptionalDeps.add('@prefresh/core');
134202
- if (!canResolve('@prefresh/utils', projectPath)) missingOptionalDeps.add('@prefresh/utils');
134203
- if (!canResolve('@rspack/plugin-preact-refresh', projectPath)) missingOptionalDeps.add('@rspack/plugin-preact-refresh');
134204
- if (!canResolve('preact', projectPath)) missingOptionalDeps.add('preact');
134364
+ if (!canResolve('@prefresh/core', projectPath)) addMissing('Preact', '@prefresh/core');
134365
+ if (!canResolve('@prefresh/utils', projectPath)) addMissing('Preact', '@prefresh/utils');
134366
+ if (!canResolve('@rspack/plugin-preact-refresh', projectPath)) addMissing('Preact', '@rspack/plugin-preact-refresh');
134367
+ if (!canResolve('preact', projectPath)) addMissing('Preact', 'preact');
134205
134368
  usedIntegrations.push('Preact');
134206
134369
  }
134207
134370
  if (usesVue) {
134208
- if (!canResolve('vue-loader', projectPath)) missingOptionalDeps.add('vue-loader');
134209
- if (!canResolve('@vue/compiler-sfc', projectPath)) missingOptionalDeps.add('@vue/compiler-sfc');
134371
+ if (!canResolve('vue-loader', projectPath)) addMissing('Vue', 'vue-loader');
134372
+ if (!canResolve('@vue/compiler-sfc', projectPath)) addMissing('Vue', '@vue/compiler-sfc');
134210
134373
  usedIntegrations.push('Vue');
134211
134374
  }
134212
134375
  if (usesSvelte) {
134213
- if (!canResolveFromProject('svelte-loader', projectPath) && !canResolve('svelte-loader', projectPath)) missingOptionalDeps.add('svelte-loader');
134214
- if (!canResolveFromProject("typescript", projectPath)) missingOptionalDeps.add("typescript");
134376
+ if (!canResolveFromProject('svelte-loader', projectPath) && !canResolve('svelte-loader', projectPath)) addMissing('Svelte', 'svelte-loader');
134377
+ if (!canResolveFromProject("typescript", projectPath)) addMissing('Svelte', "typescript");
134215
134378
  usedIntegrations.push('Svelte');
134216
134379
  }
134217
134380
  if (usesSass) {
@@ -134221,28 +134384,32 @@ var __webpack_exports__ = {};
134221
134384
  'postcss-scss',
134222
134385
  'postcss-preset-env'
134223
134386
  ];
134224
- for (const dep of postCssDeps)if (!canResolve(dep, projectPath)) missingOptionalDeps.add(dep);
134225
- missingOptionalDeps.add('sass-loader');
134387
+ for (const dep of postCssDeps)if (!canResolve(dep, projectPath)) addMissing('Sass', dep);
134388
+ addMissing('Sass', 'sass-loader');
134226
134389
  usedIntegrations.push('Sass');
134227
134390
  }
134228
134391
  }
134229
134392
  if (usesLess) {
134230
134393
  if (!canResolve('less-loader', projectPath)) {
134231
- if (!canResolve('less', projectPath)) missingOptionalDeps.add('less');
134232
- missingOptionalDeps.add('less-loader');
134394
+ if (!canResolve('less', projectPath)) addMissing('Less', 'less');
134395
+ addMissing('Less', 'less-loader');
134233
134396
  usedIntegrations.push('Less');
134234
134397
  }
134235
134398
  }
134236
134399
  if (!usesPostCss || canResolve('postcss-loader', projectPath) || usesSass || usesLess) {
134237
134400
  if (usesPostCss) usedIntegrations.push('PostCSS');
134238
134401
  } else {
134239
- if (!canResolve('postcss', projectPath)) missingOptionalDeps.add('postcss');
134240
- missingOptionalDeps.add('postcss-loader');
134402
+ if (!canResolve('postcss', projectPath)) addMissing('PostCSS', 'postcss');
134403
+ addMissing('PostCSS', 'postcss-loader');
134241
134404
  usedIntegrations.push('PostCSS');
134242
134405
  }
134243
134406
  if (missingOptionalDeps.size > 0) {
134244
134407
  const uniqueIntegrations = Array.from(new Set(usedIntegrations));
134245
- const didInstall = await (0, frameworks_lib_integrations.Dy)('Optional', Array.from(missingOptionalDeps), uniqueIntegrations);
134408
+ const installPlans = uniqueIntegrations.map((integration)=>({
134409
+ integration,
134410
+ dependencies: missingByIntegration[integration] || []
134411
+ })).filter((plan)=>plan.dependencies.length > 0);
134412
+ const didInstall = await (0, frameworks_lib_integrations.Dy)(installPlans);
134246
134413
  if (!didInstall) throw new Error('[Optional] Optional dependencies failed to install.');
134247
134414
  if (opts?.showRunAgainMessage !== false && 'true' === process.env.EXTENSION_AUTHOR_MODE) console.log(js_frameworks_lib_messages.Q2(uniqueIntegrations));
134248
134415
  if (opts?.exitOnInstall !== false) {
@@ -134301,11 +134468,18 @@ var __webpack_exports__ = {};
134301
134468
  const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
134302
134469
  try {
134303
134470
  const shouldInstallProjectDeps = !isAuthor || buildOptions?.install !== false;
134304
- await ensureProjectReady(projectStructure, 'production', {
134305
- skipProjectInstall: isVitest || !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134306
- exitOnInstall: false,
134307
- showRunAgainMessage: false
134308
- });
134471
+ const previousOneTimeHint = process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134472
+ process.env.EXTENSION_ONE_TIME_INSTALL_HINT = 'true';
134473
+ try {
134474
+ await ensureProjectReady(projectStructure, 'production', {
134475
+ skipProjectInstall: isVitest || !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134476
+ exitOnInstall: false,
134477
+ showRunAgainMessage: false
134478
+ });
134479
+ } finally{
134480
+ if (void 0 === previousOneTimeHint) delete process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134481
+ else process.env.EXTENSION_ONE_TIME_INSTALL_HINT = previousOneTimeHint;
134482
+ }
134309
134483
  const [{ rspack }, { merge }, { handleStatsErrors }, { default: webpackConfig }] = await Promise.all([
134310
134484
  Promise.resolve(require1('@rspack/core')),
134311
134485
  import("webpack-merge"),
@@ -134419,11 +134593,18 @@ var __webpack_exports__ = {};
134419
134593
  const debug = isAuthor;
134420
134594
  const { manifestDir, packageJsonDir } = (0, webpack_lib_paths.fu)(projectStructure);
134421
134595
  const shouldInstallProjectDeps = !isAuthor || false !== devOptions.install;
134422
- await ensureProjectReady(projectStructure, 'development', {
134423
- skipProjectInstall: !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134424
- exitOnInstall: false,
134425
- showRunAgainMessage: false
134426
- });
134596
+ const previousOneTimeHint = process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134597
+ process.env.EXTENSION_ONE_TIME_INSTALL_HINT = 'true';
134598
+ try {
134599
+ await ensureProjectReady(projectStructure, 'development', {
134600
+ skipProjectInstall: !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134601
+ exitOnInstall: false,
134602
+ showRunAgainMessage: false
134603
+ });
134604
+ } finally{
134605
+ if (void 0 === previousOneTimeHint) delete process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134606
+ else process.env.EXTENSION_ONE_TIME_INSTALL_HINT = previousOneTimeHint;
134607
+ }
134427
134608
  if ((0, typescript.eE)(manifestDir)) await generateExtensionTypes(manifestDir, packageJsonDir);
134428
134609
  if (projectStructure.packageJsonPath) assertNoManagedDependencyConflicts(projectStructure.packageJsonPath, manifestDir);
134429
134610
  const browser = (0, webpack_lib_paths.YN)(devOptions.browser || 'chrome', devOptions.chromiumBinary, devOptions.geckoBinary || devOptions.firefoxBinary);
@@ -134432,6 +134613,7 @@ var __webpack_exports__ = {};
134432
134613
  console.log(messages.SG(manifestDir, packageJsonDir));
134433
134614
  console.log(messages._A(browser, devOptions.chromiumBinary, geckoBinary));
134434
134615
  }
134616
+ if ('true' === process.env.EXTENSION_DEV_DRY_RUN) return;
134435
134617
  const { devServer } = await Promise.all([
134436
134618
  __webpack_require__.e("215"),
134437
134619
  __webpack_require__.e("547"),
@@ -134552,11 +134734,14 @@ var __webpack_exports__ = {};
134552
134734
  const safeBrowserConfig = (0, sanitize.a)(browserConfig);
134553
134735
  const safeCommandConfig = (0, sanitize.a)(commandConfig);
134554
134736
  const safePreviewOptions = (0, sanitize.a)(previewOptions);
134737
+ const mergedGeckoBinary = safePreviewOptions.geckoBinary || safePreviewOptions.firefoxBinary || safeCommandConfig.geckoBinary || safeCommandConfig.firefoxBinary || safeBrowserConfig.geckoBinary || safeBrowserConfig.firefoxBinary;
134738
+ const mergedChromiumBinary = safePreviewOptions.chromiumBinary || safeCommandConfig.chromiumBinary || safeBrowserConfig.chromiumBinary;
134555
134739
  const merged = {
134556
134740
  ...safeBrowserConfig,
134557
134741
  ...safeCommandConfig,
134558
134742
  ...safePreviewOptions,
134559
- geckoBinary: safePreviewOptions.geckoBinary || safePreviewOptions.firefoxBinary
134743
+ chromiumBinary: mergedChromiumBinary,
134744
+ geckoBinary: mergedGeckoBinary
134560
134745
  };
134561
134746
  const darkDefaults = (0, dark_mode.U)({
134562
134747
  browser,
@@ -134593,11 +134778,18 @@ var __webpack_exports__ = {};
134593
134778
  const isAuthor = 'true' === process.env.EXTENSION_AUTHOR_MODE;
134594
134779
  const debug = isAuthor;
134595
134780
  const shouldInstallProjectDeps = !isAuthor || false !== startOptions.install;
134596
- await ensureProjectReady(projectStructure, 'development', {
134597
- skipProjectInstall: !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134598
- exitOnInstall: false,
134599
- showRunAgainMessage: false
134600
- });
134781
+ const previousOneTimeHint = process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134782
+ process.env.EXTENSION_ONE_TIME_INSTALL_HINT = 'true';
134783
+ try {
134784
+ await ensureProjectReady(projectStructure, 'development', {
134785
+ skipProjectInstall: !projectStructure.packageJsonPath || !shouldInstallProjectDeps,
134786
+ exitOnInstall: false,
134787
+ showRunAgainMessage: false
134788
+ });
134789
+ } finally{
134790
+ if (void 0 === previousOneTimeHint) delete process.env.EXTENSION_ONE_TIME_INSTALL_HINT;
134791
+ else process.env.EXTENSION_ONE_TIME_INSTALL_HINT = previousOneTimeHint;
134792
+ }
134601
134793
  const browser = (0, webpack_lib_paths.YN)(startOptions.browser || 'chrome', startOptions.chromiumBinary, startOptions.geckoBinary || startOptions.firefoxBinary);
134602
134794
  const { manifestDir, packageJsonDir } = (0, webpack_lib_paths.fu)(projectStructure);
134603
134795
  const commandConfig = await (0, config_loader.eY)(packageJsonDir, 'start');
@@ -134620,7 +134812,7 @@ var __webpack_exports__ = {};
134620
134812
  ...commandConfig,
134621
134813
  ...startOptions,
134622
134814
  browser,
134623
- geckoBinary: startOptions.geckoBinary || startOptions.firefoxBinary,
134815
+ geckoBinary: startOptions.geckoBinary || startOptions.firefoxBinary || browserConfig.geckoBinary || browserConfig.firefoxBinary || commandConfig.geckoBinary || commandConfig.firefoxBinary,
134624
134816
  outputPath: distPath
134625
134817
  });
134626
134818
  } catch (error) {