extension-develop 4.1.35 → 4.1.36

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 (32) hide show
  1. package/dist/363~0.mjs +17 -0
  2. package/dist/469~0.mjs +20 -5
  3. package/dist/832~0.mjs +2770 -2761
  4. package/dist/840~0.mjs +2488 -2144
  5. package/dist/852~0.mjs +1 -0
  6. package/dist/contract/codes.json +6 -2
  7. package/dist/extension-js-devtools/build-stamp.json +2 -2
  8. package/dist/extension-js-devtools/chrome/background/service_worker.js +2 -2
  9. package/dist/extension-js-devtools/chrome/pages/welcome.js +2 -2
  10. package/dist/extension-js-devtools/chromium/background/service_worker.js +2 -2
  11. package/dist/extension-js-devtools/chromium/pages/welcome.js +2 -2
  12. package/dist/extension-js-devtools/edge/background/service_worker.js +2 -2
  13. package/dist/extension-js-devtools/edge/pages/welcome.js +2 -2
  14. package/dist/extension-js-devtools/firefox/background/scripts.js +2 -2
  15. package/dist/extension-js-devtools/firefox/pages/welcome.js +2 -2
  16. package/dist/extension-js-theme/build-stamp.json +2 -2
  17. package/dist/lib/addon-lint.d.ts +7 -3
  18. package/dist/lib/addon-reviewer-note.d.ts +32 -0
  19. package/dist/lib/build-summary.d.ts +6 -1
  20. package/dist/lib/build-toolchain.d.ts +8 -0
  21. package/dist/lib/chunk-dependency-provenance.d.ts +8 -0
  22. package/dist/lib/development-artifacts.d.ts +2 -0
  23. package/dist/lib/loopback-origins.d.ts +6 -0
  24. package/dist/lib/messages.d.ts +12 -1
  25. package/dist/lib/messaging.d.ts +1 -0
  26. package/dist/lib/stable-loader-paths.d.ts +14 -0
  27. package/dist/plugin-web-extension/feature-manifest/manifest-lib/edge-options-notice.d.ts +4 -0
  28. package/dist/plugin-web-extension/feature-manifest/messages.d.ts +1 -0
  29. package/dist/plugin-web-extension/feature-scripts/steps/add-base-uri-runtime-module.d.ts +5 -0
  30. package/dist/plugin-web-extension/feature-scripts/steps/stamp-webkit-utf8-bom.d.ts +9 -0
  31. package/dist/rspack-config~0.mjs +211 -20
  32. package/package.json +1 -1
package/dist/852~0.mjs CHANGED
@@ -214,6 +214,7 @@ const CODES = {
214
214
  E_LOCALES_LAYOUT: 'E_LOCALES_LAYOUT',
215
215
  E_WAR_INVALID: 'E_WAR_INVALID',
216
216
  E_DEV_SESSION_DIST_SHARED: 'E_DEV_SESSION_DIST_SHARED',
217
+ E_PROD_LOOPBACK_ORIGIN: 'E_PROD_LOOPBACK_ORIGIN',
217
218
  E_BACKGROUND_REQUIRED: 'E_BACKGROUND_REQUIRED',
218
219
  E_CONTENT_SCRIPT_SYNTAX: 'E_CONTENT_SCRIPT_SYNTAX',
219
220
  E_NO_ENTRYPOINTS: 'E_NO_ENTRYPOINTS',
@@ -168,11 +168,15 @@
168
168
  "area": "compile",
169
169
  "summary": "web_accessible_resources shape or match pattern rejected."
170
170
  },
171
- "E_DEV_SESSION_DIST_SHARED": {
171
+ "E_PROD_LOOPBACK_ORIGIN": {
172
172
  "area": "compile",
173
- "summary": "A build writes the dist folder a running dev session serves.",
173
+ "summary": "A production manifest names a loopback origin (localhost, 127.0.0.0/8, [::1] or 0.0.0.0), which store reviewers read as unexplained host access.",
174
174
  "warn": true
175
175
  },
176
+ "E_DEV_SESSION_DIST_SHARED": {
177
+ "area": "compile",
178
+ "summary": "A build would write the dist folder a running dev session serves, so it was refused; pass --out-dir to build beside it."
179
+ },
176
180
  "E_BACKGROUND_REQUIRED": {
177
181
  "area": "compile",
178
182
  "summary": "The reload runtime needs a background chunk that is absent."
@@ -1,4 +1,4 @@
1
1
  {
2
- "pipeline": "115c10317681998c74e9103e8f7497a421a3368514fca278595639a322666789",
3
- "builtAt": "2026-10-22T18:54:49.935Z"
2
+ "pipeline": "00140bc4093a876ea444ba50a57695c4e6793fd361c02a74a653e959d9564187",
3
+ "builtAt": "2026-10-27T20:15:53.823Z"
4
4
  }
@@ -1,4 +1,4 @@
1
- (()=>{"use strict";let t=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function e(e,r){if("firefox"===r)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let o="edge"===r?"edge":"chrome";return e.startsWith(`${o}://newtab`)||e.startsWith(`${o}://welcome`)||t.some(t=>t.test(e))}async function r(){try{if(!chrome.management.getAll)return[];return(await new Promise(t=>{chrome.management.getAll(t)})||[]).filter(t=>{let e;return t.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==t.id&&"development"===t.installType&&"theme"!==t.type&&!0===t.enabled&&!((e=String(t.name||"").toLowerCase()).includes("extension.js built-in developer tools")||e.includes("extension.js theme"))})}catch{return[]}}async function o(){let t=await r();return t[t.length-1]}function a(t,e){let r="chrome://extensions/";chrome.tabs.query({url:r},e=>{e.length>0||chrome.tabs.create({url:r,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function n(t){let r,a="chrome://extensions/",n="number"==typeof t?.id?t.id:void 0;r=await o();let i=String("chrome").toLowerCase(),s=r?.id||`__first_run__:${i}`;chrome.storage.local.get(s,async t=>{let r,o=t?.[s];if(o?.didRun)return;let i=t=>new Promise(e=>{try{let r=chrome.tabs.create(t,t=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),e(void 0);return}e(t)});r&&"function"==typeof r.then&&r.then(e,()=>e(void 0))}catch(t){console.error("Error creating tab:",t),e(void 0)}});try{let t=chrome.runtime.getURL("pages/welcome.html");1;if(r=await i({url:t,active:!0}),"number"==typeof n)try{let t,r;t=0,r=(o,i,s)=>{let c=function(t){if(t.updatedTabId!==t.tabId||"complete"!==t.status)return"wait";let r=String(t.url||"");return r.startsWith(t.targetUrl)?"wait":!e(r,t.browser)||t.attempts>=3?"stop":"repoint"}({tabId:n,updatedTabId:o,status:i.status,url:s.url,targetUrl:a,attempts:t,browser:"chrome"});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(r);t+=1,chrome.tabs.update(n,{url:a})}},chrome.tabs.onUpdated.addListener(r),setTimeout(()=>chrome.tabs.onUpdated.removeListener(r),1e4),chrome.tabs.update(n,{url:a})}catch{console.error("Error updating original active tab")}}catch{r=await i({url:"pages/welcome.html",active:!0})}r&&chrome.storage.local.set({[s]:{didRun:!0}})})}function i(t){return{noOpen:!0===(t&&"object"==typeof t?t:{}).noOpen}}async function s(){try{let t=await fetch("/extension-js-session.json");if(!t.ok)return i(void 0);return i(await t.json())}catch{return i(void 0)}}async function c(){if(!(await s()).noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async t=>{let r=Array.isArray(t)?t[0]:void 0,o="chrome://extensions/";if(console.log(`%c
1
+ (()=>{"use strict";function e(){return"chrome"}function t(e){let t=e&&"object"==typeof e?e:{};return{noOpen:!0===t.noOpen,startingUrl:!0===t.startingUrl}}async function r(){try{let e=await fetch("/extension-js-session.json");if(!e.ok)return t(void 0);return t(await e.json())}catch{return t(void 0)}}let a=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function o(e,t){if("firefox"===t)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let r="edge"===t?"edge":"chrome";return e.startsWith(`${r}://newtab`)||e.startsWith(`${r}://welcome`)||a.some(t=>t.test(e))}async function n(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await n();return e[e.length-1]}function s(t,r){let a=e(),o="firefox"===a,n=o?"about:addons":`${o?"about":"edge"===a?"edge":"chrome"}://extensions/`;chrome.tabs.query({url:n},e=>{let r=e.length>0;r||chrome.tabs.create({url:n,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function c(t,r={}){let a=e(),n="firefox"===a,s=n?"about:addons":`${n?"about":"edge"===a?"edge":"chrome"}://extensions/`,u="number"==typeof t?.id?t.id:void 0,l;l=await i();let d=String(a||"chromium").toLowerCase(),h=l?.id||`__first_run__:${d}`;chrome.storage.local.get(h,async e=>{let t=e?.[h];if(t?.didRun)return;let i=e=>new Promise(t=>{try{let r=chrome.tabs.create(e,e=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),t(void 0);return}t(e)});r&&"function"==typeof r.then&&r.then(t,()=>t(void 0))}catch(e){console.error("Error creating tab:",e),t(void 0)}}),c;try{let e=chrome.runtime.getURL("pages/welcome.html");if(n){c=await i({url:e,active:!r.welcomeBehind});try{chrome.tabs.query({url:"about:addons"},e=>{Array.isArray(e)&&0!==e.length||i({url:"about:addons",active:!1})})}catch{console.error("Error querying addons tab")}}else if(c=await i({url:e,active:!0}),"number"==typeof u)try{let e,t;e=0,t=(r,n,i)=>{let c=function(e){if(e.updatedTabId!==e.tabId||"complete"!==e.status)return"wait";let t=String(e.url||"");return t.startsWith(e.targetUrl)?"wait":!o(t,e.browser)||e.attempts>=3?"stop":"repoint"}({tabId:u,updatedTabId:r,status:n.status,url:i.url,targetUrl:s,attempts:e,browser:a});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(t);e+=1,chrome.tabs.update(u,{url:s})}},chrome.tabs.onUpdated.addListener(t),setTimeout(()=>chrome.tabs.onUpdated.removeListener(t),1e4),chrome.tabs.update(u,{url:s})}catch{console.error("Error updating original active tab")}}catch{c=await i({url:"pages/welcome.html",active:!0})}c&&chrome.storage.local.set({[h]:{didRun:!0}})})}async function u(){let t=await r();if(!t.noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async r=>{let a=Array.isArray(r)?r[0]:void 0,n=e(),i="firefox"===n,u="edge"===n,l=i?"about:addons":`${i?"about":u?"edge":"chrome"}://extensions/`;if(console.log(`%c
2
2
  ██████████████████████████████████████████████████████████
3
3
  ██████████████████████████████████████████████████████████
4
4
  ████████████████████████████ ██████████████████████████
@@ -23,4 +23,4 @@
23
23
  ██████████████████████████████████████████████████████████
24
24
  ██████████████████████████████████████████████████████████
25
25
  MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js authors.
26
- `,"background: transparent; color: #0971fe; "),!r){try{await n()}catch{try{chrome.tabs.create({url:o})}catch{}}return}let i=String(r.url||r.pendingUrl||""),s=e(i,"chrome");0;s?await n(r):a(r,o)})}catch{}}async function u(t){if(t.startsWith("data:"))return t;let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch icon: ${e.status}`);let r=await e.blob();return await new Promise((t,e)=>{let o=new FileReader;o.onload=()=>t(String(o.result||"")),o.onerror=()=>e(Error("Failed to read icon blob")),o.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((t,e,r)=>{if((!e?.id||e.id===chrome.runtime.id)&&t&&"resolve-icon-url"===t.type)return t.url&&function(t){if(t.startsWith("data:"))return!0;try{let e=new URL(t);return"moz-extension:"===e.protocol||"chrome-extension:"===e.protocol}catch{return!1}}(t.url)?(u(t.url).then(t=>r({ok:!0,dataUrl:t})).catch(t=>r({ok:!1,error:String(t)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await c()}),chrome.runtime.onInstalled.addListener(async()=>{await c()})})();
26
+ `,"background: transparent; color: #0971fe; "),!a){try{await c(void 0,{welcomeBehind:t.startingUrl})}catch{try{chrome.tabs.create({url:l})}catch{}}return}let d=String(a.url||a.pendingUrl||""),h=o(d,n);if(i){await c(void 0,{welcomeBehind:t.startingUrl}),h||s(a,l);return}h?await c(a):s(a,l)})}catch{}}async function l(e){if(e.startsWith("data:"))return e;let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch icon: ${t.status}`);let r=await t.blob();return await new Promise((e,t)=>{let a=new FileReader;a.onload=()=>e(String(a.result||"")),a.onerror=()=>t(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e&&"resolve-icon-url"===e.type)return e.url&&function(e){if(e.startsWith("data:"))return!0;try{let t=new URL(e);return"moz-extension:"===t.protocol||"chrome-extension:"===t.protocol}catch{return!1}}(e.url)?(l(e.url).then(e=>r({ok:!0,dataUrl:e})).catch(e=>r({ok:!1,error:String(e)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await u()}),chrome.runtime.onInstalled.addListener(async()=>{await u()})})();
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";let e,t,n,r,i,o,a,s,l,c,m,d,u,p;var f={};function h(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return __webpack_modules__[e](n,n.exports,h),n.exports}h.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),t=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),n=e?globalThis.browser:t?globalThis.chrome:{runtime:{getURL:e=>e}},r="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!r&&"object"==typeof document&&document&&document.documentElement)try{r=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){r=""}var i="";if("function"!=typeof importScripts&&(e||t))try{i=n.runtime.getURL("/")}catch(e){i=""}h.p="function"==typeof importScripts?"/":i||(r?r.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let g=h.p+"assets/logo.1e52979e.png";async function x(){try{if(!chrome.management.getAll)return[];return(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))})}catch{return[]}}async function b(){let e=await x();return e[e.length-1]}!function(e,t=document.documentElement){"dark"===(e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}())?t.classList.add("dark"):t.classList.remove("dark")}("dark");let y="firefox"===String("chrome").toLowerCase(),v="My Extension",w="Extension.js makes cross‑browser extension development simple.";function _(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function E(e){let t=_("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function j(){let e=await b();if(e)return e;let t=(await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}})||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),n=t.length?t[t.length-1]:void 0;if(n)return n;let r=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:r?.name||"Extension",shortName:r?.short_name,description:r?.description||"",version:r?.version||"",enabled:!0,installType:"development"}}let T=document.getElementById("root");T&&(e=_("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),t=_("header","mb-4 flex w-full items-center justify-center"),(n=_("img","size-16 select-none object-contain")).alt="User extension icon",n.src=g,r=!1,n.addEventListener("error",()=>{r||(r=!0,n.src=g)}),t.append(n),i=_("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),o=_("span",void 0,v),(a=_("span","neon-text","loaded successfully")).id="extensionName",a.style.color="var(--brand-success, #19f5a7)",i.append(o,_("br"),a),s=_("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",w),e.append(t,i,s,(l=_("div","mt-6 flex w-full items-center justify-center"),c=_("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),m=_("div","flex flex-wrap items-center gap-3"),(d=E("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(u=_("img","size-4 select-none")).alt="Extension.js logo",u.src=g,d.append(u,_("span","sr-only","extension.js")),(p=E("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",m.append(d,p),c.append(m),l.append(c),l)),T.replaceChildren(e),j().then(async e=>{o.textContent=e.name||v,a.title=`• Name: ${e.name}
1
+ (()=>{"use strict";var e={};function t(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return __webpack_modules__[n](i,i.exports,t),i.exports}t.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),n=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),r=e?globalThis.browser:n?globalThis.chrome:{runtime:{getURL:e=>e}},i="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!i&&"object"==typeof document&&document&&document.documentElement)try{i=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){i=""}var o="";if("function"!=typeof importScripts&&(e||n))try{o=r.runtime.getURL("/")}catch(e){o=""}t.p="function"==typeof importScripts?"/":o||(i?i.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let n=t.p+"assets/logo.1e52979e.png";async function r(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await r();return e[e.length-1]}!function(e,t=document.documentElement){let n=e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}();"dark"===n?t.classList.add("dark"):t.classList.remove("dark")}("dark");let o="firefox"===String("chrome").toLowerCase(),a="My Extension",s="Extension.js makes cross‑browser extension development simple.";function l(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function c(e){let t=l("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function m(){let e=await i();if(e)return e;let t=await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}}),n=(t||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),r=n.length?n[n.length-1]:void 0;if(r)return r;let o=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:o?.name||"Extension",shortName:o?.short_name,description:o?.description||"",version:o?.version||"",enabled:!0,installType:"development"}}let d=document.getElementById("root"),u,p,f,h,g,x,b,y,v,w,_,E,j,T;d&&(u=l("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),p=l("header","mb-4 flex w-full items-center justify-center"),(f=l("img","size-16 select-none object-contain")).alt="User extension icon",f.src=n,h=!1,f.addEventListener("error",()=>{h||(h=!0,f.src=n)}),p.append(f),g=l("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),x=l("span",void 0,a),(b=l("span","neon-text","loaded successfully")).id="extensionName",b.style.color="var(--brand-success, #19f5a7)",g.append(x,l("br"),b),y=l("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",s),u.append(p,g,y,(v=l("div","mt-6 flex w-full items-center justify-center"),w=l("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),_=l("div","flex flex-wrap items-center gap-3"),(E=c("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(j=l("img","size-4 select-none")).alt="Extension.js logo",j.src=n,E.append(j,l("span","sr-only","extension.js")),(T=c("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",_.append(E,T),w.append(_),v.append(w),v)),d.replaceChildren(u),m().then(async e=>{x.textContent=e.name||a,b.title=`• Name: ${e.name}
2
2
  • ID: ${e.id}
3
- • Version: ${e.version}`,s.textContent=e.description||w,n.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(y&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!r&&(n.src=e);return}r||(n.src=t)}}).catch(()=>{}))})();
3
+ • Version: ${e.version}`,y.textContent=e.description||s,f.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(o&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!h&&(f.src=e);return}h||(f.src=t)}}).catch(()=>{}))})();
@@ -1,4 +1,4 @@
1
- (()=>{"use strict";let t=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function e(e,r){if("firefox"===r)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let o="edge"===r?"edge":"chrome";return e.startsWith(`${o}://newtab`)||e.startsWith(`${o}://welcome`)||t.some(t=>t.test(e))}async function r(){try{if(!chrome.management.getAll)return[];return(await new Promise(t=>{chrome.management.getAll(t)})||[]).filter(t=>{let e;return t.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==t.id&&"development"===t.installType&&"theme"!==t.type&&!0===t.enabled&&!((e=String(t.name||"").toLowerCase()).includes("extension.js built-in developer tools")||e.includes("extension.js theme"))})}catch{return[]}}async function o(){let t=await r();return t[t.length-1]}function a(t,e){let r="chrome://extensions/";chrome.tabs.query({url:r},e=>{e.length>0||chrome.tabs.create({url:r,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function n(t){let r,a="chrome://extensions/",n="number"==typeof t?.id?t.id:void 0;r=await o();let i=String("chromium").toLowerCase(),s=r?.id||`__first_run__:${i}`;chrome.storage.local.get(s,async t=>{let r,o=t?.[s];if(o?.didRun)return;let i=t=>new Promise(e=>{try{let r=chrome.tabs.create(t,t=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),e(void 0);return}e(t)});r&&"function"==typeof r.then&&r.then(e,()=>e(void 0))}catch(t){console.error("Error creating tab:",t),e(void 0)}});try{let t=chrome.runtime.getURL("pages/welcome.html");1;if(r=await i({url:t,active:!0}),"number"==typeof n)try{let t,r;t=0,r=(o,i,s)=>{let c=function(t){if(t.updatedTabId!==t.tabId||"complete"!==t.status)return"wait";let r=String(t.url||"");return r.startsWith(t.targetUrl)?"wait":!e(r,t.browser)||t.attempts>=3?"stop":"repoint"}({tabId:n,updatedTabId:o,status:i.status,url:s.url,targetUrl:a,attempts:t,browser:"chromium"});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(r);t+=1,chrome.tabs.update(n,{url:a})}},chrome.tabs.onUpdated.addListener(r),setTimeout(()=>chrome.tabs.onUpdated.removeListener(r),1e4),chrome.tabs.update(n,{url:a})}catch{console.error("Error updating original active tab")}}catch{r=await i({url:"pages/welcome.html",active:!0})}r&&chrome.storage.local.set({[s]:{didRun:!0}})})}function i(t){return{noOpen:!0===(t&&"object"==typeof t?t:{}).noOpen}}async function s(){try{let t=await fetch("/extension-js-session.json");if(!t.ok)return i(void 0);return i(await t.json())}catch{return i(void 0)}}async function c(){if(!(await s()).noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async t=>{let r=Array.isArray(t)?t[0]:void 0,o="chrome://extensions/";if(console.log(`%c
1
+ (()=>{"use strict";function e(){return"chromium"}function t(e){let t=e&&"object"==typeof e?e:{};return{noOpen:!0===t.noOpen,startingUrl:!0===t.startingUrl}}async function r(){try{let e=await fetch("/extension-js-session.json");if(!e.ok)return t(void 0);return t(await e.json())}catch{return t(void 0)}}let a=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function o(e,t){if("firefox"===t)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let r="edge"===t?"edge":"chrome";return e.startsWith(`${r}://newtab`)||e.startsWith(`${r}://welcome`)||a.some(t=>t.test(e))}async function n(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await n();return e[e.length-1]}function s(t,r){let a=e(),o="firefox"===a,n=o?"about:addons":`${o?"about":"edge"===a?"edge":"chrome"}://extensions/`;chrome.tabs.query({url:n},e=>{let r=e.length>0;r||chrome.tabs.create({url:n,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function c(t,r={}){let a=e(),n="firefox"===a,s=n?"about:addons":`${n?"about":"edge"===a?"edge":"chrome"}://extensions/`,u="number"==typeof t?.id?t.id:void 0,l;l=await i();let d=String(a||"chromium").toLowerCase(),m=l?.id||`__first_run__:${d}`;chrome.storage.local.get(m,async e=>{let t=e?.[m];if(t?.didRun)return;let i=e=>new Promise(t=>{try{let r=chrome.tabs.create(e,e=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),t(void 0);return}t(e)});r&&"function"==typeof r.then&&r.then(t,()=>t(void 0))}catch(e){console.error("Error creating tab:",e),t(void 0)}}),c;try{let e=chrome.runtime.getURL("pages/welcome.html");if(n){c=await i({url:e,active:!r.welcomeBehind});try{chrome.tabs.query({url:"about:addons"},e=>{Array.isArray(e)&&0!==e.length||i({url:"about:addons",active:!1})})}catch{console.error("Error querying addons tab")}}else if(c=await i({url:e,active:!0}),"number"==typeof u)try{let e,t;e=0,t=(r,n,i)=>{let c=function(e){if(e.updatedTabId!==e.tabId||"complete"!==e.status)return"wait";let t=String(e.url||"");return t.startsWith(e.targetUrl)?"wait":!o(t,e.browser)||e.attempts>=3?"stop":"repoint"}({tabId:u,updatedTabId:r,status:n.status,url:i.url,targetUrl:s,attempts:e,browser:a});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(t);e+=1,chrome.tabs.update(u,{url:s})}},chrome.tabs.onUpdated.addListener(t),setTimeout(()=>chrome.tabs.onUpdated.removeListener(t),1e4),chrome.tabs.update(u,{url:s})}catch{console.error("Error updating original active tab")}}catch{c=await i({url:"pages/welcome.html",active:!0})}c&&chrome.storage.local.set({[m]:{didRun:!0}})})}async function u(){let t=await r();if(!t.noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async r=>{let a=Array.isArray(r)?r[0]:void 0,n=e(),i="firefox"===n,u="edge"===n,l=i?"about:addons":`${i?"about":u?"edge":"chrome"}://extensions/`;if(console.log(`%c
2
2
  ██████████████████████████████████████████████████████████
3
3
  ██████████████████████████████████████████████████████████
4
4
  ████████████████████████████ ██████████████████████████
@@ -23,4 +23,4 @@
23
23
  ██████████████████████████████████████████████████████████
24
24
  ██████████████████████████████████████████████████████████
25
25
  MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js authors.
26
- `,"background: transparent; color: #0971fe; "),!r){try{await n()}catch{try{chrome.tabs.create({url:o})}catch{}}return}let i=String(r.url||r.pendingUrl||""),s=e(i,"chromium");0;s?await n(r):a(r,o)})}catch{}}async function u(t){if(t.startsWith("data:"))return t;let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch icon: ${e.status}`);let r=await e.blob();return await new Promise((t,e)=>{let o=new FileReader;o.onload=()=>t(String(o.result||"")),o.onerror=()=>e(Error("Failed to read icon blob")),o.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((t,e,r)=>{if((!e?.id||e.id===chrome.runtime.id)&&t&&"resolve-icon-url"===t.type)return t.url&&function(t){if(t.startsWith("data:"))return!0;try{let e=new URL(t);return"moz-extension:"===e.protocol||"chrome-extension:"===e.protocol}catch{return!1}}(t.url)?(u(t.url).then(t=>r({ok:!0,dataUrl:t})).catch(t=>r({ok:!1,error:String(t)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await c()}),chrome.runtime.onInstalled.addListener(async()=>{await c()})})();
26
+ `,"background: transparent; color: #0971fe; "),!a){try{await c(void 0,{welcomeBehind:t.startingUrl})}catch{try{chrome.tabs.create({url:l})}catch{}}return}let d=String(a.url||a.pendingUrl||""),m=o(d,n);if(i){await c(void 0,{welcomeBehind:t.startingUrl}),m||s(a,l);return}m?await c(a):s(a,l)})}catch{}}async function l(e){if(e.startsWith("data:"))return e;let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch icon: ${t.status}`);let r=await t.blob();return await new Promise((e,t)=>{let a=new FileReader;a.onload=()=>e(String(a.result||"")),a.onerror=()=>t(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e&&"resolve-icon-url"===e.type)return e.url&&function(e){if(e.startsWith("data:"))return!0;try{let t=new URL(e);return"moz-extension:"===t.protocol||"chrome-extension:"===t.protocol}catch{return!1}}(e.url)?(l(e.url).then(e=>r({ok:!0,dataUrl:e})).catch(e=>r({ok:!1,error:String(e)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await u()}),chrome.runtime.onInstalled.addListener(async()=>{await u()})})();
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";let e,t,n,r,i,o,a,s,l,c,m,d,u,p;var f={};function h(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return __webpack_modules__[e](n,n.exports,h),n.exports}h.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),t=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),n=e?globalThis.browser:t?globalThis.chrome:{runtime:{getURL:e=>e}},r="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!r&&"object"==typeof document&&document&&document.documentElement)try{r=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){r=""}var i="";if("function"!=typeof importScripts&&(e||t))try{i=n.runtime.getURL("/")}catch(e){i=""}h.p="function"==typeof importScripts?"/":i||(r?r.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let g=h.p+"assets/logo.1e52979e.png";async function x(){try{if(!chrome.management.getAll)return[];return(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))})}catch{return[]}}async function b(){let e=await x();return e[e.length-1]}!function(e,t=document.documentElement){"dark"===(e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}())?t.classList.add("dark"):t.classList.remove("dark")}("dark");let y="firefox"===String("chromium").toLowerCase(),v="My Extension",w="Extension.js makes cross‑browser extension development simple.";function _(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function E(e){let t=_("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function j(){let e=await b();if(e)return e;let t=(await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}})||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),n=t.length?t[t.length-1]:void 0;if(n)return n;let r=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:r?.name||"Extension",shortName:r?.short_name,description:r?.description||"",version:r?.version||"",enabled:!0,installType:"development"}}let T=document.getElementById("root");T&&(e=_("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),t=_("header","mb-4 flex w-full items-center justify-center"),(n=_("img","size-16 select-none object-contain")).alt="User extension icon",n.src=g,r=!1,n.addEventListener("error",()=>{r||(r=!0,n.src=g)}),t.append(n),i=_("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),o=_("span",void 0,v),(a=_("span","neon-text","loaded successfully")).id="extensionName",a.style.color="var(--brand-success, #19f5a7)",i.append(o,_("br"),a),s=_("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",w),e.append(t,i,s,(l=_("div","mt-6 flex w-full items-center justify-center"),c=_("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),m=_("div","flex flex-wrap items-center gap-3"),(d=E("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(u=_("img","size-4 select-none")).alt="Extension.js logo",u.src=g,d.append(u,_("span","sr-only","extension.js")),(p=E("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",m.append(d,p),c.append(m),l.append(c),l)),T.replaceChildren(e),j().then(async e=>{o.textContent=e.name||v,a.title=`• Name: ${e.name}
1
+ (()=>{"use strict";var e={};function t(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return __webpack_modules__[n](i,i.exports,t),i.exports}t.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),n=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),r=e?globalThis.browser:n?globalThis.chrome:{runtime:{getURL:e=>e}},i="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!i&&"object"==typeof document&&document&&document.documentElement)try{i=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){i=""}var o="";if("function"!=typeof importScripts&&(e||n))try{o=r.runtime.getURL("/")}catch(e){o=""}t.p="function"==typeof importScripts?"/":o||(i?i.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let n=t.p+"assets/logo.1e52979e.png";async function r(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await r();return e[e.length-1]}!function(e,t=document.documentElement){let n=e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}();"dark"===n?t.classList.add("dark"):t.classList.remove("dark")}("dark");let o="firefox"===String("chromium").toLowerCase(),a="My Extension",s="Extension.js makes cross‑browser extension development simple.";function l(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function c(e){let t=l("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function m(){let e=await i();if(e)return e;let t=await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}}),n=(t||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),r=n.length?n[n.length-1]:void 0;if(r)return r;let o=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:o?.name||"Extension",shortName:o?.short_name,description:o?.description||"",version:o?.version||"",enabled:!0,installType:"development"}}let d=document.getElementById("root"),u,p,f,h,g,x,b,y,v,w,_,E,j,T;d&&(u=l("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),p=l("header","mb-4 flex w-full items-center justify-center"),(f=l("img","size-16 select-none object-contain")).alt="User extension icon",f.src=n,h=!1,f.addEventListener("error",()=>{h||(h=!0,f.src=n)}),p.append(f),g=l("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),x=l("span",void 0,a),(b=l("span","neon-text","loaded successfully")).id="extensionName",b.style.color="var(--brand-success, #19f5a7)",g.append(x,l("br"),b),y=l("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",s),u.append(p,g,y,(v=l("div","mt-6 flex w-full items-center justify-center"),w=l("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),_=l("div","flex flex-wrap items-center gap-3"),(E=c("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(j=l("img","size-4 select-none")).alt="Extension.js logo",j.src=n,E.append(j,l("span","sr-only","extension.js")),(T=c("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",_.append(E,T),w.append(_),v.append(w),v)),d.replaceChildren(u),m().then(async e=>{x.textContent=e.name||a,b.title=`• Name: ${e.name}
2
2
  • ID: ${e.id}
3
- • Version: ${e.version}`,s.textContent=e.description||w,n.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(y&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!r&&(n.src=e);return}r||(n.src=t)}}).catch(()=>{}))})();
3
+ • Version: ${e.version}`,y.textContent=e.description||s,f.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(o&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!h&&(f.src=e);return}h||(f.src=t)}}).catch(()=>{}))})();
@@ -1,4 +1,4 @@
1
- (()=>{"use strict";let e=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function t(t,r){if("firefox"===r)return t.startsWith("about:home")||t.startsWith("about:welcome")||t.startsWith("about:newtab")||"about:blank"===t;let a="edge"===r?"edge":"chrome";return t.startsWith(`${a}://newtab`)||t.startsWith(`${a}://welcome`)||e.some(e=>e.test(t))}async function r(){try{if(!chrome.management.getAll)return[];return(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))})}catch{return[]}}async function a(){let e=await r();return e[e.length-1]}function n(e,t){let r="edge://extensions/";chrome.tabs.query({url:r},t=>{t.length>0||chrome.tabs.create({url:r,active:!1},function(t){chrome.tabs.move(t.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(e.id,{active:!0})},500)})})})}async function o(e){let r,n="edge://extensions/",o="number"==typeof e?.id?e.id:void 0;r=await a();let i=String("edge").toLowerCase(),s=r?.id||`__first_run__:${i}`;chrome.storage.local.get(s,async e=>{let r,a=e?.[s];if(a?.didRun)return;let i=e=>new Promise(t=>{try{let r=chrome.tabs.create(e,e=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),t(void 0);return}t(e)});r&&"function"==typeof r.then&&r.then(t,()=>t(void 0))}catch(e){console.error("Error creating tab:",e),t(void 0)}});try{let e=chrome.runtime.getURL("pages/welcome.html");1;if(r=await i({url:e,active:!0}),"number"==typeof o)try{let e,r;e=0,r=(a,i,s)=>{let c=function(e){if(e.updatedTabId!==e.tabId||"complete"!==e.status)return"wait";let r=String(e.url||"");return r.startsWith(e.targetUrl)?"wait":!t(r,e.browser)||e.attempts>=3?"stop":"repoint"}({tabId:o,updatedTabId:a,status:i.status,url:s.url,targetUrl:n,attempts:e,browser:"edge"});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(r);e+=1,chrome.tabs.update(o,{url:n})}},chrome.tabs.onUpdated.addListener(r),setTimeout(()=>chrome.tabs.onUpdated.removeListener(r),1e4),chrome.tabs.update(o,{url:n})}catch{console.error("Error updating original active tab")}}catch{r=await i({url:"pages/welcome.html",active:!0})}r&&chrome.storage.local.set({[s]:{didRun:!0}})})}function i(e){return{noOpen:!0===(e&&"object"==typeof e?e:{}).noOpen}}async function s(){try{let e=await fetch("/extension-js-session.json");if(!e.ok)return i(void 0);return i(await e.json())}catch{return i(void 0)}}async function c(){if(!(await s()).noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async e=>{let r=Array.isArray(e)?e[0]:void 0,a="edge://extensions/";if(console.log(`%c
1
+ (()=>{"use strict";function t(t){let e=t&&"object"==typeof t?t:{};return{noOpen:!0===e.noOpen,startingUrl:!0===e.startingUrl}}async function e(){try{let e=await fetch("/extension-js-session.json");if(!e.ok)return t(void 0);return t(await e.json())}catch{return t(void 0)}}let r=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function a(t,e){if("firefox"===e)return t.startsWith("about:home")||t.startsWith("about:welcome")||t.startsWith("about:newtab")||"about:blank"===t;let a="edge"===e?"edge":"chrome";return t.startsWith(`${a}://newtab`)||t.startsWith(`${a}://welcome`)||r.some(e=>e.test(t))}async function n(){try{if(!chrome.management.getAll)return[];let t=await new Promise(t=>{chrome.management.getAll(t)}),e=(t||[]).filter(t=>{let e;return t.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==t.id&&"development"===t.installType&&"theme"!==t.type&&!0===t.enabled&&!((e=String(t.name||"").toLowerCase()).includes("extension.js built-in developer tools")||e.includes("extension.js theme"))});return e}catch{return[]}}async function o(){let t=await n();return t[t.length-1]}function i(t,e){let r="edge://extensions/";chrome.tabs.query({url:r},e=>{let a=e.length>0;a||chrome.tabs.create({url:r,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function s(t,e={}){let r="edge",n="edge://extensions/",i="number"==typeof t?.id?t.id:void 0,c;c=await o();let l=String(r||"chromium").toLowerCase(),u=c?.id||`__first_run__:${l}`;chrome.storage.local.get(u,async t=>{let e=t?.[u];if(e?.didRun)return;let o=t=>new Promise(e=>{try{let r=chrome.tabs.create(t,t=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),e(void 0);return}e(t)});r&&"function"==typeof r.then&&r.then(e,()=>e(void 0))}catch(t){console.error("Error creating tab:",t),e(void 0)}}),s;try{let t=chrome.runtime.getURL("pages/welcome.html");1;if(s=await o({url:t,active:!0}),"number"==typeof i)try{let t,e;t=0,e=(o,s,c)=>{let l=function(t){if(t.updatedTabId!==t.tabId||"complete"!==t.status)return"wait";let e=String(t.url||"");return e.startsWith(t.targetUrl)?"wait":!a(e,t.browser)||t.attempts>=3?"stop":"repoint"}({tabId:i,updatedTabId:o,status:s.status,url:c.url,targetUrl:n,attempts:t,browser:r});if("wait"!==l){if("stop"===l)return void chrome.tabs.onUpdated.removeListener(e);t+=1,chrome.tabs.update(i,{url:n})}},chrome.tabs.onUpdated.addListener(e),setTimeout(()=>chrome.tabs.onUpdated.removeListener(e),1e4),chrome.tabs.update(i,{url:n})}catch{console.error("Error updating original active tab")}}catch{s=await o({url:"pages/welcome.html",active:!0})}s&&chrome.storage.local.set({[u]:{didRun:!0}})})}async function c(){let t=await e();if(!t.noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async e=>{let r=Array.isArray(e)?e[0]:void 0,n="edge://extensions/";if(console.log(`%c
2
2
  ██████████████████████████████████████████████████████████
3
3
  ██████████████████████████████████████████████████████████
4
4
  ████████████████████████████ ██████████████████████████
@@ -23,4 +23,4 @@
23
23
  ██████████████████████████████████████████████████████████
24
24
  ██████████████████████████████████████████████████████████
25
25
  MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js authors.
26
- `,"background: transparent; color: #0971fe; "),!r){try{await o()}catch{try{chrome.tabs.create({url:a})}catch{}}return}let i=String(r.url||r.pendingUrl||""),s=t(i,"edge");0;s?await o(r):n(r,a)})}catch{}}async function u(e){if(e.startsWith("data:"))return e;let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch icon: ${t.status}`);let r=await t.blob();return await new Promise((e,t)=>{let a=new FileReader;a.onload=()=>e(String(a.result||"")),a.onerror=()=>t(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e&&"resolve-icon-url"===e.type)return e.url&&function(e){if(e.startsWith("data:"))return!0;try{let t=new URL(e);return"moz-extension:"===t.protocol||"chrome-extension:"===t.protocol}catch{return!1}}(e.url)?(u(e.url).then(e=>r({ok:!0,dataUrl:e})).catch(e=>r({ok:!1,error:String(e)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await c()}),chrome.runtime.onInstalled.addListener(async()=>{await c()})})();
26
+ `,"background: transparent; color: #0971fe; "),!r){try{await s(void 0,{welcomeBehind:t.startingUrl})}catch{try{chrome.tabs.create({url:n})}catch{}}return}let o=String(r.url||r.pendingUrl||""),c=a(o,"edge");0;c?await s(r):i(r,n)})}catch{}}async function l(t){if(t.startsWith("data:"))return t;let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch icon: ${e.status}`);let r=await e.blob();return await new Promise((t,e)=>{let a=new FileReader;a.onload=()=>t(String(a.result||"")),a.onerror=()=>e(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((t,e,r)=>{if((!e?.id||e.id===chrome.runtime.id)&&t&&"resolve-icon-url"===t.type)return t.url&&function(t){if(t.startsWith("data:"))return!0;try{let e=new URL(t);return"moz-extension:"===e.protocol||"chrome-extension:"===e.protocol}catch{return!1}}(t.url)?(l(t.url).then(t=>r({ok:!0,dataUrl:t})).catch(t=>r({ok:!1,error:String(t)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await c()}),chrome.runtime.onInstalled.addListener(async()=>{await c()})})();
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";let e,t,n,r,i,o,a,s,l,c,m,d,u,p;var f={};function g(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return __webpack_modules__[e](n,n.exports,g),n.exports}g.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),t=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),n=e?globalThis.browser:t?globalThis.chrome:{runtime:{getURL:e=>e}},r="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!r&&"object"==typeof document&&document&&document.documentElement)try{r=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){r=""}var i="";if("function"!=typeof importScripts&&(e||t))try{i=n.runtime.getURL("/")}catch(e){i=""}g.p="function"==typeof importScripts?"/":i||(r?r.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let h=g.p+"assets/logo.1e52979e.png";async function x(){try{if(!chrome.management.getAll)return[];return(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))})}catch{return[]}}async function b(){let e=await x();return e[e.length-1]}!function(e,t=document.documentElement){"dark"===(e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}())?t.classList.add("dark"):t.classList.remove("dark")}("dark");let y="firefox"===String("edge").toLowerCase(),v="My Extension",w="Extension.js makes cross‑browser extension development simple.";function _(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function E(e){let t=_("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function j(){let e=await b();if(e)return e;let t=(await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}})||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),n=t.length?t[t.length-1]:void 0;if(n)return n;let r=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:r?.name||"Extension",shortName:r?.short_name,description:r?.description||"",version:r?.version||"",enabled:!0,installType:"development"}}let T=document.getElementById("root");T&&(e=_("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),t=_("header","mb-4 flex w-full items-center justify-center"),(n=_("img","size-16 select-none object-contain")).alt="User extension icon",n.src=h,r=!1,n.addEventListener("error",()=>{r||(r=!0,n.src=h)}),t.append(n),i=_("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),o=_("span",void 0,v),(a=_("span","neon-text","loaded successfully")).id="extensionName",a.style.color="var(--brand-success, #19f5a7)",i.append(o,_("br"),a),s=_("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",w),e.append(t,i,s,(l=_("div","mt-6 flex w-full items-center justify-center"),c=_("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),m=_("div","flex flex-wrap items-center gap-3"),(d=E("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(u=_("img","size-4 select-none")).alt="Extension.js logo",u.src=h,d.append(u,_("span","sr-only","extension.js")),(p=E("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",m.append(d,p),c.append(m),l.append(c),l)),T.replaceChildren(e),j().then(async e=>{o.textContent=e.name||v,a.title=`• Name: ${e.name}
1
+ (()=>{"use strict";var e={};function t(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return __webpack_modules__[n](i,i.exports,t),i.exports}t.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),n=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),r=e?globalThis.browser:n?globalThis.chrome:{runtime:{getURL:e=>e}},i="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!i&&"object"==typeof document&&document&&document.documentElement)try{i=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){i=""}var o="";if("function"!=typeof importScripts&&(e||n))try{o=r.runtime.getURL("/")}catch(e){o=""}t.p="function"==typeof importScripts?"/":o||(i?i.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let n=t.p+"assets/logo.1e52979e.png";async function r(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await r();return e[e.length-1]}!function(e,t=document.documentElement){let n=e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}();"dark"===n?t.classList.add("dark"):t.classList.remove("dark")}("dark");let o="firefox"===String("edge").toLowerCase(),a="My Extension",s="Extension.js makes cross‑browser extension development simple.";function l(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function c(e){let t=l("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function m(){let e=await i();if(e)return e;let t=await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}}),n=(t||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),r=n.length?n[n.length-1]:void 0;if(r)return r;let o=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:o?.name||"Extension",shortName:o?.short_name,description:o?.description||"",version:o?.version||"",enabled:!0,installType:"development"}}let d=document.getElementById("root"),u,p,f,g,h,x,b,y,v,w,_,E,j,T;d&&(u=l("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),p=l("header","mb-4 flex w-full items-center justify-center"),(f=l("img","size-16 select-none object-contain")).alt="User extension icon",f.src=n,g=!1,f.addEventListener("error",()=>{g||(g=!0,f.src=n)}),p.append(f),h=l("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),x=l("span",void 0,a),(b=l("span","neon-text","loaded successfully")).id="extensionName",b.style.color="var(--brand-success, #19f5a7)",h.append(x,l("br"),b),y=l("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",s),u.append(p,h,y,(v=l("div","mt-6 flex w-full items-center justify-center"),w=l("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),_=l("div","flex flex-wrap items-center gap-3"),(E=c("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(j=l("img","size-4 select-none")).alt="Extension.js logo",j.src=n,E.append(j,l("span","sr-only","extension.js")),(T=c("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",_.append(E,T),w.append(_),v.append(w),v)),d.replaceChildren(u),m().then(async e=>{x.textContent=e.name||a,b.title=`• Name: ${e.name}
2
2
  • ID: ${e.id}
3
- • Version: ${e.version}`,s.textContent=e.description||w,n.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(y&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!r&&(n.src=e);return}r||(n.src=t)}}).catch(()=>{}))})();
3
+ • Version: ${e.version}`,y.textContent=e.description||s,f.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(o&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!g&&(f.src=e);return}g||(f.src=t)}}).catch(()=>{}))})();
@@ -1,4 +1,4 @@
1
- (()=>{"use strict";let t=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function e(e,r){if("firefox"===r)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let a="edge"===r?"edge":"chrome";return e.startsWith(`${a}://newtab`)||e.startsWith(`${a}://welcome`)||t.some(t=>t.test(e))}async function r(){try{if(!chrome.management.getAll)return[];return(await new Promise(t=>{chrome.management.getAll(t)})||[]).filter(t=>{let e;return t.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==t.id&&"development"===t.installType&&"theme"!==t.type&&!0===t.enabled&&!((e=String(t.name||"").toLowerCase()).includes("extension.js built-in developer tools")||e.includes("extension.js theme"))})}catch{return[]}}async function a(){let t=await r();return t[t.length-1]}function o(t,e){let r="about:addons";chrome.tabs.query({url:r},e=>{e.length>0||chrome.tabs.create({url:r,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function n(t){let e,r="about:addons",o="number"==typeof t?.id?t.id:void 0;e=await a();let n=String("firefox").toLowerCase(),i=e?.id||`__first_run__:${n}`;chrome.storage.local.get(i,async t=>{let e,r=t?.[i];if(r?.didRun)return;let a=t=>new Promise(e=>{try{let r=chrome.tabs.create(t,t=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),e(void 0);return}e(t)});r&&"function"==typeof r.then&&r.then(e,()=>e(void 0))}catch(t){console.error("Error creating tab:",t),e(void 0)}});try{let t=chrome.runtime.getURL("pages/welcome.html");0;e=await a({url:t,active:!0});try{chrome.tabs.query({url:"about:addons"},t=>{Array.isArray(t)&&0!==t.length||a({url:"about:addons",active:!1})})}catch{console.error("Error querying addons tab")}}catch{e=await a({url:"pages/welcome.html",active:!0})}e&&chrome.storage.local.set({[i]:{didRun:!0}})})}function i(t){return{noOpen:!0===(t&&"object"==typeof t?t:{}).noOpen}}async function c(){try{let t=await fetch("/extension-js-session.json");if(!t.ok)return i(void 0);return i(await t.json())}catch{return i(void 0)}}async function s(){if(!(await c()).noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async t=>{let r=Array.isArray(t)?t[0]:void 0,a="about:addons";if(console.log(`%c
1
+ (()=>{"use strict";function e(){return"firefox"}function t(e){let t=e&&"object"==typeof e?e:{};return{noOpen:!0===t.noOpen,startingUrl:!0===t.startingUrl}}async function r(){try{let e=await fetch("/extension-js-session.json");if(!e.ok)return t(void 0);return t(await e.json())}catch{return t(void 0)}}let a=[/^chrome:\/\/startpage(?:shared)?\/?/,/^https:\/\/(?:[a-z0-9-]+\.)*msn\.com\//i,/^https:\/\/(?:[a-z0-9-]+\.)*(?:ya\.ru|yandex\.[a-z.]+)\//i];function o(e,t){if("firefox"===t)return e.startsWith("about:home")||e.startsWith("about:welcome")||e.startsWith("about:newtab")||"about:blank"===e;let r="edge"===t?"edge":"chrome";return e.startsWith(`${r}://newtab`)||e.startsWith(`${r}://welcome`)||a.some(t=>t.test(e))}async function n(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await n();return e[e.length-1]}function s(t,r){let a=e(),o="firefox"===a,n=o?"about:addons":`${o?"about":"edge"===a?"edge":"chrome"}://extensions/`;chrome.tabs.query({url:n},e=>{let r=e.length>0;r||chrome.tabs.create({url:n,active:!1},function(e){chrome.tabs.move(e.id,{index:0},()=>{setTimeout(()=>{chrome.tabs.update(t.id,{active:!0})},500)})})})}async function c(t,r={}){let a=e(),n="firefox"===a,s=n?"about:addons":`${n?"about":"edge"===a?"edge":"chrome"}://extensions/`,u="number"==typeof t?.id?t.id:void 0,l;l=await i();let d=String(a||"chromium").toLowerCase(),h=l?.id||`__first_run__:${d}`;chrome.storage.local.get(h,async e=>{let t=e?.[h];if(t?.didRun)return;let i=e=>new Promise(t=>{try{let r=chrome.tabs.create(e,e=>{if(chrome.runtime.lastError){console.error("Error creating tab:",chrome.runtime.lastError.message),t(void 0);return}t(e)});r&&"function"==typeof r.then&&r.then(t,()=>t(void 0))}catch(e){console.error("Error creating tab:",e),t(void 0)}}),c;try{let e=chrome.runtime.getURL("pages/welcome.html");if(n){c=await i({url:e,active:!r.welcomeBehind});try{chrome.tabs.query({url:"about:addons"},e=>{Array.isArray(e)&&0!==e.length||i({url:"about:addons",active:!1})})}catch{console.error("Error querying addons tab")}}else if(c=await i({url:e,active:!0}),"number"==typeof u)try{let e,t;e=0,t=(r,n,i)=>{let c=function(e){if(e.updatedTabId!==e.tabId||"complete"!==e.status)return"wait";let t=String(e.url||"");return t.startsWith(e.targetUrl)?"wait":!o(t,e.browser)||e.attempts>=3?"stop":"repoint"}({tabId:u,updatedTabId:r,status:n.status,url:i.url,targetUrl:s,attempts:e,browser:a});if("wait"!==c){if("stop"===c)return void chrome.tabs.onUpdated.removeListener(t);e+=1,chrome.tabs.update(u,{url:s})}},chrome.tabs.onUpdated.addListener(t),setTimeout(()=>chrome.tabs.onUpdated.removeListener(t),1e4),chrome.tabs.update(u,{url:s})}catch{console.error("Error updating original active tab")}}catch{c=await i({url:"pages/welcome.html",active:!0})}c&&chrome.storage.local.set({[h]:{didRun:!0}})})}async function u(){let t=await r();if(!t.noOpen)try{chrome.tabs.query({active:!0,currentWindow:!0},async r=>{let a=Array.isArray(r)?r[0]:void 0,n=e(),i="firefox"===n,u="edge"===n,l=i?"about:addons":`${i?"about":u?"edge":"chrome"}://extensions/`;if(console.log(`%c
2
2
  ██████████████████████████████████████████████████████████
3
3
  ██████████████████████████████████████████████████████████
4
4
  ████████████████████████████ ██████████████████████████
@@ -23,4 +23,4 @@
23
23
  ██████████████████████████████████████████████████████████
24
24
  ██████████████████████████████████████████████████████████
25
25
  MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js authors.
26
- `,"background: transparent; color: #0971fe; "),!r){try{await n()}catch{try{chrome.tabs.create({url:a})}catch{}}return}let i=String(r.url||r.pendingUrl||""),c=e(i,"firefox");1;await n(),c||o(r,a)})}catch{}}async function u(t){if(t.startsWith("data:"))return t;let e=await fetch(t);if(!e.ok)throw Error(`Failed to fetch icon: ${e.status}`);let r=await e.blob();return await new Promise((t,e)=>{let a=new FileReader;a.onload=()=>t(String(a.result||"")),a.onerror=()=>e(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((t,e,r)=>{if((!e?.id||e.id===chrome.runtime.id)&&t&&"resolve-icon-url"===t.type)return t.url&&function(t){if(t.startsWith("data:"))return!0;try{let e=new URL(t);return"moz-extension:"===e.protocol||"chrome-extension:"===e.protocol}catch{return!1}}(t.url)?(u(t.url).then(t=>r({ok:!0,dataUrl:t})).catch(t=>r({ok:!1,error:String(t)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await s()}),chrome.runtime.onInstalled.addListener(async()=>{await s()})})();
26
+ `,"background: transparent; color: #0971fe; "),!a){try{await c(void 0,{welcomeBehind:t.startingUrl})}catch{try{chrome.tabs.create({url:l})}catch{}}return}let d=String(a.url||a.pendingUrl||""),h=o(d,n);if(i){await c(void 0,{welcomeBehind:t.startingUrl}),h||s(a,l);return}h?await c(a):s(a,l)})}catch{}}async function l(e){if(e.startsWith("data:"))return e;let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch icon: ${t.status}`);let r=await t.blob();return await new Promise((e,t)=>{let a=new FileReader;a.onload=()=>e(String(a.result||"")),a.onerror=()=>t(Error("Failed to read icon blob")),a.readAsDataURL(r)})}chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e&&"resolve-icon-url"===e.type)return e.url&&function(e){if(e.startsWith("data:"))return!0;try{let t=new URL(e);return"moz-extension:"===t.protocol||"chrome-extension:"===t.protocol}catch{return!1}}(e.url)?(l(e.url).then(e=>r({ok:!0,dataUrl:e})).catch(e=>r({ok:!1,error:String(e)})),!0):void r({ok:!1,error:"Unsupported icon URL"})}),chrome.runtime.onStartup.addListener(async()=>{await u()}),chrome.runtime.onInstalled.addListener(async()=>{await u()})})();
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";let e,t,n,r,i,o,a,s,l,c,m,d,u,p;var f={};function h(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return __webpack_modules__[e](n,n.exports,h),n.exports}h.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),t=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),n=e?globalThis.browser:t?globalThis.chrome:{runtime:{getURL:e=>e}},r="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!r&&"object"==typeof document&&document&&document.documentElement)try{r=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){r=""}var i="";if("function"!=typeof importScripts&&(e||t))try{i=n.runtime.getURL("/")}catch(e){i=""}h.p="function"==typeof importScripts?"/":i||(r?r.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let g=h.p+"assets/logo.1e52979e.png";async function x(){try{if(!chrome.management.getAll)return[];return(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))})}catch{return[]}}async function b(){let e=await x();return e[e.length-1]}!function(e,t=document.documentElement){"dark"===(e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}())?t.classList.add("dark"):t.classList.remove("dark")}("dark");let y="firefox"===String("firefox").toLowerCase(),v="My Extension",w="Extension.js makes cross‑browser extension development simple.";function _(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function E(e){let t=_("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function j(){let e=await b();if(e)return e;let t=(await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}})||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),n=t.length?t[t.length-1]:void 0;if(n)return n;let r=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:r?.name||"Extension",shortName:r?.short_name,description:r?.description||"",version:r?.version||"",enabled:!0,installType:"development"}}let T=document.getElementById("root");T&&(e=_("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),t=_("header","mb-4 flex w-full items-center justify-center"),(n=_("img","size-16 select-none object-contain")).alt="User extension icon",n.src=g,r=!1,n.addEventListener("error",()=>{r||(r=!0,n.src=g)}),t.append(n),i=_("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),o=_("span",void 0,v),(a=_("span","neon-text","loaded successfully")).id="extensionName",a.style.color="var(--brand-success, #19f5a7)",i.append(o,_("br"),a),s=_("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",w),e.append(t,i,s,(l=_("div","mt-6 flex w-full items-center justify-center"),c=_("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),m=_("div","flex flex-wrap items-center gap-3"),(d=E("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(u=_("img","size-4 select-none")).alt="Extension.js logo",u.src=g,d.append(u,_("span","sr-only","extension.js")),(p=E("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",m.append(d,p),c.append(m),l.append(c),l)),T.replaceChildren(e),j().then(async e=>{o.textContent=e.name||v,a.title=`• Name: ${e.name}
1
+ (()=>{"use strict";var e={};function t(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return __webpack_modules__[n](i,i.exports,t),i.exports}t.p="/",(()=>{var e=!!(()=>{try{return globalThis.browser.runtime.getURL("/")}catch(e){}})(),n=!!(()=>{try{return globalThis.chrome.runtime.getURL("/")}catch(e){}})(),r=e?globalThis.browser:n?globalThis.chrome:{runtime:{getURL:e=>e}},i="object"==typeof globalThis&&globalThis&&globalThis.__EXTJS_EXTENSION_BASE__?String(globalThis.__EXTJS_EXTENSION_BASE__):"";if(!i&&"object"==typeof document&&document&&document.documentElement)try{i=document.documentElement.getAttribute("data-extjs-extension-base")||""}catch(e){i=""}var o="";if("function"!=typeof importScripts&&(e||n))try{o=r.runtime.getURL("/")}catch(e){o=""}t.p="function"==typeof importScripts?"/":o||(i?i.replace(/\/+$/,"/")+String("/").replace(/^\/+/,""):"/")})();let n=t.p+"assets/logo.1e52979e.png";async function r(){try{if(!chrome.management.getAll)return[];let e=await new Promise(e=>{chrome.management.getAll(e)}),t=(e||[]).filter(e=>{let t;return e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!0===e.enabled&&!((t=String(e.name||"").toLowerCase()).includes("extension.js built-in developer tools")||t.includes("extension.js theme"))});return t}catch{return[]}}async function i(){let e=await r();return e[e.length-1]}!function(e,t=document.documentElement){let n=e??function(){let e=function(){try{let e=localStorage.getItem("theme");if("light"===e||"dark"===e)return e}catch{}return null}();if(e)return e;if("u">typeof window&&"matchMedia"in window)try{return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}return"light"}();"dark"===n?t.classList.add("dark"):t.classList.remove("dark")}("dark");let o="firefox"===String("firefox").toLowerCase(),a="My Extension",s="Extension.js makes cross‑browser extension development simple.";function l(e,t,n){let r=document.createElement(e);return t&&(r.className=t),void 0!==n&&(r.textContent=n),r}function c(e){let t=l("a",e);return t.href="https://extension.js.org/",t.target="_blank",t.rel="noopener noreferrer",t}async function m(){let e=await i();if(e)return e;let t=await new Promise(e=>{try{chrome.management.getAll(e)}catch{e([])}}),n=(t||[]).filter(e=>e&&"development"===e.installType&&e.id!==chrome.runtime.id&&e.enabled&&"theme"!==e.type),r=n.length?n[n.length-1]:void 0;if(r)return r;let o=chrome.runtime.getManifest();return{id:chrome.runtime.id,name:o?.name||"Extension",shortName:o?.short_name,description:o?.description||"",version:o?.version||"",enabled:!0,installType:"development"}}let d=document.getElementById("root"),u,p,f,h,g,x,b,y,v,w,_,E,j,T;d&&(u=l("div","relative flex h-screen flex-col items-center justify-center bg-[#1C1C1E]"),p=l("header","mb-4 flex w-full items-center justify-center"),(f=l("img","size-16 select-none object-contain")).alt="User extension icon",f.src=n,h=!1,f.addEventListener("error",()=>{h||(h=!0,f.src=n)}),p.append(f),g=l("h1","text-foreground mx-auto text-center text-3xl font-semibold leading-tight tracking-tight sm:text-4xl"),x=l("span",void 0,a),(b=l("span","neon-text","loaded successfully")).id="extensionName",b.style.color="var(--brand-success, #19f5a7)",g.append(x,l("br"),b),y=l("p","text-muted-foreground mx-auto mt-3 max-w-xl text-center text-base leading-relaxed sm:text-lg",s),u.append(p,g,y,(v=l("div","mt-6 flex w-full items-center justify-center"),w=l("div","relative inline-flex items-center gap-3 rounded-2xl border px-4 py-2 shadow-sm backdrop-blur"),_=l("div","flex flex-wrap items-center gap-3"),(E=c("inline-flex items-center gap-2")).setAttribute("aria-label","Visit extension.js.org"),(j=l("img","size-4 select-none")).alt="Extension.js logo",j.src=n,E.append(j,l("span","sr-only","extension.js")),(T=c("text-muted-foreground text-sm underline underline-offset-4 hover:opacity-90")).textContent="Learn more about developing cross-browser extensions.",_.append(E,T),w.append(_),v.append(w),v)),d.replaceChildren(u),m().then(async e=>{x.textContent=e.name||a,b.title=`• Name: ${e.name}
2
2
  • ID: ${e.id}
3
- • Version: ${e.version}`,s.textContent=e.description||w,n.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(y&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!r&&(n.src=e);return}r||(n.src=t)}}).catch(()=>{}))})();
3
+ • Version: ${e.version}`,y.textContent=e.description||s,f.alt=`${e.name||"User extension"} icon`;let t=function(e){if(e.icons&&e.icons.length)return[...e.icons].sort((e,t)=>(t.size||0)-(e.size||0))[0]?.url}(e);if(t){if(o&&!t.startsWith("data:")){let e=await new Promise(e=>{try{chrome.runtime.sendMessage({type:"resolve-icon-url",url:t},t=>{e(t?.ok&&"string"==typeof t.dataUrl?t.dataUrl:void 0)})}catch{e(void 0)}});e&&!h&&(f.src=e);return}h||(f.src=t)}}).catch(()=>{}))})();
@@ -1,4 +1,4 @@
1
1
  {
2
- "pipeline": "115c10317681998c74e9103e8f7497a421a3368514fca278595639a322666789",
3
- "builtAt": "2026-10-22T18:54:53.688Z"
2
+ "pipeline": "00140bc4093a876ea444ba50a57695c4e6793fd361c02a74a653e959d9564187",
3
+ "builtAt": "2026-10-27T20:15:57.410Z"
4
4
  }
@@ -1,5 +1,5 @@
1
1
  import type { AddonLintSummary } from './build-summary.js';
2
- import type { ChunkProvenance } from './chunk-dependency-provenance.js';
2
+ import { type ChunkProvenance } from './chunk-dependency-provenance.js';
3
3
  export declare const ADDON_LINT_DEFAULT = true;
4
4
  export declare const ADDON_LINT_TIMEOUT_MS = 60000;
5
5
  export declare const ADDON_LINT_MAX_PRINTED = 20;
@@ -39,6 +39,10 @@ export type AddonLintResult = {
39
39
  status: 'linted';
40
40
  findings: number;
41
41
  lines: string[];
42
+ reviewerNote: {
43
+ path: string;
44
+ line: string;
45
+ } | null;
42
46
  };
43
47
  type LinterModule = {
44
48
  createInstance: (options: {
@@ -68,8 +72,8 @@ export declare function shouldRunAddonLint(input: {
68
72
  status: 'skipped';
69
73
  }> | null;
70
74
  export declare function collectAddonLintLines(output: AddonLintOutput | null | undefined): AddonLintLine[];
71
- export declare function attributionFor(location: string, chunkProvenance?: Map<string, ChunkProvenance>): string;
72
- export declare function formatAddonLintFindings(output: AddonLintOutput | null | undefined, distDisplay: string, maxPrinted?: number, chunkProvenance?: Map<string, ChunkProvenance>): {
75
+ export declare function attributionFor(location: string, chunkProvenance?: Map<string, ChunkProvenance>, code?: string, browser?: string): string;
76
+ export declare function formatAddonLintFindings(output: AddonLintOutput | null | undefined, distDisplay: string, maxPrinted?: number, chunkProvenance?: Map<string, ChunkProvenance>, browser?: string): {
73
77
  findings: number;
74
78
  lines: string[];
75
79
  };
@@ -0,0 +1,32 @@
1
+ import type { AddonLintLine } from './addon-lint.js';
2
+ import { type ChunkProvenance } from './chunk-dependency-provenance.js';
3
+ export declare const ADDON_REVIEWER_NOTE_FILE = "amo-reviewer-note.md";
4
+ export declare const AUTHOR_ONLY_CODES: Set<string>;
5
+ export interface PackageFacts {
6
+ version: string | null;
7
+ license: string | null;
8
+ }
9
+ export interface ReviewerNotePackage extends PackageFacts {
10
+ name: string;
11
+ findings: Array<{
12
+ line: AddonLintLine;
13
+ mixed: boolean;
14
+ }>;
15
+ }
16
+ export interface ReviewerNote {
17
+ packages: ReviewerNotePackage[];
18
+ own: AddonLintLine[];
19
+ }
20
+ export declare function lockfilePackageVersion(projectPath: string, name: string): string | null;
21
+ export declare function packageFacts(projectPath: string, name: string): PackageFacts;
22
+ export declare function classifyAddonLintLines(lines: AddonLintLine[], chunkProvenance: Map<string, ChunkProvenance> | undefined, readFacts: (name: string) => PackageFacts): ReviewerNote;
23
+ export declare function renderAddonReviewerNote(note: ReviewerNote, distDisplay: string): string;
24
+ export declare function addonReviewerNotePath(distPath: string): string;
25
+ export interface WriteAddonReviewerNoteInput {
26
+ projectPath: string;
27
+ distPath: string;
28
+ distDisplay: string;
29
+ lines: AddonLintLine[];
30
+ chunkProvenance?: Map<string, ChunkProvenance>;
31
+ }
32
+ export declare function writeAddonReviewerNote(input: WriteAddonReviewerNoteInput): string | null;
@@ -1,3 +1,4 @@
1
+ import type { BuildToolchain } from './build-toolchain.js';
1
2
  /**
2
3
  * What the injected Safari packager reports back about the app it produced.
3
4
  * `bundleIdDerived` is the load-bearing one: a generated `dev.extensionjs.*`
@@ -26,6 +27,7 @@ export type AddonLintSummary = {
26
27
  };
27
28
  export type BuildSummary = {
28
29
  browser: string;
30
+ buildType: 'production' | 'development';
29
31
  /** Absolute dist directory the build emitted into. Hosts that shell out
30
32
  * would otherwise have to re-derive `<project>/dist/<browser>` themselves. */
31
33
  output_path?: string;
@@ -40,6 +42,9 @@ export type BuildSummary = {
40
42
  /** Present only for safari/webkit-based builds that ran the packager. */
41
43
  safari?: SafariPackageSummary;
42
44
  addon_lint?: AddonLintSummary;
45
+ /** The Node and package manager versions the build ran under, for the
46
+ * reviewer note that asks a store to rebuild and compare. */
47
+ toolchain?: BuildToolchain;
43
48
  /** Archives this build wrote, with their promoted paths. The name is
44
49
  * rewritten from the manifest, so a caller reads it here rather than
45
50
  * composing it. Absent when neither --zip nor --zip-source was asked for. */
@@ -58,4 +63,4 @@ export declare function getBuildSummary(browser: string, info: {
58
63
  errors?: unknown[];
59
64
  } | null, outputPath?: string, outputFiles?: Array<{
60
65
  size: number;
61
- }>, codes?: ReadonlyMap<string, string>): BuildSummary;
66
+ }>, codes?: ReadonlyMap<string, string>): Omit<BuildSummary, 'buildType'>;
@@ -0,0 +1,8 @@
1
+ export interface BuildToolchain {
2
+ node: string;
3
+ package_manager?: {
4
+ name: string;
5
+ version: string;
6
+ };
7
+ }
8
+ export declare function getBuildToolchain(env?: Record<string, string | undefined>, nodeVersion?: string): BuildToolchain;
@@ -5,9 +5,17 @@ export interface ChunkProvenance {
5
5
  interface ChunkGraphLike {
6
6
  getChunkModulesIterable: (chunk: never) => Iterable<unknown>;
7
7
  }
8
+ export declare function chunkFileOf(location: string): string;
9
+ interface AssetLike {
10
+ name?: unknown;
11
+ info?: {
12
+ sourceFilename?: unknown;
13
+ };
14
+ }
8
15
  export interface CompilationLike {
9
16
  chunks?: Iterable<unknown>;
10
17
  chunkGraph?: ChunkGraphLike;
18
+ getAssets?: () => Iterable<AssetLike>;
11
19
  }
12
20
  export declare function packageNameFromPath(candidate: string): string | null;
13
21
  export declare function collectChunkDependencyProvenance(compilation: CompilationLike | null | undefined): Map<string, ChunkProvenance>;
@@ -0,0 +1,2 @@
1
+ export declare const DEV_HOT_UPDATES_DIR = "hot";
2
+ export declare function removeDevelopmentArtifacts(distPath: string): string[];
@@ -0,0 +1,6 @@
1
+ export interface LoopbackOrigin {
2
+ pattern: string;
3
+ where: string;
4
+ }
5
+ export declare function isLoopbackPattern(pattern: unknown): boolean;
6
+ export declare function findLoopbackOrigins(manifest: unknown): LoopbackOrigin[];
@@ -1,5 +1,6 @@
1
1
  import type { Stats } from '@rspack/core';
2
2
  import type { DevOptions, Manifest } from '../types.js';
3
+ import type { BuildToolchain } from './build-toolchain.js';
3
4
  import { fmt } from './messaging.js';
4
5
  import { type OutputFile } from './output-files.js';
5
6
  export { fmt };
@@ -24,15 +25,25 @@ export declare function projectInstallFallbackToNpm(pmName: string): string;
24
25
  export declare function projectInstallScriptsDisabled(pmName: string): string;
25
26
  export declare function anotherDevSessionActive(browser: string, pid: number, runId: string): string;
26
27
  export declare function buildOutDirInvalid(value: string): string;
28
+ export declare function productionLoopbackOrigins(origins: Array<{
29
+ pattern: string;
30
+ where: string;
31
+ }>): string;
32
+ export declare function productionLoopbackOriginsText(origins: Array<{
33
+ pattern: string;
34
+ where: string;
35
+ }>): string;
27
36
  export declare function buildSharesDevDist(browser: string, distDisplay: string, pid: number): string;
28
- export declare function buildSharesDevDistText(distDisplay: string, pid: number): string;
29
37
  export declare function anotherDevSessionRefused(browser: string, pid: number, port: number | null): string;
30
38
  export declare function buildAssetsTree(stats: Stats | undefined, outputFiles?: OutputFile[]): string;
31
39
  export declare function buildComplete(browser: DevOptions['browser'], distDisplayPath: string, totalBytes?: number, mode?: 'development' | 'production' | 'none'): string;
40
+ export declare function buildToolchain(toolchain: BuildToolchain): string;
32
41
  export declare function operaBuildUnminified(): string;
33
42
  export declare function addonLintSummary(errorCount: number, warningCount: number, distDisplay: string): string;
34
43
  export declare function addonLintFinding(level: 'error' | 'warning', code: string, message: string, location: string, attribution?: string): string;
35
44
  export declare function addonLintDependencyAttribution(packages: string[], onlyDependencies: boolean): string;
45
+ export declare function addonLintUnsupportedApiFix(browser: string): string;
46
+ export declare function addonLintReviewerNote(noteDisplay: string): string;
36
47
  export declare function addonLintMore(hiddenCount: number, distDisplay: string): string;
37
48
  export declare function addonLintNotInstalled(installHint: string): string;
38
49
  export declare function addonLintFailed(reason: string, distDisplay: string): string;
@@ -113,6 +113,7 @@ export declare const CODES: {
113
113
  readonly E_LOCALES_LAYOUT: 'E_LOCALES_LAYOUT';
114
114
  readonly E_WAR_INVALID: 'E_WAR_INVALID';
115
115
  readonly E_DEV_SESSION_DIST_SHARED: 'E_DEV_SESSION_DIST_SHARED';
116
+ readonly E_PROD_LOOPBACK_ORIGIN: 'E_PROD_LOOPBACK_ORIGIN';
116
117
  readonly E_BACKGROUND_REQUIRED: 'E_BACKGROUND_REQUIRED';
117
118
  readonly E_CONTENT_SCRIPT_SYNTAX: 'E_CONTENT_SCRIPT_SYNTAX';
118
119
  readonly E_NO_ENTRYPOINTS: 'E_NO_ENTRYPOINTS';
@@ -0,0 +1,14 @@
1
+ import type { Compiler } from '@rspack/core';
2
+ interface PackageLocation {
3
+ name: string;
4
+ inside: string;
5
+ }
6
+ export declare function locateLoaderPackage(loaderPath: string, developRoot?: string): PackageLocation | undefined;
7
+ export declare function projectLocalLoaderPath(loaderPath: string, projectRoot: string, developRoot?: string | undefined): string;
8
+ type Rewrite = (loaderPath: string) => string;
9
+ export declare function rewriteRuleLoaderPaths(rules: unknown, rewrite: Rewrite): void;
10
+ export declare class StableLoaderPathsPlugin {
11
+ static readonly name: string;
12
+ apply(compiler: Compiler): void;
13
+ }
14
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { DevOptions, Manifest } from '../../../types.js';
2
+ export declare function edgeEmbedsOptionsPage(manifest: Manifest, browser: DevOptions['browser']): boolean;
3
+ export declare function reportEdgeEmbeddedOptions(manifest: Manifest, browser: DevOptions['browser']): void;
4
+ export declare function resetEdgeOptionsNotice(): void;
@@ -40,6 +40,7 @@ export declare const safariMissingMemberDetails: Record<string, string>;
40
40
  export declare function safariMemberUnsupported(file: string, api: string, member: string, kind: 'call' | 'read'): string;
41
41
  export declare function geckoActionUnsupportedOnMv2(file: string): string;
42
42
  export declare function contentScriptEntryDroppedForBrowser(index: number, browser: string, prefixedKeys: string[]): string;
43
+ export declare function edgeEmbeddedOptionsDialog(): string;
43
44
  export declare function webkitUnsupportedKeysDropped(browser: string, dropped: Array<{
44
45
  path: string;
45
46
  reason: string;
@@ -0,0 +1,5 @@
1
+ import type { Compiler } from '@rspack/core';
2
+ export declare class AddBaseUriRuntimeModule {
3
+ apply(compiler: Compiler): void;
4
+ }
5
+ export declare function baseUriRuntimeSource(baseUriGlobal: string): string[];
@@ -0,0 +1,9 @@
1
+ import { type Compiler } from '@rspack/core';
2
+ export declare const UTF8_BOM = "\uFEFF";
3
+ export declare class StampWebkitUtf8Bom {
4
+ private readonly browser;
5
+ constructor(options: {
6
+ browser?: string;
7
+ });
8
+ apply(compiler: Compiler): void;
9
+ }