@gxp-dev/tools 2.0.62 → 2.0.64

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 (182) hide show
  1. package/README.md +32 -31
  2. package/bin/gx-devtools.js +74 -54
  3. package/bin/lib/cli.js +23 -21
  4. package/bin/lib/commands/add-dependency.js +366 -325
  5. package/bin/lib/commands/assets.js +137 -139
  6. package/bin/lib/commands/build.js +169 -174
  7. package/bin/lib/commands/datastore.js +181 -183
  8. package/bin/lib/commands/dev.js +127 -131
  9. package/bin/lib/commands/extensions.js +147 -149
  10. package/bin/lib/commands/extract-config.js +73 -67
  11. package/bin/lib/commands/index.js +12 -12
  12. package/bin/lib/commands/init.js +342 -240
  13. package/bin/lib/commands/publish.js +69 -75
  14. package/bin/lib/commands/socket.js +69 -69
  15. package/bin/lib/commands/ssl.js +14 -14
  16. package/bin/lib/constants.js +10 -24
  17. package/bin/lib/tui/App.tsx +761 -705
  18. package/bin/lib/tui/components/AIPanel.tsx +191 -171
  19. package/bin/lib/tui/components/CommandInput.tsx +394 -343
  20. package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
  21. package/bin/lib/tui/components/Header.tsx +23 -21
  22. package/bin/lib/tui/components/LogPanel.tsx +244 -220
  23. package/bin/lib/tui/components/TabBar.tsx +50 -48
  24. package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
  25. package/bin/lib/tui/index.tsx +37 -39
  26. package/bin/lib/tui/services/AIService.ts +518 -462
  27. package/bin/lib/tui/services/ExtensionService.ts +140 -129
  28. package/bin/lib/tui/services/GeminiService.ts +367 -337
  29. package/bin/lib/tui/services/ServiceManager.ts +344 -322
  30. package/bin/lib/tui/services/SocketService.ts +168 -168
  31. package/bin/lib/tui/services/ViteService.ts +88 -88
  32. package/bin/lib/tui/services/index.ts +47 -22
  33. package/bin/lib/utils/ai-scaffold.js +291 -280
  34. package/bin/lib/utils/extract-config.js +157 -140
  35. package/bin/lib/utils/files.js +82 -86
  36. package/bin/lib/utils/index.js +7 -7
  37. package/bin/lib/utils/paths.js +34 -34
  38. package/bin/lib/utils/prompts.js +194 -169
  39. package/bin/lib/utils/ssl.js +79 -81
  40. package/browser-extensions/README.md +0 -1
  41. package/browser-extensions/chrome/background.js +244 -237
  42. package/browser-extensions/chrome/content.js +32 -29
  43. package/browser-extensions/chrome/devtools.html +7 -7
  44. package/browser-extensions/chrome/devtools.js +19 -19
  45. package/browser-extensions/chrome/inspector.js +802 -767
  46. package/browser-extensions/chrome/manifest.json +71 -63
  47. package/browser-extensions/chrome/panel.html +674 -636
  48. package/browser-extensions/chrome/panel.js +722 -712
  49. package/browser-extensions/chrome/popup.html +586 -543
  50. package/browser-extensions/chrome/popup.js +282 -244
  51. package/browser-extensions/chrome/rules.json +1 -1
  52. package/browser-extensions/chrome/test-chrome.html +216 -136
  53. package/browser-extensions/chrome/test-mixed-content.html +284 -189
  54. package/browser-extensions/chrome/test-uri-pattern.html +221 -198
  55. package/browser-extensions/firefox/README.md +9 -6
  56. package/browser-extensions/firefox/background.js +221 -218
  57. package/browser-extensions/firefox/content.js +55 -52
  58. package/browser-extensions/firefox/debug-errors.html +386 -228
  59. package/browser-extensions/firefox/debug-https.html +153 -105
  60. package/browser-extensions/firefox/devtools.html +7 -7
  61. package/browser-extensions/firefox/devtools.js +23 -20
  62. package/browser-extensions/firefox/inspector.js +802 -767
  63. package/browser-extensions/firefox/manifest.json +68 -68
  64. package/browser-extensions/firefox/panel.html +674 -636
  65. package/browser-extensions/firefox/panel.js +722 -712
  66. package/browser-extensions/firefox/popup.html +572 -535
  67. package/browser-extensions/firefox/popup.js +281 -236
  68. package/browser-extensions/firefox/test-gramercy.html +170 -125
  69. package/browser-extensions/firefox/test-imports.html +59 -55
  70. package/browser-extensions/firefox/test-masking.html +231 -140
  71. package/browser-extensions/firefox/test-uri-pattern.html +221 -198
  72. package/dist/tui/App.d.ts +1 -1
  73. package/dist/tui/App.d.ts.map +1 -1
  74. package/dist/tui/App.js +154 -150
  75. package/dist/tui/App.js.map +1 -1
  76. package/dist/tui/components/AIPanel.d.ts.map +1 -1
  77. package/dist/tui/components/AIPanel.js +42 -35
  78. package/dist/tui/components/AIPanel.js.map +1 -1
  79. package/dist/tui/components/CommandInput.d.ts +1 -1
  80. package/dist/tui/components/CommandInput.d.ts.map +1 -1
  81. package/dist/tui/components/CommandInput.js +92 -62
  82. package/dist/tui/components/CommandInput.js.map +1 -1
  83. package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
  84. package/dist/tui/components/GeminiPanel.js +37 -30
  85. package/dist/tui/components/GeminiPanel.js.map +1 -1
  86. package/dist/tui/components/Header.d.ts.map +1 -1
  87. package/dist/tui/components/Header.js +1 -1
  88. package/dist/tui/components/Header.js.map +1 -1
  89. package/dist/tui/components/LogPanel.d.ts +1 -1
  90. package/dist/tui/components/LogPanel.d.ts.map +1 -1
  91. package/dist/tui/components/LogPanel.js +26 -24
  92. package/dist/tui/components/LogPanel.js.map +1 -1
  93. package/dist/tui/components/TabBar.d.ts +2 -2
  94. package/dist/tui/components/TabBar.d.ts.map +1 -1
  95. package/dist/tui/components/TabBar.js +11 -11
  96. package/dist/tui/components/TabBar.js.map +1 -1
  97. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
  98. package/dist/tui/components/WelcomeScreen.js +6 -6
  99. package/dist/tui/components/WelcomeScreen.js.map +1 -1
  100. package/dist/tui/index.d.ts.map +1 -1
  101. package/dist/tui/index.js +8 -8
  102. package/dist/tui/index.js.map +1 -1
  103. package/dist/tui/services/AIService.d.ts +2 -2
  104. package/dist/tui/services/AIService.d.ts.map +1 -1
  105. package/dist/tui/services/AIService.js +165 -125
  106. package/dist/tui/services/AIService.js.map +1 -1
  107. package/dist/tui/services/ExtensionService.d.ts +1 -1
  108. package/dist/tui/services/ExtensionService.d.ts.map +1 -1
  109. package/dist/tui/services/ExtensionService.js +33 -26
  110. package/dist/tui/services/ExtensionService.js.map +1 -1
  111. package/dist/tui/services/GeminiService.d.ts +1 -1
  112. package/dist/tui/services/GeminiService.d.ts.map +1 -1
  113. package/dist/tui/services/GeminiService.js +87 -76
  114. package/dist/tui/services/GeminiService.js.map +1 -1
  115. package/dist/tui/services/ServiceManager.d.ts +3 -3
  116. package/dist/tui/services/ServiceManager.d.ts.map +1 -1
  117. package/dist/tui/services/ServiceManager.js +72 -58
  118. package/dist/tui/services/ServiceManager.js.map +1 -1
  119. package/dist/tui/services/SocketService.d.ts.map +1 -1
  120. package/dist/tui/services/SocketService.js +32 -32
  121. package/dist/tui/services/SocketService.js.map +1 -1
  122. package/dist/tui/services/ViteService.d.ts.map +1 -1
  123. package/dist/tui/services/ViteService.js +26 -28
  124. package/dist/tui/services/ViteService.js.map +1 -1
  125. package/dist/tui/services/index.d.ts +6 -6
  126. package/dist/tui/services/index.d.ts.map +1 -1
  127. package/dist/tui/services/index.js +6 -6
  128. package/dist/tui/services/index.js.map +1 -1
  129. package/mcp/gxp-api-server.js +83 -81
  130. package/package.json +109 -93
  131. package/runtime/PortalContainer.vue +258 -234
  132. package/runtime/dev-tools/DevToolsModal.vue +153 -155
  133. package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
  134. package/runtime/dev-tools/MockDataEditor.vue +456 -433
  135. package/runtime/dev-tools/SocketSimulator.vue +379 -371
  136. package/runtime/dev-tools/StoreInspector.vue +517 -455
  137. package/runtime/dev-tools/index.js +5 -5
  138. package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
  139. package/runtime/fallback-layouts/PublicLayout.vue +2 -2
  140. package/runtime/fallback-layouts/SystemLayout.vue +2 -2
  141. package/runtime/gxpStringsPlugin.js +159 -134
  142. package/runtime/index.html +17 -19
  143. package/runtime/main.js +24 -22
  144. package/runtime/mock-api/auth-middleware.js +15 -15
  145. package/runtime/mock-api/image-generator.js +46 -46
  146. package/runtime/mock-api/index.js +55 -55
  147. package/runtime/mock-api/response-generator.js +116 -105
  148. package/runtime/mock-api/route-generator.js +107 -84
  149. package/runtime/mock-api/socket-triggers.js +94 -93
  150. package/runtime/mock-api/spec-loader.js +79 -80
  151. package/runtime/package.json +3 -0
  152. package/runtime/server.js +68 -68
  153. package/runtime/stores/gxpPortalConfigStore.js +204 -186
  154. package/runtime/stores/index.js +2 -2
  155. package/runtime/vite-inspector-plugin.js +858 -707
  156. package/runtime/vite-source-tracker-plugin.js +132 -113
  157. package/runtime/vite.config.js +207 -132
  158. package/scripts/launch-chrome.js +41 -41
  159. package/scripts/pack-chrome.js +38 -39
  160. package/socket-events/AiSessionMessageCreated.json +17 -17
  161. package/socket-events/SocialStreamPostCreated.json +23 -23
  162. package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
  163. package/template/.claude/agents/gxp-developer.md +100 -99
  164. package/template/.claude/settings.json +7 -7
  165. package/template/AGENTS.md +30 -23
  166. package/template/GEMINI.md +20 -20
  167. package/template/README.md +70 -53
  168. package/template/app-manifest.json +2 -4
  169. package/template/configuration.json +10 -10
  170. package/template/default-styling.css +1 -1
  171. package/template/index.html +18 -20
  172. package/template/main.js +24 -22
  173. package/template/src/DemoPage.vue +415 -362
  174. package/template/src/Plugin.vue +76 -85
  175. package/template/src/stores/index.js +3 -3
  176. package/template/src/stores/test-data.json +164 -172
  177. package/template/theme-layouts/AdditionalStyling.css +50 -50
  178. package/template/theme-layouts/PrivateLayout.vue +8 -12
  179. package/template/theme-layouts/PublicLayout.vue +8 -12
  180. package/template/theme-layouts/SystemLayout.vue +8 -12
  181. package/template/vite.extend.js +45 -0
  182. package/template/vite.config.js +0 -409
@@ -1,59 +1,64 @@
1
1
  document.addEventListener("DOMContentLoaded", async function () {
2
2
  // Get all DOM elements
3
- const toggleButton = document.getElementById("toggleButton");
4
- const toggleText = document.getElementById("toggleText");
5
- const saveBtn = document.getElementById("saveBtn");
6
- const clearCacheBtn = document.getElementById("clearCacheBtn");
7
- const statusMessage = document.getElementById("statusMessage");
8
- const maskingMode = document.getElementById("maskingMode");
9
- const clearCacheOnEnable = document.getElementById("clearCacheOnEnable");
10
- const disableCacheForRedirects = document.getElementById("disableCacheForRedirects");
3
+ const toggleButton = document.getElementById("toggleButton")
4
+ const toggleText = document.getElementById("toggleText")
5
+ const saveBtn = document.getElementById("saveBtn")
6
+ const clearCacheBtn = document.getElementById("clearCacheBtn")
7
+ const statusMessage = document.getElementById("statusMessage")
8
+ const maskingMode = document.getElementById("maskingMode")
9
+ const clearCacheOnEnable = document.getElementById("clearCacheOnEnable")
10
+ const disableCacheForRedirects = document.getElementById(
11
+ "disableCacheForRedirects",
12
+ )
11
13
 
12
14
  // Tab elements
13
- const tabs = document.querySelectorAll(".tab");
14
- const tabContents = document.querySelectorAll(".tab-content");
15
- const jsBadge = document.getElementById("jsBadge");
16
- const cssBadge = document.getElementById("cssBadge");
15
+ const tabs = document.querySelectorAll(".tab")
16
+ const tabContents = document.querySelectorAll(".tab-content")
17
+ const jsBadge = document.getElementById("jsBadge")
18
+ const cssBadge = document.getElementById("cssBadge")
17
19
 
18
20
  // Inspector elements
19
- const inspectorCard = document.getElementById("inspectorCard");
20
- const inspectorBadge = document.getElementById("inspectorBadge");
21
+ const inspectorCard = document.getElementById("inspectorCard")
22
+ const inspectorBadge = document.getElementById("inspectorBadge")
21
23
 
22
24
  // Inspector state
23
- let inspectorEnabled = false;
25
+ let inspectorEnabled = false
24
26
 
25
27
  // JS Rule elements
26
- const jsRuleToggle = document.getElementById("jsRuleToggle");
27
- const jsRuleContent = document.getElementById("jsRuleContent");
28
- const jsRedirectUrl = document.getElementById("jsRedirectUrl");
29
- const jsUseCustomPattern = document.getElementById("jsUseCustomPattern");
30
- const jsPatternGroup = document.getElementById("jsPatternGroup");
31
- const jsPattern = document.getElementById("jsPattern");
28
+ const jsRuleToggle = document.getElementById("jsRuleToggle")
29
+ const jsRuleContent = document.getElementById("jsRuleContent")
30
+ const jsRedirectUrl = document.getElementById("jsRedirectUrl")
31
+ const jsUseCustomPattern = document.getElementById("jsUseCustomPattern")
32
+ const jsPatternGroup = document.getElementById("jsPatternGroup")
33
+ const jsPattern = document.getElementById("jsPattern")
32
34
 
33
35
  // CSS Rule elements
34
- const cssRuleToggle = document.getElementById("cssRuleToggle");
35
- const cssRuleContent = document.getElementById("cssRuleContent");
36
- const cssRedirectUrl = document.getElementById("cssRedirectUrl");
37
- const cssReturnBlank = document.getElementById("cssReturnBlank");
38
- const cssRedirectGroup = document.getElementById("cssRedirectGroup");
39
- const cssUseCustomPattern = document.getElementById("cssUseCustomPattern");
40
- const cssPatternGroup = document.getElementById("cssPatternGroup");
41
- const cssPattern = document.getElementById("cssPattern");
36
+ const cssRuleToggle = document.getElementById("cssRuleToggle")
37
+ const cssRuleContent = document.getElementById("cssRuleContent")
38
+ const cssRedirectUrl = document.getElementById("cssRedirectUrl")
39
+ const cssReturnBlank = document.getElementById("cssReturnBlank")
40
+ const cssRedirectGroup = document.getElementById("cssRedirectGroup")
41
+ const cssUseCustomPattern = document.getElementById("cssUseCustomPattern")
42
+ const cssPatternGroup = document.getElementById("cssPatternGroup")
43
+ const cssPattern = document.getElementById("cssPattern")
42
44
 
43
45
  // Load environment-based defaults from defaults.json (generated by launch script)
44
- let envDefaults = {};
46
+ let envDefaults = {}
45
47
  try {
46
- const response = await fetch(browser.runtime.getURL("defaults.json"));
48
+ const response = await fetch(browser.runtime.getURL("defaults.json"))
47
49
  if (response.ok) {
48
- envDefaults = await response.json();
49
- console.log("[GxP DevTools] Loaded environment defaults:", envDefaults);
50
+ envDefaults = await response.json()
51
+ console.log("[GxP DevTools] Loaded environment defaults:", envDefaults)
50
52
  }
51
53
  } catch (error) {
52
- console.log("[GxP DevTools] No environment defaults found, using hardcoded defaults");
54
+ console.log(
55
+ "[GxP DevTools] No environment defaults found, using hardcoded defaults",
56
+ )
53
57
  }
54
58
 
55
59
  // Build default redirect URL from env defaults or fallback
56
- const defaultRedirectUrl = envDefaults.jsRedirectUrl || "https://localhost:3060/src/Plugin.vue";
60
+ const defaultRedirectUrl =
61
+ envDefaults.jsRedirectUrl || "https://localhost:3060/src/Plugin.vue"
57
62
 
58
63
  // Default configuration (merged with environment defaults)
59
64
  const defaultConfig = {
@@ -64,13 +69,15 @@ document.addEventListener("DOMContentLoaded", async function () {
64
69
  rules: {
65
70
  js: {
66
71
  enabled: true,
67
- pattern: "uploads\\/plugin-version\\/\\d+\\/file_name\\/.*\\.js(\\?.*)?",
72
+ pattern:
73
+ "uploads\\/plugin-version\\/\\d+\\/file_name\\/.*\\.js(\\?.*)?",
68
74
  redirectUrl: defaultRedirectUrl,
69
75
  useCustomPattern: envDefaults.jsUseCustomPattern || false,
70
76
  },
71
77
  css: {
72
78
  enabled: envDefaults.cssRuleEnabled !== false,
73
- pattern: "uploads\\/plugin-version\\/\\d+\\/style_file_name\\/.*\\.css(\\?.*)?",
79
+ pattern:
80
+ "uploads\\/plugin-version\\/\\d+\\/style_file_name\\/.*\\.css(\\?.*)?",
74
81
  redirectUrl: envDefaults.cssRedirectUrl || "",
75
82
  returnBlank: envDefaults.cssReturnBlank !== false,
76
83
  useCustomPattern: envDefaults.cssUseCustomPattern || false,
@@ -79,54 +86,59 @@ document.addEventListener("DOMContentLoaded", async function () {
79
86
  maskingMode: false,
80
87
  clearCacheOnEnable: envDefaults.clearCacheOnEnable !== false,
81
88
  disableCacheForRedirects: envDefaults.disableCacheForRedirects !== false,
82
- };
89
+ }
83
90
 
84
91
  // Load current configuration
85
- let config = {};
92
+ let config = {}
86
93
  try {
87
- const result = await browser.runtime.sendMessage({ action: "getConfig" });
94
+ const result = await browser.runtime.sendMessage({ action: "getConfig" })
88
95
 
89
96
  // Check if defaults.json has enabled=true (launched from CLI)
90
97
  // In this case, we should apply the CLI defaults over stored config
91
- const cliLaunched = envDefaults.enabled === true;
98
+ const cliLaunched = envDefaults.enabled === true
92
99
 
93
100
  if (!result || Object.keys(result).length === 0) {
94
- config = defaultConfig;
95
- console.log("[GxP DevTools] Initialized with environment defaults");
101
+ config = defaultConfig
102
+ console.log("[GxP DevTools] Initialized with environment defaults")
96
103
  } else if (cliLaunched) {
97
104
  // CLI launch - apply defaults over stored config for key settings
98
- config = { ...defaultConfig, ...result };
99
- config.enabled = true; // Force enabled when launched from CLI
100
- config = migrateConfig(config, defaultConfig);
105
+ config = { ...defaultConfig, ...result }
106
+ config.enabled = true // Force enabled when launched from CLI
107
+ config = migrateConfig(config, defaultConfig)
101
108
  // Also ensure rules use CLI defaults
102
109
  if (config.rules) {
103
- config.rules.js.useCustomPattern = envDefaults.jsUseCustomPattern !== false;
104
- config.rules.css.useCustomPattern = envDefaults.cssUseCustomPattern !== false;
105
- config.rules.css.enabled = envDefaults.cssRuleEnabled !== false;
106
- config.rules.css.returnBlank = envDefaults.cssReturnBlank !== false;
110
+ config.rules.js.useCustomPattern =
111
+ envDefaults.jsUseCustomPattern !== false
112
+ config.rules.css.useCustomPattern =
113
+ envDefaults.cssUseCustomPattern !== false
114
+ config.rules.css.enabled = envDefaults.cssRuleEnabled !== false
115
+ config.rules.css.returnBlank = envDefaults.cssReturnBlank !== false
107
116
  }
108
117
  // Save the updated config
109
- await browser.runtime.sendMessage({ action: "updateConfig", config: config });
110
- console.log("[GxP DevTools] Applied CLI defaults over stored config");
118
+ await browser.runtime.sendMessage({
119
+ action: "updateConfig",
120
+ config: config,
121
+ })
122
+ console.log("[GxP DevTools] Applied CLI defaults over stored config")
111
123
  } else {
112
- config = { ...defaultConfig, ...result };
113
- config = migrateConfig(config, defaultConfig);
124
+ config = { ...defaultConfig, ...result }
125
+ config = migrateConfig(config, defaultConfig)
114
126
  }
115
127
  } catch (error) {
116
- console.error("[GxP DevTools] Error loading config:", error);
117
- config = defaultConfig;
128
+ console.error("[GxP DevTools] Error loading config:", error)
129
+ config = defaultConfig
118
130
  }
119
131
 
120
132
  // Initialize UI
121
- updateUI();
122
- setupTabNavigation();
133
+ updateUI()
134
+ setupTabNavigation()
123
135
 
124
136
  // If CLI launched and config is enabled, notify background script to activate
125
137
  if (config.enabled) {
126
138
  browser.runtime.sendMessage({
127
139
  action: "toggleProxy",
128
140
  enabled: true,
129
- });
141
+ })
130
142
  }
131
143
 
132
144
  function migrateConfig(config, defaults = defaultConfig) {
@@ -136,7 +148,8 @@ document.addEventListener("DOMContentLoaded", async function () {
136
148
  enabled: true,
137
149
  pattern: config.urlPattern || defaults.rules.js.pattern,
138
150
  redirectUrl: config.redirectUrl || defaults.rules.js.redirectUrl,
139
- useCustomPattern: config.useCustomPattern || defaults.rules.js.useCustomPattern,
151
+ useCustomPattern:
152
+ config.useCustomPattern || defaults.rules.js.useCustomPattern,
140
153
  },
141
154
  css: {
142
155
  enabled: defaults.rules.css.enabled,
@@ -145,284 +158,292 @@ document.addEventListener("DOMContentLoaded", async function () {
145
158
  returnBlank: defaults.rules.css.returnBlank,
146
159
  useCustomPattern: defaults.rules.css.useCustomPattern,
147
160
  },
148
- };
161
+ }
149
162
  }
150
- return config;
163
+ return config
151
164
  }
152
165
 
153
166
  function setupTabNavigation() {
154
167
  tabs.forEach((tab) => {
155
168
  tab.addEventListener("click", () => {
156
- const tabName = tab.dataset.tab;
169
+ const tabName = tab.dataset.tab
157
170
 
158
171
  // Update active tab
159
- tabs.forEach((t) => t.classList.remove("active"));
160
- tab.classList.add("active");
172
+ tabs.forEach((t) => t.classList.remove("active"))
173
+ tab.classList.add("active")
161
174
 
162
175
  // Show corresponding content
163
176
  tabContents.forEach((content) => {
164
- content.classList.remove("active");
177
+ content.classList.remove("active")
165
178
  if (content.id === `${tabName}Tab`) {
166
- content.classList.add("active");
179
+ content.classList.add("active")
167
180
  }
168
- });
169
- });
170
- });
181
+ })
182
+ })
183
+ })
171
184
  }
172
185
 
173
186
  function updateUI() {
174
187
  // Update toggle button
175
188
  if (config.enabled) {
176
- toggleButton.classList.add("enabled");
177
- toggleText.textContent = "ON";
189
+ toggleButton.classList.add("enabled")
190
+ toggleText.textContent = "ON"
178
191
  } else {
179
- toggleButton.classList.remove("enabled");
180
- toggleText.textContent = "OFF";
192
+ toggleButton.classList.remove("enabled")
193
+ toggleText.textContent = "OFF"
181
194
  }
182
195
 
183
196
  // Update global settings
184
- maskingMode.checked = config.maskingMode || false;
185
- clearCacheOnEnable.checked = config.clearCacheOnEnable !== false;
186
- disableCacheForRedirects.checked = config.disableCacheForRedirects !== false;
197
+ maskingMode.checked = config.maskingMode || false
198
+ clearCacheOnEnable.checked = config.clearCacheOnEnable !== false
199
+ disableCacheForRedirects.checked = config.disableCacheForRedirects !== false
187
200
 
188
201
  // Update JS rule
189
202
  if (config.rules && config.rules.js) {
190
- jsRuleToggle.checked = config.rules.js.enabled;
191
- jsRedirectUrl.value = config.rules.js.redirectUrl || "";
192
- jsUseCustomPattern.checked = config.rules.js.useCustomPattern || false;
193
- jsPattern.value = config.rules.js.pattern || "";
203
+ jsRuleToggle.checked = config.rules.js.enabled
204
+ jsRedirectUrl.value = config.rules.js.redirectUrl || ""
205
+ jsUseCustomPattern.checked = config.rules.js.useCustomPattern || false
206
+ jsPattern.value = config.rules.js.pattern || ""
194
207
 
195
208
  // Update JS badge
196
209
  if (config.rules.js.enabled) {
197
- jsBadge.textContent = "ON";
198
- jsBadge.classList.remove("disabled");
199
- jsBadge.classList.add("enabled");
200
- jsRuleContent.classList.remove("rule-disabled");
210
+ jsBadge.textContent = "ON"
211
+ jsBadge.classList.remove("disabled")
212
+ jsBadge.classList.add("enabled")
213
+ jsRuleContent.classList.remove("rule-disabled")
201
214
  } else {
202
- jsBadge.textContent = "OFF";
203
- jsBadge.classList.remove("enabled");
204
- jsBadge.classList.add("disabled");
205
- jsRuleContent.classList.add("rule-disabled");
215
+ jsBadge.textContent = "OFF"
216
+ jsBadge.classList.remove("enabled")
217
+ jsBadge.classList.add("disabled")
218
+ jsRuleContent.classList.add("rule-disabled")
206
219
  }
207
220
 
208
221
  // Toggle custom pattern input visibility
209
222
  if (config.rules.js.useCustomPattern) {
210
- jsPatternGroup.classList.remove("hidden");
223
+ jsPatternGroup.classList.remove("hidden")
211
224
  } else {
212
- jsPatternGroup.classList.add("hidden");
225
+ jsPatternGroup.classList.add("hidden")
213
226
  }
214
227
  }
215
228
 
216
229
  // Update CSS rule
217
230
  if (config.rules && config.rules.css) {
218
- cssRuleToggle.checked = config.rules.css.enabled;
219
- cssRedirectUrl.value = config.rules.css.redirectUrl || "";
220
- cssReturnBlank.checked = config.rules.css.returnBlank || false;
221
- cssUseCustomPattern.checked = config.rules.css.useCustomPattern || false;
222
- cssPattern.value = config.rules.css.pattern || "";
231
+ cssRuleToggle.checked = config.rules.css.enabled
232
+ cssRedirectUrl.value = config.rules.css.redirectUrl || ""
233
+ cssReturnBlank.checked = config.rules.css.returnBlank || false
234
+ cssUseCustomPattern.checked = config.rules.css.useCustomPattern || false
235
+ cssPattern.value = config.rules.css.pattern || ""
223
236
 
224
237
  // Update CSS badge
225
238
  if (config.rules.css.enabled) {
226
- cssBadge.textContent = "ON";
227
- cssBadge.classList.remove("disabled");
228
- cssBadge.classList.add("enabled");
229
- cssRuleContent.classList.remove("rule-disabled");
239
+ cssBadge.textContent = "ON"
240
+ cssBadge.classList.remove("disabled")
241
+ cssBadge.classList.add("enabled")
242
+ cssRuleContent.classList.remove("rule-disabled")
230
243
  } else {
231
- cssBadge.textContent = "OFF";
232
- cssBadge.classList.remove("enabled");
233
- cssBadge.classList.add("disabled");
234
- cssRuleContent.classList.add("rule-disabled");
244
+ cssBadge.textContent = "OFF"
245
+ cssBadge.classList.remove("enabled")
246
+ cssBadge.classList.add("disabled")
247
+ cssRuleContent.classList.add("rule-disabled")
235
248
  }
236
249
 
237
250
  // Toggle redirect section based on blank return setting
238
251
  if (config.rules.css.returnBlank) {
239
- cssRedirectGroup.classList.add("hidden");
252
+ cssRedirectGroup.classList.add("hidden")
240
253
  } else {
241
- cssRedirectGroup.classList.remove("hidden");
254
+ cssRedirectGroup.classList.remove("hidden")
242
255
  }
243
256
 
244
257
  // Toggle custom pattern input visibility
245
258
  if (config.rules.css.useCustomPattern) {
246
- cssPatternGroup.classList.remove("hidden");
259
+ cssPatternGroup.classList.remove("hidden")
247
260
  } else {
248
- cssPatternGroup.classList.add("hidden");
261
+ cssPatternGroup.classList.add("hidden")
249
262
  }
250
263
  }
251
264
  }
252
265
 
253
266
  function showStatus(message, isSuccess = true) {
254
- statusMessage.textContent = message;
255
- statusMessage.className = `status ${isSuccess ? "success" : "error"}`;
267
+ statusMessage.textContent = message
268
+ statusMessage.className = `status ${isSuccess ? "success" : "error"}`
256
269
 
257
270
  setTimeout(() => {
258
- statusMessage.className = "status";
259
- }, 3000);
271
+ statusMessage.className = "status"
272
+ }, 3000)
260
273
  }
261
274
 
262
275
  function validateRedirectUrl(url) {
263
- if (!url || url.trim() === "") return null;
276
+ if (!url || url.trim() === "") return null
264
277
 
265
278
  try {
266
- new URL(url);
267
- return null;
279
+ new URL(url)
280
+ return null
268
281
  } catch {
269
- if (url.includes("://")) return "Invalid URL format";
282
+ if (url.includes("://")) return "Invalid URL format"
270
283
 
271
284
  try {
272
- new URL("https://" + url);
273
- return null;
285
+ new URL("https://" + url)
286
+ return null
274
287
  } catch {
275
- return "Invalid URL format";
288
+ return "Invalid URL format"
276
289
  }
277
290
  }
278
291
  }
279
292
 
280
293
  function validatePattern(pattern) {
281
- if (!pattern || pattern.trim() === "") return "URL pattern is required";
294
+ if (!pattern || pattern.trim() === "") return "URL pattern is required"
282
295
 
283
296
  try {
284
- new RegExp(pattern);
285
- return null;
297
+ new RegExp(pattern)
298
+ return null
286
299
  } catch {
287
- return "Invalid regular expression pattern";
300
+ return "Invalid regular expression pattern"
288
301
  }
289
302
  }
290
303
 
291
304
  function normalizeUrl(url) {
292
- if (!url || url.trim() === "") return "";
293
- if (!url.includes("://")) return "https://" + url;
294
- return url;
305
+ if (!url || url.trim() === "") return ""
306
+ if (!url.includes("://")) return "https://" + url
307
+ return url
295
308
  }
296
309
 
297
310
  // Event listeners
298
311
  toggleButton.addEventListener("click", async function () {
299
- config.enabled = !config.enabled;
312
+ config.enabled = !config.enabled
300
313
 
301
314
  try {
302
315
  const response = await browser.runtime.sendMessage({
303
316
  action: "toggleProxy",
304
317
  enabled: config.enabled,
305
- });
318
+ })
306
319
 
307
320
  if (response && response.success) {
308
- updateUI();
309
- showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled");
321
+ updateUI()
322
+ showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled")
310
323
  } else {
311
- throw new Error(response ? response.error : "Unknown error");
324
+ throw new Error(response ? response.error : "Unknown error")
312
325
  }
313
326
  } catch (error) {
314
- console.error("[GxP DevTools] Error toggling proxy:", error);
315
- showStatus("Error toggling proxy", false);
327
+ console.error("[GxP DevTools] Error toggling proxy:", error)
328
+ showStatus("Error toggling proxy", false)
316
329
  // Revert the change
317
- config.enabled = !config.enabled;
330
+ config.enabled = !config.enabled
318
331
  }
319
- });
332
+ })
320
333
 
321
334
  // Global settings event listeners
322
335
  maskingMode.addEventListener("change", function () {
323
- config.maskingMode = this.checked;
324
- });
336
+ config.maskingMode = this.checked
337
+ })
325
338
 
326
339
  clearCacheOnEnable.addEventListener("change", function () {
327
- config.clearCacheOnEnable = this.checked;
328
- });
340
+ config.clearCacheOnEnable = this.checked
341
+ })
329
342
 
330
343
  disableCacheForRedirects.addEventListener("change", function () {
331
- config.disableCacheForRedirects = this.checked;
332
- });
344
+ config.disableCacheForRedirects = this.checked
345
+ })
333
346
 
334
347
  // JS rule event listeners
335
348
  jsRuleToggle.addEventListener("change", function () {
336
- if (!config.rules) config.rules = {};
337
- if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js };
338
- config.rules.js.enabled = this.checked;
339
- updateUI();
340
- });
349
+ if (!config.rules) config.rules = {}
350
+ if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
351
+ config.rules.js.enabled = this.checked
352
+ updateUI()
353
+ })
341
354
 
342
355
  jsUseCustomPattern.addEventListener("change", function () {
343
- if (!config.rules) config.rules = {};
344
- if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js };
345
- config.rules.js.useCustomPattern = this.checked;
346
- updateUI();
347
- });
356
+ if (!config.rules) config.rules = {}
357
+ if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
358
+ config.rules.js.useCustomPattern = this.checked
359
+ updateUI()
360
+ })
348
361
 
349
362
  // CSS rule event listeners
350
363
  cssRuleToggle.addEventListener("change", function () {
351
- if (!config.rules) config.rules = {};
352
- if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css };
353
- config.rules.css.enabled = this.checked;
354
- updateUI();
355
- });
364
+ if (!config.rules) config.rules = {}
365
+ if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
366
+ config.rules.css.enabled = this.checked
367
+ updateUI()
368
+ })
356
369
 
357
370
  cssReturnBlank.addEventListener("change", function () {
358
- if (!config.rules) config.rules = {};
359
- if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css };
360
- config.rules.css.returnBlank = this.checked;
361
- updateUI();
362
- });
371
+ if (!config.rules) config.rules = {}
372
+ if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
373
+ config.rules.css.returnBlank = this.checked
374
+ updateUI()
375
+ })
363
376
 
364
377
  cssUseCustomPattern.addEventListener("change", function () {
365
- if (!config.rules) config.rules = {};
366
- if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css };
367
- config.rules.css.useCustomPattern = this.checked;
368
- updateUI();
369
- });
378
+ if (!config.rules) config.rules = {}
379
+ if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
380
+ config.rules.css.useCustomPattern = this.checked
381
+ updateUI()
382
+ })
370
383
 
371
384
  clearCacheBtn.addEventListener("click", async function () {
372
385
  try {
373
- this.textContent = "Clearing...";
374
- this.disabled = true;
386
+ this.textContent = "Clearing..."
387
+ this.disabled = true
375
388
 
376
- const response = await browser.runtime.sendMessage({ action: "clearCache" });
389
+ const response = await browser.runtime.sendMessage({
390
+ action: "clearCache",
391
+ })
377
392
 
378
393
  if (response && response.success) {
379
- showStatus("Cache cleared successfully");
394
+ showStatus("Cache cleared successfully")
380
395
  } else {
381
- showStatus("Error clearing cache: " + (response?.error || "Unknown error"), false);
396
+ showStatus(
397
+ "Error clearing cache: " + (response?.error || "Unknown error"),
398
+ false,
399
+ )
382
400
  }
383
401
  } catch (error) {
384
- console.error("[GxP DevTools] Error clearing cache:", error);
385
- showStatus("Error clearing cache", false);
402
+ console.error("[GxP DevTools] Error clearing cache:", error)
403
+ showStatus("Error clearing cache", false)
386
404
  } finally {
387
- this.textContent = "Clear Cache";
388
- this.disabled = false;
405
+ this.textContent = "Clear Cache"
406
+ this.disabled = false
389
407
  }
390
- });
408
+ })
391
409
 
392
410
  saveBtn.addEventListener("click", async function () {
393
- if (!config.rules) config.rules = {};
394
- if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js };
395
- if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css };
411
+ if (!config.rules) config.rules = {}
412
+ if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
413
+ if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
396
414
 
397
415
  // Get values from inputs
398
- const jsRedirectUrlValue = jsRedirectUrl.value.trim();
416
+ const jsRedirectUrlValue = jsRedirectUrl.value.trim()
399
417
  const jsPatternValue = config.rules.js.useCustomPattern
400
418
  ? jsPattern.value.trim()
401
- : defaultConfig.rules.js.pattern;
419
+ : defaultConfig.rules.js.pattern
402
420
 
403
- const cssRedirectUrlValue = cssRedirectUrl.value.trim();
421
+ const cssRedirectUrlValue = cssRedirectUrl.value.trim()
404
422
  const cssPatternValue = config.rules.css.useCustomPattern
405
423
  ? cssPattern.value.trim()
406
- : defaultConfig.rules.css.pattern;
424
+ : defaultConfig.rules.css.pattern
407
425
 
408
426
  // Validate JS rule if enabled
409
427
  if (config.rules.js.enabled) {
410
428
  if (!jsRedirectUrlValue) {
411
- showStatus("JavaScript redirect URL is required when JS rule is enabled", false);
412
- return;
429
+ showStatus(
430
+ "JavaScript redirect URL is required when JS rule is enabled",
431
+ false,
432
+ )
433
+ return
413
434
  }
414
435
 
415
- const jsUrlError = validateRedirectUrl(jsRedirectUrlValue);
436
+ const jsUrlError = validateRedirectUrl(jsRedirectUrlValue)
416
437
  if (jsUrlError) {
417
- showStatus("JavaScript rule: " + jsUrlError, false);
418
- return;
438
+ showStatus("JavaScript rule: " + jsUrlError, false)
439
+ return
419
440
  }
420
441
 
421
442
  if (config.rules.js.useCustomPattern) {
422
- const jsPatternError = validatePattern(jsPatternValue);
443
+ const jsPatternError = validatePattern(jsPatternValue)
423
444
  if (jsPatternError) {
424
- showStatus("JavaScript rule: " + jsPatternError, false);
425
- return;
445
+ showStatus("JavaScript rule: " + jsPatternError, false)
446
+ return
426
447
  }
427
448
  }
428
449
  }
@@ -430,106 +451,130 @@ document.addEventListener("DOMContentLoaded", async function () {
430
451
  // Validate CSS rule if enabled
431
452
  if (config.rules.css.enabled) {
432
453
  if (!config.rules.css.returnBlank && !cssRedirectUrlValue) {
433
- showStatus("CSS redirect URL is required when not returning blank", false);
434
- return;
454
+ showStatus(
455
+ "CSS redirect URL is required when not returning blank",
456
+ false,
457
+ )
458
+ return
435
459
  }
436
460
 
437
461
  if (!config.rules.css.returnBlank && cssRedirectUrlValue) {
438
- const cssUrlError = validateRedirectUrl(cssRedirectUrlValue);
462
+ const cssUrlError = validateRedirectUrl(cssRedirectUrlValue)
439
463
  if (cssUrlError) {
440
- showStatus("CSS rule: " + cssUrlError, false);
441
- return;
464
+ showStatus("CSS rule: " + cssUrlError, false)
465
+ return
442
466
  }
443
467
  }
444
468
 
445
469
  if (config.rules.css.useCustomPattern) {
446
- const cssPatternError = validatePattern(cssPatternValue);
470
+ const cssPatternError = validatePattern(cssPatternValue)
447
471
  if (cssPatternError) {
448
- showStatus("CSS rule: " + cssPatternError, false);
449
- return;
472
+ showStatus("CSS rule: " + cssPatternError, false)
473
+ return
450
474
  }
451
475
  }
452
476
  }
453
477
 
454
478
  // Update config with form values
455
- config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue);
456
- config.rules.js.pattern = jsPatternValue;
457
- config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue);
458
- config.rules.css.pattern = cssPatternValue;
479
+ config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue)
480
+ config.rules.js.pattern = jsPatternValue
481
+ config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue)
482
+ config.rules.css.pattern = cssPatternValue
459
483
 
460
484
  try {
461
- this.disabled = true;
462
- this.textContent = "Saving...";
485
+ this.disabled = true
486
+ this.textContent = "Saving..."
463
487
 
464
488
  const response = await browser.runtime.sendMessage({
465
489
  action: "updateConfig",
466
490
  config: config,
467
- });
491
+ })
468
492
 
469
493
  if (response && response.success) {
470
- updateUI();
471
- showStatus("Configuration saved successfully");
494
+ updateUI()
495
+ showStatus("Configuration saved successfully")
472
496
  } else {
473
- throw new Error(response ? response.error : "Unknown error");
497
+ throw new Error(response ? response.error : "Unknown error")
474
498
  }
475
499
  } catch (error) {
476
- console.error("[GxP DevTools] Error saving config:", error);
477
- showStatus("Error saving configuration", false);
500
+ console.error("[GxP DevTools] Error saving config:", error)
501
+ showStatus("Error saving configuration", false)
478
502
  } finally {
479
- this.disabled = false;
480
- this.textContent = "Save Configuration";
503
+ this.disabled = false
504
+ this.textContent = "Save Configuration"
481
505
  }
482
- });
506
+ })
483
507
 
484
508
  // Component Inspector
485
509
  function updateInspectorUI() {
486
510
  if (inspectorEnabled) {
487
- inspectorBadge.textContent = "ON";
488
- inspectorBadge.classList.add("enabled");
511
+ inspectorBadge.textContent = "ON"
512
+ inspectorBadge.classList.add("enabled")
489
513
  } else {
490
- inspectorBadge.textContent = "OFF";
491
- inspectorBadge.classList.remove("enabled");
514
+ inspectorBadge.textContent = "OFF"
515
+ inspectorBadge.classList.remove("enabled")
492
516
  }
493
517
  }
494
518
 
495
519
  async function getInspectorState() {
496
520
  try {
497
- const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
521
+ const [tab] = await browser.tabs.query({
522
+ active: true,
523
+ currentWindow: true,
524
+ })
498
525
  if (tab?.id) {
499
- const response = await browser.tabs.sendMessage(tab.id, { action: "getInspectorState" });
526
+ const response = await browser.tabs.sendMessage(tab.id, {
527
+ action: "getInspectorState",
528
+ })
500
529
  if (response) {
501
- inspectorEnabled = response.enabled;
502
- updateInspectorUI();
530
+ inspectorEnabled = response.enabled
531
+ updateInspectorUI()
503
532
  }
504
533
  }
505
534
  } catch (error) {
506
- console.log("[GxP DevTools] Could not get inspector state:", error);
535
+ console.log("[GxP DevTools] Could not get inspector state:", error)
507
536
  }
508
537
  }
509
538
 
510
539
  // Click on inspector card enables inspector and prompts to open DevTools
511
540
  inspectorCard.addEventListener("click", async function () {
512
541
  try {
513
- const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
542
+ const [tab] = await browser.tabs.query({
543
+ active: true,
544
+ currentWindow: true,
545
+ })
514
546
  if (tab?.id) {
515
547
  // Enable the inspector on the page
516
- const response = await browser.tabs.sendMessage(tab.id, { action: "toggleInspector" });
548
+ const response = await browser.tabs.sendMessage(tab.id, {
549
+ action: "toggleInspector",
550
+ })
517
551
  if (response) {
518
- inspectorEnabled = response.enabled;
519
- updateInspectorUI();
552
+ inspectorEnabled = response.enabled
553
+ updateInspectorUI()
520
554
  }
521
555
 
522
556
  // Log a message to the console suggesting to open DevTools
523
- browser.tabs.executeScript(tab.id, {
524
- code: `console.log('%c[GxP Inspector] Inspector enabled! Press F12 or Ctrl+Shift+J to open DevTools and see the GxP Inspector panel.', 'color: #667eea; font-weight: bold; font-size: 14px;');`
525
- }).catch(err => console.log('[GxP DevTools] Could not inject script:', err));
526
-
527
- showStatus(inspectorEnabled ? "Inspector enabled - check DevTools" : "Inspector disabled");
557
+ browser.tabs
558
+ .executeScript(tab.id, {
559
+ code: `console.log('%c[GxP Inspector] Inspector enabled! Press F12 or Ctrl+Shift+J to open DevTools and see the GxP Inspector panel.', 'color: #667eea; font-weight: bold; font-size: 14px;');`,
560
+ })
561
+ .catch((err) =>
562
+ console.log("[GxP DevTools] Could not inject script:", err),
563
+ )
564
+
565
+ showStatus(
566
+ inspectorEnabled
567
+ ? "Inspector enabled - check DevTools"
568
+ : "Inspector disabled",
569
+ )
528
570
  }
529
571
  } catch (error) {
530
- showStatus("Could not open inspector. Make sure you're on a web page.", false);
572
+ showStatus(
573
+ "Could not open inspector. Make sure you're on a web page.",
574
+ false,
575
+ )
531
576
  }
532
- });
577
+ })
533
578
 
534
- getInspectorState();
535
- });
579
+ getInspectorState()
580
+ })