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