extension-develop 4.1.30 → 4.1.31-canary.1790876576.d8ea8bc5

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 (95) hide show
  1. package/dist/105~0.mjs +34 -4
  2. package/dist/143~0.mjs +158 -0
  3. package/dist/471~0.mjs +53 -0
  4. package/dist/{672~0.mjs → 519~0.mjs} +10 -153
  5. package/dist/616~0.mjs +34 -11
  6. package/dist/{474~0.mjs → 731~0.mjs} +3 -60
  7. package/dist/832~0.mjs +212 -54
  8. package/dist/840~0.mjs +333 -124
  9. package/dist/937~0.mjs +61 -0
  10. package/dist/938~0.mjs +8 -12
  11. package/dist/950~0.mjs +156 -54
  12. package/dist/bridge-entry.d.ts +2 -2
  13. package/dist/bridge.mjs +37 -10
  14. package/dist/command-preview.d.ts +1 -0
  15. package/dist/contracts.mjs +12 -1
  16. package/dist/dev-server/control-bridge/broker.d.ts +2 -0
  17. package/dist/dev-server/control-bridge/contracts.d.ts +3 -1
  18. package/dist/dev-server/control-bridge/logs-query.d.ts +13 -3
  19. package/dist/dev-server/control-bridge/producer-runtime.d.ts +1 -1
  20. package/dist/dev-server/control-bridge/ring-buffer.d.ts +2 -0
  21. package/dist/dev-server~0.mjs +100 -74
  22. package/dist/extension-js-devtools/build-stamp.json +4 -0
  23. package/dist/extension-js-theme/build-stamp.json +4 -0
  24. package/dist/feature-scripts-content-script-wrapper.js +8 -4
  25. package/dist/feature-scripts-content-script-wrapper.mjs +8 -4
  26. package/dist/lib/addon-lint.d.ts +8 -1
  27. package/dist/lib/build-summary.d.ts +13 -0
  28. package/dist/lib/config-loader.d.ts +4 -1
  29. package/dist/lib/config-resolved-plugin.d.ts +10 -0
  30. package/dist/lib/manifest-utils.d.ts +4 -1
  31. package/dist/lib/messages.d.ts +8 -1
  32. package/dist/lib/normalize-split-chunks.d.ts +3 -0
  33. package/dist/lib/optional-deps-contracts.d.ts +1 -0
  34. package/dist/lib/project.d.ts +1 -0
  35. package/dist/lib/safari-identity.d.ts +4 -0
  36. package/dist/lib/session-paths.d.ts +1 -0
  37. package/dist/lib/split-chunks.d.ts +1 -0
  38. package/dist/manifest-entry.d.ts +1 -0
  39. package/dist/manifest.mjs +2 -0
  40. package/dist/plugin-compatibility/compatibility-lib/free-browser-references.d.ts +2 -0
  41. package/dist/plugin-compatibility/compatibility-lib/messages.d.ts +1 -0
  42. package/dist/plugin-compatibility/feature-browser-global.d.ts +9 -0
  43. package/dist/plugin-compatibility/index.d.ts +1 -0
  44. package/dist/plugin-compilation/compilation-lib/messages.d.ts +1 -0
  45. package/dist/plugin-compilation/env.d.ts +3 -0
  46. package/dist/plugin-compilation/index.d.ts +2 -0
  47. package/dist/plugin-compilation/zip.d.ts +6 -1
  48. package/dist/plugin-js-frameworks/index.d.ts +8 -0
  49. package/dist/plugin-js-frameworks/js-frameworks-lib/messages.d.ts +1 -1
  50. package/dist/plugin-js-frameworks/js-tools/react.d.ts +1 -0
  51. package/dist/plugin-js-frameworks/js-tools/solid.d.ts +22 -1
  52. package/dist/plugin-js-frameworks/js-tools/vue.d.ts +1 -0
  53. package/dist/plugin-perf-budgets/categorize.d.ts +1 -1
  54. package/dist/plugin-playwright/index.d.ts +1 -0
  55. package/dist/plugin-reload/reload-lib/dev-content-scripts.d.ts +1 -0
  56. package/dist/plugin-reload/reload-lib/scripts-replay-shim.d.ts +1 -1
  57. package/dist/plugin-special-folders/folder-extensions/resolve-dirs.d.ts +1 -0
  58. package/dist/plugin-special-folders/folder-extensions/utils.d.ts +1 -0
  59. package/dist/plugin-special-folders/folders-config.d.ts +17 -0
  60. package/dist/plugin-special-folders/get-data.d.ts +4 -3
  61. package/dist/plugin-special-folders/index.d.ts +2 -0
  62. package/dist/plugin-special-folders/resolve-public-folder.d.ts +2 -0
  63. package/dist/plugin-web-extension/feature-html/html-lib/messages.d.ts +3 -0
  64. package/dist/plugin-web-extension/feature-icons/extract-action-theme-icons.d.ts +1 -1
  65. package/dist/plugin-web-extension/feature-icons/messages.d.ts +3 -0
  66. package/dist/plugin-web-extension/feature-json/messages.d.ts +3 -0
  67. package/dist/plugin-web-extension/feature-manifest/manifest-lib/sanitize-fatal-shapes.d.ts +6 -0
  68. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/chrome_url_overrides.d.ts +1 -1
  69. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/devtools_page.d.ts +1 -1
  70. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/options_page.d.ts +1 -1
  71. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/options_ui.d.ts +1 -1
  72. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/page_action.d.ts +1 -1
  73. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/sandbox.d.ts +1 -1
  74. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/sidebar_action.d.ts +1 -1
  75. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/common/theme.d.ts +1 -1
  76. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/browser_action.d.ts +1 -1
  77. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/chrome_settings_overrides.d.ts +1 -1
  78. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/index.d.ts +1 -1
  79. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv2/theme_experiment.d.ts +1 -1
  80. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/action.d.ts +1 -1
  81. package/dist/plugin-web-extension/feature-manifest/manifest-overrides/mv3/side_panel.d.ts +1 -1
  82. package/dist/plugin-web-extension/feature-manifest/messages.d.ts +1 -0
  83. package/dist/plugin-web-extension/feature-manifest/normalize-manifest-path.d.ts +1 -1
  84. package/dist/plugin-web-extension/feature-manifest/steps/warn-undeclared-permissions.d.ts +9 -0
  85. package/dist/plugin-web-extension/feature-scripts/messages.d.ts +2 -1
  86. package/dist/plugin-web-extension/feature-scripts/steps/add-scripts.d.ts +1 -0
  87. package/dist/plugin-web-extension/feature-scripts/steps/compile-main-world-scripts.d.ts +15 -0
  88. package/dist/plugin-web-extension/feature-scripts/steps/trace-runtime-loaded-files.d.ts +14 -0
  89. package/dist/plugin-web-extension/shared/html-surfaces.d.ts +13 -2
  90. package/dist/plugin-web-extension/shared/manifest-fields.d.ts +1 -0
  91. package/dist/plugin-web-extension/shared/manifest-path-assets.d.ts +3 -3
  92. package/dist/plugin-web-extension/shared/paths.d.ts +1 -0
  93. package/dist/rspack-config~0.mjs +1748 -731
  94. package/dist/types.d.ts +47 -16
  95. package/package.json +10 -1
package/dist/105~0.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
+ import { publicFolderSetting } from "./471~0.mjs";
2
3
  import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
3
4
  import * as __rspack_external_node_path_806ed179 from "node:path";
4
5
  function isUsableDir(candidate) {
@@ -11,11 +12,12 @@ function isUsableDir(candidate) {
11
12
  }
12
13
  }
13
14
  function inspectPublicFolders(manifestPath, projectRoot) {
15
+ const setting = publicFolderSetting(projectRoot);
14
16
  const fromManifest = __rspack_external_node_path_806ed179.join(__rspack_external_node_path_806ed179.dirname(manifestPath), 'public');
15
- const fromRoot = projectRoot ? __rspack_external_node_path_806ed179.join(projectRoot, 'public') : fromManifest;
17
+ const fromRoot = 'path' === setting.kind ? setting.dir : projectRoot ? __rspack_external_node_path_806ed179.join(projectRoot, 'public') : fromManifest;
16
18
  const sameLocation = __rspack_external_node_path_806ed179.resolve(fromRoot) === __rspack_external_node_path_806ed179.resolve(fromManifest);
17
- const rootOk = isUsableDir(fromRoot);
18
- const manifestOk = !sameLocation && isUsableDir(fromManifest);
19
+ const rootOk = 'off' !== setting.kind && isUsableDir(fromRoot);
20
+ const manifestOk = 'default' === setting.kind && !sameLocation && isUsableDir(fromManifest);
19
21
  return {
20
22
  publicDir: rootOk ? fromRoot : manifestOk ? fromManifest : void 0,
21
23
  fromRoot,
@@ -27,11 +29,39 @@ function inspectPublicFolders(manifestPath, projectRoot) {
27
29
  function resolvePublicFolder(manifestPath, projectRoot) {
28
30
  return inspectPublicFolders(manifestPath, projectRoot).publicDir;
29
31
  }
32
+ function isUsableFile(candidate) {
33
+ try {
34
+ if (!__rspack_external_node_fs_1b05aee1.existsSync(candidate)) return false;
35
+ const stat = __rspack_external_node_fs_1b05aee1.statSync(candidate);
36
+ return 'function' == typeof stat?.isFile ? stat.isFile() : true;
37
+ } catch {
38
+ return false;
39
+ }
40
+ }
41
+ function publicRelativePath(ref) {
42
+ return String(ref || '').replace(/\\/g, '/').replace(/^(?:\/public\/|(?:\.\/)?public\/)/i, '').replace(/^\.\//, '').replace(/^\/+/, '');
43
+ }
44
+ function findPublicFile(manifestPath, projectRoot, ref) {
45
+ const rel = publicRelativePath(ref);
46
+ if (!rel || rel.split('/').includes('..') || __rspack_external_node_path_806ed179.isAbsolute(rel)) return;
47
+ const { publicDir } = inspectPublicFolders(manifestPath, projectRoot);
48
+ if (!publicDir) return;
49
+ const candidate = __rspack_external_node_path_806ed179.join(publicDir, rel);
50
+ return isUsableFile(candidate) ? candidate : void 0;
51
+ }
30
52
  function publicFolderOrDefault(manifestPath, projectRoot) {
31
53
  return resolvePublicFolder(manifestPath, projectRoot) || __rspack_external_node_path_806ed179.join(projectRoot, 'public');
32
54
  }
33
55
  function publicResolveRoots(projectRoot, manifestPath) {
56
+ const setting = publicFolderSetting(projectRoot);
34
57
  const manifestDir = __rspack_external_node_path_806ed179.dirname(manifestPath);
58
+ if ('off' === setting.kind) return [
59
+ manifestDir
60
+ ];
61
+ if ('path' === setting.kind) return [
62
+ setting.dir,
63
+ manifestDir
64
+ ];
35
65
  const fromRoot = __rspack_external_node_path_806ed179.join(projectRoot, 'public');
36
66
  const fromManifest = __rspack_external_node_path_806ed179.join(manifestDir, 'public');
37
67
  const roots = [
@@ -49,4 +79,4 @@ function publicRootsFor(compiler) {
49
79
  if (!compiler) return [];
50
80
  return publicRootsByCompiler.get(compiler) || [];
51
81
  }
52
- export { inspectPublicFolders, publicFolderOrDefault, publicResolveRoots, publicRootsFor, rememberPublicRoots };
82
+ export { findPublicFile, inspectPublicFolders, publicFolderOrDefault, publicRelativePath, publicResolveRoots, publicRootsFor, rememberPublicRoots };
package/dist/143~0.mjs ADDED
@@ -0,0 +1,158 @@
1
+ import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
+ import { isChromiumBasedBrowser, parseJsonSafe, isGeckoBasedBrowser } from "./937~0.mjs";
3
+ import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
4
+ const CHROMIUM_VENDOR_PREFIXES = [
5
+ 'chrome',
6
+ 'edge'
7
+ ];
8
+ function classifyPrefixes(browser) {
9
+ const isSafariTarget = 'safari' === browser || 'webkit-based' === browser || String(browser).includes('webkit');
10
+ const isChromiumTarget = isChromiumBasedBrowser(String(browser)) || isSafariTarget;
11
+ const isGeckoTarget = isGeckoBasedBrowser(String(browser));
12
+ const chromiumPrefixes = new Set([
13
+ 'chromium'
14
+ ]);
15
+ const geckoPrefixes = new Set([
16
+ 'gecko',
17
+ 'firefox'
18
+ ]);
19
+ const webkitPrefixes = new Set([
20
+ 'safari',
21
+ 'webkit'
22
+ ]);
23
+ const isFamilyPrefix = (prefix)=>isChromiumTarget && chromiumPrefixes.has(prefix) || isGeckoTarget && geckoPrefixes.has(prefix);
24
+ const isSpecificPrefix = (prefix)=>prefix === browser || isSafariTarget && webkitPrefixes.has(prefix);
25
+ return {
26
+ isChromiumTarget,
27
+ isFamilyPrefix,
28
+ isSpecificPrefix
29
+ };
30
+ }
31
+ function filterKeysForThisBrowser(manifest, browser, options = {}) {
32
+ const { isFamilyPrefix, isSpecificPrefix } = classifyPrefixes(browser);
33
+ const fallbackPrefixes = new Set((options.fallbacks || []).map((prefix)=>prefix.replace(/:$/, '')));
34
+ const resolve = (node)=>{
35
+ if (Array.isArray(node)) return node.map((item)=>resolve(item));
36
+ if (node && 'object' == typeof node) {
37
+ const result = new Map();
38
+ const fallbackMatches = new Map();
39
+ const familyMatches = new Map();
40
+ const specificMatches = new Map();
41
+ for (const [key, value] of Object.entries(node)){
42
+ const indexOfColon = key.indexOf(':');
43
+ if (-1 === indexOfColon) {
44
+ result.set(key, resolve(value));
45
+ continue;
46
+ }
47
+ const prefix = key.substring(0, indexOfColon);
48
+ const strippedKey = key.substring(indexOfColon + 1);
49
+ if (isSpecificPrefix(prefix)) specificMatches.set(strippedKey, resolve(value));
50
+ else if (isFamilyPrefix(prefix)) familyMatches.set(strippedKey, resolve(value));
51
+ else if (fallbackPrefixes.has(prefix)) fallbackMatches.set(strippedKey, resolve(value));
52
+ }
53
+ for (const [strippedKey, value] of fallbackMatches)result.set(strippedKey, value);
54
+ for (const [strippedKey, value] of familyMatches)result.set(strippedKey, value);
55
+ for (const [strippedKey, value] of specificMatches)result.set(strippedKey, value);
56
+ return Object.fromEntries(result);
57
+ }
58
+ return node;
59
+ };
60
+ return resolve(manifest);
61
+ }
62
+ function findDroppedVendorKeys(manifest, browser) {
63
+ const { isChromiumTarget, isFamilyPrefix, isSpecificPrefix } = classifyPrefixes(browser);
64
+ const found = [];
65
+ if (!isChromiumTarget) return found;
66
+ const vendors = new Set(CHROMIUM_VENDOR_PREFIXES);
67
+ const formerFamily = new Set([
68
+ 'chromium',
69
+ ...vendors
70
+ ]);
71
+ const join = (at, key)=>at ? `${at}.${key}` : key;
72
+ const walk = (node, at)=>{
73
+ if (Array.isArray(node)) {
74
+ for (const [index, item] of node.entries())walk(item, join(at, String(index)));
75
+ return;
76
+ }
77
+ if (!node || 'object' != typeof node) return;
78
+ const lastFormerFamily = new Map();
79
+ const hasSpecific = new Set();
80
+ const hasSibling = new Set();
81
+ for (const key of Object.keys(node)){
82
+ const colon = key.indexOf(':');
83
+ if (-1 === colon) {
84
+ hasSibling.add(key);
85
+ continue;
86
+ }
87
+ const prefix = key.substring(0, colon);
88
+ const strippedKey = key.substring(colon + 1);
89
+ if (isSpecificPrefix(prefix)) hasSpecific.add(strippedKey);
90
+ else if ('chromium' === prefix) hasSibling.add(strippedKey);
91
+ if (formerFamily.has(prefix)) lastFormerFamily.set(strippedKey, key);
92
+ }
93
+ for (const [key, value] of Object.entries(node)){
94
+ const colon = key.indexOf(':');
95
+ if (-1 === colon) {
96
+ walk(value, join(at, key));
97
+ continue;
98
+ }
99
+ const prefix = key.substring(0, colon);
100
+ const strippedKey = key.substring(colon + 1);
101
+ if (isSpecificPrefix(prefix) || isFamilyPrefix(prefix)) walk(value, join(at, key));
102
+ else if (vendors.has(prefix)) found.push({
103
+ path: join(at, key),
104
+ familyPath: join(at, `chromium:${strippedKey}`),
105
+ vendor: prefix,
106
+ appliedBefore: !hasSpecific.has(strippedKey) && !hasSibling.has(strippedKey) && lastFormerFamily.get(strippedKey) === key
107
+ });
108
+ }
109
+ };
110
+ walk(manifest, '');
111
+ return found;
112
+ }
113
+ function isValidManifestVersion(value) {
114
+ return 2 === value || 3 === value;
115
+ }
116
+ function findPrefixedManifestVersionKeys(manifest) {
117
+ if (!manifest || 'object' != typeof manifest) return [];
118
+ return Object.keys(manifest).filter((key)=>{
119
+ const colon = key.indexOf(':');
120
+ return colon > 0 && 'manifest_version' === key.substring(colon + 1);
121
+ });
122
+ }
123
+ const THEME_DISQUALIFYING_KEYS = [
124
+ 'background',
125
+ "content_scripts",
126
+ 'action',
127
+ 'browser_action',
128
+ 'page_action',
129
+ 'sidebar_action',
130
+ 'side_panel',
131
+ 'options_page',
132
+ 'options_ui',
133
+ 'devtools_page',
134
+ 'chrome_url_overrides',
135
+ 'sandbox',
136
+ "user_scripts",
137
+ 'declarative_net_request',
138
+ 'web_accessible_resources'
139
+ ];
140
+ function isStaticTheme(manifest) {
141
+ if (!manifest || 'object' != typeof manifest) return false;
142
+ const theme = manifest.theme;
143
+ if (!theme || 'object' != typeof theme) return false;
144
+ return !THEME_DISQUALIFYING_KEYS.some((key)=>{
145
+ const value = manifest[key];
146
+ return null != value;
147
+ });
148
+ }
149
+ function isStaticThemeSource(manifestPath, browser) {
150
+ if (!manifestPath) return false;
151
+ try {
152
+ const parsed = parseJsonSafe(__rspack_external_node_fs_1b05aee1.readFileSync(manifestPath, 'utf-8'));
153
+ return isStaticTheme(filterKeysForThisBrowser(parsed, browser));
154
+ } catch {
155
+ return false;
156
+ }
157
+ }
158
+ export { filterKeysForThisBrowser, findDroppedVendorKeys, findPrefixedManifestVersionKeys, isStaticTheme, isStaticThemeSource, isValidManifestVersion };
package/dist/471~0.mjs ADDED
@@ -0,0 +1,53 @@
1
+ import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
+ import * as __rspack_external_node_path_806ed179 from "node:path";
3
+ const foldersByProjectRoot = new Map();
4
+ function rememberSpecialFoldersConfig(projectRoot, folders) {
5
+ if (!projectRoot) return;
6
+ if (folders) foldersByProjectRoot.set(__rspack_external_node_path_806ed179.resolve(projectRoot), folders);
7
+ else foldersByProjectRoot.delete(__rspack_external_node_path_806ed179.resolve(projectRoot));
8
+ }
9
+ function rememberedFolders(projectRoot) {
10
+ if (!projectRoot) return {};
11
+ return foldersByProjectRoot.get(__rspack_external_node_path_806ed179.resolve(projectRoot)) || {};
12
+ }
13
+ const SCRIPTS_FOLDER_EXTENSIONS = new Set([
14
+ '.js',
15
+ '.mjs',
16
+ '.jsx',
17
+ '.mjsx',
18
+ '.ts',
19
+ '.mts',
20
+ '.tsx',
21
+ '.mtsx'
22
+ ]);
23
+ function isScriptsFolderEntry(filePath) {
24
+ return SCRIPTS_FOLDER_EXTENSIONS.has(__rspack_external_node_path_806ed179.extname(filePath).toLowerCase());
25
+ }
26
+ function foldersRoots(projectRoot) {
27
+ const folders = rememberedFolders(projectRoot);
28
+ const roots = {};
29
+ for (const name of [
30
+ 'pages',
31
+ "scripts"
32
+ ]){
33
+ const setting = folders[name];
34
+ if (false === setting) continue;
35
+ const root = 'string' == typeof setting && setting.trim() ? __rspack_external_node_path_806ed179.resolve(projectRoot, setting) : __rspack_external_node_path_806ed179.join(projectRoot, name);
36
+ if (__rspack_external_node_path_806ed179.basename(root) === name) roots[name] = root;
37
+ }
38
+ return roots;
39
+ }
40
+ function publicFolderSetting(projectRoot) {
41
+ const setting = rememberedFolders(projectRoot).public;
42
+ if (false === setting) return {
43
+ kind: 'off'
44
+ };
45
+ if ('string' == typeof setting && setting.trim() && projectRoot) return {
46
+ kind: 'path',
47
+ dir: __rspack_external_node_path_806ed179.resolve(projectRoot, setting)
48
+ };
49
+ return {
50
+ kind: 'default'
51
+ };
52
+ }
53
+ export { foldersRoots, isScriptsFolderEntry, publicFolderSetting, rememberSpecialFoldersConfig, rememberedFolders };
@@ -1,153 +1,6 @@
1
1
  import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
2
  import pintor from "pintor";
3
- import { isChromiumBasedBrowser, parseJsonSafe, isGeckoBasedBrowser } from "./474~0.mjs";
4
- import { prefix as messaging_prefix } from "./852~0.mjs";
5
- import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
6
- const CHROMIUM_VENDOR_PREFIXES = [
7
- 'chrome',
8
- 'edge'
9
- ];
10
- function classifyPrefixes(browser) {
11
- const isSafariTarget = 'safari' === browser || 'webkit-based' === browser || String(browser).includes('webkit');
12
- const isChromiumTarget = isChromiumBasedBrowser(String(browser)) || isSafariTarget;
13
- const isGeckoTarget = isGeckoBasedBrowser(String(browser));
14
- const chromiumPrefixes = new Set([
15
- 'chromium'
16
- ]);
17
- const geckoPrefixes = new Set([
18
- 'gecko',
19
- 'firefox'
20
- ]);
21
- const webkitPrefixes = new Set([
22
- 'safari',
23
- 'webkit'
24
- ]);
25
- const isFamilyPrefix = (prefix)=>isChromiumTarget && chromiumPrefixes.has(prefix) || isGeckoTarget && geckoPrefixes.has(prefix);
26
- const isSpecificPrefix = (prefix)=>prefix === browser || isSafariTarget && webkitPrefixes.has(prefix);
27
- return {
28
- isChromiumTarget,
29
- isFamilyPrefix,
30
- isSpecificPrefix
31
- };
32
- }
33
- function filterKeysForThisBrowser(manifest, browser) {
34
- const { isFamilyPrefix, isSpecificPrefix } = classifyPrefixes(browser);
35
- const resolve = (node)=>{
36
- if (Array.isArray(node)) return node.map((item)=>resolve(item));
37
- if (node && 'object' == typeof node) {
38
- const result = new Map();
39
- const familyMatches = new Map();
40
- const specificMatches = new Map();
41
- for (const [key, value] of Object.entries(node)){
42
- const indexOfColon = key.indexOf(':');
43
- if (-1 === indexOfColon) {
44
- result.set(key, resolve(value));
45
- continue;
46
- }
47
- const prefix = key.substring(0, indexOfColon);
48
- const strippedKey = key.substring(indexOfColon + 1);
49
- if (isSpecificPrefix(prefix)) specificMatches.set(strippedKey, resolve(value));
50
- else if (isFamilyPrefix(prefix)) familyMatches.set(strippedKey, resolve(value));
51
- }
52
- for (const [strippedKey, value] of familyMatches)result.set(strippedKey, value);
53
- for (const [strippedKey, value] of specificMatches)result.set(strippedKey, value);
54
- return Object.fromEntries(result);
55
- }
56
- return node;
57
- };
58
- return resolve(manifest);
59
- }
60
- function findDroppedVendorKeys(manifest, browser) {
61
- const { isChromiumTarget, isFamilyPrefix, isSpecificPrefix } = classifyPrefixes(browser);
62
- const found = [];
63
- if (!isChromiumTarget) return found;
64
- const vendors = new Set(CHROMIUM_VENDOR_PREFIXES);
65
- const formerFamily = new Set([
66
- 'chromium',
67
- ...vendors
68
- ]);
69
- const join = (at, key)=>at ? `${at}.${key}` : key;
70
- const walk = (node, at)=>{
71
- if (Array.isArray(node)) {
72
- for (const [index, item] of node.entries())walk(item, join(at, String(index)));
73
- return;
74
- }
75
- if (!node || 'object' != typeof node) return;
76
- const lastFormerFamily = new Map();
77
- const hasSpecific = new Set();
78
- for (const key of Object.keys(node)){
79
- const colon = key.indexOf(':');
80
- if (-1 === colon) continue;
81
- const prefix = key.substring(0, colon);
82
- const strippedKey = key.substring(colon + 1);
83
- if (isSpecificPrefix(prefix)) hasSpecific.add(strippedKey);
84
- else if (formerFamily.has(prefix)) lastFormerFamily.set(strippedKey, key);
85
- }
86
- for (const [key, value] of Object.entries(node)){
87
- const colon = key.indexOf(':');
88
- if (-1 === colon) {
89
- walk(value, join(at, key));
90
- continue;
91
- }
92
- const prefix = key.substring(0, colon);
93
- const strippedKey = key.substring(colon + 1);
94
- if (isSpecificPrefix(prefix) || isFamilyPrefix(prefix)) walk(value, join(at, key));
95
- else if (vendors.has(prefix)) found.push({
96
- path: join(at, key),
97
- familyPath: join(at, `chromium:${strippedKey}`),
98
- vendor: prefix,
99
- appliedBefore: !hasSpecific.has(strippedKey) && lastFormerFamily.get(strippedKey) === key
100
- });
101
- }
102
- };
103
- walk(manifest, '');
104
- return found;
105
- }
106
- function isValidManifestVersion(value) {
107
- return 2 === value || 3 === value;
108
- }
109
- function findPrefixedManifestVersionKeys(manifest) {
110
- if (!manifest || 'object' != typeof manifest) return [];
111
- return Object.keys(manifest).filter((key)=>{
112
- const colon = key.indexOf(':');
113
- return colon > 0 && 'manifest_version' === key.substring(colon + 1);
114
- });
115
- }
116
- const THEME_DISQUALIFYING_KEYS = [
117
- 'background',
118
- "content_scripts",
119
- 'action',
120
- 'browser_action',
121
- 'page_action',
122
- 'sidebar_action',
123
- 'side_panel',
124
- 'options_page',
125
- 'options_ui',
126
- 'devtools_page',
127
- 'chrome_url_overrides',
128
- 'sandbox',
129
- "user_scripts",
130
- 'declarative_net_request',
131
- 'web_accessible_resources'
132
- ];
133
- function isStaticTheme(manifest) {
134
- if (!manifest || 'object' != typeof manifest) return false;
135
- const theme = manifest.theme;
136
- if (!theme || 'object' != typeof theme) return false;
137
- return !THEME_DISQUALIFYING_KEYS.some((key)=>{
138
- const value = manifest[key];
139
- return null != value;
140
- });
141
- }
142
- function isStaticThemeSource(manifestPath, browser) {
143
- if (!manifestPath) return false;
144
- try {
145
- const parsed = parseJsonSafe(__rspack_external_node_fs_1b05aee1.readFileSync(manifestPath, 'utf-8'));
146
- return isStaticTheme(filterKeysForThisBrowser(parsed, browser));
147
- } catch {
148
- return false;
149
- }
150
- }
3
+ import { prefix } from "./852~0.mjs";
151
4
  function importScriptsDependencyMissing(workerPath, literal, expectedPath, sourceSibling) {
152
5
  const lines = [];
153
6
  lines.push(`The background service worker calls importScripts('${literal}'), but the file isn't in the output.`);
@@ -196,7 +49,11 @@ const SPLIT_ENTRY_SURFACES = {
196
49
  effect: "the script never runs"
197
50
  }
198
51
  };
199
- function entrySplitAcrossInitialFiles(entryName, surface, ownFile, extraFiles) {
52
+ const SPLIT_ENTRY_CAUSES = {
53
+ runtimeChunk: ()=>"Only a user-set optimization.runtimeChunk does this. Keep runtimeChunk: false so every entry carries its own runtime",
54
+ cacheGroup: ()=>"Only a user-set optimization.splitChunks cache group does this. Use chunks: 'async' and import() the shared module"
55
+ };
56
+ function entrySplitAcrossInitialFiles(entryName, surface, ownFile, extraFiles, cause = 'cacheGroup') {
200
57
  const shape = SPLIT_ENTRY_SURFACES[surface];
201
58
  const count = extraFiles.length + 1;
202
59
  const lines = [];
@@ -204,7 +61,7 @@ function entrySplitAcrossInitialFiles(entryName, surface, ownFile, extraFiles) {
204
61
  lines.push(`${pintor.gray('LOADED')} ${pintor.underline(ownFile)}`);
205
62
  lines.push(`${pintor.gray('NOT LOADED')} ${extraFiles.map((file)=>pintor.underline(file)).join(', ')}`);
206
63
  lines.push(`The entry waits for the other files at runtime and never runs, so ${shape.effect}.`);
207
- lines.push(`Only a user-set optimization.splitChunks cache group does this. Use chunks: 'async' and import() the shared module: ${pintor.blue(SPLIT_ENTRY_RECIPE_URL)}`);
64
+ lines.push(`${SPLIT_ENTRY_CAUSES[cause]()}: ${pintor.blue(SPLIT_ENTRY_RECIPE_URL)}`);
208
65
  return lines.join('\n');
209
66
  }
210
67
  const PAGE_CONTEXT_SURFACES = {
@@ -238,7 +95,7 @@ function getURLDependencyMissing(assetName, literal, expectedPath) {
238
95
  }
239
96
  function runtimeSetSurfaceDependencyMissing(assetName, literal, expectedPath) {
240
97
  const lines = [];
241
- lines.push(`${assetName} sets '${literal}' as a runtime surface (setPopup/setOptions), but the file isn't in the output.`);
98
+ lines.push(`${assetName} names '${literal}' at runtime (setPopup, setIcon, panels.create, tabs.create and friends), but the file isn't in the output.`);
242
99
  lines.push(`${pintor.gray('NOT FOUND')} ${pintor.underline(expectedPath)}`);
243
100
  lines.push("The surface opens a 404 at runtime.");
244
101
  lines.push(`Move the file to ${pintor.blue(expectedPath)} or ${pintor.blue('public/')} so it ships with the extension.`);
@@ -254,7 +111,7 @@ function staticImportDependencyMissing(assetName, literal, expectedPath) {
254
111
  }
255
112
  function reservedScriptsFolder(relPath, indicators) {
256
113
  const reasons = indicators.map((r)=>`- ${pintor.gray(r)}`).join('\n');
257
- return `${messaging_prefix('error')} scripts/ is a reserved folder in Extension.js.\n${pintor.gray('PATH')} ${pintor.underline(relPath)}\nEvery file under ${pintor.blue("scripts/")} is wrapped with the browser content-script mount runtime, so Node.js-only files placed here fail to parse or run.\nThis file looks Node.js-only:\n${reasons}\nRename the folder at the project root (for example ${pintor.blue('bin/')}, ${pintor.blue('tools/')}, or ${pintor.blue('tasks/')}), or move the file out of scripts/.`;
114
+ return `${prefix('error')} scripts/ is a reserved folder in Extension.js.\n${pintor.gray('PATH')} ${pintor.underline(relPath)}\nEvery file under ${pintor.blue("scripts/")} is wrapped with the browser content-script mount runtime, so Node.js-only files placed here fail to parse or run.\nThis file looks Node.js-only:\n${reasons}\nRename the folder at the project root (for example ${pintor.blue('bin/')}, ${pintor.blue('tools/')}, or ${pintor.blue('tasks/')}), or move the file out of scripts/.`;
258
115
  }
259
116
  function compiledSourceSpelling(assetName, api, literal, emittedPath) {
260
117
  const lines = [];
@@ -265,4 +122,4 @@ function compiledSourceSpelling(assetName, api, literal, emittedPath) {
265
122
  lines.push(`Reference the emitted path: ${pintor.blue(emittedPath)}.`);
266
123
  return lines.join('\n');
267
124
  }
268
- export { compiledSourceSpelling, entrySplitAcrossInitialFiles, fetchedFileDependencyMissing, filterKeysForThisBrowser, findDroppedVendorKeys, findPrefixedManifestVersionKeys, getURLDependencyMissing, importScriptsDependencyMissing, injectedCompiledSourceLiteral, injectedFileDependencyMissing, isStaticTheme, isStaticThemeSource, isValidManifestVersion, reservedScriptsFolder, runtimeSetSurfaceDependencyMissing, staticImportDependencyMissing, workerStartedFromPageContext };
125
+ export { compiledSourceSpelling, entrySplitAcrossInitialFiles, fetchedFileDependencyMissing, getURLDependencyMissing, importScriptsDependencyMissing, injectedCompiledSourceLiteral, injectedFileDependencyMissing, reservedScriptsFolder, runtimeSetSurfaceDependencyMissing, staticImportDependencyMissing, workerStartedFromPageContext };
package/dist/616~0.mjs CHANGED
@@ -1,8 +1,19 @@
1
1
  import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
- import { controlTokenPath, legacyControlTokenPath } from "./950~0.mjs";
2
+ import { CONTROL_TOKEN_FILE_PREFIX, controlTokenPath, legacyControlTokenPath, sessionStateDir } from "./950~0.mjs";
3
3
  import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
4
4
  import * as __rspack_external_node_path_806ed179 from "node:path";
5
5
  import * as __rspack_external_node_crypto_2e7c4b46 from "node:crypto";
6
+ const LOG_CONTEXTS = [
7
+ 'background',
8
+ 'content',
9
+ 'popup',
10
+ 'options',
11
+ 'sidebar',
12
+ 'devtools',
13
+ 'newtab',
14
+ 'history',
15
+ 'bookmarks'
16
+ ];
6
17
  const REFUSAL_NEEDS_HEADED_WINDOW = 'needs_headed_window';
7
18
  const REFUSAL_NEEDS_USER_GESTURE = 'needs_user_gesture';
8
19
  const REFUSAL_SURFACE_NOT_OPEN = 'surface_not_open';
@@ -40,22 +51,34 @@ function writeControlToken(projectPath, browser) {
40
51
  __rspack_external_node_fs_1b05aee1.chmodSync(file, 384);
41
52
  } catch {}
42
53
  try {
43
- __rspack_external_node_fs_1b05aee1.writeFileSync(legacyControlTokenPath(projectPath), token, {
54
+ const legacy = legacyControlTokenPath(projectPath);
55
+ __rspack_external_node_fs_1b05aee1.writeFileSync(legacy, token, {
44
56
  encoding: 'utf-8',
45
57
  mode: 384
46
58
  });
59
+ __rspack_external_node_fs_1b05aee1.chmodSync(legacy, 384);
47
60
  } catch {}
48
61
  return token;
49
62
  }
63
+ function readTokenFile(file) {
64
+ try {
65
+ return __rspack_external_node_fs_1b05aee1.readFileSync(file, 'utf-8').trim() || null;
66
+ } catch {
67
+ return null;
68
+ }
69
+ }
70
+ function hasAnyPerBrowserToken(projectPath) {
71
+ try {
72
+ return __rspack_external_node_fs_1b05aee1.readdirSync(sessionStateDir(projectPath)).some((name)=>name.startsWith(CONTROL_TOKEN_FILE_PREFIX));
73
+ } catch {
74
+ return false;
75
+ }
76
+ }
50
77
  function readControlToken(projectPath, browser) {
51
- for (const file of [
52
- controlTokenPath(projectPath, browser),
53
- legacyControlTokenPath(projectPath)
54
- ])try {
55
- const token = __rspack_external_node_fs_1b05aee1.readFileSync(file, 'utf-8').trim();
56
- if (token.length) return token;
57
- } catch {}
58
- return null;
78
+ const token = readTokenFile(controlTokenPath(projectPath, browser));
79
+ if (token) return token;
80
+ if (hasAnyPerBrowserToken(projectPath)) return null;
81
+ return readTokenFile(legacyControlTokenPath(projectPath));
59
82
  }
60
83
  function clearControlToken(projectPath, browser) {
61
84
  const file = controlTokenPath(projectPath, browser);
@@ -75,4 +98,4 @@ function clearControlToken(projectPath, browser) {
75
98
  });
76
99
  } catch {}
77
100
  }
78
- export { CONTROL_WS_PATH, REFUSAL_API_UNAVAILABLE, REFUSAL_NEEDS_HEADED_WINDOW, REFUSAL_NEEDS_USER_GESTURE, REFUSAL_SURFACE_NOT_OPEN, REFUSAL_TAB_NOT_FOUND, REFUSAL_URL_REFUSED, clearControlToken, readControlToken, readPersistedControlPort, writeControlToken, writePersistedControlPort };
101
+ export { CONTROL_WS_PATH, LOG_CONTEXTS, REFUSAL_API_UNAVAILABLE, REFUSAL_NEEDS_HEADED_WINDOW, REFUSAL_NEEDS_USER_GESTURE, REFUSAL_SURFACE_NOT_OPEN, REFUSAL_TAB_NOT_FOUND, REFUSAL_URL_REFUSED, clearControlToken, readControlToken, readPersistedControlPort, writeControlToken, writePersistedControlPort };
@@ -1,64 +1,7 @@
1
1
  import { createRequire as __extjsCreateRequire } from "node:module"; const require = __extjsCreateRequire(import.meta.url);
2
- import * as __rspack_external_node_path_806ed179 from "node:path";
2
+ import { stripBom } from "./937~0.mjs";
3
3
  import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
4
- __rspack_external_node_path_806ed179.join(process.cwd(), 'node_modules/extension-develop/dist/certs');
5
- const CHROMIUM_BASED_BROWSERS = [
6
- 'chrome',
7
- 'edge',
8
- 'brave',
9
- 'opera',
10
- 'vivaldi',
11
- 'yandex'
12
- ];
13
- const GECKO_BASED_BROWSERS = [
14
- 'firefox',
15
- 'waterfox',
16
- 'librewolf',
17
- 'zen',
18
- 'floorp'
19
- ];
20
- const WEBKIT_BASED_BROWSERS = [
21
- 'safari'
22
- ];
23
- const CHROMIUM_FAMILY_ALIASES = [
24
- 'chromium',
25
- 'chrome',
26
- 'edge',
27
- 'chromium-based'
28
- ];
29
- const GECKO_FAMILY_ALIASES = [
30
- 'firefox',
31
- 'gecko-based'
32
- ];
33
- const EMULATOR_BROWSER = 'chromium-emulator';
34
- function isEmulatorLaneEnabled(env = process.env) {
35
- const value = String(env.EXTENSION_EXPERIMENTAL_EMULATOR || '').trim().toLowerCase();
36
- return '1' === value || 'true' === value;
37
- }
38
- function isEmulatorBrowser(browser) {
39
- return browser === EMULATOR_BROWSER;
40
- }
41
- [
42
- ...CHROMIUM_BASED_BROWSERS,
43
- ...GECKO_BASED_BROWSERS
44
- ];
45
- function isChromiumBasedBrowser(browser) {
46
- return CHROMIUM_BASED_BROWSERS.includes(browser) || String(browser).includes('chromium');
47
- }
48
- function isGeckoBasedBrowser(browser) {
49
- return GECKO_BASED_BROWSERS.includes(browser) || String(browser).includes('gecko') || String(browser).includes('firefox');
50
- }
51
- function isWebkitBasedBrowser(browser) {
52
- return WEBKIT_BASED_BROWSERS.includes(browser) || String(browser).includes('webkit');
53
- }
54
- function stripBom(text) {
55
- const raw = 'string' == typeof text ? text : String(text || '');
56
- return raw && 0xfeff === raw.charCodeAt(0) ? raw.slice(1) : raw;
57
- }
58
- function parseJsonSafe(text) {
59
- const s = stripBom(text);
60
- return JSON.parse(s || '{}');
61
- }
4
+ import * as __rspack_external_node_path_806ed179 from "node:path";
62
5
  const PROJECT_MANIFEST_FILENAMES = [
63
6
  'package.json',
64
7
  'deno.jsonc',
@@ -258,4 +201,4 @@ function validateDenoConfig(denoConfigPath) {
258
201
  return false;
259
202
  }
260
203
  }
261
- export { CHROMIUM_FAMILY_ALIASES, GECKO_FAMILY_ALIASES, PROJECT_MANIFEST_FILENAMES, findNearestDenoConfigSync, findNearestProjectManifestDirSync, findNearestProjectManifestSync, hasProjectDependency, isChromiumBasedBrowser, isEmulatorBrowser, isEmulatorLaneEnabled, isGeckoBasedBrowser, isWebkitBasedBrowser, parseJsonSafe, readProjectDependencies, stripBom, validateDenoConfig };
204
+ export { PROJECT_MANIFEST_FILENAMES, findNearestDenoConfigSync, findNearestProjectManifestDirSync, findNearestProjectManifestSync, hasProjectDependency, readProjectDependencies, validateDenoConfig };