extension-develop 4.1.9 → 4.1.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 (58) hide show
  1. package/dist/0~rspack-config.mjs +212 -102
  2. package/dist/101.mjs +1 -1
  3. package/dist/291.mjs +8 -1
  4. package/dist/839.mjs +65 -13
  5. package/dist/extension-js-devtools/chrome/background/service_worker.js +1 -1
  6. package/dist/extension-js-devtools/chrome/content_scripts/content-0.js +2 -2
  7. package/dist/extension-js-devtools/chrome/manifest.json +4 -0
  8. package/dist/extension-js-devtools/chrome/options/index.css +2 -0
  9. package/dist/extension-js-devtools/chrome/options/index.html +11 -0
  10. package/dist/extension-js-devtools/chrome/options/index.js +1 -0
  11. package/dist/extension-js-devtools/chrome/pages/centralized-logger.css +1 -1
  12. package/dist/extension-js-devtools/chrome/pages/welcome.css +1 -1
  13. package/dist/extension-js-devtools/chrome/scripts/logger-client.js +1 -1
  14. package/dist/extension-js-devtools/chromium/background/service_worker.js +1 -1
  15. package/dist/extension-js-devtools/chromium/content_scripts/content-0.js +2 -2
  16. package/dist/extension-js-devtools/chromium/manifest.json +4 -0
  17. package/dist/extension-js-devtools/chromium/options/index.css +2 -0
  18. package/dist/extension-js-devtools/chromium/options/index.html +11 -0
  19. package/dist/extension-js-devtools/chromium/options/index.js +1 -0
  20. package/dist/extension-js-devtools/chromium/pages/centralized-logger.css +1 -1
  21. package/dist/extension-js-devtools/chromium/pages/welcome.css +1 -1
  22. package/dist/extension-js-devtools/chromium/scripts/logger-client.js +1 -1
  23. package/dist/extension-js-devtools/edge/background/service_worker.js +1 -1
  24. package/dist/extension-js-devtools/edge/content_scripts/content-0.js +2 -2
  25. package/dist/extension-js-devtools/edge/manifest.json +4 -0
  26. package/dist/extension-js-devtools/edge/options/index.css +2 -0
  27. package/dist/extension-js-devtools/edge/options/index.html +11 -0
  28. package/dist/extension-js-devtools/edge/options/index.js +1 -0
  29. package/dist/extension-js-devtools/edge/pages/centralized-logger.css +1 -1
  30. package/dist/extension-js-devtools/edge/pages/welcome.css +1 -1
  31. package/dist/extension-js-devtools/edge/scripts/logger-client.js +1 -1
  32. package/dist/extension-js-devtools/firefox/background/scripts.js +1 -1
  33. package/dist/extension-js-devtools/firefox/content_scripts/content-0.js +2 -2
  34. package/dist/extension-js-devtools/firefox/manifest.json +4 -0
  35. package/dist/extension-js-devtools/firefox/options/index.css +2 -0
  36. package/dist/extension-js-devtools/firefox/options/index.html +11 -0
  37. package/dist/extension-js-devtools/firefox/options/index.js +1 -0
  38. package/dist/extension-js-devtools/firefox/pages/centralized-logger.css +1 -1
  39. package/dist/extension-js-devtools/firefox/pages/welcome.css +1 -1
  40. package/dist/extension-js-devtools/firefox/scripts/logger-client.js +1 -1
  41. package/dist/feature-scripts-content-script-wrapper.js +3 -2
  42. package/dist/feature-scripts-content-script-wrapper.mjs +3 -2
  43. package/dist/feature-scripts-native-geturl-import-loader.mjs +73 -9
  44. package/dist/minimum-script-file.js +4 -4
  45. package/dist/minimum-script-file.mjs +4 -4
  46. package/dist/plugin-reload/reload-dispatch.d.ts +1 -1
  47. package/dist/plugin-reload/steps/setup-reload-strategy/index.d.ts +6 -8
  48. package/dist/plugin-web-extension/feature-html/html-lib/assets.d.ts +3 -2
  49. package/dist/plugin-web-extension/feature-html/html-lib/parse-html.d.ts +2 -0
  50. package/dist/plugin-web-extension/feature-html/html-lib/utils.d.ts +6 -0
  51. package/dist/plugin-web-extension/feature-json/resolve-json-resource.d.ts +6 -0
  52. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/storage.d.ts +1 -1
  53. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/declarative_net_request.d.ts +1 -1
  54. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/index.d.ts +1 -1
  55. package/dist/plugin-web-extension/feature-scripts/contracts.d.ts +3 -0
  56. package/dist/plugin-web-extension/feature-scripts/scripts-lib/utils.d.ts +9 -0
  57. package/dist/plugin-web-extension/feature-scripts/steps/add-content-script-wrapper/index.d.ts +2 -1
  58. package/package.json +2 -2
package/dist/839.mjs CHANGED
@@ -1255,28 +1255,79 @@ async function dispatchReload(instruction, executor) {
1255
1255
  if (warning) console.warn(warning);
1256
1256
  }
1257
1257
  }
1258
+ function isForcedFullPath(normalized) {
1259
+ return normalized.includes('manifest.json') || normalized.includes('_locales/');
1260
+ }
1261
+ function isHotAsset(normalized) {
1262
+ return normalized.startsWith('hot/') || normalized.includes('.hot-update.');
1263
+ }
1264
+ function normalizeChangedPath(file, contextDir) {
1265
+ const raw = String(file || '');
1266
+ if (!raw) return;
1267
+ const normalized = __rspack_external_node_path_c5b9b54f.isAbsolute(raw) ? __rspack_external_node_path_c5b9b54f.relative(contextDir, raw).replace(/\\/g, '/') : raw.replace(/\\/g, '/');
1268
+ if (!normalized) return;
1269
+ return normalized;
1270
+ }
1271
+ function pushChanged(into, file, contextDir, markForced) {
1272
+ const normalized = normalizeChangedPath(file, contextDir);
1273
+ if (!normalized) return;
1274
+ if (!into.includes(normalized)) into.push(normalized);
1275
+ if (isForcedFullPath(normalized)) markForced();
1276
+ }
1258
1277
  function createChangedSourcesTracker(compiler) {
1259
1278
  let forcedFull = false;
1260
1279
  let changedSources = [];
1280
+ let heldForcedFull = false;
1281
+ let heldSources = [];
1282
+ let writtenAssets = [];
1283
+ const contextDir = ()=>compiler.options.context || '';
1284
+ const ingest = (files, into, markForced)=>{
1285
+ if (!files) return;
1286
+ const ctx = contextDir();
1287
+ for (const file of files)pushChanged(into, file, ctx, markForced);
1288
+ };
1289
+ const foldRecoveryIntoCurrent = ()=>{
1290
+ const recovering = heldSources.length > 0 || heldForcedFull;
1291
+ if (!recovering) return;
1292
+ for (const file of heldSources)if (!changedSources.includes(file)) changedSources.push(file);
1293
+ for (const file of writtenAssets)if (!changedSources.includes(file)) changedSources.push(file);
1294
+ forcedFull = forcedFull || heldForcedFull || writtenAssets.some((file)=>isForcedFullPath(file));
1295
+ heldSources = [];
1296
+ heldForcedFull = false;
1297
+ };
1298
+ const markForced = ()=>{
1299
+ forcedFull = true;
1300
+ };
1261
1301
  compiler.hooks.watchRun.tap('extjs-reload-changed-sources', ()=>{
1262
1302
  forcedFull = false;
1263
1303
  changedSources = [];
1264
- const modifiedFiles = compiler.modifiedFiles;
1265
- if (!modifiedFiles || 0 === modifiedFiles.size) return;
1266
- const contextDir = compiler.options.context || '';
1267
- for (const file of modifiedFiles){
1268
- const normalized = __rspack_external_node_path_c5b9b54f.relative(contextDir, file).replace(/\\/g, '/');
1269
- if (normalized) {
1270
- changedSources.push(normalized);
1271
- if (normalized.includes('manifest.json') || normalized.includes('_locales/')) forcedFull = true;
1272
- }
1304
+ writtenAssets = [];
1305
+ ingest(compiler.modifiedFiles, changedSources, markForced);
1306
+ });
1307
+ compiler.hooks.done?.tap?.('extjs-reload-changed-sources-done', (stats)=>{
1308
+ const compilation = stats?.compilation;
1309
+ ingest(compilation?.modifiedFiles, changedSources, markForced);
1310
+ ingest(compiler.modifiedFiles, changedSources, markForced);
1311
+ if (compilation?.errors && compilation.errors.length > 0) {
1312
+ heldForcedFull = heldForcedFull || forcedFull;
1313
+ for (const file of changedSources)if (!heldSources.includes(file)) heldSources.push(file);
1314
+ return;
1273
1315
  }
1316
+ foldRecoveryIntoCurrent();
1317
+ });
1318
+ compiler.hooks.assetEmitted?.tap?.('extjs-reload-changed-sources-emitted', (file)=>{
1319
+ const normalized = normalizeChangedPath(file, contextDir());
1320
+ if (!normalized || isHotAsset(normalized)) return;
1321
+ if (!writtenAssets.includes(normalized)) writtenAssets.push(normalized);
1274
1322
  });
1275
1323
  return {
1276
- snapshot: ()=>({
1324
+ snapshot: ()=>{
1325
+ foldRecoveryIntoCurrent();
1326
+ return {
1277
1327
  forcedFull,
1278
1328
  changedSources
1279
- })
1329
+ };
1330
+ }
1280
1331
  };
1281
1332
  }
1282
1333
  function formatReloadContextLabel(context, files) {
@@ -1679,14 +1730,15 @@ async function extensionDev(pathOrRemoteUrl, devOptions) {
1679
1730
  if (isUsingTypeScript(manifestDir)) await generateExtensionTypes(manifestDir, packageJsonDir);
1680
1731
  const userManifestPath = projectStructure.packageJsonPath || projectStructure.denoJsonPath;
1681
1732
  if (userManifestPath) assertNoManagedDependencyConflicts(userManifestPath, manifestDir);
1682
- const browser = normalizeBrowser(devOptions.browser || 'chrome', devOptions.chromiumBinary, devOptions.geckoBinary || devOptions.firefoxBinary, devOptions.safariBinary);
1733
+ const commandConfig = await loadCommandConfig(packageJsonDir, 'dev');
1734
+ const configBrowser = commandConfig.browser;
1735
+ const browser = normalizeBrowser(devOptions.browser || configBrowser || 'chrome', devOptions.chromiumBinary, devOptions.geckoBinary || devOptions.firefoxBinary, devOptions.safariBinary);
1683
1736
  const geckoBinary = devOptions.geckoBinary || devOptions.firefoxBinary;
1684
1737
  if (debug) {
1685
1738
  console.log(debugDirs(manifestDir, packageJsonDir));
1686
1739
  console.log(debugBrowser(browser, devOptions.chromiumBinary, geckoBinary));
1687
1740
  }
1688
1741
  const browserConfig = await loadBrowserConfig(packageJsonDir, browser);
1689
- const commandConfig = await loadCommandConfig(packageJsonDir, 'dev');
1690
1742
  const merged = withDarkMode({
1691
1743
  ...mergeOptionLayers(DEV_COMMAND_DEFAULTS, browserConfig, commandConfig, devOptions),
1692
1744
  browser
@@ -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; "),!t){try{await n()}catch{try{chrome.tabs.create({url:o})}catch{}}return}let i=String(t.url||""),s=i.startsWith(`${a}://newtab`)||i.startsWith(`${a}://welcome`);0;s?await n():r(t,o)})}catch{}}let o=[],i=new Map,s=new Set;try{chrome.storage.session.get(["logger_capture_stacks"],e=>{e?.logger_capture_stacks}),chrome.storage.session.onChanged.addListener((e,t)=>{"session"===t&&"logger_capture_stacks"in e&&e.logger_capture_stacks?.newValue})}catch{}function d(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}function l(e){if(o.push(e),o.length>2e3&&o.shift(),"number"==typeof e.tabId){let t=i.get(e.tabId)||[];t.push(e),t.length>1e3&&t.shift(),i.set(e.tabId,t)}for(let t of s)try{let r={type:"append",event:e};t.postMessage(r)}catch{}}chrome.runtime.onConnect.addListener(e=>{if("logger"!==e.name)return;let t=t=>(function(e,t){var r;let n,a;if("subscribe"===t.type){s.add(e);try{e.postMessage({type:"init",events:o})}catch{}return}let i=e.sender?.id;if(i&&i===chrome.runtime.id)return;let l=e.sender?.tab?.id,c=e.sender?.frameId,u=e.sender?.tab?.incognito,m=e.sender?.tab?.windowId;if(r=i||`tab:${l??"unknown"}`,n=Date.now(),(a=h.get(r))?n-a.ts>1e3?(a.ts=n,a.count=1,!!0):(a.count+=1,!!(a.count>200)):(h.set(r,{ts:n,count:1}),!!0))return;let y=p(t.messageParts),v={id:d(),timestamp:Date.now(),level:t.level,context:t.context,messageParts:y,eventType:"dx.signal"===t.eventType||"log"===t.eventType?t.eventType:"log",code:"string"==typeof t.code?f(t.code,128):void 0,status:"ok"===t.status||"warn"===t.status||"fail"===t.status?t.status:void 0,data:b(t.data),remediation:"string"==typeof t.remediation?f(t.remediation,512):void 0,url:t.url,stack:t.stack,errorName:t.errorName,tabId:l,frameId:c,sourceExtensionId:i,incognito:u,windowId:m};g(v)})(e,t);e.onMessage.addListener(t),e.onDisconnect.addListener(()=>{s.delete(e);try{e.onMessage.removeListener(t)}catch{}})}),chrome.action.onClicked.addListener(async()=>{try{await chrome.sidePanel.setPanelBehavior({openPanelOnActionClick:!0})}catch{}});let c=[],u=new Set;function m(e){try{return JSON.stringify(e)}catch{return String(e)}}function g(e){let t=`${e.eventType??"log"}|${e.code??""}|${e.status??""}|${e.level}|${e.context}|${e.tabId??""}|${e.frameId??""}|${e.url??""}|${m(e.messageParts)}|${m(e.data)}`.slice(0,512);if(!u.has(t)){if(u.add(t),c.push(t),c.length>2e3){let e=c.shift();e&&u.delete(e)}if(e.url&&!e.hostname)try{let t=new URL(e.url);e.hostname=`${t.hostname}${t.pathname}`}catch{}if(null!=e.tabId&&null==e.title)try{chrome.tabs.get(e.tabId,t=>{if(chrome.runtime.lastError)return l(e);e.title=t?.title||e.title,l(e)});return}catch{}l(e)}}let h=new Map;function f(e,t=2048){return e.length<=t?e:e.slice(0,t)+"..."}function y(e){try{return JSON.stringify(e)}catch{try{return String(e)}catch{return"[unserializable]"}}}function p(e){try{let t=[];for(let r of e??[])if("string"==typeof r?t.push(f(r)):r instanceof Error?t.push(f(`${r.name}: ${r.message}`)):t.push(f(y(r))),t.join(" ").length>8192)break;return t}catch{return[y(e)]}}function b(e){if(e&&"object"==typeof e)try{let t=JSON.stringify(e);if(!t)return;let r=JSON.parse(t);if(0===Object.keys(r).length)return;return r}catch{return}}function v(e,t,r={}){g({id:d(),timestamp:Date.now(),level:e,context:"background",messageParts:t,url:"string"==typeof r.url?r.url:void 0,tabId:"number"==typeof r.tabId?r.tabId:void 0,frameId:"number"==typeof r.frameId?r.frameId:void 0})}function x(e){let t=String(e.name||"").toLowerCase();return t.includes("extension.js built-in developer tools")||t.includes("extension.js theme")}async function w(){let e=(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!x(e));if(0===e.length)return{ok:!0,extensionEnabled:null};let t=e.find(e=>e.enabled)||e[e.length-1];return{ok:!0,extensionEnabled:!!t?.enabled,extensionName:t?.name,extensionId:t?.id}}async function I(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 n=new FileReader;n.onload=()=>e(String(n.result||"")),n.onerror=()=>t(Error("Failed to read icon blob")),n.readAsDataURL(r)})}function L(e){return!!e&&e.id!==chrome.runtime.id&&"development"===e.installType&&"theme"!==e.type&&!x(e)}chrome.runtime.onInstalled.addListener(e=>{v("info",["extension installed",e.reason,e.previousVersion??null])}),chrome.storage.session.get(["logger_events"],e=>{let t=Array.isArray(e?.logger_events)?e.logger_events:[];if(t.length)for(let e of t.slice(-2e3))o.push(e)}),setInterval(()=>{chrome.storage.session.set({logger_events:o.slice(-200)})},2e3),chrome.runtime.onStartup.addListener(()=>{v("info",["extension startup"]);try{v("info",["TEST_LOG: background-start"])}catch{}}),chrome.tabs.onCreated.addListener(e=>{v("info",["tab created"],{tabId:e.id??void 0,url:e.url})}),chrome.tabs.onUpdated.addListener((e,t,r)=>{"loading"===t.status&&v("debug",["tab loading"],{tabId:e,url:r.url}),"complete"===t.status&&v("debug",["tab complete"],{tabId:e,url:r.url}),"string"==typeof t.url&&v("info",["tab url changed",t.url],{tabId:e,url:t.url})}),chrome.tabs.onRemoved.addListener((e,t)=>{v("info",["tab removed",{windowId:t.windowId,isWindowClosing:t.isWindowClosing}],{tabId:e})}),chrome.webNavigation.onBeforeNavigate.addListener(e=>{0===e.frameId&&v("info",["Before navigate"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onCommitted.addListener(e=>{0===e.frameId&&v("info",["Navigation committed"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onCompleted.addListener(e=>{0===e.frameId&&v("info",["Navigation completed"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onErrorOccurred.addListener(e=>{0===e.frameId&&v("error",["Navigation error",e.error],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onHistoryStateUpdated.addListener(e=>{0===e.frameId&&v("info",["History state updated"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.runtime.onMessage.addListener((e,t,r)=>e&&"get-events"===e.type?(r({events:o.slice(-500)}),!0):!!e&&"clear-events"===e.type&&(o.length=0,r({ok:!0}),!0)),chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e){if("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)?(I(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"});if("get-dx-status"===e.type)return w().then(e=>r(e)).catch(e=>r({ok:!1,error:String(e||"Unknown error")})),!0;if("dx-signal"===e.type){try{var n={level:e.level||"info",context:e.context||"content",messageParts:Array.isArray(e.messageParts)&&e.messageParts.length>0?e.messageParts:[e.code||"DX_SIGNAL"],eventType:e.eventType||"dx.signal",code:e.code,status:e.status,data:e.data,remediation:e.remediation,url:"string"==typeof e.url?e.url:void 0,stack:"string"==typeof e.stack?e.stack:void 0,errorName:"string"==typeof e.errorName?e.errorName:void 0};g({id:d(),timestamp:Date.now(),level:n.level,context:n.context,messageParts:p(n.messageParts||[]),eventType:"dx.signal"===n.eventType||"log"===n.eventType?n.eventType:"log",code:"string"==typeof n.code?f(String(n.code),128):void 0,status:"ok"===n.status||"warn"===n.status||"fail"===n.status?n.status:void 0,data:b(n.data),remediation:"string"==typeof n.remediation?f(n.remediation,512):void 0,url:n.url,stack:n.stack,errorName:n.errorName,tabId:n.tabId,frameId:n.frameId}),r({ok:!0})}catch(e){r({ok:!1,error:String(e||"Unknown error")})}return!0}}}),chrome.runtime.onStartup.addListener(async()=>{await a()}),chrome.runtime.onInstalled.addListener(async()=>{await a()});let k="";function S(e,t,r){try{chrome.tabs.query({},n=>{for(let a of n||[])if("number"==typeof a.id)try{chrome.tabs.sendMessage(a.id,{type:"extjs-dev-reload",state:e,label:t||"",kind:r||""}).catch(()=>{})}catch{}})}catch{}}"function"==typeof chrome.runtime?.onMessageExternal?.addListener&&chrome.runtime.onMessageExternal.addListener((e,t,r)=>{if(!e||"extjs-dev-reload-state"!==e.type)return;let n=t?.id;if(!n)return;let a="reloaded"===e.phase?"reloaded":"reloading",o="string"==typeof e.label?e.label:"",i="string"==typeof e.kind?e.kind:"";chrome.management.get(n,e=>{chrome.runtime.lastError||L(e)&&(k="reloading"===a?o:"",S(a,o,i))}),r({ok:!0})}),"function"==typeof chrome.management?.onDisabled?.addListener&&chrome.management.onDisabled.addListener(e=>{L(e)&&S("reloading",k)}),"function"==typeof chrome.management?.onEnabled?.addListener&&chrome.management.onEnabled.addListener(e=>{L(e)&&(S("reloaded",k),k="")}),"function"==typeof chrome.management?.onInstalled?.addListener&&chrome.management.onInstalled.addListener(e=>{L(e)&&(S("reloaded",k),k="")})})();
26
+ `,"background: transparent; color: #0971fe; "),!t){try{await n()}catch{try{chrome.tabs.create({url:o})}catch{}}return}let i=String(t.url||""),s=i.startsWith(`${a}://newtab`)||i.startsWith(`${a}://welcome`);0;s?await n():r(t,o)})}catch{}}let o=[],i=new Map,s=new Set;try{chrome.storage.session.get(["logger_capture_stacks"],e=>{e?.logger_capture_stacks}),chrome.storage.session.onChanged.addListener((e,t)=>{"session"===t&&"logger_capture_stacks"in e&&e.logger_capture_stacks?.newValue})}catch{}function d(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}function l(e){if(o.push(e),o.length>2e3&&o.shift(),"number"==typeof e.tabId){let t=i.get(e.tabId)||[];t.push(e),t.length>1e3&&t.shift(),i.set(e.tabId,t)}for(let t of s)try{let r={type:"append",event:e};t.postMessage(r)}catch{}}chrome.runtime.onConnect.addListener(e=>{if("logger"!==e.name)return;let t=t=>(function(e,t){var r;let n,a;if("subscribe"===t.type){s.add(e);try{e.postMessage({type:"init",events:o})}catch{}return}let i=e.sender?.id;if(i&&i===chrome.runtime.id)return;let l=e.sender?.tab?.id,c=e.sender?.frameId,u=e.sender?.tab?.incognito,m=e.sender?.tab?.windowId;if(r=i||`tab:${l??"unknown"}`,n=Date.now(),(a=h.get(r))?n-a.ts>1e3?(a.ts=n,a.count=1,!!0):(a.count+=1,!!(a.count>200)):(h.set(r,{ts:n,count:1}),!!0))return;let p=y(t.messageParts),v={id:d(),timestamp:Date.now(),level:t.level,context:t.context,messageParts:p,eventType:"dx.signal"===t.eventType||"log"===t.eventType?t.eventType:"log",code:"string"==typeof t.code?f(t.code,128):void 0,status:"ok"===t.status||"warn"===t.status||"fail"===t.status?t.status:void 0,data:b(t.data),remediation:"string"==typeof t.remediation?f(t.remediation,512):void 0,url:t.url,stack:t.stack,errorName:t.errorName,tabId:l,frameId:c,sourceExtensionId:i,incognito:u,windowId:m};g(v)})(e,t);e.onMessage.addListener(t),e.onDisconnect.addListener(()=>{s.delete(e);try{e.onMessage.removeListener(t)}catch{}})}),chrome.action.onClicked.addListener(async()=>{try{await chrome.sidePanel.setPanelBehavior({openPanelOnActionClick:!0})}catch{}});let c=[],u=new Set;function m(e){try{return JSON.stringify(e)}catch{return String(e)}}function g(e){let t=`${e.eventType??"log"}|${e.code??""}|${e.status??""}|${e.level}|${e.context}|${e.tabId??""}|${e.frameId??""}|${e.url??""}|${m(e.messageParts)}|${m(e.data)}`.slice(0,512);if(!u.has(t)){if(u.add(t),c.push(t),c.length>2e3){let e=c.shift();e&&u.delete(e)}if(e.url&&!e.hostname)try{let t=new URL(e.url);e.hostname=`${t.hostname}${t.pathname}`}catch{}if(null!=e.tabId&&null==e.title)try{chrome.tabs.get(e.tabId,t=>{if(chrome.runtime.lastError)return l(e);e.title=t?.title||e.title,l(e)});return}catch{}l(e)}}let h=new Map;function f(e,t=2048){return e.length<=t?e:e.slice(0,t)+"..."}function p(e){try{return JSON.stringify(e)}catch{try{return String(e)}catch{return"[unserializable]"}}}function y(e){try{let t=[];for(let r of e??[])if("string"==typeof r?t.push(f(r)):r instanceof Error?t.push(f(`${r.name}: ${r.message}`)):t.push(f(p(r))),t.join(" ").length>8192)break;return t}catch{return[p(e)]}}function b(e){if(e&&"object"==typeof e)try{let t=JSON.stringify(e);if(!t)return;let r=JSON.parse(t);if(0===Object.keys(r).length)return;return r}catch{return}}function v(e,t,r={}){g({id:d(),timestamp:Date.now(),level:e,context:"background",messageParts:t,url:"string"==typeof r.url?r.url:void 0,tabId:"number"==typeof r.tabId?r.tabId:void 0,frameId:"number"==typeof r.frameId?r.frameId:void 0})}function x(e){let t=String(e.name||"").toLowerCase();return t.includes("extension.js built-in developer tools")||t.includes("extension.js theme")}async function w(){let e=(await new Promise(e=>{chrome.management.getAll(e)})||[]).filter(e=>e.id!==chrome.runtime.id&&"igcijhgmihmjbbahdabahfbpffalcfnn"!==e.id&&"development"===e.installType&&"theme"!==e.type&&!x(e));if(0===e.length)return{ok:!0,extensionEnabled:null};let t=e.find(e=>e.enabled)||e[e.length-1];return{ok:!0,extensionEnabled:!!t?.enabled,extensionName:t?.name,extensionId:t?.id}}async function I(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 n=new FileReader;n.onload=()=>e(String(n.result||"")),n.onerror=()=>t(Error("Failed to read icon blob")),n.readAsDataURL(r)})}function k(e){return!!e&&e.id!==chrome.runtime.id&&"development"===e.installType&&"theme"!==e.type&&!x(e)}chrome.runtime.onInstalled.addListener(e=>{v("info",["extension installed",e.reason,e.previousVersion??null])}),chrome.storage.session.get(["logger_events"],e=>{let t=Array.isArray(e?.logger_events)?e.logger_events:[];if(t.length)for(let e of t.slice(-2e3))o.push(e)}),setInterval(()=>{chrome.storage.session.set({logger_events:o.slice(-200)})},2e3),chrome.runtime.onStartup.addListener(()=>{v("info",["extension startup"]);try{v("info",["TEST_LOG: background-start"])}catch{}}),chrome.tabs.onCreated.addListener(e=>{v("info",["tab created"],{tabId:e.id??void 0,url:e.url})}),chrome.tabs.onUpdated.addListener((e,t,r)=>{"loading"===t.status&&v("debug",["tab loading"],{tabId:e,url:r.url}),"complete"===t.status&&v("debug",["tab complete"],{tabId:e,url:r.url}),"string"==typeof t.url&&v("info",["tab url changed",t.url],{tabId:e,url:t.url})}),chrome.tabs.onRemoved.addListener((e,t)=>{v("info",["tab removed",{windowId:t.windowId,isWindowClosing:t.isWindowClosing}],{tabId:e})}),chrome.webNavigation.onBeforeNavigate.addListener(e=>{0===e.frameId&&v("info",["Before navigate"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onCommitted.addListener(e=>{0===e.frameId&&v("info",["Navigation committed"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onCompleted.addListener(e=>{0===e.frameId&&v("info",["Navigation completed"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onErrorOccurred.addListener(e=>{0===e.frameId&&v("error",["Navigation error",e.error],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.webNavigation.onHistoryStateUpdated.addListener(e=>{0===e.frameId&&v("info",["History state updated"],{tabId:e.tabId,frameId:e.frameId,url:e.url,title:"[navigation]"})}),chrome.runtime.onMessage.addListener((e,t,r)=>e&&"get-events"===e.type?(r({events:o.slice(-500)}),!0):!!e&&"clear-events"===e.type&&(o.length=0,r({ok:!0}),!0)),chrome.runtime.onMessage.addListener((e,t,r)=>{if((!t?.id||t.id===chrome.runtime.id)&&e){if("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)?(I(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"});if("get-dx-status"===e.type)return w().then(e=>r(e)).catch(e=>r({ok:!1,error:String(e||"Unknown error")})),!0;if("open-options-page"===e.type){try{chrome.runtime.openOptionsPage(()=>{chrome.runtime.lastError?r({ok:!1,error:String(chrome.runtime.lastError.message||"Unknown error")}):r({ok:!0})})}catch(e){r({ok:!1,error:String(e||"Unknown error")})}return!0}if("dx-signal"===e.type){try{var n={level:e.level||"info",context:e.context||"content",messageParts:Array.isArray(e.messageParts)&&e.messageParts.length>0?e.messageParts:[e.code||"DX_SIGNAL"],eventType:e.eventType||"dx.signal",code:e.code,status:e.status,data:e.data,remediation:e.remediation,url:"string"==typeof e.url?e.url:void 0,stack:"string"==typeof e.stack?e.stack:void 0,errorName:"string"==typeof e.errorName?e.errorName:void 0};g({id:d(),timestamp:Date.now(),level:n.level,context:n.context,messageParts:y(n.messageParts||[]),eventType:"dx.signal"===n.eventType||"log"===n.eventType?n.eventType:"log",code:"string"==typeof n.code?f(String(n.code),128):void 0,status:"ok"===n.status||"warn"===n.status||"fail"===n.status?n.status:void 0,data:b(n.data),remediation:"string"==typeof n.remediation?f(n.remediation,512):void 0,url:n.url,stack:n.stack,errorName:n.errorName,tabId:n.tabId,frameId:n.frameId}),r({ok:!0})}catch(e){r({ok:!1,error:String(e||"Unknown error")})}return!0}}}),chrome.runtime.onStartup.addListener(async()=>{await a()}),chrome.runtime.onInstalled.addListener(async()=>{await a()});let L="";function S(e,t,r){try{chrome.tabs.query({},n=>{for(let a of n||[])if("number"==typeof a.id)try{chrome.tabs.sendMessage(a.id,{type:"extjs-dev-reload",state:e,label:t||"",kind:r||""}).catch(()=>{})}catch{}})}catch{}}"function"==typeof chrome.runtime?.onMessageExternal?.addListener&&chrome.runtime.onMessageExternal.addListener((e,t,r)=>{if(!e||"extjs-dev-reload-state"!==e.type)return;let n=t?.id;if(!n)return;let a="reloaded"===e.phase?"reloaded":"reloading",o="string"==typeof e.label?e.label:"",i="string"==typeof e.kind?e.kind:"";chrome.management.get(n,e=>{chrome.runtime.lastError||k(e)&&(L="reloading"===a?o:"",S(a,o,i))}),r({ok:!0})}),"function"==typeof chrome.management?.onDisabled?.addListener&&chrome.management.onDisabled.addListener(e=>{k(e)&&S("reloading",L)}),"function"==typeof chrome.management?.onEnabled?.addListener&&chrome.management.onEnabled.addListener(e=>{k(e)&&(S("reloaded",L),L="")}),"function"==typeof chrome.management?.onInstalled?.addListener&&chrome.management.onInstalled.addListener(e=>{k(e)&&(S("reloaded",L),L="")})})();