extension-develop 4.0.26 → 4.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -175,7 +175,11 @@ Options accepted by each command. Values shown are typical types or enumerations
175
175
  - browser.chrome | .firefox | .edge | .chromium-based | .gecko-based: start flags, excluded flags, preferences, binaries, profile reuse (persistProfile), and per-browser `extensions`.
176
176
  - extensions: load-only companion extensions (unpacked dirs) loaded alongside your extension in dev/preview/start.
177
177
  - Example: { dir: "./extensions" } loads every "./extensions/\*" folder that contains a manifest.json.
178
- - Precedence when composing options: browser._ → commands._ → CLI flags. CLI flags always win over config defaults.
178
+ - Precedence when composing options (one contract for every command): stock defaults → browser._ → commands._ → CLI flags.
179
+ - Scalars: an unset flag never clobbers config, and an explicit flag (including `false`) always wins.
180
+ - Example: `commands.dev.polyfill: false` turns the polyfill off for the team, and `--polyfill` turns it back on for one run.
181
+ - Lists (`browserFlags`, `excludeBrowserFlags`): concatenate across layers in order (browser, then command, then CLI) and dedupe.
182
+ - Objects (`preferences`): deep-merge, later layers win on key conflict.
179
183
  - Browser key aliases when resolving `browser.*` from `extension.config.*`:
180
184
  - When the runtime asks for `chromium`, `loadBrowserConfig` prefers `browser.chromium` and then falls back to `browser['chromium-based']`.
181
185
  - When the runtime asks for `chromium-based`, it prefers `browser['chromium-based']` and then `browser.chromium`.
@@ -7,11 +7,11 @@ import { RspackDevServer } from "@rspack/dev-server";
7
7
  import { merge } from "webpack-merge";
8
8
  import { WebSocket, WebSocketServer } from "ws";
9
9
  import { classifyReloadFromSources, attachLifecycleStream, readContentScriptCount, humanLine, buildSourceFeatureIndex, createChangedSourcesTracker, createLifecycleStream, dispatchReload } from "./839.mjs";
10
- import { autoExitForceKill, loadCommandConfig, sanitize, extensionJsRunnerError, portInUse, devServerStartTimeout, autoExitTriggered, asAbsolute, shouldWarnPortConflict, isGeckoBasedBrowser, createPlaywrightMetadataWriter, autoExitModeEnabled, getSessionRunId, loadCustomConfig, loadBrowserConfig, getDistPath, resolveCompanionExtensionsConfig, getSpecialFoldersDataForProjectRoot } from "./101.mjs";
10
+ import { DEV_COMMAND_DEFAULTS, autoExitForceKill, loadCommandConfig, sanitize, extensionJsRunnerError, portInUse, devServerStartTimeout, autoExitTriggered, asAbsolute, mergeOptionLayers, shouldWarnPortConflict, isGeckoBasedBrowser, createPlaywrightMetadataWriter, autoExitModeEnabled, getSessionRunId, loadCustomConfig, loadBrowserConfig, getDistPath, resolveCompanionExtensionsConfig, getSpecialFoldersDataForProjectRoot } from "./101.mjs";
11
11
  import { CONTROL_WS_PATH, writePersistedControlPort, writeControlToken, clearControlToken, readPersistedControlPort } from "./887.mjs";
12
12
  import { hasProjectDependency, findNearestProjectManifestDirSync } from "./80.mjs";
13
13
  import { setupNoBrowserBannerOnFirstDone, webpackConfig, resolveConnectableHost, setupCompilerLifecycleHooks } from "./0~rspack-config.mjs";
14
- import { actionsPath, controlPortFilePath, logsPath, legacyControlPortFilePath, ensureSessionArtifactsIgnoreFile } from "./494.mjs";
14
+ import { ensureSessionStateInProjectGitignore, logsPath, actionsPath, controlPortFilePath, legacyControlPortFilePath, ensureSessionArtifactsIgnoreFile } from "./494.mjs";
15
15
  import { isDebug } from "./349.mjs";
16
16
  import * as __rspack_external_node_path_c5b9b54f from "node:path";
17
17
  import * as __rspack_external_node_fs_5ea92f0c from "node:fs";
@@ -1049,6 +1049,7 @@ async function dev_server_devServer(projectStructure, devOptions) {
1049
1049
  const primaryDistPath = getDistPath(asAbsolute(packageJsonDir), browserName);
1050
1050
  const bridgeLogsAbsPath = logsPath(packageJsonDir, browserName);
1051
1051
  ensureSessionArtifactsIgnoreFile(packageJsonDir);
1052
+ ensureSessionStateInProjectGitignore(packageJsonDir);
1052
1053
  const bridgeLogsRelPath = __rspack_external_node_path_c5b9b54f.relative(packageJsonDir, bridgeLogsAbsPath);
1053
1054
  const sessionRunId = getSessionRunId(packageJsonDir, browserName);
1054
1055
  const bridgeLogFile = new LogsFileWriter({
@@ -1144,6 +1145,7 @@ async function dev_server_devServer(projectStructure, devOptions) {
1144
1145
  const safeBrowserConfig = sanitize(browserConfig);
1145
1146
  const safeCommandConfig = sanitize(commandConfig);
1146
1147
  const safeDevOptions = sanitize(devOptions);
1148
+ const mergedDevOptions = mergeOptionLayers(DEV_COMMAND_DEFAULTS, safeBrowserConfig, safeCommandConfig, safeDevOptions);
1147
1149
  const specialFoldersData = getSpecialFoldersDataForProjectRoot(packageJsonDir);
1148
1150
  const mergedExtensionsConfig = safeDevOptions.extensions ?? safeCommandConfig.extensions ?? safeBrowserConfig.extensions ?? specialFoldersData.extensions;
1149
1151
  const resolvedExtensionsConfig = await resolveCompanionExtensionsConfig({
@@ -1152,9 +1154,7 @@ async function dev_server_devServer(projectStructure, devOptions) {
1152
1154
  config: mergedExtensionsConfig
1153
1155
  });
1154
1156
  const baseConfig = webpackConfig(projectStructure, {
1155
- ...safeBrowserConfig,
1156
- ...safeCommandConfig,
1157
- ...safeDevOptions,
1157
+ ...mergedDevOptions,
1158
1158
  extensions: resolvedExtensionsConfig,
1159
1159
  browser: devOptions.browser,
1160
1160
  mode: 'development',