extension-develop 2.0.0 → 2.0.3

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 (263) hide show
  1. package/README.md +230 -0
  2. package/dist/add-content-script-wrapper.js +1777 -0
  3. package/dist/add-hmr-accept-code.js +95 -3
  4. package/dist/build.d.ts +2 -0
  5. package/dist/cleanup.d.ts +1 -0
  6. package/dist/deprecated-shadow-root.js +115 -14
  7. package/dist/dev.d.ts +2 -0
  8. package/dist/develop-lib/config-types.d.ts +85 -0
  9. package/dist/develop-lib/extract-from-zip.d.ts +1 -0
  10. package/dist/develop-lib/find-nearest-package.d.ts +2 -0
  11. package/dist/develop-lib/generate-extension-types.d.ts +1 -0
  12. package/dist/develop-lib/generate-zip.d.ts +2 -0
  13. package/dist/develop-lib/get-extension-config.d.ts +6 -0
  14. package/dist/develop-lib/get-project-path.d.ts +6 -0
  15. package/dist/develop-lib/install-dependencies.d.ts +2 -0
  16. package/dist/develop-lib/messages.d.ts +35 -0
  17. package/dist/develop-lib/validate-user-dependencies.d.ts +1 -0
  18. package/dist/ensure-hmr-for-scripts.js +74 -3
  19. package/dist/extensions/chrome-manager-extension/background.js +1 -1
  20. package/dist/extensions/chrome-manager-extension/define-initial-tab.js +11 -1
  21. package/dist/extensions/chrome-manager-extension/images/logo.png +0 -0
  22. package/dist/extensions/chrome-manager-extension/manifest.json +3 -3
  23. package/dist/extensions/chrome-manager-extension/pages/welcome.html +3 -6
  24. package/dist/extensions/chrome-manager-extension/reload-service.js +214 -62
  25. package/dist/extensions/chromium-based-manager-extension/background.js +1 -1
  26. package/dist/extensions/chromium-based-manager-extension/define-initial-tab.js +11 -1
  27. package/dist/extensions/chromium-based-manager-extension/images/logo.png +0 -0
  28. package/dist/extensions/chromium-based-manager-extension/manifest.json +3 -3
  29. package/dist/extensions/chromium-based-manager-extension/pages/welcome.html +3 -6
  30. package/dist/extensions/chromium-based-manager-extension/reload-service.js +185 -28
  31. package/dist/extensions/edge-manager-extension/background.js +1 -1
  32. package/dist/extensions/edge-manager-extension/define-initial-tab.js +11 -1
  33. package/dist/extensions/edge-manager-extension/images/logo.png +0 -0
  34. package/dist/extensions/edge-manager-extension/manifest.json +3 -3
  35. package/dist/extensions/edge-manager-extension/pages/welcome.html +3 -6
  36. package/dist/extensions/edge-manager-extension/reload-service.js +223 -69
  37. package/dist/extensions/firefox-manager-extension/background.js +40 -12
  38. package/dist/extensions/firefox-manager-extension/define-initial-tab.js +16 -14
  39. package/dist/extensions/firefox-manager-extension/images/logo.png +0 -0
  40. package/dist/extensions/firefox-manager-extension/manifest.json +4 -5
  41. package/dist/extensions/firefox-manager-extension/pages/welcome.html +3 -6
  42. package/dist/extensions/firefox-manager-extension/reload-service.js +113 -75
  43. package/dist/extensions/gecko-based-manager-extension/background.js +1 -1
  44. package/dist/extensions/gecko-based-manager-extension/define-initial-tab.js +13 -6
  45. package/dist/extensions/gecko-based-manager-extension/images/logo.png +0 -0
  46. package/dist/extensions/gecko-based-manager-extension/manifest.json +3 -3
  47. package/dist/extensions/gecko-based-manager-extension/pages/welcome.html +3 -6
  48. package/dist/extensions/gecko-based-manager-extension/reload-service.js +54 -26
  49. package/dist/inject-chromium-client-loader.js +146 -22
  50. package/dist/inject-firefox-client-loader.js +166 -47
  51. package/dist/minimum-chromium-file.js +25 -0
  52. package/dist/minimum-content-file.js +5 -0
  53. package/dist/minimum-firefox-file.js +17 -0
  54. package/dist/minimum-script-file.js +5 -0
  55. package/dist/module.d.ts +8 -95
  56. package/dist/module.js +10703 -128
  57. package/dist/preview.d.ts +2 -0
  58. package/dist/rslib.config.d.ts +3 -0
  59. package/dist/start.d.ts +2 -0
  60. package/dist/types.d.ts +11 -0
  61. package/dist/vitest.config.d.mts +2 -0
  62. package/dist/webpack/dev-server.d.ts +3 -0
  63. package/dist/webpack/plugin-browsers/browsers-lib/add-progress-bar.d.ts +1 -0
  64. package/dist/webpack/plugin-browsers/browsers-lib/constants.d.ts +5 -0
  65. package/dist/webpack/plugin-browsers/browsers-lib/dynamic-extension-manager.d.ts +35 -0
  66. package/dist/webpack/plugin-browsers/browsers-lib/html-merge.d.ts +1 -0
  67. package/dist/webpack/plugin-browsers/browsers-lib/instance-manager.d.ts +71 -0
  68. package/dist/webpack/plugin-browsers/browsers-lib/messages.d.ts +161 -0
  69. package/dist/webpack/plugin-browsers/browsers-lib/rdp-wire.d.ts +7 -0
  70. package/dist/webpack/plugin-browsers/browsers-lib/shared-utils.d.ts +16 -0
  71. package/dist/webpack/plugin-browsers/browsers-types.d.ts +131 -0
  72. package/dist/webpack/plugin-browsers/index.d.ts +41 -0
  73. package/dist/webpack/plugin-browsers/run-chromium/browser-config.d.ts +3 -0
  74. package/dist/webpack/plugin-browsers/run-chromium/create-profile.d.ts +10 -0
  75. package/dist/webpack/plugin-browsers/run-chromium/index.d.ts +28 -0
  76. package/dist/webpack/plugin-browsers/run-chromium/master-preferences.d.ts +161 -0
  77. package/dist/webpack/plugin-browsers/run-chromium/setup-chrome-inspection/cdp-client.d.ts +29 -0
  78. package/dist/webpack/plugin-browsers/run-chromium/setup-chrome-inspection/index.d.ts +25 -0
  79. package/dist/webpack/plugin-browsers/run-firefox/firefox/binary-detector.d.ts +15 -0
  80. package/dist/webpack/plugin-browsers/run-firefox/firefox/browser-config.d.ts +7 -0
  81. package/dist/webpack/plugin-browsers/run-firefox/firefox/create-profile.d.ts +13 -0
  82. package/dist/webpack/plugin-browsers/run-firefox/firefox/master-preferences.d.ts +95 -0
  83. package/dist/webpack/plugin-browsers/run-firefox/index.d.ts +26 -0
  84. package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/index.d.ts +13 -0
  85. package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/message-utils.d.ts +2 -0
  86. package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/messaging-client.d.ts +42 -0
  87. package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/setup-firefox-inspection.d.ts +31 -0
  88. package/dist/webpack/plugin-compatibility/feature-browser-specific-fields.d.ts +9 -0
  89. package/dist/webpack/plugin-compatibility/feature-polyfill.d.ts +12 -0
  90. package/dist/webpack/plugin-compatibility/index.d.ts +13 -0
  91. package/dist/webpack/plugin-compilation/clean-dist.d.ts +8 -0
  92. package/dist/webpack/plugin-compilation/env.d.ts +9 -0
  93. package/dist/webpack/plugin-compilation/index.d.ts +12 -0
  94. package/dist/webpack/plugin-css/common-style-loaders.d.ts +8 -0
  95. package/dist/webpack/plugin-css/css-in-content-script-loader.d.ts +11 -0
  96. package/dist/webpack/plugin-css/css-in-html-loader.d.ts +8 -0
  97. package/dist/webpack/plugin-css/css-tools/less.d.ts +4 -0
  98. package/dist/webpack/plugin-css/css-tools/postcss.d.ts +3 -0
  99. package/dist/webpack/plugin-css/css-tools/sass.d.ts +4 -0
  100. package/dist/webpack/plugin-css/css-tools/stylelint.d.ts +4 -0
  101. package/dist/webpack/plugin-css/css-tools/tailwind.d.ts +2 -0
  102. package/dist/webpack/plugin-css/index.d.ts +9 -0
  103. package/dist/webpack/plugin-css/is-content-script.d.ts +1 -0
  104. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/action.d.ts +2 -0
  105. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/background.d.ts +2 -0
  106. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/browser_action.d.ts +2 -0
  107. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/chrome_url_overrides.d.ts +2 -0
  108. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/devtools_page.d.ts +2 -0
  109. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/index.d.ts +2 -0
  110. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/options_ui.d.ts +2 -0
  111. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/page_action.d.ts +2 -0
  112. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/sandbox.d.ts +2 -0
  113. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/side_panel.d.ts +2 -0
  114. package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/sidebar_action.d.ts +2 -0
  115. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/action.d.ts +2 -0
  116. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/browser_action.d.ts +2 -0
  117. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/browser_action.theme_icons.d.ts +2 -0
  118. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/icons.d.ts +2 -0
  119. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/index.d.ts +2 -0
  120. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/normalize.d.ts +6 -0
  121. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/page_action.d.ts +2 -0
  122. package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/sidebar_action.d.ts +2 -0
  123. package/dist/webpack/plugin-extension/data/manifest-fields/index.d.ts +19 -0
  124. package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/declarative_net_request.d.ts +2 -0
  125. package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/index.d.ts +2 -0
  126. package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/storage.d.ts +2 -0
  127. package/dist/webpack/plugin-extension/data/manifest-fields/locales-fields/index.d.ts +1 -0
  128. package/dist/webpack/plugin-extension/data/manifest-fields/normalize.d.ts +10 -0
  129. package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/background.d.ts +2 -0
  130. package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/content_scripts.d.ts +2 -0
  131. package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/index.d.ts +2 -0
  132. package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/service_worker.d.ts +2 -0
  133. package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/user_scripts.d.ts +2 -0
  134. package/dist/webpack/plugin-extension/data/manifest-fields/web-resources-fields/index.d.ts +2 -0
  135. package/dist/webpack/plugin-extension/data/special-folders/generate-entries.d.ts +4 -0
  136. package/dist/webpack/plugin-extension/data/special-folders/index.d.ts +12 -0
  137. package/dist/webpack/plugin-extension/feature-html/__spec__/html-lib/test-utils.d.ts +18 -0
  138. package/dist/webpack/plugin-extension/feature-html/html-lib/parse-html.d.ts +8 -0
  139. package/dist/webpack/plugin-extension/feature-html/html-lib/patch-html.d.ts +8 -0
  140. package/dist/webpack/plugin-extension/feature-html/html-lib/utils.d.ts +18 -0
  141. package/dist/webpack/plugin-extension/feature-html/index.d.ts +37 -0
  142. package/dist/webpack/plugin-extension/feature-html/steps/add-assets-to-compilation.d.ts +11 -0
  143. package/dist/webpack/plugin-extension/feature-html/steps/add-scripts-and-styles-to-compilation.d.ts +10 -0
  144. package/dist/webpack/plugin-extension/feature-html/steps/add-to-file-dependencies.d.ts +10 -0
  145. package/dist/webpack/plugin-extension/feature-html/steps/emit-html-file.d.ts +9 -0
  146. package/dist/webpack/plugin-extension/feature-html/steps/ensure-hmr-for-scripts.d.ts +2 -0
  147. package/dist/webpack/plugin-extension/feature-html/steps/handle-common-errors.d.ts +10 -0
  148. package/dist/webpack/plugin-extension/feature-html/steps/minimum-script-file.d.ts +1 -0
  149. package/dist/webpack/plugin-extension/feature-html/steps/throw-if-recompile-is-needed.d.ts +13 -0
  150. package/dist/webpack/plugin-extension/feature-html/steps/update-html-file.d.ts +10 -0
  151. package/dist/webpack/plugin-extension/feature-icons/index.d.ts +25 -0
  152. package/dist/webpack/plugin-extension/feature-icons/steps/add-to-file-dependencies.d.ts +9 -0
  153. package/dist/webpack/plugin-extension/feature-icons/steps/emit-file.d.ts +9 -0
  154. package/dist/webpack/plugin-extension/feature-json/index.d.ts +18 -0
  155. package/dist/webpack/plugin-extension/feature-locales/get-locales.d.ts +1 -0
  156. package/dist/webpack/plugin-extension/feature-locales/index.d.ts +13 -0
  157. package/dist/webpack/plugin-extension/feature-manifest/index.d.ts +23 -0
  158. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/background.d.ts +10 -0
  159. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/chrome_url_overrides.d.ts +8 -0
  160. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/commands.d.ts +16 -0
  161. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/content_scripts.d.ts +7 -0
  162. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/content_security_policy.d.ts +4 -0
  163. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/devtools_page.d.ts +4 -0
  164. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/icons.d.ts +6 -0
  165. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/index.d.ts +2 -0
  166. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/omnibox.d.ts +2 -0
  167. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/options_page.d.ts +4 -0
  168. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/options_ui.d.ts +8 -0
  169. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/page_action.d.ts +8 -0
  170. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/permissions.d.ts +4 -0
  171. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/sandbox.d.ts +7 -0
  172. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/sidebar_action.d.ts +2 -0
  173. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/storage.d.ts +6 -0
  174. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/theme.d.ts +2 -0
  175. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/user_scripts.d.ts +2 -0
  176. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/web_accessible_resources.d.ts +9 -0
  177. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/index.d.ts +2 -0
  178. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/background.d.ts +10 -0
  179. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/browser_action.d.ts +12 -0
  180. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/chrome_settings_overrides.d.ts +24 -0
  181. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/index.d.ts +2 -0
  182. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/page_action.d.ts +1 -0
  183. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/sidebar_action.d.ts +1 -0
  184. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/theme_experiment.d.ts +2 -0
  185. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/action.d.ts +8 -0
  186. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/background.d.ts +10 -0
  187. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/declarative_net_request.d.ts +2 -0
  188. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/host_permissions.d.ts +2 -0
  189. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/index.d.ts +2 -0
  190. package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/side_panel.d.ts +2 -0
  191. package/dist/webpack/plugin-extension/feature-manifest/steps/add-dependencies.d.ts +6 -0
  192. package/dist/webpack/plugin-extension/feature-manifest/steps/check-manifest-files.d.ts +17 -0
  193. package/dist/webpack/plugin-extension/feature-manifest/steps/emit-manifest.d.ts +7 -0
  194. package/dist/webpack/plugin-extension/feature-manifest/steps/throw-if-recompile.d.ts +11 -0
  195. package/dist/webpack/plugin-extension/feature-manifest/steps/update-manifest.d.ts +9 -0
  196. package/dist/webpack/plugin-extension/feature-scripts/index.d.ts +27 -0
  197. package/dist/webpack/plugin-extension/feature-scripts/scripts-lib/utils.d.ts +3 -0
  198. package/dist/webpack/plugin-extension/feature-scripts/steps/add-content-script-wrapper.d.ts +2 -0
  199. package/dist/webpack/plugin-extension/feature-scripts/steps/add-hmr-accept-code.d.ts +2 -0
  200. package/dist/webpack/plugin-extension/feature-scripts/steps/add-public-path-for-main-world.d.ts +11 -0
  201. package/dist/webpack/plugin-extension/feature-scripts/steps/add-public-path-runtime-module.d.ts +4 -0
  202. package/dist/webpack/plugin-extension/feature-scripts/steps/add-scripts.d.ts +9 -0
  203. package/dist/webpack/plugin-extension/feature-scripts/steps/deprecated-shadow-root.d.ts +2 -0
  204. package/dist/webpack/plugin-extension/feature-scripts/steps/javascript-content-script-wrapper.d.ts +1 -0
  205. package/dist/webpack/plugin-extension/feature-scripts/steps/preact-content-script-wrapper.d.ts +1 -0
  206. package/dist/webpack/plugin-extension/feature-scripts/steps/react-content-script-wrapper.d.ts +1 -0
  207. package/dist/webpack/plugin-extension/feature-scripts/steps/svelte-content-script-wrapper.d.ts +1 -0
  208. package/dist/webpack/plugin-extension/feature-scripts/steps/typescript-content-script-wrapper.d.ts +1 -0
  209. package/dist/webpack/plugin-extension/feature-scripts/steps/vue-content-script-wrapper.d.ts +1 -0
  210. package/dist/webpack/plugin-extension/feature-special-folders/copy-public-folder.d.ts +14 -0
  211. package/dist/webpack/plugin-extension/feature-special-folders/index.d.ts +19 -0
  212. package/dist/webpack/plugin-extension/feature-special-folders/warn-upon-folder-changes.d.ts +7 -0
  213. package/dist/webpack/plugin-extension/feature-web-resources/clean-matches.d.ts +7 -0
  214. package/dist/webpack/plugin-extension/feature-web-resources/index.d.ts +18 -0
  215. package/dist/webpack/plugin-extension/index.d.ts +10 -0
  216. package/dist/webpack/plugin-js-frameworks/index.d.ts +13 -0
  217. package/dist/webpack/plugin-js-frameworks/js-tools/babel.d.ts +16 -0
  218. package/dist/webpack/plugin-js-frameworks/js-tools/preact.d.ts +3 -0
  219. package/dist/webpack/plugin-js-frameworks/js-tools/react.d.ts +3 -0
  220. package/dist/webpack/plugin-js-frameworks/js-tools/svelte.d.ts +3 -0
  221. package/dist/webpack/plugin-js-frameworks/js-tools/typescript.d.ts +36 -0
  222. package/dist/webpack/plugin-js-frameworks/js-tools/vue.d.ts +3 -0
  223. package/dist/webpack/plugin-js-frameworks/load-loader-options.d.ts +1 -0
  224. package/dist/webpack/plugin-reload/index.d.ts +13 -0
  225. package/dist/webpack/plugin-reload/reload-lib/messages.d.ts +106 -0
  226. package/dist/webpack/plugin-reload/reload-types.d.ts +14 -0
  227. package/dist/webpack/plugin-reload/start-server.d.ts +4 -0
  228. package/dist/webpack/plugin-reload/steps/create-web-socket-server/index.d.ts +14 -0
  229. package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/broadcast-message.d.ts +2 -0
  230. package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/message-dispatcher.d.ts +2 -0
  231. package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/servers.d.ts +2 -0
  232. package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/index.d.ts +3 -0
  233. package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/inject-chromium-client-loader.d.ts +9 -0
  234. package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/minimum-chromium-file.d.ts +0 -0
  235. package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/index.d.ts +3 -0
  236. package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/inject-firefox-client-loader.d.ts +9 -0
  237. package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/minimum-firefox-file.d.ts +0 -0
  238. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/index.d.ts +9 -0
  239. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-background.d.ts +15 -0
  240. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-csp.d.ts +5 -0
  241. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-externally-connectable.d.ts +10 -0
  242. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-web-resources.d.ts +10 -0
  243. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/generate-manager-extension.d.ts +15 -0
  244. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/index.d.ts +10 -0
  245. package/dist/webpack/plugin-reload/steps/setup-reload-strategy/target-web-extension-plugin/index.d.ts +13 -0
  246. package/dist/webpack/plugin-static-assets/index.d.ts +12 -0
  247. package/dist/webpack/webpack-config.d.ts +14 -0
  248. package/dist/webpack/webpack-lib/auto-exit.d.ts +1 -0
  249. package/dist/webpack/webpack-lib/constants.d.ts +4 -0
  250. package/dist/webpack/webpack-lib/messages.d.ts +121 -0
  251. package/dist/webpack/webpack-lib/port-manager.d.ts +27 -0
  252. package/dist/webpack/webpack-lib/utils.d.ts +23 -0
  253. package/dist/webpack/webpack-types.d.ts +49 -0
  254. package/package.json +64 -29
  255. package/dist/depreacated-shadow-root.js +0 -34
  256. package/dist/inject-content-css-during-dev.js +0 -10
  257. package/dist/minimum-chromium-file.mjs +0 -1
  258. package/dist/minimum-content-file.mjs +0 -1
  259. package/dist/minimum-firefox-file.mjs +0 -1
  260. package/dist/resolver-loader.js +0 -1
  261. package/dist/resolver-module.mjs +0 -1
  262. package/dist/tailwind.config.js +0 -25
  263. /package/dist/{minimum-script-file.mjs → webpack/plugin-extension/feature-scripts/steps/minimum-content-file.d.ts} +0 -0
@@ -1,44 +1,74 @@
1
1
  const TEN_SECONDS_MS = 10 * 1000
2
+ const INSTANT_MS = 100
2
3
  let webSocket = null
3
4
 
5
+ // Get instance ID from the service worker context
6
+ const instanceId = '__INSTANCE_ID__'
7
+
4
8
  export async function connect() {
5
9
  if (webSocket) {
6
10
  // If already connected, do nothing
7
11
  return
8
12
  }
9
13
 
10
- webSocket = new WebSocket('ws://localhost:__RELOAD_PORT__')
11
-
12
- webSocket.onerror = (event) => {
13
- console.error(`[Reload Service] Connection error: ${JSON.stringify(event)}`)
14
- webSocket.close()
15
- }
14
+ // Get port from the placeholder that will be replaced during build
15
+ const port = '__RELOAD_PORT__'
16
16
 
17
- webSocket.onopen = () => {
18
- console.info(`[Reload Service] Connection opened.`)
19
- }
17
+ let reconnectAttempts = 0
18
+ const maxReconnectAttempts = 10
19
+ const baseBackoffMs = 250
20
+ const maxBackoffMs = 5000
20
21
 
21
- webSocket.onmessage = async (event) => {
22
- const message = JSON.parse(event.data)
22
+ const establish = () => {
23
+ webSocket = new WebSocket(`ws://127.0.0.1:${port}`)
23
24
 
24
- if (message.status === 'serverReady') {
25
- console.info('[Reload Service] Connection ready.')
26
- await requestInitialLoadData()
25
+ webSocket.onerror = (_event) => {
26
+ try {
27
+ webSocket && webSocket.close()
28
+ } catch {}
27
29
  }
28
30
 
29
- if (message.changedFile) {
31
+ webSocket.onopen = () => {
32
+ reconnectAttempts = 0
30
33
  console.info(
31
- `[Reload Service] Changes detected on ${message.changedFile}. Reloading extension...`
34
+ `[Extension.js] Connection opened. Listening on port ${port} for instance ${instanceId}...`
32
35
  )
36
+ }
37
+
38
+ let reloadDebounce
39
+ webSocket.onmessage = async (event) => {
40
+ const message = JSON.parse(event.data)
41
+
42
+ // Only process messages for this instance
43
+ if (message.instanceId && message.instanceId !== instanceId) {
44
+ return
45
+ }
33
46
 
34
- await messageAllExtensions(message.changedFile)
47
+ if (message.status === 'serverReady') {
48
+ await requestInitialLoadData()
49
+ }
50
+
51
+ if (message.changedFile) {
52
+ clearTimeout(reloadDebounce)
53
+ reloadDebounce = setTimeout(async () => {
54
+ await hardReloadAllExtensions(message.changedFile)
55
+ }, 200)
56
+ }
35
57
  }
36
- }
37
58
 
38
- webSocket.onclose = () => {
39
- console.info('[Reload Service] Connection closed.')
40
- webSocket = null
59
+ webSocket.onclose = () => {
60
+ webSocket = null
61
+ if (reconnectAttempts >= maxReconnectAttempts) return
62
+ reconnectAttempts++
63
+ const backoff = Math.min(
64
+ maxBackoffMs,
65
+ baseBackoffMs * 2 ** reconnectAttempts
66
+ )
67
+ setTimeout(establish, backoff)
68
+ }
41
69
  }
70
+
71
+ establish()
42
72
  }
43
73
 
44
74
  export function disconnect() {
@@ -47,6 +77,33 @@ export function disconnect() {
47
77
  }
48
78
  }
49
79
 
80
+ async function requestInitialLoadData() {
81
+ const devExtensions = await getDevExtensions()
82
+
83
+ for (const extension of devExtensions) {
84
+ try {
85
+ const response = await chrome.runtime.sendMessage(extension.id, {
86
+ initialLoadData: true
87
+ })
88
+
89
+ if (response) {
90
+ // Send the response back to the server with instance ID
91
+ webSocket.send(
92
+ JSON.stringify({
93
+ status: 'clientReady',
94
+ instanceId: instanceId,
95
+ data: response
96
+ })
97
+ )
98
+ }
99
+ } catch (error) {
100
+ console.error(
101
+ `[Extension.js] Error sending message to ${extension.id}: ${error.message}`
102
+ )
103
+ }
104
+ }
105
+ }
106
+
50
107
  async function getDevExtensions() {
51
108
  const allExtensions = await new Promise((resolve) => {
52
109
  chrome.management.getAll(resolve)
@@ -64,16 +121,26 @@ async function getDevExtensions() {
64
121
  })
65
122
  }
66
123
 
67
- async function messageAllExtensions(changedFile) {
68
- // Check if the external extension is ready
69
- const isExtensionReady = await checkExtensionReadiness()
124
+ async function hardReloadAllExtensions(changedFile) {
125
+ // For critical files like manifest.json, skip the long delay
126
+ const isCriticalFile =
127
+ changedFile === 'manifest.json' ||
128
+ changedFile === 'service_worker' ||
129
+ changedFile === 'declarative_net_request'
130
+
131
+ // Check if the external extension is ready with optimized timing
132
+ const isExtensionReady = await checkExtensionReadiness(isCriticalFile)
70
133
 
71
134
  if (isExtensionReady) {
72
135
  const devExtensions = await getDevExtensions()
73
- const reloadAll = devExtensions.map((extension) => {
136
+ const reloadAll = devExtensions.map(async (extension) => {
137
+ await hardReloadExtension(extension.id)
138
+
74
139
  chrome.runtime.sendMessage(extension.id, {changedFile}, (response) => {
75
140
  if (response) {
76
- console.info('[Reload Service] Extension reloaded and ready.')
141
+ console.info(
142
+ `[Extension.js] Extension reloaded and ready for instance ${instanceId}.`
143
+ )
77
144
  }
78
145
  })
79
146
 
@@ -82,62 +149,147 @@ async function messageAllExtensions(changedFile) {
82
149
 
83
150
  await Promise.all(reloadAll)
84
151
  } else {
85
- console.info('[Reload Service] External extension is not ready.')
152
+ console.info(
153
+ `[Extension.js] External extension is not ready for instance ${instanceId}.`
154
+ )
86
155
  }
87
156
  }
88
157
 
89
- async function requestInitialLoadData() {
90
- const devExtensions = await getDevExtensions()
158
+ async function checkExtensionReadiness(isCriticalFile = false) {
159
+ return new Promise((resolve) => {
160
+ // For critical files like manifest.json, use minimal delay
161
+ // For regular files, use longer delay to ensure stability
162
+ const delay = isCriticalFile ? INSTANT_MS : TEN_SECONDS_MS
91
163
 
92
- const messagePromises = devExtensions.map(async (extension) => {
93
- return await new Promise((resolve) => {
94
- chrome.runtime.sendMessage(
95
- extension.id,
96
- {initialLoadData: true},
97
- (response) => {
98
- if (chrome.runtime.lastError) {
99
- console.error(
100
- `Error sending message to ${extension.id}: ${chrome.runtime.lastError.message}`
101
- )
102
- resolve(null)
103
- } else {
104
- resolve(response)
105
- }
106
- }
107
- )
108
- })
164
+ setTimeout(() => {
165
+ resolve(true)
166
+ }, delay)
109
167
  })
168
+ }
169
+
170
+ // Smart reload strategy: Try standard method first, fallback to CDP if needed
171
+ async function hardReloadExtension(extensionId) {
172
+ try {
173
+ // Try the standard enable/disable reload first (feels natural)
174
+ await chrome.management.setEnabled(extensionId, false)
175
+ await chrome.management.setEnabled(extensionId, true)
176
+
177
+ // Verify it worked with a simple health check
178
+ const isHealthy = await verifyExtensionHealth(extensionId)
179
+ if (isHealthy) {
180
+ console.info(
181
+ `[Extension.js] Standard reload successful for ${extensionId}`
182
+ )
183
+ return true
184
+ }
185
+
186
+ // If we get here, the reload "succeeded" but extension isn't healthy
187
+ throw new Error('[Reload Service] Extension reloaded but not responding')
188
+ } catch (error) {
189
+ console.warn(
190
+ `[Extension.js] Standard reload failed for ${extensionId}, trying CDP fallback: ${error.message}`
191
+ )
110
192
 
111
- const responses = await Promise.all(messagePromises)
193
+ // Only use CDP when the natural approach fails
194
+ return await attemptCDPFallback(extensionId)
195
+ }
196
+ }
112
197
 
113
- // We received the info from the use extension.
114
- // All good, client is ready. Inform the server.
115
- if (webSocket && webSocket.readyState === WebSocket.OPEN) {
116
- const message = JSON.stringify({
117
- status: 'clientReady',
118
- data: responses[0]
198
+ // CDP fallback for when standard reload fails
199
+ async function attemptCDPFallback(extensionId) {
200
+ try {
201
+ // Get extension info to find its source path
202
+ const extensionInfo = await new Promise((resolve) => {
203
+ chrome.management.get(extensionId, resolve)
119
204
  })
120
205
 
121
- webSocket.send(message)
206
+ if (!extensionInfo || !extensionInfo.path) {
207
+ console.warn(
208
+ `[Extension.js] No path info for ${extensionId}, CDP fallback not possible`
209
+ )
210
+ return false
211
+ }
212
+
213
+ // Use CDP client directly for seamless fallback
214
+ const cdpClient = await getCDPClient()
215
+ if (!cdpClient) {
216
+ console.warn(`[Extension.js] CDP client not available for ${extensionId}`)
217
+ return false
218
+ }
219
+
220
+ // Use CDP to force reload the extension
221
+ const success = await cdpClient.forceReloadExtension(extensionId)
222
+ if (success) {
223
+ console.info(`[Extension.js] CDP fallback successful for ${extensionId}`)
224
+ return true
225
+ } else {
226
+ console.warn(`[Extension.js] CDP fallback failed for ${extensionId}`)
227
+ return false
228
+ }
229
+ } catch (cdpError) {
230
+ console.error(
231
+ `[Extension.js] CDP fallback also failed for ${extensionId}: ${cdpError.message}`
232
+ )
233
+ return false
122
234
  }
123
235
  }
124
236
 
125
- async function checkExtensionReadiness() {
126
- // Delay for 1 second
127
- await delay(1000)
128
- // Assume the extension is ready
129
- return true
237
+ // Get CDP client instance
238
+ // This will be injected by the build process
239
+ async function getCDPClient() {
240
+ try {
241
+ // The CDP client will be available globally when injected
242
+ if (typeof window !== 'undefined' && window.cdpClient) {
243
+ return window.cdpClient
244
+ }
245
+
246
+ // Fallback for service worker context
247
+ if (typeof globalThis !== 'undefined' && globalThis.cdpClient) {
248
+ return globalThis.cdpClient
249
+ }
250
+
251
+ console.warn(`[Extension.js] CDP client not found in global scope`)
252
+ return null
253
+ } catch (error) {
254
+ console.warn(`[Extension.js] Failed to get CDP client: ${error.message}`)
255
+ return null
256
+ }
130
257
  }
131
258
 
132
- async function delay(ms) {
133
- return await new Promise((resolve) => setTimeout(resolve, ms))
259
+ /**
260
+ * Simple health check to verify extension is responsive
261
+ */
262
+ async function verifyExtensionHealth(extensionId) {
263
+ try {
264
+ // Simple ping to see if extension responds
265
+ await new Promise((resolve, reject) => {
266
+ const timeout = setTimeout(() => {
267
+ reject(new Error('Health check timeout'))
268
+ }, 2000)
269
+
270
+ chrome.runtime.sendMessage(extensionId, {type: 'PING'}, (response) => {
271
+ clearTimeout(timeout)
272
+ if (chrome.runtime.lastError) {
273
+ reject(new Error(chrome.runtime.lastError.message))
274
+ } else {
275
+ resolve(response)
276
+ }
277
+ })
278
+ })
279
+ return true
280
+ } catch (error) {
281
+ console.warn(
282
+ `[Extension.js] Health check failed for ${extensionId}: ${error.message}`
283
+ )
284
+ return false
285
+ }
134
286
  }
135
287
 
136
288
  export function keepAlive() {
137
289
  const keepAliveIntervalId = setInterval(() => {
138
290
  if (webSocket) {
139
291
  webSocket.send(JSON.stringify({status: 'ping'}))
140
- console.info('[Reload Service] Listening for changes...')
292
+ console.info('[Extension.js] Listening for changes...')
141
293
  } else {
142
294
  clearInterval(keepAliveIntervalId)
143
295
  }
@@ -2,7 +2,7 @@ import {createExtensionsPageTab, handleFirstRun} from './define-initial-tab.js'
2
2
  import {connect, disconnect, keepAlive} from './reload-service.js'
3
3
 
4
4
  function bgGreen(str) {
5
- return `background: #0A0C10; color: #26FFB8; ${str}`
5
+ return `background: transparent; color: #0971fe; ${str}`
6
6
  }
7
7
  chrome.tabs.query({active: true}, async ([initialTab]) => {
8
8
  console.log(
@@ -60,7 +60,17 @@ export async function handleFirstRun() {
60
60
  return
61
61
  }
62
62
 
63
- chrome.tabs.create({url: 'pages/welcome.html'})
63
+ // Guard against opening multiple welcome pages
64
+ chrome.tabs.query(
65
+ {url: chrome.runtime.getURL('pages/welcome.html')},
66
+ (tabs) => {
67
+ if (Array.isArray(tabs) && tabs.length > 0) {
68
+ // Already open; do not create another
69
+ return
70
+ }
71
+ chrome.tabs.create({url: 'pages/welcome.html'})
72
+ }
73
+ )
64
74
  // Ensure the welcome page shows only once per extension installation
65
75
  chrome.storage.local.set({[devExtension.id]: {didRun: true}})
66
76
  })
@@ -1,7 +1,7 @@
1
1
  {
2
- "name": "Extension Manager",
3
- "description": "Extension.js developer tools for tabs and reload management.",
4
- "version": "1.0",
2
+ "name": "Extension.js DevTools",
3
+ "description": "Extension.js built-in developer tools for browser instance ID __INSTANCE_ID__",
4
+ "version": "1.0.0",
5
5
  "manifest_version": 3,
6
6
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
7
7
  "background": {
@@ -3,10 +3,7 @@
3
3
  <head>
4
4
  <title>Welcome!</title>
5
5
  <meta charset="UTF-8" />
6
- <link
7
- rel="icon"
8
- href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🧩</text></svg>"
9
- />
6
+ <link rel="icon" type="image/png" href="../images/logo.png" />
10
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
8
  <link rel="stylesheet" href="./sakura.css" media="screen" />
12
9
  <link
@@ -37,8 +34,8 @@
37
34
  <a target="_blank" href="https://github.com/cezaraugusto/extension"
38
35
  >🧩 Extension.js</a
39
36
  >
40
- is a development tool for browser extensions with built-in support for
41
- TypeScript, WebAssembly, React, and modern JavaScript.
37
+ is a development toolkit for building cross-browser extensions with
38
+ modern web technologies.
42
39
  </p>
43
40
  <button id="learnMore">
44
41
  🧩 Learn more about developing cross-browser extensions
@@ -1,4 +1,5 @@
1
1
  const TEN_SECONDS_MS = 10 * 1000
2
+ const INSTANT_MS = 100
2
3
  let webSocket = null
3
4
 
4
5
  export async function connect() {
@@ -7,38 +8,59 @@ export async function connect() {
7
8
  return
8
9
  }
9
10
 
10
- webSocket = new WebSocket('ws://localhost:__RELOAD_PORT__')
11
+ // Get port from the placeholder that will be replaced during build
12
+ const port = '__RELOAD_PORT__'
11
13
 
12
- webSocket.onerror = (event) => {
13
- console.error(`[Reload Service] Connection error: ${JSON.stringify(event)}`)
14
- webSocket.close()
15
- }
16
-
17
- webSocket.onopen = () => {
18
- console.info(`[Reload Service] Connection opened.`)
19
- }
14
+ let reconnectAttempts = 0
15
+ const maxReconnectAttempts = 10
16
+ const baseBackoffMs = 250
17
+ const maxBackoffMs = 5000
20
18
 
21
- webSocket.onmessage = async (event) => {
22
- const message = JSON.parse(event.data)
19
+ const establish = () => {
20
+ webSocket = new WebSocket(`ws://127.0.0.1:${port}`)
23
21
 
24
- if (message.status === 'serverReady') {
25
- console.info('[Reload Service] Connection ready.')
26
- await requestInitialLoadData()
22
+ webSocket.onerror = (_event) => {
23
+ try {
24
+ webSocket && webSocket.close()
25
+ } catch {}
27
26
  }
28
27
 
29
- if (message.changedFile) {
28
+ webSocket.onopen = () => {
29
+ reconnectAttempts = 0
30
30
  console.info(
31
- `[Reload Service] Changes detected on ${message.changedFile}. Reloading extension...`
31
+ `[Extension.js] Connection opened. Listening on port ${port}...`
32
32
  )
33
+ }
34
+
35
+ let reloadDebounce
36
+ webSocket.onmessage = async (event) => {
37
+ const message = JSON.parse(event.data)
33
38
 
34
- await messageAllExtensions(message.changedFile)
39
+ if (message.status === 'serverReady') {
40
+ await requestInitialLoadData()
41
+ }
42
+
43
+ if (message.changedFile) {
44
+ clearTimeout(reloadDebounce)
45
+ reloadDebounce = setTimeout(async () => {
46
+ await hardReloadAllExtensions(message.changedFile)
47
+ }, 200)
48
+ }
35
49
  }
36
- }
37
50
 
38
- webSocket.onclose = () => {
39
- console.info('[Reload Service] Connection closed.')
40
- webSocket = null
51
+ webSocket.onclose = () => {
52
+ webSocket = null
53
+ if (reconnectAttempts >= maxReconnectAttempts) return
54
+ reconnectAttempts++
55
+ const backoff = Math.min(
56
+ maxBackoffMs,
57
+ baseBackoffMs * 2 ** reconnectAttempts
58
+ )
59
+ setTimeout(establish, backoff)
60
+ }
41
61
  }
62
+
63
+ establish()
42
64
  }
43
65
 
44
66
  export function disconnect() {
@@ -64,13 +86,21 @@ async function getDevExtensions() {
64
86
  })
65
87
  }
66
88
 
67
- async function messageAllExtensions(changedFile) {
68
- // Check if the external extension is ready
69
- const isExtensionReady = await checkExtensionReadiness()
89
+ async function hardReloadAllExtensions(changedFile) {
90
+ // For critical files like manifest.json, skip the delay entirely
91
+ const isCriticalFile =
92
+ changedFile === 'manifest.json' ||
93
+ changedFile === 'service_worker' ||
94
+ changedFile === 'declarative_net_request'
95
+
96
+ // Check if the external extension is ready with optimized timing
97
+ const isExtensionReady = await checkExtensionReadiness(isCriticalFile)
70
98
 
71
99
  if (isExtensionReady) {
72
100
  const devExtensions = await getDevExtensions()
73
- const reloadAll = devExtensions.map((extension) => {
101
+ const reloadAll = devExtensions.map(async (extension) => {
102
+ await hardReloadExtension(extension.id)
103
+
74
104
  chrome.runtime.sendMessage(extension.id, {changedFile}, (response) => {
75
105
  if (response) {
76
106
  console.info('[Reload Service] Extension reloaded and ready.')
@@ -122,9 +152,11 @@ async function requestInitialLoadData() {
122
152
  }
123
153
  }
124
154
 
125
- async function checkExtensionReadiness() {
126
- // Delay for 1 second
127
- await delay(1000)
155
+ async function checkExtensionReadiness(isCriticalFile = false) {
156
+ // For critical files like manifest.json, use minimal delay
157
+ // For regular files, use 1 second delay to ensure stability
158
+ const delayTime = isCriticalFile ? INSTANT_MS : 1000
159
+ await delay(delayTime)
128
160
  // Assume the extension is ready
129
161
  return true
130
162
  }
@@ -143,3 +175,128 @@ export function keepAlive() {
143
175
  }
144
176
  }, TEN_SECONDS_MS)
145
177
  }
178
+
179
+ const toggleExtensionState = (extensionId, enabled) => {
180
+ if (extensionId === chrome.runtime.id) {
181
+ return Promise.resolve()
182
+ }
183
+ return new Promise((resolve) => {
184
+ chrome.management.setEnabled(extensionId, enabled, resolve)
185
+ })
186
+ }
187
+
188
+ // Smart reload strategy: Try standard method first, fallback to CDP if needed
189
+ async function hardReloadExtension(extensionId) {
190
+ try {
191
+ // Try the standard enable/disable reload first (feels natural)
192
+ await toggleExtensionState(extensionId, false)
193
+ await toggleExtensionState(extensionId, true)
194
+
195
+ // Verify it worked with a simple health check
196
+ const isHealthy = await verifyExtensionHealth(extensionId)
197
+ if (isHealthy) {
198
+ console.info(
199
+ `[Extension.js] Standard reload successful for ${extensionId}`
200
+ )
201
+ return true
202
+ }
203
+
204
+ // If we get here, the reload "succeeded" but extension isn't healthy
205
+ throw new Error('Extension reloaded but not responding')
206
+ } catch (error) {
207
+ console.warn(
208
+ `[Extension.js] Standard reload failed for ${extensionId}, trying CDP fallback: ${error.message}`
209
+ )
210
+
211
+ // Only use CDP when the natural approach fails
212
+ return await attemptCDPFallback(extensionId)
213
+ }
214
+ }
215
+
216
+ // CDP fallback for when standard reload fails
217
+ async function attemptCDPFallback(extensionId) {
218
+ try {
219
+ // Get extension info to find its source path
220
+ const extensionInfo = await new Promise((resolve) => {
221
+ chrome.management.get(extensionId, resolve)
222
+ })
223
+
224
+ if (!extensionInfo || !extensionInfo.path) {
225
+ console.warn(
226
+ `[Extension.js] No path info for ${extensionId}, CDP fallback not possible`
227
+ )
228
+ return false
229
+ }
230
+
231
+ // Use CDP client directly for seamless fallback
232
+ const cdpClient = await getCDPClient()
233
+ if (!cdpClient) {
234
+ console.warn(`[Extension.js] CDP client not available for ${extensionId}`)
235
+ return false
236
+ }
237
+
238
+ // Use CDP to force reload the extension
239
+ const success = await cdpClient.forceReloadExtension(extensionId)
240
+ if (success) {
241
+ console.info(`[Extension.js] CDP fallback successful for ${extensionId}`)
242
+ return true
243
+ } else {
244
+ console.warn(`[Extension.js] CDP fallback failed for ${extensionId}`)
245
+ return false
246
+ }
247
+ } catch (cdpError) {
248
+ console.error(
249
+ `[Extension.js] CDP fallback also failed for ${extensionId}: ${cdpError.message}`
250
+ )
251
+ return false
252
+ }
253
+ }
254
+
255
+ // Get CDP client instance
256
+ // This will be injected by the build process
257
+ async function getCDPClient() {
258
+ try {
259
+ // The CDP client will be available globally when injected
260
+ if (typeof window !== 'undefined' && window.cdpClient) {
261
+ return window.cdpClient
262
+ }
263
+
264
+ // Fallback for service worker context
265
+ if (typeof globalThis !== 'undefined' && globalThis.cdpClient) {
266
+ return globalThis.cdpClient
267
+ }
268
+
269
+ console.warn(`[Extension.js] CDP client not found in global scope`)
270
+ return null
271
+ } catch (error) {
272
+ console.warn(`[Extension.js] Failed to get CDP client: ${error.message}`)
273
+ return null
274
+ }
275
+ }
276
+
277
+ // Simple health check to verify extension is responsive
278
+ async function verifyExtensionHealth(extensionId) {
279
+ try {
280
+ // Simple ping to see if extension responds
281
+ await new Promise((resolve, reject) => {
282
+ const timeout = setTimeout(() => {
283
+ reject(new Error('Health check timeout'))
284
+ }, 2000)
285
+
286
+ chrome.runtime.sendMessage(extensionId, {type: 'PING'}, (response) => {
287
+ clearTimeout(timeout)
288
+ if (chrome.runtime.lastError) {
289
+ reject(new Error(chrome.runtime.lastError.message))
290
+ } else {
291
+ resolve(response)
292
+ }
293
+ })
294
+ })
295
+ return true
296
+ } catch (error) {
297
+ console.warn(
298
+ `[Extension.js] Health check failed for ${extensionId}: ${error.message}`
299
+ )
300
+ return false
301
+ }
302
+ }
@@ -2,7 +2,7 @@ import {createExtensionsPageTab, handleFirstRun} from './define-initial-tab.js'
2
2
  import {connect, disconnect, keepAlive} from './reload-service.js'
3
3
 
4
4
  function bgGreen(str) {
5
- return `background: #0A0C10; color: #26FFB8; ${str}`
5
+ return `background: transparent; color: #0971fe; ${str}`
6
6
  }
7
7
  chrome.tabs.query({active: true}, async ([initialTab]) => {
8
8
  console.log(