extension-develop 4.1.12 → 4.1.13

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 (110) hide show
  1. package/dist/0~dev-server.mjs +147 -81
  2. package/dist/0~rspack-config.mjs +1096 -694
  3. package/dist/0~zip.mjs +1 -1
  4. package/dist/101.mjs +185 -900
  5. package/dist/129.mjs +89 -0
  6. package/dist/278.mjs +52 -0
  7. package/dist/292.mjs +61 -0
  8. package/dist/372.mjs +87 -0
  9. package/dist/518.mjs +434 -0
  10. package/dist/77.mjs +928 -0
  11. package/dist/839.mjs +176 -39
  12. package/dist/845.mjs +10 -1
  13. package/dist/887.mjs +1 -1
  14. package/dist/bridge-entry.d.ts +2 -1
  15. package/dist/bridge.mjs +56 -7
  16. package/dist/css-parse-guard-loader.mjs +3 -0
  17. package/dist/dead-css-url-loader.mjs +51 -24
  18. package/dist/dev-server/cleanup.d.ts +2 -1
  19. package/dist/dev-server/control-bridge/broker.d.ts +1 -0
  20. package/dist/dev-server/control-bridge/contracts.d.ts +2 -0
  21. package/dist/dev-server/control-bridge/logs-query.d.ts +12 -1
  22. package/dist/dev-server/control-bridge/producer-runtime.d.ts +1 -1
  23. package/dist/dev-server/messages.d.ts +8 -0
  24. package/dist/dev-server/session-restart.d.ts +29 -0
  25. package/dist/ensure-hmr-for-scripts.js +37 -20
  26. package/dist/ensure-hmr-for-scripts.mjs +37 -20
  27. package/dist/extension-js-devtools/chrome/content_scripts/content-0.js +2 -2
  28. package/dist/extension-js-devtools/chrome/scripts/logger-client.js +1 -1
  29. package/dist/extension-js-devtools/chromium/content_scripts/content-0.js +2 -2
  30. package/dist/extension-js-devtools/chromium/scripts/logger-client.js +1 -1
  31. package/dist/extension-js-devtools/edge/content_scripts/content-0.js +2 -2
  32. package/dist/extension-js-devtools/edge/scripts/logger-client.js +1 -1
  33. package/dist/extension-js-devtools/firefox/content_scripts/content-0.js +2 -2
  34. package/dist/extension-js-devtools/firefox/scripts/logger-client.js +1 -1
  35. package/dist/feature-scripts-classic-concat-loader.js +58 -5
  36. package/dist/feature-scripts-classic-concat-loader.mjs +58 -5
  37. package/dist/feature-scripts-content-script-wrapper.js +14 -17
  38. package/dist/feature-scripts-content-script-wrapper.mjs +14 -17
  39. package/dist/feature-scripts-native-geturl-import-loader.mjs +10 -3
  40. package/dist/lib/asset-source-maps.d.ts +7 -0
  41. package/dist/lib/config-loader.d.ts +7 -34
  42. package/dist/lib/loader-source-maps.d.ts +17 -0
  43. package/dist/lib/messages.d.ts +1 -0
  44. package/dist/lib/msg-placeholders.d.ts +2 -0
  45. package/dist/lib/paths.d.ts +2 -0
  46. package/dist/lib/project.d.ts +3 -0
  47. package/dist/lib/session-project-root.d.ts +1 -0
  48. package/dist/minimum-script-file.js +41 -1
  49. package/dist/minimum-script-file.mjs +41 -1
  50. package/dist/module.d.ts +1 -1
  51. package/dist/module.mjs +1 -1
  52. package/dist/plugin-css/css-lib/dead-url-refs.d.ts +5 -0
  53. package/dist/plugin-css/css-lib/inline-content-script-css.d.ts +32 -0
  54. package/dist/plugin-css/css-lib/messages.d.ts +3 -0
  55. package/dist/plugin-css/css-lib/verbatim-css.d.ts +9 -0
  56. package/dist/plugin-css/css-parse-guard-loader.d.ts +3 -0
  57. package/dist/plugin-css/css-tools/postcss.d.ts +1 -0
  58. package/dist/plugin-css/dead-css-url-loader.d.ts +8 -4
  59. package/dist/plugin-css/index.d.ts +1 -0
  60. package/dist/plugin-js-frameworks/js-frameworks-lib/jsx-transform.d.ts +10 -0
  61. package/dist/plugin-js-frameworks/js-tools/solid-jsx-runtime.d.ts +8 -0
  62. package/dist/plugin-js-frameworks/js-tools/solid.d.ts +3 -0
  63. package/dist/plugin-js-frameworks/swc-targets.d.ts +3 -0
  64. package/dist/plugin-reload/classify-reload.d.ts +6 -0
  65. package/dist/plugin-reload/index.d.ts +2 -1
  66. package/dist/plugin-reload/reload-dispatch.d.ts +1 -0
  67. package/dist/plugin-special-folders/folder-extensions/resolve-dirs.d.ts +1 -0
  68. package/dist/plugin-special-folders/folder-extensions/utils.d.ts +3 -0
  69. package/dist/plugin-special-folders/messages.d.ts +2 -0
  70. package/dist/plugin-special-folders/resolve-public-folder.d.ts +13 -0
  71. package/dist/plugin-web-extension/feature-html/html-lib/assets.d.ts +1 -1
  72. package/dist/plugin-web-extension/feature-html/html-lib/base-href.d.ts +11 -0
  73. package/dist/plugin-web-extension/feature-html/html-lib/patch-html.d.ts +2 -2
  74. package/dist/plugin-web-extension/feature-html/html-lib/utils.d.ts +13 -0
  75. package/dist/plugin-web-extension/feature-html/index.d.ts +1 -0
  76. package/dist/plugin-web-extension/feature-html/steps/ensure-hmr-for-scripts.d.ts +1 -1
  77. package/dist/plugin-web-extension/feature-icons/extract-action-theme-icons.d.ts +2 -0
  78. package/dist/plugin-web-extension/feature-icons/omnibox-fields.d.ts +2 -0
  79. package/dist/plugin-web-extension/feature-icons/theme-image-fields.d.ts +2 -0
  80. package/dist/plugin-web-extension/feature-json/json-validation.d.ts +1 -0
  81. package/dist/plugin-web-extension/feature-manifest/index.d.ts +1 -0
  82. package/dist/plugin-web-extension/feature-manifest/manifest-lib/manifest.d.ts +1 -1
  83. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/index.d.ts +1 -1
  84. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/sandbox.d.ts +1 -1
  85. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/storage.d.ts +1 -1
  86. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/theme.d.ts +1 -1
  87. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/index.d.ts +1 -1
  88. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/chrome_settings_overrides.d.ts +1 -1
  89. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/index.d.ts +1 -1
  90. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/theme_experiment.d.ts +1 -1
  91. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/action.d.ts +2 -1
  92. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/declarative_net_request.d.ts +1 -1
  93. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/index.d.ts +1 -1
  94. package/dist/plugin-web-extension/feature-manifest/messages.d.ts +2 -0
  95. package/dist/plugin-web-extension/feature-manifest/normalize-manifest-path.d.ts +4 -0
  96. package/dist/plugin-web-extension/feature-manifest/steps/apply-dev-defaults-lib/patch-csp.d.ts +1 -1
  97. package/dist/plugin-web-extension/feature-manifest/steps/apply-dev-defaults.d.ts +1 -0
  98. package/dist/plugin-web-extension/feature-scripts/steps/native-geturl-import-loader.d.ts +7 -2
  99. package/dist/plugin-web-extension/feature-web-resources/collect-entry-imports.d.ts +1 -0
  100. package/dist/plugin-web-extension/index.d.ts +1 -0
  101. package/dist/plugin-web-extension/shared/html-surfaces.d.ts +19 -0
  102. package/dist/plugin-web-extension/shared/manifest-fields-change-detector.d.ts +1 -0
  103. package/dist/plugin-web-extension/shared/manifest-fields.d.ts +18 -0
  104. package/dist/plugin-web-extension/shared/manifest-path-assets.d.ts +4 -0
  105. package/dist/plugin-web-extension/shared/paths.d.ts +1 -0
  106. package/dist/solid-jsx-runtime.mjs +15 -0
  107. package/dist/types.d.ts +20 -7
  108. package/package.json +1 -1
  109. package/dist/494.mjs +0 -89
  110. package/dist/86.mjs +0 -36
@@ -7,11 +7,12 @@ 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 { 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";
10
+ import { runnerCleanupError, autoExitForceKill, loadCommandConfig, sanitize, extensionJsRunnerError, portInUse, devServerStartTimeout, autoExitTriggered, loadProjectConfigDefaults, runnerUncaughtException, shouldWarnPortConflict, devServerRestarting, DEV_COMMAND_DEFAULTS, mergeOptionLayers, runnerUnhandledRejection, createPlaywrightMetadataWriter, autoExitModeEnabled, getSessionRunId, isGeckoBasedBrowser, loadCustomConfig, loadBrowserConfig, 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
- import { setupNoBrowserBannerOnFirstDone, webpackConfig, resolveConnectableHost, setupCompilerLifecycleHooks } from "./0~rspack-config.mjs";
14
- import { ensureSessionStateInProjectGitignore, logsPath, actionsPath, controlPortFilePath, legacyControlPortFilePath, ensureSessionArtifactsIgnoreFile } from "./494.mjs";
13
+ import { publicFolderOrDefault } from "./278.mjs";
14
+ import { setupNoBrowserBannerOnFirstDone, DevSessionRestartScheduler, resolveConnectableHost, webpackConfig, bindDevSessionRestart, unbindDevSessionRestart, setupCompilerLifecycleHooks } from "./0~rspack-config.mjs";
15
+ import { logsPath, controlPortFilePath, legacyControlPortFilePath, asAbsolute, getDistPath, ensureSessionStateInProjectGitignore, actionsPath, ensureSessionArtifactsIgnoreFile } from "./77.mjs";
15
16
  import { isDebug } from "./349.mjs";
16
17
  import * as __rspack_external_node_os_74b4b876 from "node:os";
17
18
  import * as __rspack_external_node_path_c5b9b54f from "node:path";
@@ -60,11 +61,16 @@ function setupAutoExit(autoExitMsRaw, forceKillMsRaw, onCleanup) {
60
61
  }
61
62
  return cancelAutoExitTimers;
62
63
  }
64
+ function resolveDevServer(handle) {
65
+ return 'function' == typeof handle ? handle() : handle;
66
+ }
63
67
  function closeAll(devServer, portManager) {
64
- return devServer.stop().then(async ()=>{
68
+ const afterStop = async ()=>{
65
69
  await portManager.terminateCurrentInstance();
66
70
  setTimeout(()=>process.exit(), 500);
67
- }).catch(async (error)=>{
71
+ };
72
+ if (!devServer || 'function' != typeof devServer.stop) return afterStop();
73
+ return devServer.stop().then(afterStop).catch(async (error)=>{
68
74
  humanLine(extensionJsRunnerError(error));
69
75
  await portManager.terminateCurrentInstance();
70
76
  setTimeout(()=>process.exit(1), 500);
@@ -76,18 +82,18 @@ function setupCleanupHandlers(devServer, portManager) {
76
82
  if (isShuttingDown) return;
77
83
  isShuttingDown = true;
78
84
  try {
79
- await closeAll(devServer, portManager);
85
+ await closeAll(resolveDevServer(devServer), portManager);
80
86
  } catch (error) {
81
- console.error('[Extension.js Runner] Error during cleanup.', error);
87
+ console.error(runnerCleanupError(error));
82
88
  process.exit(1);
83
89
  }
84
90
  };
85
91
  process.on('uncaughtException', async (error)=>{
86
- console.error('[Extension.js Runner] Uncaught exception.', error);
92
+ console.error(runnerUncaughtException(error));
87
93
  await cleanup();
88
94
  });
89
95
  process.on('unhandledRejection', (reason, promise)=>{
90
- console.error('[Extension.js Runner] Unhandled rejection.', promise, reason);
96
+ console.error(runnerUnhandledRejection(reason));
91
97
  });
92
98
  const cancelAutoExit = setupAutoExit(process.env.EXTENSION_AUTO_EXIT_MS, process.env.EXTENSION_FORCE_KILL_MS, cleanup);
93
99
  const cancelAndCleanup = async ()=>{
@@ -346,7 +352,10 @@ class BridgeBroker {
346
352
  reloadType: instruction.type,
347
353
  changedContentScriptEntries: instruction.changedContentScriptEntries,
348
354
  label: instruction.label,
349
- changedFiles: instruction.changedFiles
355
+ changedFiles: instruction.changedFiles,
356
+ ...instruction.changedScriptFiles?.length ? {
357
+ changedScriptFiles: instruction.changedScriptFiles
358
+ } : {}
350
359
  };
351
360
  let notified = 0;
352
361
  for (const [conn, role] of this.roles)if ('producer' === role) try {
@@ -1076,6 +1085,7 @@ async function dev_server_devServer(projectStructure, devOptions) {
1076
1085
  const { manifestPath, packageJsonPath, denoJsonPath } = projectStructure;
1077
1086
  const projectManifestPath = packageJsonPath || denoJsonPath;
1078
1087
  const packageJsonDir = projectManifestPath ? __rspack_external_node_path_c5b9b54f.dirname(projectManifestPath) : __rspack_external_node_path_c5b9b54f.dirname(manifestPath);
1088
+ const projectConfig = await loadProjectConfigDefaults(packageJsonDir);
1079
1089
  const commandConfig = await loadCommandConfig(packageJsonDir, 'dev');
1080
1090
  const browserConfig = await loadBrowserConfig(packageJsonDir, devOptions.browser);
1081
1091
  const portManager = new PortManager(8080);
@@ -1192,19 +1202,22 @@ async function dev_server_devServer(projectStructure, devOptions) {
1192
1202
  bridgeActionsFile?.close();
1193
1203
  } catch {}
1194
1204
  if (bridgeControlToken) clearControlToken(packageJsonDir, browserName);
1205
+ unbindDevSessionRestart();
1195
1206
  });
1207
+ const safeProjectConfig = sanitize(projectConfig);
1196
1208
  const safeBrowserConfig = sanitize(browserConfig);
1197
1209
  const safeCommandConfig = sanitize(commandConfig);
1198
1210
  const safeDevOptions = sanitize(devOptions);
1199
- const mergedDevOptions = mergeOptionLayers(DEV_COMMAND_DEFAULTS, safeBrowserConfig, safeCommandConfig, safeDevOptions);
1211
+ const mergedDevOptions = mergeOptionLayers(DEV_COMMAND_DEFAULTS, safeProjectConfig, safeBrowserConfig, safeCommandConfig, safeDevOptions);
1200
1212
  const specialFoldersData = getSpecialFoldersDataForProjectRoot(packageJsonDir);
1201
- const mergedExtensionsConfig = safeDevOptions.extensions ?? safeCommandConfig.extensions ?? safeBrowserConfig.extensions ?? specialFoldersData.extensions;
1213
+ const mergedExtensionsConfig = safeDevOptions.extensions ?? safeCommandConfig.extensions ?? safeBrowserConfig.extensions ?? safeProjectConfig.extensions ?? specialFoldersData.extensions;
1202
1214
  const resolvedExtensionsConfig = await resolveCompanionExtensionsConfig({
1203
1215
  projectRoot: packageJsonDir,
1204
1216
  browser: devOptions.browser,
1205
1217
  config: mergedExtensionsConfig
1206
1218
  });
1207
- const baseConfig = webpackConfig(projectStructure, {
1219
+ const webpackConfigOptions = {
1220
+ metadataCommand: 'dev',
1208
1221
  ...mergedDevOptions,
1209
1222
  extensions: resolvedExtensionsConfig,
1210
1223
  browser: devOptions.browser,
@@ -1219,39 +1232,8 @@ async function dev_server_devServer(projectStructure, devOptions) {
1219
1232
  clean: false,
1220
1233
  path: primaryDistPath
1221
1234
  }
1222
- });
1223
- const customWebpackConfig = await loadCustomConfig(packageJsonDir);
1224
- const finalConfig = customWebpackConfig(baseConfig);
1225
- const compilerConfig = merge(finalConfig, {});
1226
- const compiler = rspack(compilerConfig);
1235
+ };
1227
1236
  const manifestOutputPath = __rspack_external_node_path_c5b9b54f.join(primaryDistPath, 'manifest.json');
1228
- const uninstallManifestGuard = installManifestDiskWriteGuard(manifestOutputPath);
1229
- const releaseOutputFsGuard = suppressManifestOutputWrites(compiler, manifestOutputPath);
1230
- if (!extendedOptions.browsersPlugin && compiler?.hooks?.watchRun) {
1231
- const changedSources = createChangedSourcesTracker(compiler);
1232
- let isFirstBridgeCompile = true;
1233
- compiler.hooks.done.tapPromise('extjs-no-browser-reload', async (stats)=>{
1234
- const compilation = stats.compilation;
1235
- if (compilation.errors && compilation.errors.length > 0) return;
1236
- if (isFirstBridgeCompile) {
1237
- isFirstBridgeCompile = false;
1238
- return;
1239
- }
1240
- const outputPath = String(compilation.options?.output?.path || '');
1241
- const contextDir = String(compilation.options?.context || '');
1242
- const { forcedFull, changedSources: sources } = changedSources.snapshot();
1243
- const instruction = classifyReloadFromSources({
1244
- changedSources: sources,
1245
- forcedFull,
1246
- getContentScriptCount: ()=>readContentScriptCount(compilation, outputPath),
1247
- getSourceFeatureIndex: ()=>buildSourceFeatureIndex(compilation, contextDir),
1248
- outputPath
1249
- });
1250
- await dispatchReload(instruction, {
1251
- broker: bridgeBroker
1252
- });
1253
- });
1254
- }
1255
1237
  const metadata = createPlaywrightMetadataWriter({
1256
1238
  packageJsonDir,
1257
1239
  browser: String(devOptions.browser || 'chromium'),
@@ -1278,21 +1260,12 @@ async function dev_server_devServer(projectStructure, devOptions) {
1278
1260
  requestedPort: Number(devOptions.port),
1279
1261
  port
1280
1262
  });
1281
- attachLifecycleStream(compiler, lifecycle);
1282
- setupCompilerLifecycleHooks(compiler);
1283
- if (devOptions.noBrowser) setupNoBrowserBannerOnFirstDone({
1284
- compiler,
1285
- browser: String(devOptions.browser || 'chromium'),
1286
- manifestPath,
1287
- readyPath: metadata.readyPath,
1288
- distPath: primaryDistPath
1289
- });
1290
1263
  if (shouldWarnPortConflict(devOptions.port, port)) humanLine(portInUse(Number(devOptions.port), port));
1291
1264
  const serverConfig = {
1292
1265
  host: devServerHost,
1293
1266
  allowedHosts: 'all',
1294
1267
  static: {
1295
- directory: __rspack_external_node_path_c5b9b54f.join(packageJsonDir, 'public'),
1268
+ directory: publicFolderOrDefault(manifestPath, packageJsonDir),
1296
1269
  watch: false
1297
1270
  },
1298
1271
  compress: false,
@@ -1304,7 +1277,7 @@ async function dev_server_devServer(projectStructure, devOptions) {
1304
1277
  },
1305
1278
  watchFiles: {
1306
1279
  paths: [
1307
- __rspack_external_node_path_c5b9b54f.join(packageJsonDir, 'public', '**/*'),
1280
+ __rspack_external_node_path_c5b9b54f.join(publicFolderOrDefault(manifestPath, packageJsonDir), '**/*'),
1308
1281
  ...isUsingJSFramework(packageJsonDir) ? [] : [
1309
1282
  __rspack_external_node_path_c5b9b54f.join(packageJsonDir, '**/*.html')
1310
1283
  ]
@@ -1328,34 +1301,127 @@ async function dev_server_devServer(projectStructure, devOptions) {
1328
1301
  hot: true,
1329
1302
  liveReload: true
1330
1303
  };
1331
- const devServer = new RspackDevServer(serverConfig, compiler);
1332
- if ('function' == typeof devServer.stop) {
1333
- const originalDevServerStop = devServer.stop.bind(devServer);
1334
- devServer.stop = async ()=>{
1335
- try {
1336
- await originalDevServerStop();
1337
- } finally{
1338
- uninstallManifestGuard();
1339
- releaseOutputFsGuard();
1340
- }
1304
+ const START_TIMEOUT_MS = parseInt(String(process.env.EXTENSION_START_TIMEOUT_MS || '30000'), 10);
1305
+ async function createCompilerAndServer(opts) {
1306
+ const baseConfig = webpackConfig(projectStructure, webpackConfigOptions);
1307
+ const customWebpackConfig = await loadCustomConfig(packageJsonDir);
1308
+ const compilerConfig = merge(customWebpackConfig(baseConfig), {});
1309
+ const compiler = rspack(compilerConfig);
1310
+ const uninstallManifestGuard = installManifestDiskWriteGuard(manifestOutputPath);
1311
+ const releaseOutputFsGuard = suppressManifestOutputWrites(compiler, manifestOutputPath);
1312
+ if (!extendedOptions.browsersPlugin && compiler?.hooks?.watchRun) {
1313
+ const changedSources = createChangedSourcesTracker(compiler);
1314
+ let isFirstBridgeCompile = true;
1315
+ compiler.hooks.done.tapPromise('extjs-no-browser-reload', async (stats)=>{
1316
+ const compilation = stats.compilation;
1317
+ if (compilation.errors && compilation.errors.length > 0) return;
1318
+ if (isFirstBridgeCompile) {
1319
+ isFirstBridgeCompile = false;
1320
+ return;
1321
+ }
1322
+ const outputPath = String(compilation.options?.output?.path || '');
1323
+ const contextDir = String(compilation.options?.context || '');
1324
+ const { forcedFull, changedSources: sources } = changedSources.snapshot();
1325
+ const instruction = classifyReloadFromSources({
1326
+ changedSources: sources,
1327
+ forcedFull,
1328
+ getContentScriptCount: ()=>readContentScriptCount(compilation, outputPath),
1329
+ getSourceFeatureIndex: ()=>buildSourceFeatureIndex(compilation, contextDir),
1330
+ outputPath
1331
+ });
1332
+ await dispatchReload(instruction, {
1333
+ broker: bridgeBroker
1334
+ });
1335
+ });
1336
+ }
1337
+ attachLifecycleStream(compiler, lifecycle);
1338
+ setupCompilerLifecycleHooks(compiler);
1339
+ if (!opts.isRestart && devOptions.noBrowser) setupNoBrowserBannerOnFirstDone({
1340
+ compiler,
1341
+ browser: String(devOptions.browser || 'chromium'),
1342
+ manifestPath,
1343
+ readyPath: metadata.readyPath,
1344
+ distPath: primaryDistPath
1345
+ });
1346
+ const firstCompile = new Promise((resolve)=>{
1347
+ let settled = false;
1348
+ const finish = (stats)=>{
1349
+ if (settled) return;
1350
+ settled = true;
1351
+ resolve(stats);
1352
+ };
1353
+ if (!compiler.hooks?.done?.tap) return void finish(null);
1354
+ compiler.hooks.done.tap('extjs-session-restart-first-done', (stats)=>{
1355
+ finish(stats);
1356
+ });
1357
+ compiler.hooks.failed?.tap?.('extjs-session-restart-first-failed', ()=>{
1358
+ finish(null);
1359
+ });
1360
+ });
1361
+ const server = new RspackDevServer(serverConfig, compiler);
1362
+ if ('function' == typeof server.stop) {
1363
+ const originalDevServerStop = server.stop.bind(server);
1364
+ server.stop = async ()=>{
1365
+ try {
1366
+ await originalDevServerStop();
1367
+ } finally{
1368
+ uninstallManifestGuard();
1369
+ releaseOutputFsGuard();
1370
+ }
1371
+ };
1372
+ }
1373
+ return {
1374
+ compiler,
1375
+ server,
1376
+ firstCompile
1341
1377
  };
1342
1378
  }
1343
- const START_TIMEOUT_MS = parseInt(String(process.env.EXTENSION_START_TIMEOUT_MS || '30000'), 10);
1344
- let startTimeout;
1345
- try {
1346
- startTimeout = setTimeout(()=>{
1347
- console.error(devServerStartTimeout(START_TIMEOUT_MS));
1348
- }, START_TIMEOUT_MS);
1349
- await devServer.start();
1350
- if (startTimeout) clearTimeout(startTimeout);
1351
- } catch (error) {
1352
- if (startTimeout) clearTimeout(startTimeout);
1353
- metadata.writeError('dev_server_start_failed', error instanceof Error ? error.message : String(error));
1354
- lifecycle.failed(error instanceof Error ? error.message : String(error));
1355
- humanLine(extensionJsRunnerError(error));
1356
- process.exit(1);
1379
+ async function startBundler(server) {
1380
+ let startTimeout;
1381
+ try {
1382
+ startTimeout = setTimeout(()=>{
1383
+ console.error(devServerStartTimeout(START_TIMEOUT_MS));
1384
+ }, START_TIMEOUT_MS);
1385
+ await server.start();
1386
+ if (startTimeout) clearTimeout(startTimeout);
1387
+ } catch (error) {
1388
+ if (startTimeout) clearTimeout(startTimeout);
1389
+ metadata.writeError('dev_server_start_failed', error instanceof Error ? error.message : String(error));
1390
+ lifecycle.failed(error instanceof Error ? error.message : String(error));
1391
+ humanLine(extensionJsRunnerError(error));
1392
+ process.exit(1);
1393
+ }
1357
1394
  }
1395
+ const firstBundle = await createCompilerAndServer({
1396
+ isRestart: false
1397
+ });
1398
+ let currentServer = firstBundle.server;
1399
+ await startBundler(firstBundle.server);
1400
+ const sessionRestart = new DevSessionRestartScheduler();
1401
+ sessionRestart.setHandler(async (request)=>{
1402
+ humanLine(devServerRestarting(request));
1403
+ const nextBundle = await createCompilerAndServer({
1404
+ isRestart: true
1405
+ });
1406
+ const previous = currentServer;
1407
+ currentServer = null;
1408
+ if (previous && 'function' == typeof previous.stop) await previous.stop();
1409
+ currentServer = nextBundle.server;
1410
+ await startBundler(nextBundle.server);
1411
+ const stats = await nextBundle.firstCompile;
1412
+ if (stats && 'function' == typeof stats.hasErrors && stats.hasErrors()) return;
1413
+ await dispatchReload({
1414
+ type: 'full',
1415
+ label: 'extension'
1416
+ }, {
1417
+ broker: bridgeBroker
1418
+ });
1419
+ });
1420
+ bindDevSessionRestart(sessionRestart);
1421
+ process.once('exit', ()=>{
1422
+ sessionRestart.dispose();
1423
+ });
1358
1424
  lifecycle.watchBrowserExit();
1359
- setupCleanupHandlers(devServer, portManager);
1425
+ setupCleanupHandlers(()=>currentServer, portManager);
1360
1426
  }
1361
1427
  export { dev_server_devServer as devServer };