extension 4.0.4 → 4.0.5

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
@@ -447,6 +447,9 @@ var __webpack_modules__ = {
447
447
  })();
448
448
  return `${getLoggingPrefix('error')} ${isUnreachable}Either install the missing browser or choose a different one via ${pintor__rspack_import_4_default().blue('--browser')} ${pintor__rspack_import_4_default().gray('<chrome|edge|firefox>')}.\n\n${pintor__rspack_import_4_default().red('NOT FOUND')} ${pintor__rspack_import_4_default().underline(browserBinaryLocation || capitalizedBrowserName(browser) + 'BROWSER')}` + wslHint;
449
449
  }
450
+ function usingManagedChromiumFamilyFallback(requestedBrowser, fallbackBrowser, binaryPath) {
451
+ return `${getLoggingPrefix('info')} ${managedBrowserDisplayName(requestedBrowser)} is not installed. Using managed ${managedBrowserDisplayName(fallbackBrowser)} instead.\n${pintor__rspack_import_4_default().gray('PATH')} ${pintor__rspack_import_4_default().underline(binaryPath)}\nRun ${pintor__rspack_import_4_default().blue(`npx extension install ${requestedBrowser}`)} to use ${managedBrowserDisplayName(requestedBrowser)} itself.`;
452
+ }
450
453
  function browserLaunchError(browser, error) {
451
454
  return `${getLoggingPrefix('error')} Error launching ${capitalizedBrowserName(browser)}:\n${pintor__rspack_import_4_default().red(errorDetail(error))}`;
452
455
  }
@@ -536,6 +539,12 @@ var __webpack_modules__ = {
536
539
  body.push(pintor__rspack_import_4_default().gray(`Install ${browserDisplay} into the managed browser cache:`));
537
540
  body.push('');
538
541
  body.push(` ${pintor__rspack_import_4_default().bold(pintor__rspack_import_4_default().blue(installCommand))}`);
542
+ if ('chromium' === browserNorm) {
543
+ body.push('');
544
+ body.push(pintor__rspack_import_4_default().gray('Or install Chrome for Testing (stable channel) — chromium targets use it automatically:'));
545
+ body.push('');
546
+ body.push(` ${pintor__rspack_import_4_default().bold(pintor__rspack_import_4_default().blue(preferredManagedInstallCommand('chrome')))}`);
547
+ }
539
548
  if (finalCachePath) {
540
549
  body.push('');
541
550
  body.push(`${dim('INSTALL PATH')} ${pintor__rspack_import_4_default().underline(finalCachePath)}`);
@@ -723,6 +732,7 @@ var __webpack_modules__ = {
723
732
  TF: ()=>enhancedProcessManagementCleanupError,
724
733
  Te: ()=>cdpClientTargetWebSocketUrlStored,
725
734
  Th: ()=>browserInstanceExited,
735
+ Ug: ()=>usingManagedChromiumFamilyFallback,
726
736
  Vk: ()=>enhancedProcessManagementCleanup,
727
737
  WV: ()=>addonInstallError,
728
738
  XH: ()=>enhancedProcessManagementTerminating,
@@ -857,6 +867,23 @@ var __webpack_modules__ = {
857
867
  }
858
868
  return null;
859
869
  }
870
+ function resolveChromiumFamilyFallback(compilation, requested = 'chromium') {
871
+ const candidates = 'chrome' === requested ? [
872
+ 'chromium',
873
+ 'edge'
874
+ ] : [
875
+ 'chrome',
876
+ 'edge'
877
+ ];
878
+ for (const browser of candidates){
879
+ const binary = resolveFromBinaries(compilation, browser);
880
+ if (binary && fs__rspack_import_0.existsSync(binary)) return {
881
+ browser,
882
+ binary
883
+ };
884
+ }
885
+ return null;
886
+ }
860
887
  function buildCandidates(dir, browser) {
861
888
  const out = [];
862
889
  if ('chrome' === browser) if ('darwin' === process.platform) out.push(path__rspack_import_1.join(dir, 'chrome-mac-arm64', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'), path__rspack_import_1.join(dir, 'chrome-mac', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'));
@@ -937,7 +964,8 @@ var __webpack_modules__ = {
937
964
  __webpack_require__.d(__webpack_exports__, {
938
965
  $4: ()=>managedBrowserCacheEnv,
939
966
  LB: ()=>computeBinariesBaseDir,
940
- kI: ()=>resolveFromBinaries
967
+ kI: ()=>resolveFromBinaries,
968
+ zN: ()=>resolveChromiumFamilyFallback
941
969
  });
942
970
  },
943
971
  "./browsers/browsers-lib/process-teardown.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
@@ -2138,7 +2166,18 @@ var __webpack_modules__ = {
2138
2166
  const getInstallGuidanceText = (target)=>{
2139
2167
  try {
2140
2168
  if ('edge' === target) return (0, external_edge_location_.getInstallGuidance)();
2141
- if ('chromium' === target) return (0, external_chromium_location_.getInstallGuidance)();
2169
+ if ('chromium' === target) return (0, external_chromium_location_.getInstallGuidance)({
2170
+ steps: [
2171
+ {
2172
+ summary: 'Install Chrome for Testing (recommended — stable channel; chromium targets use it automatically)',
2173
+ command: 'npx extension install chrome'
2174
+ },
2175
+ {
2176
+ summary: 'Install Chromium (unbranded snapshot build)',
2177
+ command: 'npx extension install chromium'
2178
+ }
2179
+ ]
2180
+ });
2142
2181
  return (0, external_chrome_location2_.getInstallGuidance)();
2143
2182
  } catch {
2144
2183
  return `npx extension install ${target}`;
@@ -2342,6 +2381,14 @@ var __webpack_modules__ = {
2342
2381
  if (!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) {
2343
2382
  browserBinaryLocation = browserBinaryLocation || resolveManagedBinary();
2344
2383
  if (!browserBinaryLocation) browserBinaryLocation = resolveWslFallback();
2384
+ if ((!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) && ('chrome' === browser || 'chromium' === browser)) {
2385
+ const familyFallback = output_binaries_resolver.zN(compilation, browser);
2386
+ const normalized = normalizePath(familyFallback?.binary || null);
2387
+ if (familyFallback && isUsableBinary(normalized)) {
2388
+ console.log(messages.Ug(browser, familyFallback.browser, normalized));
2389
+ browserBinaryLocation = normalized;
2390
+ }
2391
+ }
2345
2392
  if (!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) {
2346
2393
  if ('chromium' === browser || 'chromium-based' === browser) printInstallGuidance(getInstallGuidanceText('chromium'), 'chromium');
2347
2394
  if (!printedGuidance && 'chromium' !== browser && 'chromium-based' !== browser) this.logger.error(messages.Ih(browser, browserBinaryLocation || ''));
package/dist/cli.cjs CHANGED
@@ -448,6 +448,9 @@ var __webpack_modules__ = {
448
448
  })();
449
449
  return `${getLoggingPrefix('error')} ${isUnreachable}Either install the missing browser or choose a different one via ${pintor__rspack_import_4_default().blue('--browser')} ${pintor__rspack_import_4_default().gray('<chrome|edge|firefox>')}.\n\n${pintor__rspack_import_4_default().red('NOT FOUND')} ${pintor__rspack_import_4_default().underline(browserBinaryLocation || capitalizedBrowserName(browser) + 'BROWSER')}` + wslHint;
450
450
  }
451
+ function usingManagedChromiumFamilyFallback(requestedBrowser, fallbackBrowser, binaryPath) {
452
+ return `${getLoggingPrefix('info')} ${managedBrowserDisplayName(requestedBrowser)} is not installed. Using managed ${managedBrowserDisplayName(fallbackBrowser)} instead.\n${pintor__rspack_import_4_default().gray('PATH')} ${pintor__rspack_import_4_default().underline(binaryPath)}\nRun ${pintor__rspack_import_4_default().blue(`npx extension install ${requestedBrowser}`)} to use ${managedBrowserDisplayName(requestedBrowser)} itself.`;
453
+ }
451
454
  function browserLaunchError(browser, error) {
452
455
  return `${getLoggingPrefix('error')} Error launching ${capitalizedBrowserName(browser)}:\n${pintor__rspack_import_4_default().red(errorDetail(error))}`;
453
456
  }
@@ -537,6 +540,12 @@ var __webpack_modules__ = {
537
540
  body.push(pintor__rspack_import_4_default().gray(`Install ${browserDisplay} into the managed browser cache:`));
538
541
  body.push('');
539
542
  body.push(` ${pintor__rspack_import_4_default().bold(pintor__rspack_import_4_default().blue(installCommand))}`);
543
+ if ('chromium' === browserNorm) {
544
+ body.push('');
545
+ body.push(pintor__rspack_import_4_default().gray('Or install Chrome for Testing (stable channel) — chromium targets use it automatically:'));
546
+ body.push('');
547
+ body.push(` ${pintor__rspack_import_4_default().bold(pintor__rspack_import_4_default().blue(preferredManagedInstallCommand('chrome')))}`);
548
+ }
540
549
  if (finalCachePath) {
541
550
  body.push('');
542
551
  body.push(`${dim('INSTALL PATH')} ${pintor__rspack_import_4_default().underline(finalCachePath)}`);
@@ -796,6 +805,7 @@ var __webpack_modules__ = {
796
805
  TF: ()=>enhancedProcessManagementCleanupError,
797
806
  Te: ()=>cdpClientTargetWebSocketUrlStored,
798
807
  Th: ()=>browserInstanceExited,
808
+ Ug: ()=>usingManagedChromiumFamilyFallback,
799
809
  Vk: ()=>enhancedProcessManagementCleanup,
800
810
  WV: ()=>addonInstallError,
801
811
  XH: ()=>enhancedProcessManagementTerminating,
@@ -944,6 +954,23 @@ var __webpack_modules__ = {
944
954
  }
945
955
  return null;
946
956
  }
957
+ function resolveChromiumFamilyFallback(compilation, requested = 'chromium') {
958
+ const candidates = 'chrome' === requested ? [
959
+ 'chromium',
960
+ 'edge'
961
+ ] : [
962
+ 'chrome',
963
+ 'edge'
964
+ ];
965
+ for (const browser of candidates){
966
+ const binary = resolveFromBinaries(compilation, browser);
967
+ if (binary && fs__rspack_import_0.existsSync(binary)) return {
968
+ browser,
969
+ binary
970
+ };
971
+ }
972
+ return null;
973
+ }
947
974
  function buildCandidates(dir, browser) {
948
975
  const out = [];
949
976
  if ('chrome' === browser) if ('darwin' === process.platform) out.push(path__rspack_import_1.join(dir, 'chrome-mac-arm64', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'), path__rspack_import_1.join(dir, 'chrome-mac', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'));
@@ -1024,7 +1051,8 @@ var __webpack_modules__ = {
1024
1051
  __webpack_require__.d(__webpack_exports__, {
1025
1052
  $4: ()=>managedBrowserCacheEnv,
1026
1053
  LB: ()=>computeBinariesBaseDir,
1027
- kI: ()=>resolveFromBinaries
1054
+ kI: ()=>resolveFromBinaries,
1055
+ zN: ()=>resolveChromiumFamilyFallback
1028
1056
  });
1029
1057
  },
1030
1058
  "./browsers/browsers-lib/process-teardown.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
@@ -2223,7 +2251,18 @@ var __webpack_modules__ = {
2223
2251
  const getInstallGuidanceText = (target)=>{
2224
2252
  try {
2225
2253
  if ('edge' === target) return (0, external_edge_location_.getInstallGuidance)();
2226
- if ('chromium' === target) return (0, external_chromium_location_.getInstallGuidance)();
2254
+ if ('chromium' === target) return (0, external_chromium_location_.getInstallGuidance)({
2255
+ steps: [
2256
+ {
2257
+ summary: 'Install Chrome for Testing (recommended — stable channel; chromium targets use it automatically)',
2258
+ command: 'npx extension install chrome'
2259
+ },
2260
+ {
2261
+ summary: 'Install Chromium (unbranded snapshot build)',
2262
+ command: 'npx extension install chromium'
2263
+ }
2264
+ ]
2265
+ });
2227
2266
  return (0, external_chrome_location2_.getInstallGuidance)();
2228
2267
  } catch {
2229
2268
  return `npx extension install ${target}`;
@@ -2427,6 +2466,14 @@ var __webpack_modules__ = {
2427
2466
  if (!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) {
2428
2467
  browserBinaryLocation = browserBinaryLocation || resolveManagedBinary();
2429
2468
  if (!browserBinaryLocation) browserBinaryLocation = resolveWslFallback();
2469
+ if ((!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) && ('chrome' === browser || 'chromium' === browser)) {
2470
+ const familyFallback = output_binaries_resolver.zN(compilation, browser);
2471
+ const normalized = normalizePath(familyFallback?.binary || null);
2472
+ if (familyFallback && isUsableBinary(normalized)) {
2473
+ console.log(messages.Ug(browser, familyFallback.browser, normalized));
2474
+ browserBinaryLocation = normalized;
2475
+ }
2476
+ }
2430
2477
  if (!browserBinaryLocation || !external_fs_.existsSync(browserBinaryLocation)) {
2431
2478
  if ('chromium' === browser || 'chromium-based' === browser) printInstallGuidance(getInstallGuidanceText('chromium'), 'chromium');
2432
2479
  if (!printedGuidance && 'chromium' !== browser && 'chromium-based' !== browser) this.logger.error(messages.Ih(browser, browserBinaryLocation || ''));
@@ -5560,6 +5607,12 @@ Cross-Browser Compatibility
5560
5607
  'firefox'
5561
5608
  ] : String(value).split(',');
5562
5609
  };
5610
+ const installTargets = (browser)=>'all' === browser ? [
5611
+ 'chrome',
5612
+ 'chromium',
5613
+ 'edge',
5614
+ 'firefox'
5615
+ ] : vendors(browser);
5563
5616
  function validateVendorsOrExit(vendorsList, onInvalid) {
5564
5617
  const supported = [
5565
5618
  'chrome',
@@ -6704,7 +6757,7 @@ Cross-Browser Compatibility
6704
6757
  function registerInstallCommand(program) {
6705
6758
  program.command('install').arguments('[browser-name]').usage('[browser-name] [options]').description(commandDescriptions.install).option('--browser <chrome | chromium | edge | firefox | chromium-based | gecko-based | firefox-based | all>', 'override the positional browser name. Supports comma-separated values and `all`.').option('--where', 'print the resolved managed browser cache root').action(async function(browserArg, options) {
6706
6759
  const selectedBrowser = options.browser || browserArg || 'chromium';
6707
- const browserList = vendors(selectedBrowser);
6760
+ const browserList = installTargets(selectedBrowser);
6708
6761
  validateVendorsOrExit(browserList, (invalid, supported)=>{
6709
6762
  console.error(unsupportedBrowserFlag(invalid, supported));
6710
6763
  });
@@ -12,6 +12,7 @@ export declare function bestEffortBannerPrintFailed(message: string): string;
12
12
  export declare function firefoxRdpRuntimeCapabilitySummary(state: 'available' | 'unavailable'): string;
13
13
  export declare function skippingBrowserLaunchDueToCompileErrors(): string;
14
14
  export declare function browserNotInstalledError(browser: Browser, browserBinaryLocation: string): string;
15
+ export declare function usingManagedChromiumFamilyFallback(requestedBrowser: Browser, fallbackBrowser: Browser, binaryPath: string): string;
15
16
  export declare function browserLaunchError(browser: Browser, error: unknown): string;
16
17
  export declare function enhancedProcessManagementCleanup(browser: Browser): string;
17
18
  export declare function enhancedProcessManagementTerminating(browser: Browser): string;
@@ -3,3 +3,7 @@ export declare function getCompilationOutputPath(compilation: CompilationLike):
3
3
  export declare function computeBinariesBaseDir(compilation: CompilationLike): string;
4
4
  export declare function managedBrowserCacheEnv(cacheRoot: string, browser: 'chrome' | 'chromium' | 'firefox' | 'edge' | 'brave' | 'opera' | 'vivaldi' | 'yandex' | 'waterfox' | 'librewolf' | 'chromium-based' | 'gecko-based' | 'firefox-based' | 'safari' | 'webkit-based'): Record<string, string>;
5
5
  export declare function resolveFromBinaries(compilation: CompilationLike, browser: 'chrome' | 'chromium' | 'firefox' | 'edge'): string | null;
6
+ export declare function resolveChromiumFamilyFallback(compilation: CompilationLike, requested?: 'chrome' | 'chromium'): {
7
+ browser: 'chrome' | 'chromium' | 'edge';
8
+ binary: string;
9
+ } | null;
@@ -2,4 +2,5 @@ export type Browser = 'chrome' | 'edge' | 'firefox' | 'chromium' | 'chromium-bas
2
2
  export declare function isSafariVendor(value: string): boolean;
3
3
  export declare function parseOptionalBoolean(value?: string): boolean;
4
4
  export declare const vendors: (browser?: Browser | "all") => string[];
5
+ export declare const installTargets: (browser?: Browser | "all") => string[];
5
6
  export declare function validateVendorsOrExit(vendorsList: string[], onInvalid: (invalid: string, supported: string[]) => void): void;
package/package.json CHANGED
@@ -38,7 +38,7 @@
38
38
  "extension": "./bin/extension.cjs"
39
39
  },
40
40
  "name": "extension",
41
- "version": "4.0.4",
41
+ "version": "4.0.5",
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
  "bugs": {
@@ -100,7 +100,7 @@
100
100
  "@types/webextension-polyfill": "0.12.4",
101
101
  "brave-location": "3.0.6",
102
102
  "chrome-location2": "4.0.0",
103
- "chromium-location": "2.0.0",
103
+ "chromium-location": "2.1.1",
104
104
  "cross-spawn": "^7.0.6",
105
105
  "edge-location": "2.2.0",
106
106
  "firefox-location2": "3.0.0",
@@ -109,9 +109,9 @@
109
109
  "vivaldi-location2": "2.0.2",
110
110
  "waterfox-location": "2.0.2",
111
111
  "yandex-location": "2.0.2",
112
- "extension-create": "4.0.4",
113
- "extension-develop": "4.0.4",
114
- "extension-install": "4.0.4",
112
+ "extension-create": "4.0.5",
113
+ "extension-develop": "4.0.5",
114
+ "extension-install": "4.0.5",
115
115
  "commander": "^15.0.0",
116
116
  "pintor": "0.3.0",
117
117
  "semver": "^7.7.3",