extension-develop 2.0.0-alpha.1 → 2.0.0-alpha.11

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 (210) hide show
  1. package/dist/ensure-hmr-for-scripts.js +2 -2
  2. package/dist/extensions/{manager-extension → chrome-manager-extension}/background.js +1 -1
  3. package/dist/extensions/{manager-extension → chrome-manager-extension}/manifest.json +2 -2
  4. package/dist/extensions/{manager-extension → chrome-manager-extension}/reload-service.js +10 -8
  5. package/dist/extensions/chromium-manager-extension/background.js +58 -0
  6. package/dist/extensions/chromium-manager-extension/define-initial-tab.js +67 -0
  7. package/dist/extensions/chromium-manager-extension/manifest.json +17 -0
  8. package/dist/extensions/chromium-manager-extension/pages/welcome.js +34 -0
  9. package/dist/extensions/chromium-manager-extension/reload-service.js +145 -0
  10. package/dist/extensions/edge-manager-extension/background.js +58 -0
  11. package/dist/extensions/edge-manager-extension/define-initial-tab.js +67 -0
  12. package/dist/extensions/edge-manager-extension/manifest.json +17 -0
  13. package/dist/extensions/edge-manager-extension/pages/sakura-dark.css +268 -0
  14. package/dist/extensions/edge-manager-extension/pages/sakura.css +267 -0
  15. package/dist/extensions/edge-manager-extension/pages/welcome.html +49 -0
  16. package/dist/extensions/edge-manager-extension/pages/welcome.js +34 -0
  17. package/dist/extensions/edge-manager-extension/public/logo.png +0 -0
  18. package/dist/extensions/edge-manager-extension/reload-service.js +145 -0
  19. package/dist/extensions/{manager-extension-firefox → firefox-manager-extension}/background.js +5 -16
  20. package/dist/extensions/{manager-extension-firefox → firefox-manager-extension}/define-initial-tab.js +17 -12
  21. package/dist/extensions/{manager-extension-firefox → firefox-manager-extension}/manifest.json +2 -2
  22. package/dist/extensions/firefox-manager-extension/pages/sakura-dark.css +268 -0
  23. package/dist/extensions/firefox-manager-extension/pages/sakura.css +267 -0
  24. package/dist/extensions/firefox-manager-extension/pages/welcome.html +49 -0
  25. package/dist/extensions/firefox-manager-extension/public/logo.png +0 -0
  26. package/dist/extensions/{manager-extension-firefox → firefox-manager-extension}/reload-service.js +1 -1
  27. package/dist/inject-chromium-client-loader.js +2 -2
  28. package/dist/inject-content-css-during-dev.js +3 -3
  29. package/dist/inject-firefox-client-loader.js +38 -43
  30. package/dist/minimum-firefox-file.mjs +1 -1
  31. package/dist/module.js +81 -85
  32. package/dist/run-chrome-profile/Default/BrowsingTopicsState +3 -3
  33. package/dist/run-chrome-profile/Default/Cache/Cache_Data/15145040f7f12f31_0 +0 -0
  34. package/dist/run-chrome-profile/Default/Cache/Cache_Data/878b0f723bb46fc9_0 +0 -0
  35. package/dist/run-chrome-profile/Default/Cache/Cache_Data/93d81321f8c35eab_0 +0 -0
  36. package/dist/run-chrome-profile/Default/Cache/Cache_Data/e85ac8952d7783d7_0 +0 -0
  37. package/dist/run-chrome-profile/Default/Cache/Cache_Data/index-dir/the-real-index +0 -0
  38. package/dist/run-chrome-profile/Default/Code Cache/js/0861135386d2c738_0 +0 -0
  39. package/dist/run-chrome-profile/Default/Code Cache/js/218fe828c74bdb99_0 +0 -0
  40. package/dist/run-chrome-profile/Default/Code Cache/js/a8bfd7ab3bf7adbd_0 +0 -0
  41. package/dist/run-chrome-profile/Default/Code Cache/js/index-dir/the-real-index +0 -0
  42. package/dist/run-chrome-profile/Default/Code Cache/wasm/index-dir/the-real-index +0 -0
  43. package/dist/run-chrome-profile/Default/Cookies +0 -0
  44. package/dist/run-chrome-profile/Default/DIPS +0 -0
  45. package/dist/run-chrome-profile/Default/DawnGraphiteCache/data_1 +0 -0
  46. package/dist/run-chrome-profile/Default/DawnGraphiteCache/index +0 -0
  47. package/dist/run-chrome-profile/Default/DawnWebGPUCache/data_1 +0 -0
  48. package/dist/run-chrome-profile/Default/DawnWebGPUCache/index +0 -0
  49. package/dist/run-chrome-profile/Default/Extension Rules/000003.log +0 -0
  50. package/dist/run-chrome-profile/Default/Extension Rules/LOG +3 -3
  51. package/dist/run-chrome-profile/Default/Extension Rules/LOG.old +3 -3
  52. package/dist/run-chrome-profile/Default/Extension Scripts/000003.log +0 -0
  53. package/dist/run-chrome-profile/Default/Extension Scripts/LOG +3 -3
  54. package/dist/run-chrome-profile/Default/Extension Scripts/LOG.old +3 -3
  55. package/dist/run-chrome-profile/Default/Extension State/000003.log +0 -0
  56. package/dist/run-chrome-profile/Default/Extension State/LOG +3 -3
  57. package/dist/run-chrome-profile/Default/Extension State/LOG.old +3 -3
  58. package/dist/run-chrome-profile/Default/Favicons +0 -0
  59. package/dist/run-chrome-profile/Default/GPUCache/data_0 +0 -0
  60. package/dist/run-chrome-profile/Default/GPUCache/data_1 +0 -0
  61. package/dist/run-chrome-profile/Default/GPUCache/data_2 +0 -0
  62. package/dist/run-chrome-profile/Default/GPUCache/index +0 -0
  63. package/dist/run-chrome-profile/Default/History +0 -0
  64. package/dist/run-chrome-profile/Default/Local Extension Settings/pbpgonifamlpcahjkkkfelffkegofkgg/000003.log +0 -0
  65. package/dist/run-chrome-profile/Default/Local Extension Settings/pbpgonifamlpcahjkkkfelffkegofkgg/LOG +3 -3
  66. package/dist/run-chrome-profile/Default/Local Extension Settings/pbpgonifamlpcahjkkkfelffkegofkgg/LOG.old +3 -3
  67. package/dist/run-chrome-profile/Default/Local Storage/leveldb/000003.log +0 -0
  68. package/dist/run-chrome-profile/Default/Local Storage/leveldb/LOG +3 -3
  69. package/dist/run-chrome-profile/Default/Local Storage/leveldb/LOG.old +3 -3
  70. package/dist/run-chrome-profile/Default/Network Persistent State +1 -1
  71. package/dist/run-chrome-profile/Default/Platform Notifications/LOG +3 -3
  72. package/dist/run-chrome-profile/Default/Platform Notifications/LOG.old +2 -3
  73. package/dist/run-chrome-profile/Default/Preferences +1 -1
  74. package/dist/run-chrome-profile/Default/Reporting and NEL and b/package/dist/run-chrome-profile/Default/Reporting → NEL +0 -0
  75. package/dist/run-chrome-profile/Default/Secure Preferences +1 -1
  76. package/dist/run-chrome-profile/Default/Service Worker/Database/000003.log +0 -0
  77. package/dist/run-chrome-profile/Default/Service Worker/Database/LOG +3 -3
  78. package/dist/run-chrome-profile/Default/Service Worker/Database/LOG.old +3 -3
  79. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/{297ecea5cebb5dfe_0 → 08b99d499107ba17_0} +0 -0
  80. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/2a0afd649b00527b_0 +0 -0
  81. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/{2cc80dabc69f58b6_0 → 67a473248953641b_0} +0 -0
  82. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/67a473248953641b_1 +0 -0
  83. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/{013888a1cda32b90_0 → 7b4fd8111178d5b1_0} +0 -0
  84. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/d0757ff92c7cde0a_0 +0 -0
  85. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/d0757ff92c7cde0a_1 +0 -0
  86. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/index-dir/the-real-index +0 -0
  87. package/dist/run-chrome-profile/Default/Session Storage/000003.log +0 -0
  88. package/dist/run-chrome-profile/Default/Session Storage/LOG +3 -3
  89. package/dist/run-chrome-profile/Default/Session Storage/LOG.old +3 -3
  90. package/dist/run-chrome-profile/Default/Sessions/Session_13369796364394711 +0 -0
  91. package/dist/run-chrome-profile/Default/Sessions/Session_13369796396690736 +0 -0
  92. package/dist/run-chrome-profile/Default/Sessions/Tabs_13369796364895748 +0 -0
  93. package/dist/run-chrome-profile/Default/Sessions/Tabs_13369796397211431 +0 -0
  94. package/dist/run-chrome-profile/Default/Shared Dictionary/cache/index-dir/the-real-index +0 -0
  95. package/dist/run-chrome-profile/Default/Site Characteristics Database/LOG +3 -3
  96. package/dist/run-chrome-profile/Default/Site Characteristics Database/LOG.old +3 -3
  97. package/dist/run-chrome-profile/Default/Sync Data/LevelDB/LOG +3 -3
  98. package/dist/run-chrome-profile/Default/Sync Data/LevelDB/LOG.old +3 -3
  99. package/dist/run-chrome-profile/Default/TransportSecurity +1 -1
  100. package/dist/run-chrome-profile/Default/Visited Links +0 -0
  101. package/dist/run-chrome-profile/Default/Web Data +0 -0
  102. package/dist/run-chrome-profile/Default/WebStorage/QuotaManager +0 -0
  103. package/dist/run-chrome-profile/Default/shared_proto_db/000003.log +0 -0
  104. package/dist/run-chrome-profile/Default/shared_proto_db/LOG +3 -3
  105. package/dist/run-chrome-profile/Default/shared_proto_db/LOG.old +3 -3
  106. package/dist/run-chrome-profile/Default/shared_proto_db/metadata/000003.log +0 -0
  107. package/dist/run-chrome-profile/Default/shared_proto_db/metadata/LOG +3 -3
  108. package/dist/run-chrome-profile/Default/shared_proto_db/metadata/LOG.old +3 -3
  109. package/dist/run-chrome-profile/GrShaderCache/data_0 +0 -0
  110. package/dist/run-chrome-profile/GrShaderCache/data_1 +0 -0
  111. package/dist/run-chrome-profile/GrShaderCache/data_2 +0 -0
  112. package/dist/run-chrome-profile/GrShaderCache/data_3 +0 -0
  113. package/dist/run-chrome-profile/GrShaderCache/index +0 -0
  114. package/dist/run-chrome-profile/GraphiteDawnCache/data_1 +0 -0
  115. package/dist/run-chrome-profile/GraphiteDawnCache/index +0 -0
  116. package/dist/run-chrome-profile/Last Version +1 -1
  117. package/dist/run-chrome-profile/Local State +1 -1
  118. package/dist/run-chrome-profile/ShaderCache/data_0 +0 -0
  119. package/dist/run-chrome-profile/ShaderCache/data_1 +0 -0
  120. package/dist/run-chrome-profile/ShaderCache/data_2 +0 -0
  121. package/dist/run-chrome-profile/ShaderCache/index +0 -0
  122. package/dist/run-chrome-profile/first_party_sets.db +0 -0
  123. package/dist/run-chrome-profile/optimization_guide_model_store/32/E6DC4029A1E4B4C1/616740573B202A03/model-info.pb +0 -0
  124. package/dist/run-chrome-profile/optimization_guide_model_store/32/E6DC4029A1E4B4C1/616740573B202A03/model.tflite +0 -0
  125. package/dist/run-chrome-profile/segmentation_platform/ukm_db +0 -0
  126. package/dist/run-chrome-profile/segmentation_platform/ukm_db-journal +0 -0
  127. package/package.json +3 -2
  128. package/dist/run-chrome-profile/Default/Cache/Cache_Data/036e8d82a2523a26_0 +0 -0
  129. package/dist/run-chrome-profile/Default/Cache/Cache_Data/257b9ada9582cd59_0 +0 -0
  130. package/dist/run-chrome-profile/Default/Cache/Cache_Data/8259bc2d7356bc5d_0 +0 -0
  131. package/dist/run-chrome-profile/Default/Cache/Cache_Data/c2880d01d9ca0897_0 +0 -0
  132. package/dist/run-chrome-profile/Default/Cache/Cache_Data/c52888c9a6d22991_0 +0 -0
  133. package/dist/run-chrome-profile/Default/Cache/Cache_Data/c7fae7b7f9b7a0bf_0 +0 -0
  134. package/dist/run-chrome-profile/Default/Code Cache/js/0ad47d0a74641b22_0 +0 -0
  135. package/dist/run-chrome-profile/Default/Code Cache/js/0fbcafeba7a5c5ed_0 +0 -0
  136. package/dist/run-chrome-profile/Default/Code Cache/js/195a67332db1fb6b_0 +0 -0
  137. package/dist/run-chrome-profile/Default/Code Cache/js/27866c80f227a32a_0 +0 -0
  138. package/dist/run-chrome-profile/Default/Code Cache/js/27e56546e417a182_0 +0 -0
  139. package/dist/run-chrome-profile/Default/Code Cache/js/3faea91e5564d655_0 +0 -0
  140. package/dist/run-chrome-profile/Default/Code Cache/js/4a213402db3f97ee_0 +0 -0
  141. package/dist/run-chrome-profile/Default/Code Cache/js/4c7708679c89a020_0 +0 -0
  142. package/dist/run-chrome-profile/Default/Code Cache/js/4ed8840c82a10bf8_0 +0 -0
  143. package/dist/run-chrome-profile/Default/Code Cache/js/5d469b2e72dff033_0 +0 -0
  144. package/dist/run-chrome-profile/Default/Code Cache/js/73ae4e72d479b847_0 +0 -0
  145. package/dist/run-chrome-profile/Default/Code Cache/js/95b17471b8555b5b_0 +0 -0
  146. package/dist/run-chrome-profile/Default/Code Cache/js/992c26a30322831b_0 +0 -0
  147. package/dist/run-chrome-profile/Default/Code Cache/js/a1bc84ca2dc9c9d8_0 +0 -0
  148. package/dist/run-chrome-profile/Default/Code Cache/js/af02e9170bb433a3_0 +0 -0
  149. package/dist/run-chrome-profile/Default/Code Cache/js/b5dc0ad71f1c8f44_0 +0 -0
  150. package/dist/run-chrome-profile/Default/Code Cache/js/b94fbb70162d5d28_0 +0 -0
  151. package/dist/run-chrome-profile/Default/Code Cache/js/baf8a70daa2269f3_0 +0 -0
  152. package/dist/run-chrome-profile/Default/Code Cache/js/be54fe001d56ed5d_0 +0 -0
  153. package/dist/run-chrome-profile/Default/Code Cache/js/c47232f2c415ea6f_0 +0 -0
  154. package/dist/run-chrome-profile/Default/Code Cache/js/d158ea025ea94688_0 +0 -0
  155. package/dist/run-chrome-profile/Default/Code Cache/js/d6eff9c5bab69b0a_0 +0 -0
  156. package/dist/run-chrome-profile/Default/Code Cache/js/dd2a2093670eef0f_0 +0 -0
  157. package/dist/run-chrome-profile/Default/Code Cache/js/e321489c3c662b3e_0 +0 -0
  158. package/dist/run-chrome-profile/Default/Code Cache/js/e658e73784a6d0b9_0 +0 -0
  159. package/dist/run-chrome-profile/Default/Code Cache/js/e9fbecf364affa6a_0 +0 -0
  160. package/dist/run-chrome-profile/Default/Code Cache/js/edcd059a7c35480a_0 +0 -0
  161. package/dist/run-chrome-profile/Default/Code Cache/js/f1fadc4174aa146d_0 +0 -0
  162. package/dist/run-chrome-profile/Default/Code Cache/js/f51fbbddfd2d7633_0 +0 -0
  163. package/dist/run-chrome-profile/Default/Code Cache/js/f90e2f63985a5ce0_0 +0 -0
  164. package/dist/run-chrome-profile/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_1 +0 -0
  165. package/dist/run-chrome-profile/Default/Sessions/Session_13368811062401121 +0 -0
  166. package/dist/run-chrome-profile/Default/Sessions/Session_13368811144592394 +0 -0
  167. package/dist/run-chrome-profile/Default/Sessions/Tabs_13368811062857759 +0 -0
  168. package/dist/run-chrome-profile/Default/Sessions/Tabs_13368811145119608 +0 -0
  169. package/dist/types/css-content.d.ts +0 -7
  170. package/dist/types/css-modules.d.ts +0 -19
  171. package/dist/types/images.d.ts +0 -58
  172. package/dist/types/index.d.ts +0 -13
  173. package/dist/types/index.ts +0 -7
  174. package/dist/types/polyfill.d.ts +0 -1
  175. /package/dist/extensions/{manager-extension → chrome-manager-extension}/define-initial-tab.js +0 -0
  176. /package/dist/extensions/{manager-extension-firefox → chrome-manager-extension}/pages/sakura-dark.css +0 -0
  177. /package/dist/extensions/{manager-extension-firefox → chrome-manager-extension}/pages/sakura.css +0 -0
  178. /package/dist/extensions/{manager-extension-firefox → chrome-manager-extension}/pages/welcome.html +0 -0
  179. /package/dist/extensions/{manager-extension → chrome-manager-extension}/pages/welcome.js +0 -0
  180. /package/dist/extensions/{manager-extension-firefox → chrome-manager-extension}/public/logo.png +0 -0
  181. /package/dist/extensions/{manager-extension → chromium-manager-extension}/pages/sakura-dark.css +0 -0
  182. /package/dist/extensions/{manager-extension → chromium-manager-extension}/pages/sakura.css +0 -0
  183. /package/dist/extensions/{manager-extension → chromium-manager-extension}/pages/welcome.html +0 -0
  184. /package/dist/extensions/{manager-extension → chromium-manager-extension}/public/logo.png +0 -0
  185. /package/dist/extensions/{manager-extension-firefox → firefox-manager-extension}/pages/welcome.js +0 -0
  186. /package/dist/run-chrome-profile/optimization_guide_model_store/13/E6DC4029A1E4B4C1/{A2FF726319EAE26F → 7FB2BED5F58D342A}/model-info.pb +0 -0
  187. /package/dist/run-chrome-profile/optimization_guide_model_store/13/E6DC4029A1E4B4C1/{A2FF726319EAE26F → 7FB2BED5F58D342A}/model.tflite +0 -0
  188. /package/dist/run-chrome-profile/optimization_guide_model_store/15/E6DC4029A1E4B4C1/{DD2F3F59DBBFC161 → E2AEF611C74078E8}/VERSION.txt +0 -0
  189. /package/dist/run-chrome-profile/optimization_guide_model_store/15/E6DC4029A1E4B4C1/{DD2F3F59DBBFC161 → E2AEF611C74078E8}/model-info.pb +0 -0
  190. /package/dist/run-chrome-profile/optimization_guide_model_store/15/E6DC4029A1E4B4C1/{DD2F3F59DBBFC161 → E2AEF611C74078E8}/model.tflite +0 -0
  191. /package/dist/run-chrome-profile/optimization_guide_model_store/15/E6DC4029A1E4B4C1/{DD2F3F59DBBFC161 → E2AEF611C74078E8}/override_list.pb.gz +0 -0
  192. /package/dist/run-chrome-profile/optimization_guide_model_store/2/E6DC4029A1E4B4C1/{5C9CEB1B5864C075 → D87E159693F0EB16}/model-info.pb +0 -0
  193. /package/dist/run-chrome-profile/optimization_guide_model_store/2/E6DC4029A1E4B4C1/{5C9CEB1B5864C075 → D87E159693F0EB16}/model.tflite +0 -0
  194. /package/dist/run-chrome-profile/optimization_guide_model_store/20/E6DC4029A1E4B4C1/{53F9D90C8266B357 → 34B03CEAE0058949}/model-info.pb +0 -0
  195. /package/dist/run-chrome-profile/optimization_guide_model_store/20/E6DC4029A1E4B4C1/{53F9D90C8266B357 → 34B03CEAE0058949}/model.tflite +0 -0
  196. /package/dist/run-chrome-profile/optimization_guide_model_store/25/E6DC4029A1E4B4C1/{D93CB2CBA8635DD6 → 758FC3BEFF3CA2C1}/model-info.pb +0 -0
  197. /package/dist/run-chrome-profile/optimization_guide_model_store/25/E6DC4029A1E4B4C1/{D93CB2CBA8635DD6 → 758FC3BEFF3CA2C1}/model.tflite +0 -0
  198. /package/dist/run-chrome-profile/optimization_guide_model_store/25/E6DC4029A1E4B4C1/{D93CB2CBA8635DD6 → 758FC3BEFF3CA2C1}/visual_model_desktop.tflite +0 -0
  199. /package/dist/run-chrome-profile/optimization_guide_model_store/26/E6DC4029A1E4B4C1/{39FB7D5ADBDA7869 → 8D7B8C555280B305}/model-info.pb +0 -0
  200. /package/dist/run-chrome-profile/optimization_guide_model_store/26/E6DC4029A1E4B4C1/{39FB7D5ADBDA7869 → 8D7B8C555280B305}/model.tflite +0 -0
  201. /package/dist/run-chrome-profile/optimization_guide_model_store/31/E6DC4029A1E4B4C1/{78ED3668E901D315 → 8268F35943871DCC}/model-info.pb +0 -0
  202. /package/dist/run-chrome-profile/optimization_guide_model_store/31/E6DC4029A1E4B4C1/{78ED3668E901D315 → 8268F35943871DCC}/model.tflite +0 -0
  203. /package/dist/run-chrome-profile/optimization_guide_model_store/34/E6DC4029A1E4B4C1/{9C601F6F58B4BB6D → 07A53CCB3617518F}/model-info.pb +0 -0
  204. /package/dist/run-chrome-profile/optimization_guide_model_store/34/E6DC4029A1E4B4C1/{9C601F6F58B4BB6D → 07A53CCB3617518F}/model.tflite +0 -0
  205. /package/dist/run-chrome-profile/optimization_guide_model_store/40/E6DC4029A1E4B4C1/{D4BFFC1A4F34F105 → D09D4C34287503EC}/model-info.pb +0 -0
  206. /package/dist/run-chrome-profile/optimization_guide_model_store/40/E6DC4029A1E4B4C1/{D4BFFC1A4F34F105 → D09D4C34287503EC}/model.tflite +0 -0
  207. /package/dist/run-chrome-profile/optimization_guide_model_store/40/E6DC4029A1E4B4C1/{D4BFFC1A4F34F105 → D09D4C34287503EC}/ts.bin +0 -0
  208. /package/dist/run-chrome-profile/optimization_guide_model_store/40/E6DC4029A1E4B4C1/{D4BFFC1A4F34F105 → D09D4C34287503EC}/ts_spm.model +0 -0
  209. /package/dist/run-chrome-profile/optimization_guide_model_store/9/E6DC4029A1E4B4C1/{3D618C218E10133D → 74D0A314A35DB18B}/model-info.pb +0 -0
  210. /package/dist/run-chrome-profile/optimization_guide_model_store/9/E6DC4029A1E4B4C1/{3D618C218E10133D → 74D0A314A35DB18B}/model.tflite +0 -0
@@ -1,3 +1,3 @@
1
- "use strict";var A=Object.create;var g=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var C=(t,n)=>{for(var s in n)g(t,s,{get:n[s],enumerable:!0})},b=(t,n,s,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of R(n))!_.call(t,r)&&r!==s&&g(t,r,{get:()=>n[r],enumerable:!(e=D(n,r))||e.enumerable});return t};var a=(t,n,s)=>(s=t!=null?A(P(t)):{},b(n||!t||!t.__esModule?g(s,"default",{value:t,enumerable:!0}):s,t)),U=t=>b(g({},"__esModule",{value:!0}),t);var V={};C(V,{default:()=>S});module.exports=U(V);var x=a(require("path")),T=a(require("fs")),k=require("loader-utils"),O=require("schema-utils");var v=a(require("fs")),f=a(require("path")),j=a(require("parse5-utils"));var p=a(require("parse5-utils"));function m(t){try{return new URL(t),!0}catch{return!1}}function h(t,n){let{childNodes:s=[]}=t;for(let e of s)if(e.nodeName==="script"){let r=p.default.getAttribute(e,"src");if(!r||m(r))continue;n({filePath:r,childNode:e,assetType:"script"})}else if(e.nodeName==="link"){let r=p.default.getAttribute(e,"href"),i=p.default.getAttribute(e,"rel");if(!r||m(r))continue;n(i==="dns-prefetch"||i==="icon"||i==="manifest"||i==="modulepreload"||i==="preconnect"||i==="prefetch"||i==="preload"||i==="prerender"?{filePath:r,childNode:e,assetType:"staticHref"}:{filePath:r,childNode:e,assetType:"css"})}else if(e.nodeName==="a"||e.nodeName==="area"){let r=p.default.getAttribute(e,"href");if(!r||m(r))continue;n({filePath:r,childNode:e,assetType:"staticHref"})}else if(e.nodeName==="audio"||e.nodeName==="embed"||e.nodeName==="iframe"||e.nodeName==="img"||e.nodeName==="input"||e.nodeName==="source"||e.nodeName==="track"||e.nodeName==="video"){let r=p.default.getAttribute(e,"src");if(!r||m(r))continue;n({filePath:r,childNode:e,assetType:"staticSrc"})}else h(e,n)}function N(t,n){let s={css:[],js:[],static:[]};if(!t)return s;let e=n||v.default.readFileSync(t,{encoding:"utf8"}),r=j.default.parse(e),i=(o,c)=>f.default.join(f.default.dirname(o),c.startsWith("/")?f.default.relative(f.default.dirname(o),c):c);for(let o of r.childNodes)if(o.nodeName==="html"){for(let c of o.childNodes)(c.nodeName==="head"||c.nodeName==="body")&&h(c,({filePath:u,assetType:y})=>{let d=i(t,u);switch(y){case"script":s.js?.push(d);break;case"css":s.css?.push(d);break;case"staticSrc":case"staticHref":if(u.startsWith("#"))break;s.static?.push(d);break;default:break}});return{css:s.css,js:s.js,static:s.static}}}var w=a(require("path")),$=a(require("fs")),q=require("child_process"),z=require("detect-package-manager");var H=a(require("path")),l=require("@colors/colors/safe");var E=a(require("path")),L=E.default.join(process.cwd(),"node_modules/extension-develop/dist/certs");function F(t){let n=w.default.join(t,"package.json");if(!$.default.existsSync(n))return!1;let s=JSON.parse($.default.readFileSync(n,"utf-8")),e=["react","vue","@angular/core","svelte","solid-js","preact"],r=s.dependencies||{},i=s.devDependencies||{};for(let o of e)if(r[o]||i[o])return!0;return!1}var J={type:"object",properties:{test:{type:"string"},manifestPath:{type:"string"},includeList:{type:"object"},excludeList:{type:"object"}}};function S(t){let n=this.getOptions(),s=n.manifestPath,e=x.default.dirname(s);(0,O.validate)(J,n,{name:"html:ensure-hmr-for-scripts",baseDataPath:"options"});let r=(0,k.urlToRequest)(this.resourcePath),i=`
1
+ "use strict";var D=Object.create;var m=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var U=(t,n)=>{for(var s in n)m(t,s,{get:n[s],enumerable:!0})},b=(t,n,s,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of _(n))!C.call(t,r)&&r!==s&&m(t,r,{get:()=>n[r],enumerable:!(e=A(n,r))||e.enumerable});return t};var a=(t,n,s)=>(s=t!=null?D(P(t)):{},b(n||!t||!t.__esModule?m(s,"default",{value:t,enumerable:!0}):s,t)),L=t=>b(m({},"__esModule",{value:!0}),t);var Y={};U(Y,{default:()=>k});module.exports=L(Y);var x=a(require("path")),S=a(require("fs")),T=require("loader-utils"),M=require("schema-utils");var v=a(require("fs")),d=a(require("path")),E=a(require("parse5-utils"));var p=a(require("parse5-utils"));function g(t){try{return new URL(t),!0}catch{return!1}}function h(t,n){let{childNodes:s=[]}=t;for(let e of s)if(e.nodeName==="script"){let r=p.default.getAttribute(e,"src");if(!r||g(r))continue;n({filePath:r,childNode:e,assetType:"script"})}else if(e.nodeName==="link"){let r=p.default.getAttribute(e,"href"),o=p.default.getAttribute(e,"rel");if(!r||g(r))continue;n(o==="dns-prefetch"||o==="icon"||o==="manifest"||o==="modulepreload"||o==="preconnect"||o==="prefetch"||o==="preload"||o==="prerender"?{filePath:r,childNode:e,assetType:"staticHref"}:{filePath:r,childNode:e,assetType:"css"})}else if(e.nodeName==="a"||e.nodeName==="area"){let r=p.default.getAttribute(e,"href");if(!r||g(r))continue;n({filePath:r,childNode:e,assetType:"staticHref"})}else if(e.nodeName==="audio"||e.nodeName==="embed"||e.nodeName==="iframe"||e.nodeName==="img"||e.nodeName==="input"||e.nodeName==="source"||e.nodeName==="track"||e.nodeName==="video"){let r=p.default.getAttribute(e,"src");if(!r||g(r))continue;n({filePath:r,childNode:e,assetType:"staticSrc"})}else h(e,n)}function N(t,n){let s={css:[],js:[],static:[]};if(!t)return s;let e=n||v.default.readFileSync(t,{encoding:"utf8"}),r=E.default.parse(e),o=(i,c)=>d.default.join(d.default.dirname(i),c.startsWith("/")?d.default.relative(d.default.dirname(i),c):c);for(let i of r.childNodes)if(i.nodeName==="html"){for(let c of i.childNodes)(c.nodeName==="head"||c.nodeName==="body")&&h(c,({filePath:u,assetType:y})=>{let f=o(t,u);switch(y){case"script":s.js?.push(f);break;case"css":s.css?.push(f);break;case"staticSrc":case"staticHref":if(u.startsWith("#"))break;s.static?.push(f);break;default:break}});return{css:s.css,js:s.js,static:s.static}}}var O=a(require("path")),$=a(require("fs")),z=require("child_process"),J=require("detect-package-manager");var q=a(require("path")),l=require("@colors/colors/safe");var j=a(require("path")),H=j.default.join(process.cwd(),"node_modules/extension-develop/dist/certs"),F=["chrome","edge"],W=["firefox"],Z=[...F,...W];function w(t){let n=O.default.join(t,"package.json");if(!$.default.existsSync(n))return!1;let s=JSON.parse($.default.readFileSync(n,"utf-8")),e=["react","vue","@angular/core","svelte","solid-js","preact"],r=s.dependencies||{},o=s.devDependencies||{};for(let i of e)if(r[i]||o[i])return!0;return!1}var V={type:"object",properties:{test:{type:"string"},manifestPath:{type:"string"},includeList:{type:"object"},excludeList:{type:"object"}}};function k(t){let n=this.getOptions(),s=n.manifestPath,e=x.default.dirname(s);(0,M.validate)(V,n,{name:"html:ensure-hmr-for-scripts",baseDataPath:"options"});let r=(0,T.urlToRequest)(this.resourcePath),o=`
2
2
  if (import.meta.webpackHot) { import.meta.webpackHot.accept() };
3
- `;if(F(e))return t;let o=n.includeList||{};for(let c of Object.entries(o)){let[,u]=c;if(u){if(!T.default.existsSync(u))return;let d=N(u)?.js||[];for(let M of d){let I=x.default.resolve(e,M);if(r.includes(I))return`${i}${t}`}}}return t}
3
+ `;if(w(e))return t;let i=n.includeList||{};for(let c of Object.entries(i)){let[,u]=c;if(u){if(!S.default.existsSync(u))return;let f=N(u)?.js||[];for(let R of f){let I=x.default.resolve(e,R);if(r.includes(I))return`${o}${t}`}}}return t}
@@ -30,7 +30,7 @@ chrome.tabs.query({active: true}, async ([initialTab]) => {
30
30
  ██████████████████████████ ████████████████████████████
31
31
  ██████████████████████████████████████████████████████████
32
32
  ██████████████████████████████████████████████████████████
33
- Make it very easy to develop cross-browser extensions.
33
+ MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js Authors.
34
34
  `,
35
35
  bgGreen('')
36
36
  )
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "Extension.js Developer Tools",
3
- "description": "Utility for developers to manage their extensions.",
2
+ "name": "Extension Manager",
3
+ "description": "Extension.js developer tools for tabs and reload management.",
4
4
  "version": "1.0",
5
5
  "manifest_version": 3,
6
6
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
@@ -10,25 +10,25 @@ export async function connect() {
10
10
  webSocket = new WebSocket('ws://localhost:__RELOAD_PORT__')
11
11
 
12
12
  webSocket.onerror = (event) => {
13
- console.error(`[Extension.js] Connection error: ${JSON.stringify(event)}`)
13
+ console.error(`[Reload Service] Connection error: ${JSON.stringify(event)}`)
14
14
  webSocket.close()
15
15
  }
16
16
 
17
17
  webSocket.onopen = () => {
18
- console.info(`[Extension.js] Connection opened.`)
18
+ console.info(`[Reload Service] Connection opened.`)
19
19
  }
20
20
 
21
21
  webSocket.onmessage = async (event) => {
22
22
  const message = JSON.parse(event.data)
23
23
 
24
24
  if (message.status === 'serverReady') {
25
- console.info('[Extension.js] Connection ready.')
25
+ console.info('[Reload Service] Connection ready.')
26
26
  await requestInitialLoadData()
27
27
  }
28
28
 
29
29
  if (message.changedFile) {
30
30
  console.info(
31
- `[Extension.js] Changes detected on ${message.changedFile}. Reloading extension...`
31
+ `[Reload Service] Changes detected on ${message.changedFile}. Reloading extension...`
32
32
  )
33
33
 
34
34
  await messageAllExtensions(message.changedFile)
@@ -36,7 +36,7 @@ export async function connect() {
36
36
  }
37
37
 
38
38
  webSocket.onclose = () => {
39
- console.info('[Extension.js] Connection closed.')
39
+ console.info('[Reload Service] Connection closed.')
40
40
  webSocket = null
41
41
  }
42
42
  }
@@ -56,6 +56,8 @@ async function getDevExtensions() {
56
56
  return (
57
57
  // Do not include itself
58
58
  extension.id !== chrome.runtime.id &&
59
+ // Manager extension
60
+ extension.id !== 'hkklidinfhnfidkjiknmmbmcloigimco' &&
59
61
  // Show only unpackaged extensions
60
62
  extension.installType === 'development'
61
63
  )
@@ -71,7 +73,7 @@ async function messageAllExtensions(changedFile) {
71
73
  const reloadAll = devExtensions.map((extension) => {
72
74
  chrome.runtime.sendMessage(extension.id, {changedFile}, (response) => {
73
75
  if (response) {
74
- console.info('[Extension.js] Extension reloaded and ready.')
76
+ console.info('[Reload Service] Extension reloaded and ready.')
75
77
  }
76
78
  })
77
79
 
@@ -80,7 +82,7 @@ async function messageAllExtensions(changedFile) {
80
82
 
81
83
  await Promise.all(reloadAll)
82
84
  } else {
83
- console.info('[Extension.js] External extension is not ready.')
85
+ console.info('[Reload Service] External extension is not ready.')
84
86
  }
85
87
  }
86
88
 
@@ -135,7 +137,7 @@ export function keepAlive() {
135
137
  const keepAliveIntervalId = setInterval(() => {
136
138
  if (webSocket) {
137
139
  webSocket.send(JSON.stringify({status: 'ping'}))
138
- console.info('[Extension.js] Listening for changes...')
140
+ console.info('[Reload Service] Listening for changes...')
139
141
  } else {
140
142
  clearInterval(keepAliveIntervalId)
141
143
  }
@@ -0,0 +1,58 @@
1
+ import {createExtensionsPageTab, handleFirstRun} from './define-initial-tab.js'
2
+ import {connect, disconnect, keepAlive} from './reload-service.js'
3
+
4
+ function bgGreen(str) {
5
+ return `background: #0A0C10; color: #26FFB8; ${str}`
6
+ }
7
+ chrome.tabs.query({active: true}, async ([initialTab]) => {
8
+ console.log(
9
+ `%c
10
+ ██████████████████████████████████████████████████████████
11
+ ██████████████████████████████████████████████████████████
12
+ ████████████████████████████ ██████████████████████████
13
+ █████████████████████████ ██████ ███████████████
14
+ ███████████████████████ ███ ███ ████████████
15
+ ██████████████████████ ██████ ███ ███████████
16
+ ███████████████████████ ██████ ██████ ███████████
17
+ ████████████████ ██████ ██████████████ ███████████
18
+ █████████████ ████ ████████████ ████████████
19
+ ███████████ ██ █████████████ ███████████████
20
+ ██████████ ██████ █████████████████ █████████████
21
+ ███████████ ████████████████████████████ ███████████
22
+ █████████████ █████████████████ ██████ ██████████
23
+ ███████████████ ██████████████ ██ ██████████
24
+ ████████████ ████████████ ████ █████████████
25
+ ███████████ █████████████ ██████ ███████████████
26
+ ███████████ ██████ ██████ ███████████████████████
27
+ ███████████ ████ ██████ ██████████████████████
28
+ ████████████ ██ ███ ███████████████████████
29
+ ███████████████ ██████ █████████████████████████
30
+ ██████████████████████████ ████████████████████████████
31
+ ██████████████████████████████████████████████████████████
32
+ ██████████████████████████████████████████████████████████
33
+ MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js Authors.
34
+ `,
35
+ bgGreen('')
36
+ )
37
+
38
+ if (
39
+ initialTab.url === 'chrome://newtab/' ||
40
+ initialTab.url === 'chrome://welcome/'
41
+ ) {
42
+ await handleFirstRun()
43
+ } else {
44
+ createExtensionsPageTab(initialTab, 'chrome://extensions/')
45
+ }
46
+ })
47
+
48
+ chrome.runtime.onInstalled.addListener(async () => {
49
+ let isConnected = false
50
+
51
+ if (isConnected) {
52
+ disconnect()
53
+ } else {
54
+ await connect()
55
+ isConnected = true
56
+ keepAlive()
57
+ }
58
+ })
@@ -0,0 +1,67 @@
1
+ async function getDevExtension() {
2
+ const allExtensions = await new Promise((resolve) => {
3
+ chrome.management.getAll(resolve)
4
+ })
5
+
6
+ const devExtensions = allExtensions.filter((extension) => {
7
+ return (
8
+ // Do not include itself
9
+ extension.id !== chrome.runtime.id &&
10
+ // Reload extension
11
+ extension.id !== 'igcijhgmihmjbbahdabahfbpffalcfnn' &&
12
+ // Show only unpackaged extensions
13
+ extension.installType === 'development'
14
+ )
15
+ })
16
+
17
+ return devExtensions[0]
18
+ }
19
+
20
+ // Ideas here are adapted from
21
+ // https://github.com/jeremyben/webpack-chrome-extension-launcher
22
+ // Released under MIT license.
23
+
24
+ // Create a new tab and set it to background.
25
+ // We want the user-selected page to be active,
26
+ // not chrome://extensions.
27
+ export function createExtensionsPageTab(initialTab, url) {
28
+ // Check if url tab is open
29
+ chrome.tabs.query({url: 'chrome://extensions/'}, (tabs) => {
30
+ const extensionsTabExist = tabs.length > 0
31
+
32
+ // Return if url exists
33
+ if (extensionsTabExist) return
34
+
35
+ // Create an inactive tab
36
+ chrome.tabs.create(
37
+ {url, active: false},
38
+ function setBackgroundTab(extensionsTab) {
39
+ // Get current url tab and move it left.
40
+ // This action auto-activates the tab
41
+ chrome.tabs.move(extensionsTab.id, {index: 0}, () => {
42
+ // Get user-selected initial page tab and activate the right tab
43
+ setTimeout(() => {
44
+ chrome.tabs.update(initialTab.id, {active: true})
45
+ }, 500)
46
+ })
47
+ }
48
+ )
49
+ })
50
+ }
51
+
52
+ // Function to handle first run logic
53
+ export async function handleFirstRun() {
54
+ chrome.tabs.update({url: 'chrome://extensions/'})
55
+
56
+ const devExtension = await getDevExtension()
57
+
58
+ chrome.storage.local.get(devExtension.id, (result) => {
59
+ if (result[devExtension.id] && result[devExtension.id].didRun) {
60
+ return
61
+ }
62
+
63
+ chrome.tabs.create({url: 'pages/welcome.html'})
64
+ // Ensure the welcome page shows only once per extension installation
65
+ chrome.storage.local.set({[devExtension.id]: {didRun: true}})
66
+ })
67
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "Extension Manager",
3
+ "description": "Extension.js developer tools for tabs and reload management.",
4
+ "version": "1.0",
5
+ "manifest_version": 3,
6
+ "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
7
+ "background": {
8
+ "service_worker": "background.js",
9
+ "type": "module"
10
+ },
11
+ "icons": {
12
+ "16": "./public/logo.png",
13
+ "48": "./public/logo.png",
14
+ "128": "./public/logo.png"
15
+ },
16
+ "permissions": ["management", "tabs", "storage"]
17
+ }
@@ -0,0 +1,34 @@
1
+ async function getUserExtension() {
2
+ const allExtensions = await chrome.management.getAll()
3
+
4
+ return allExtensions.filter((extension) => {
5
+ return (
6
+ // Do not include itself
7
+ extension.id !== chrome.runtime.id &&
8
+ // Reload extension
9
+ extension.id !== 'igcijhgmihmjbbahdabahfbpffalcfnn' &&
10
+ // Show only unpackaged extensions
11
+ extension.installType === 'development'
12
+ )
13
+ })
14
+ }
15
+
16
+ async function onStartup() {
17
+ const userExtension = await getUserExtension()
18
+ const extensionName = document.getElementById('extensionName')
19
+ const extensionDescription = document.getElementById('extensionDescription')
20
+
21
+ extensionName.innerText = userExtension[0].name
22
+ extensionName.title = `• Name: ${userExtension[0].name}
23
+ • ID: ${userExtension[0].id}
24
+ • Version: ${userExtension[0].version}`
25
+
26
+ extensionDescription.innerText = userExtension[0].description
27
+
28
+ const learnMore = document.getElementById('learnMore')
29
+ learnMore.addEventListener('click', () => {
30
+ chrome.tabs.create({url: 'https://extension.js.org/'})
31
+ })
32
+ }
33
+
34
+ onStartup()
@@ -0,0 +1,145 @@
1
+ const TEN_SECONDS_MS = 10 * 1000
2
+ let webSocket = null
3
+
4
+ export async function connect() {
5
+ if (webSocket) {
6
+ // If already connected, do nothing
7
+ return
8
+ }
9
+
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
+ }
16
+
17
+ webSocket.onopen = () => {
18
+ console.info(`[Reload Service] Connection opened.`)
19
+ }
20
+
21
+ webSocket.onmessage = async (event) => {
22
+ const message = JSON.parse(event.data)
23
+
24
+ if (message.status === 'serverReady') {
25
+ console.info('[Reload Service] Connection ready.')
26
+ await requestInitialLoadData()
27
+ }
28
+
29
+ if (message.changedFile) {
30
+ console.info(
31
+ `[Reload Service] Changes detected on ${message.changedFile}. Reloading extension...`
32
+ )
33
+
34
+ await messageAllExtensions(message.changedFile)
35
+ }
36
+ }
37
+
38
+ webSocket.onclose = () => {
39
+ console.info('[Reload Service] Connection closed.')
40
+ webSocket = null
41
+ }
42
+ }
43
+
44
+ export function disconnect() {
45
+ if (webSocket) {
46
+ webSocket.close()
47
+ }
48
+ }
49
+
50
+ async function getDevExtensions() {
51
+ const allExtensions = await new Promise((resolve) => {
52
+ chrome.management.getAll(resolve)
53
+ })
54
+
55
+ return allExtensions.filter((extension) => {
56
+ return (
57
+ // Do not include itself
58
+ extension.id !== chrome.runtime.id &&
59
+ // Manager extension
60
+ extension.id !== 'hkklidinfhnfidkjiknmmbmcloigimco' &&
61
+ // Show only unpackaged extensions
62
+ extension.installType === 'development'
63
+ )
64
+ })
65
+ }
66
+
67
+ async function messageAllExtensions(changedFile) {
68
+ // Check if the external extension is ready
69
+ const isExtensionReady = await checkExtensionReadiness()
70
+
71
+ if (isExtensionReady) {
72
+ const devExtensions = await getDevExtensions()
73
+ const reloadAll = devExtensions.map((extension) => {
74
+ chrome.runtime.sendMessage(extension.id, {changedFile}, (response) => {
75
+ if (response) {
76
+ console.info('[Reload Service] Extension reloaded and ready.')
77
+ }
78
+ })
79
+
80
+ return true
81
+ })
82
+
83
+ await Promise.all(reloadAll)
84
+ } else {
85
+ console.info('[Reload Service] External extension is not ready.')
86
+ }
87
+ }
88
+
89
+ async function requestInitialLoadData() {
90
+ const devExtensions = await getDevExtensions()
91
+
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
+ })
109
+ })
110
+
111
+ const responses = await Promise.all(messagePromises)
112
+
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]
119
+ })
120
+
121
+ webSocket.send(message)
122
+ }
123
+ }
124
+
125
+ async function checkExtensionReadiness() {
126
+ // Delay for 1 second
127
+ await delay(1000)
128
+ // Assume the extension is ready
129
+ return true
130
+ }
131
+
132
+ async function delay(ms) {
133
+ return await new Promise((resolve) => setTimeout(resolve, ms))
134
+ }
135
+
136
+ export function keepAlive() {
137
+ const keepAliveIntervalId = setInterval(() => {
138
+ if (webSocket) {
139
+ webSocket.send(JSON.stringify({status: 'ping'}))
140
+ console.info('[Reload Service] Listening for changes...')
141
+ } else {
142
+ clearInterval(keepAliveIntervalId)
143
+ }
144
+ }, TEN_SECONDS_MS)
145
+ }
@@ -0,0 +1,58 @@
1
+ import {createExtensionsPageTab, handleFirstRun} from './define-initial-tab.js'
2
+ import {connect, disconnect, keepAlive} from './reload-service.js'
3
+
4
+ function bgGreen(str) {
5
+ return `background: #0A0C10; color: #26FFB8; ${str}`
6
+ }
7
+ chrome.tabs.query({active: true}, async ([initialTab]) => {
8
+ console.log(
9
+ `%c
10
+ ██████████████████████████████████████████████████████████
11
+ ██████████████████████████████████████████████████████████
12
+ ████████████████████████████ ██████████████████████████
13
+ █████████████████████████ ██████ ███████████████
14
+ ███████████████████████ ███ ███ ████████████
15
+ ██████████████████████ ██████ ███ ███████████
16
+ ███████████████████████ ██████ ██████ ███████████
17
+ ████████████████ ██████ ██████████████ ███████████
18
+ █████████████ ████ ████████████ ████████████
19
+ ███████████ ██ █████████████ ███████████████
20
+ ██████████ ██████ █████████████████ █████████████
21
+ ███████████ ████████████████████████████ ███████████
22
+ █████████████ █████████████████ ██████ ██████████
23
+ ███████████████ ██████████████ ██ ██████████
24
+ ████████████ ████████████ ████ █████████████
25
+ ███████████ █████████████ ██████ ███████████████
26
+ ███████████ ██████ ██████ ███████████████████████
27
+ ███████████ ████ ██████ ██████████████████████
28
+ ████████████ ██ ███ ███████████████████████
29
+ ███████████████ ██████ █████████████████████████
30
+ ██████████████████████████ ████████████████████████████
31
+ ██████████████████████████████████████████████████████████
32
+ ██████████████████████████████████████████████████████████
33
+ MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js Authors.
34
+ `,
35
+ bgGreen('')
36
+ )
37
+
38
+ if (
39
+ initialTab.url === 'chrome://newtab/' ||
40
+ initialTab.url === 'chrome://welcome/'
41
+ ) {
42
+ await handleFirstRun()
43
+ } else {
44
+ createExtensionsPageTab(initialTab, 'chrome://extensions/')
45
+ }
46
+ })
47
+
48
+ chrome.runtime.onInstalled.addListener(async () => {
49
+ let isConnected = false
50
+
51
+ if (isConnected) {
52
+ disconnect()
53
+ } else {
54
+ await connect()
55
+ isConnected = true
56
+ keepAlive()
57
+ }
58
+ })
@@ -0,0 +1,67 @@
1
+ async function getDevExtension() {
2
+ const allExtensions = await new Promise((resolve) => {
3
+ chrome.management.getAll(resolve)
4
+ })
5
+
6
+ const devExtensions = allExtensions.filter((extension) => {
7
+ return (
8
+ // Do not include itself
9
+ extension.id !== chrome.runtime.id &&
10
+ // Reload extension
11
+ extension.id !== 'igcijhgmihmjbbahdabahfbpffalcfnn' &&
12
+ // Show only unpackaged extensions
13
+ extension.installType === 'development'
14
+ )
15
+ })
16
+
17
+ return devExtensions[0]
18
+ }
19
+
20
+ // Ideas here are adapted from
21
+ // https://github.com/jeremyben/webpack-chrome-extension-launcher
22
+ // Released under MIT license.
23
+
24
+ // Create a new tab and set it to background.
25
+ // We want the user-selected page to be active,
26
+ // not chrome://extensions.
27
+ export function createExtensionsPageTab(initialTab, url) {
28
+ // Check if url tab is open
29
+ chrome.tabs.query({url: 'chrome://extensions/'}, (tabs) => {
30
+ const extensionsTabExist = tabs.length > 0
31
+
32
+ // Return if url exists
33
+ if (extensionsTabExist) return
34
+
35
+ // Create an inactive tab
36
+ chrome.tabs.create(
37
+ {url, active: false},
38
+ function setBackgroundTab(extensionsTab) {
39
+ // Get current url tab and move it left.
40
+ // This action auto-activates the tab
41
+ chrome.tabs.move(extensionsTab.id, {index: 0}, () => {
42
+ // Get user-selected initial page tab and activate the right tab
43
+ setTimeout(() => {
44
+ chrome.tabs.update(initialTab.id, {active: true})
45
+ }, 500)
46
+ })
47
+ }
48
+ )
49
+ })
50
+ }
51
+
52
+ // Function to handle first run logic
53
+ export async function handleFirstRun() {
54
+ chrome.tabs.update({url: 'chrome://extensions/'})
55
+
56
+ const devExtension = await getDevExtension()
57
+
58
+ chrome.storage.local.get(devExtension.id, (result) => {
59
+ if (result[devExtension.id] && result[devExtension.id].didRun) {
60
+ return
61
+ }
62
+
63
+ chrome.tabs.create({url: 'pages/welcome.html'})
64
+ // Ensure the welcome page shows only once per extension installation
65
+ chrome.storage.local.set({[devExtension.id]: {didRun: true}})
66
+ })
67
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "Extension Manager",
3
+ "description": "Extension.js developer tools for tabs and reload management.",
4
+ "version": "1.0",
5
+ "manifest_version": 3,
6
+ "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
7
+ "background": {
8
+ "service_worker": "background.js",
9
+ "type": "module"
10
+ },
11
+ "icons": {
12
+ "16": "./public/logo.png",
13
+ "48": "./public/logo.png",
14
+ "128": "./public/logo.png"
15
+ },
16
+ "permissions": ["management", "tabs", "storage"]
17
+ }