adnbn 0.14.0 → 0.15.0

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 (115) hide show
  1. package/dist/cli/builders/app/build.d.ts +7 -0
  2. package/dist/cli/builders/app/build.js +58 -0
  3. package/dist/cli/builders/app/build.js.map +1 -0
  4. package/dist/cli/builders/app/index.d.ts +6 -1
  5. package/dist/cli/builders/app/index.js +49 -14
  6. package/dist/cli/builders/app/index.js.map +1 -1
  7. package/dist/cli/builders/app/{command.d.ts → watch.d.ts} +0 -1
  8. package/dist/cli/builders/app/{command.js → watch.js} +1 -26
  9. package/dist/cli/builders/app/watch.js.map +1 -0
  10. package/dist/cli/builders/manifest/ManifestBase.d.ts +5 -1
  11. package/dist/cli/builders/manifest/ManifestBase.js +16 -0
  12. package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
  13. package/dist/cli/builders/manifest/ManifestV2.js +3 -15
  14. package/dist/cli/builders/manifest/ManifestV2.js.map +1 -1
  15. package/dist/cli/builders/manifest/ManifestV3.js +3 -15
  16. package/dist/cli/builders/manifest/ManifestV3.js.map +1 -1
  17. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js +4 -0
  18. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js.map +1 -1
  19. package/dist/cli/index.js +16 -3
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/plugins/action.d.ts +2 -0
  22. package/dist/cli/plugins/action.js +13 -0
  23. package/dist/cli/plugins/action.js.map +1 -0
  24. package/dist/cli/plugins/index.d.ts +1 -0
  25. package/dist/cli/plugins/index.js +52 -50
  26. package/dist/cli/plugins/index.js.map +1 -1
  27. package/dist/cli/plugins/offscreen/index.js +2 -4
  28. package/dist/cli/plugins/offscreen/index.js.map +1 -1
  29. package/dist/cli/plugins/style/index.js +34 -31
  30. package/dist/cli/plugins/style/index.js.map +1 -1
  31. package/dist/cli/plugins/style/rebase.d.ts +14 -0
  32. package/dist/cli/plugins/style/rebase.js +63 -0
  33. package/dist/cli/plugins/style/rebase.js.map +1 -0
  34. package/dist/cli/plugins/style/utils.d.ts +5 -1
  35. package/dist/cli/plugins/style/utils.js +21 -8
  36. package/dist/cli/plugins/style/utils.js.map +1 -1
  37. package/dist/cli/plugins/typescript/TypescriptConfig.js +2 -2
  38. package/dist/cli/plugins/typescript/TypescriptConfig.js.map +1 -1
  39. package/dist/cli/resolvers/bundler.js +9 -1
  40. package/dist/cli/resolvers/bundler.js.map +1 -1
  41. package/dist/cli/resolvers/config.js +5 -1
  42. package/dist/cli/resolvers/config.js.map +1 -1
  43. package/dist/cli/utils/path.js +1 -1
  44. package/dist/cli/utils/path.js.map +1 -1
  45. package/dist/entry/relay/Builder.d.ts +4 -3
  46. package/dist/entry/relay/Builder.js.map +1 -1
  47. package/dist/entry/relay/index.d.ts +4 -3
  48. package/dist/entry/relay/index.js.map +1 -1
  49. package/dist/locale/adapters/react/hooks/use-locale.js +1 -1
  50. package/dist/locale/adapters/react/hooks/use-locale.js.map +1 -1
  51. package/dist/locale/adapters/react/hooks/use-native-locale.js +1 -1
  52. package/dist/locale/adapters/react/hooks/use-native-locale.js.map +1 -1
  53. package/dist/locale/index.d.ts +1 -0
  54. package/dist/locale/index.js +3 -1
  55. package/dist/locale/index.js.map +1 -1
  56. package/dist/locale/{providers → observers}/ObservableLocale.js +2 -2
  57. package/dist/locale/observers/ObservableLocale.js.map +1 -0
  58. package/dist/locale/observers/index.d.ts +1 -0
  59. package/dist/locale/observers/index.js +5 -0
  60. package/dist/locale/observers/index.js.map +1 -0
  61. package/dist/locale/providers/index.d.ts +0 -1
  62. package/dist/locale/providers/index.js +1 -3
  63. package/dist/locale/providers/index.js.map +1 -1
  64. package/dist/main/config.d.ts +1 -0
  65. package/dist/main/config.js.map +1 -1
  66. package/dist/main/relay.d.ts +1 -0
  67. package/dist/main/relay.js +2 -0
  68. package/dist/main/relay.js.map +1 -1
  69. package/dist/message/adapters/react/index.d.ts +1 -1
  70. package/dist/message/adapters/react/index.js +1 -1
  71. package/dist/message/adapters/react/index.js.map +1 -1
  72. package/dist/message/adapters/react/{useMessageHandler.js → use-message-handler.js} +6 -4
  73. package/dist/message/adapters/react/use-message-handler.js.map +1 -0
  74. package/dist/message/handlers/MapHandler.js +2 -1
  75. package/dist/message/handlers/MapHandler.js.map +1 -1
  76. package/dist/message/handlers/SingleHandler.js +2 -1
  77. package/dist/message/handlers/SingleHandler.js.map +1 -1
  78. package/dist/message/providers/Message.js +1 -1
  79. package/dist/message/providers/Message.js.map +1 -1
  80. package/dist/relay/RelayPermission.js +8 -2
  81. package/dist/relay/RelayPermission.js.map +1 -1
  82. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +1 -0
  83. package/dist/relay/adapters/RelayScriptingAdapter.js +30 -64
  84. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -1
  85. package/dist/relay/adapters/invoke-relay.d.ts +3 -0
  86. package/dist/relay/adapters/invoke-relay.js +69 -0
  87. package/dist/relay/adapters/invoke-relay.js.map +1 -0
  88. package/dist/relay/adapters/scripting-response.d.ts +12 -0
  89. package/dist/relay/adapters/scripting-response.js +1 -0
  90. package/dist/relay/adapters/scripting-response.js.map +1 -0
  91. package/dist/relay/result.d.ts +3 -0
  92. package/dist/relay/result.js +7 -0
  93. package/dist/relay/result.js.map +1 -1
  94. package/dist/types/action.d.ts +8 -0
  95. package/dist/types/action.js +1 -0
  96. package/dist/types/action.js.map +1 -0
  97. package/dist/types/config.d.ts +17 -1
  98. package/dist/types/content/definition.d.ts +2 -1
  99. package/dist/types/manifest.d.ts +3 -0
  100. package/dist/types/manifest.js.map +1 -1
  101. package/dist/types/popup.d.ts +2 -1
  102. package/dist/types/sidebar.d.ts +2 -1
  103. package/dist/types/sidebar.js.map +1 -1
  104. package/package.json +18 -31
  105. package/dist/cli/builders/app/command.js.map +0 -1
  106. package/dist/locale/providers/ObservableLocale.js.map +0 -1
  107. package/dist/message/adapters/react/useMessageHandler.js.map +0 -1
  108. package/scripts/clean-dist.js +0 -7
  109. package/scripts/copy-dts.js +0 -29
  110. package/scripts/merge-coverage.mjs +0 -12
  111. package/scripts/pre-commit.mjs +0 -22
  112. package/scripts/test-inventory.mjs +0 -38
  113. package/scripts/test-run.mjs +0 -25
  114. /package/dist/locale/{providers → observers}/ObservableLocale.d.ts +0 -0
  115. /package/dist/message/adapters/react/{useMessageHandler.d.ts → use-message-handler.d.ts} +0 -0
@@ -0,0 +1,63 @@
1
+ import path from "path";
2
+ import valueParser from "postcss-value-parser";
3
+ import { toPosix } from "./../../../cli/utils/path.js";
4
+ const RelativeRequestPattern = /^\.{1,2}\//;
5
+ const ExternalUrlPattern = /^(?:[a-z][a-z\d+.-]*:|[/#?~])/i;
6
+ const rebaseModuleRequest = (params, from, to) => {
7
+ const parsed = valueParser(params);
8
+ const request = parsed.nodes.find((node) => node.type !== "space" && node.type !== "comment");
9
+ if ((request == null ? void 0 : request.type) !== "string" || request.unclosed || !RelativeRequestPattern.test(request.value) || request.value.includes("#{")) {
10
+ return params;
11
+ }
12
+ request.value = rebaseStylePath(request.value, from, to);
13
+ return parsed.toString();
14
+ };
15
+ const rebaseUrlFunctions = (value, from, to) => {
16
+ const parsed = valueParser(value);
17
+ let rebased = false;
18
+ parsed.walk((node) => {
19
+ if (node.type !== "function" || node.value.toLowerCase() !== "url") {
20
+ return;
21
+ }
22
+ const tokens = node.nodes.filter((token) => token.type !== "space" && token.type !== "comment");
23
+ const url = tokens[0];
24
+ if (node.unclosed || tokens.length !== 1 || !isLiteralUrl(url)) {
25
+ return false;
26
+ }
27
+ const quoted = {
28
+ ...url,
29
+ type: "string",
30
+ quote: url.type === "string" ? url.quote : '"',
31
+ value: rebaseStylePath(url.value, from, to)
32
+ };
33
+ node.nodes = node.nodes.map((token) => token === url ? quoted : token);
34
+ rebased = true;
35
+ return false;
36
+ });
37
+ return rebased ? parsed.toString() : value;
38
+ };
39
+ const isLiteralUrl = (token) => {
40
+ if (token.type === "string") {
41
+ return !token.unclosed && isLiteralPath(token.value);
42
+ }
43
+ if (token.type === "word") {
44
+ return isLiteralPath(token.value) && !/[$()]/.test(token.value);
45
+ }
46
+ return false;
47
+ };
48
+ const isLiteralPath = (value) => {
49
+ return Boolean(value) && !ExternalUrlPattern.test(value) && !value.includes("#{");
50
+ };
51
+ const rebaseStylePath = (request, from, to) => {
52
+ const suffixIndex = request.search(/[?#]/);
53
+ const pathname = suffixIndex === -1 ? request : request.slice(0, suffixIndex);
54
+ const suffix = suffixIndex === -1 ? "" : request.slice(suffixIndex);
55
+ const directory = toPosix(path.relative(path.dirname(to), path.dirname(from)));
56
+ const relative = path.posix.join(directory, pathname);
57
+ return `${relative.startsWith("../") ? relative : `./${relative}`}${suffix}`;
58
+ };
59
+ export {
60
+ rebaseModuleRequest,
61
+ rebaseUrlFunctions
62
+ };
63
+ //# sourceMappingURL=rebase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/plugins/style/rebase.ts"],"sourcesContent":["import path from \"path\";\nimport valueParser from \"postcss-value-parser\";\n\nimport {toPosix} from \"@cli/utils/path\";\n\nconst RelativeRequestPattern = /^\\.{1,2}\\//;\n// Schemes, root-relative paths, fragments, queries and ~-prefixed requests are not rebased.\nconst ExternalUrlPattern = /^(?:[a-z][a-z\\d+.-]*:|[/#?~])/i;\n\n/**\n * Rebases the explicit `./` or `../` module request of `@use` or `@forward` parameters written in the\n * stylesheet `from` so it resolves from the stylesheet `to`. Namespaces, `show`, `hide` and `with`\n * configuration stay as written; package, alias, built-in and interpolated requests keep their normal\n * resolution. When both stylesheets are the same file, the request is only normalized.\n */\nexport const rebaseModuleRequest = (params: string, from: string, to: string): string => {\n const parsed = valueParser(params);\n const request = parsed.nodes.find(node => node.type !== \"space\" && node.type !== \"comment\");\n\n if (\n request?.type !== \"string\" ||\n request.unclosed ||\n !RelativeRequestPattern.test(request.value) ||\n request.value.includes(\"#{\")\n ) {\n return params;\n }\n\n request.value = rebaseStylePath(request.value, from, to);\n\n return parsed.toString();\n};\n\n/**\n * Rebases literal relative `url(...)` values written in the stylesheet `from` so they resolve from the\n * stylesheet `to`, including values nested in lists, functions and module configuration. Absolute URLs,\n * schemes, root-relative paths, fragments, queries, ~-prefixed requests and Sass expressions stay as written.\n * Rebased URLs are quoted and keep their query and fragment.\n */\nexport const rebaseUrlFunctions = (value: string, from: string, to: string): string => {\n const parsed = valueParser(value);\n let rebased = false;\n\n parsed.walk(node => {\n if (node.type !== \"function\" || node.value.toLowerCase() !== \"url\") {\n return;\n }\n\n const tokens = node.nodes.filter(token => token.type !== \"space\" && token.type !== \"comment\");\n const url = tokens[0];\n\n if (node.unclosed || tokens.length !== 1 || !isLiteralUrl(url)) {\n return false;\n }\n\n // Quote rebased URLs so spaces in the app directory remain part of the path.\n const quoted: valueParser.StringNode = {\n ...url,\n type: \"string\",\n quote: url.type === \"string\" ? url.quote : '\"',\n value: rebaseStylePath(url.value, from, to),\n };\n\n node.nodes = node.nodes.map(token => (token === url ? quoted : token));\n rebased = true;\n\n return false;\n });\n\n return rebased ? parsed.toString() : value;\n};\n\nconst isLiteralUrl = (token: valueParser.Node): token is valueParser.StringNode | valueParser.WordNode => {\n if (token.type === \"string\") {\n return !token.unclosed && isLiteralPath(token.value);\n }\n\n if (token.type === \"word\") {\n return isLiteralPath(token.value) && !/[$()]/.test(token.value);\n }\n\n return false;\n};\n\nconst isLiteralPath = (value: string): boolean => {\n return Boolean(value) && !ExternalUrlPattern.test(value) && !value.includes(\"#{\");\n};\n\nconst rebaseStylePath = (request: string, from: string, to: string): string => {\n const suffixIndex = request.search(/[?#]/);\n const pathname = suffixIndex === -1 ? request : request.slice(0, suffixIndex);\n const suffix = suffixIndex === -1 ? \"\" : request.slice(suffixIndex);\n const directory = toPosix(path.relative(path.dirname(to), path.dirname(from)));\n // Stylesheet requests are URLs, including on Windows. Keep query/fragment data out of path normalization.\n const relative = path.posix.join(directory, pathname);\n\n return `${relative.startsWith(\"../\") ? relative : `./${relative}`}${suffix}`;\n};\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,iBAAiB;AAExB,SAAQ,eAAc;AAEtB,MAAM,yBAAyB;AAE/B,MAAM,qBAAqB;AAQpB,MAAM,sBAAsB,CAAC,QAAgB,MAAc,OAAuB;AACrF,QAAM,SAAS,YAAY,MAAM;AACjC,QAAM,UAAU,OAAO,MAAM,KAAK,UAAQ,KAAK,SAAS,WAAW,KAAK,SAAS,SAAS;AAE1F,OACI,mCAAS,UAAS,YAClB,QAAQ,YACR,CAAC,uBAAuB,KAAK,QAAQ,KAAK,KAC1C,QAAQ,MAAM,SAAS,IAAI,GAC7B;AACE,WAAO;AAAA,EACX;AAEA,UAAQ,QAAQ,gBAAgB,QAAQ,OAAO,MAAM,EAAE;AAEvD,SAAO,OAAO,SAAS;AAC3B;AAQO,MAAM,qBAAqB,CAAC,OAAe,MAAc,OAAuB;AACnF,QAAM,SAAS,YAAY,KAAK;AAChC,MAAI,UAAU;AAEd,SAAO,KAAK,UAAQ;AAChB,QAAI,KAAK,SAAS,cAAc,KAAK,MAAM,YAAY,MAAM,OAAO;AAChE;AAAA,IACJ;AAEA,UAAM,SAAS,KAAK,MAAM,OAAO,WAAS,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS;AAC5F,UAAM,MAAM,OAAO,CAAC;AAEpB,QAAI,KAAK,YAAY,OAAO,WAAW,KAAK,CAAC,aAAa,GAAG,GAAG;AAC5D,aAAO;AAAA,IACX;AAGA,UAAM,SAAiC;AAAA,MACnC,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO,IAAI,SAAS,WAAW,IAAI,QAAQ;AAAA,MAC3C,OAAO,gBAAgB,IAAI,OAAO,MAAM,EAAE;AAAA,IAC9C;AAEA,SAAK,QAAQ,KAAK,MAAM,IAAI,WAAU,UAAU,MAAM,SAAS,KAAM;AACrE,cAAU;AAEV,WAAO;AAAA,EACX,CAAC;AAED,SAAO,UAAU,OAAO,SAAS,IAAI;AACzC;AAEA,MAAM,eAAe,CAAC,UAAoF;AACtG,MAAI,MAAM,SAAS,UAAU;AACzB,WAAO,CAAC,MAAM,YAAY,cAAc,MAAM,KAAK;AAAA,EACvD;AAEA,MAAI,MAAM,SAAS,QAAQ;AACvB,WAAO,cAAc,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,MAAM,KAAK;AAAA,EAClE;AAEA,SAAO;AACX;AAEA,MAAM,gBAAgB,CAAC,UAA2B;AAC9C,SAAO,QAAQ,KAAK,KAAK,CAAC,mBAAmB,KAAK,KAAK,KAAK,CAAC,MAAM,SAAS,IAAI;AACpF;AAEA,MAAM,kBAAkB,CAAC,SAAiB,MAAc,OAAuB;AAC3E,QAAM,cAAc,QAAQ,OAAO,MAAM;AACzC,QAAM,WAAW,gBAAgB,KAAK,UAAU,QAAQ,MAAM,GAAG,WAAW;AAC5E,QAAM,SAAS,gBAAgB,KAAK,KAAK,QAAQ,MAAM,WAAW;AAClE,QAAM,YAAY,QAAQ,KAAK,SAAS,KAAK,QAAQ,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC;AAE7E,QAAM,WAAW,KAAK,MAAM,KAAK,WAAW,QAAQ;AAEpD,SAAO,GAAG,SAAS,WAAW,KAAK,IAAI,WAAW,KAAK,QAAQ,EAAE,GAAG,MAAM;AAC9E;","names":[]}
@@ -1 +1,5 @@
1
- export declare const mergeStyleSources: (sharedStyle: string, appStyle: string) => string;
1
+ export type StyleSource = {
2
+ filename: string;
3
+ content: string;
4
+ };
5
+ export declare const mergeStyleSources: (sharedStyle: StyleSource, appStyle: StyleSource) => string;
@@ -1,7 +1,8 @@
1
1
  import * as scss from "postcss-scss";
2
+ import { rebaseModuleRequest, rebaseUrlFunctions } from "./rebase.js";
2
3
  const mergeStyleSources = (sharedStyle, appStyle) => {
3
- const shared = splitStyleSource(sharedStyle);
4
- const app = splitStyleSource(appStyle);
4
+ const shared = splitStyleSource(sharedStyle, sharedStyle.filename);
5
+ const app = splitStyleSource(appStyle, sharedStyle.filename);
5
6
  return [
6
7
  ...dedupePrelude([...shared.charsets, ...app.charsets]),
7
8
  ...dedupePrelude([...shared.sassPrelude, ...app.sassPrelude]),
@@ -21,9 +22,23 @@ const dedupePrelude = (parts) => {
21
22
  return true;
22
23
  });
23
24
  };
24
- const splitStyleSource = (source) => {
25
+ const splitStyleSource = (source, target) => {
25
26
  var _a;
26
- const root = scss.parse(source);
27
+ const root = scss.parse(source.content, { from: source.filename });
28
+ const relocated = source.filename !== target;
29
+ root.walkAtRules((node) => {
30
+ if (isModuleRuleNode(node)) {
31
+ node.params = rebaseModuleRequest(node.params, source.filename, target);
32
+ }
33
+ if (relocated) {
34
+ node.params = rebaseUrlFunctions(node.params, source.filename, target);
35
+ }
36
+ });
37
+ if (relocated) {
38
+ root.walkDecls((node) => {
39
+ node.value = rebaseUrlFunctions(node.value, source.filename, target);
40
+ });
41
+ }
27
42
  const parts = {
28
43
  charsets: [],
29
44
  sassPrelude: [],
@@ -64,14 +79,12 @@ const stringifyNode = (node) => {
64
79
  return content;
65
80
  };
66
81
  const isCharsetNode = (node) => node.type === "atrule" && node.name === "charset";
82
+ const isModuleRuleNode = (node) => node.type === "atrule" && ["forward", "use"].includes(node.name);
67
83
  const isSassPreludeNode = (node) => {
68
84
  if (node.type === "decl") {
69
85
  return node.prop.startsWith("$");
70
86
  }
71
- if (node.type !== "atrule") {
72
- return false;
73
- }
74
- return ["forward", "use"].includes(node.name);
87
+ return isModuleRuleNode(node);
75
88
  };
76
89
  const isCssPreludeNode = (node) => {
77
90
  var _a;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/plugins/style/utils.ts"],"sourcesContent":["import {ChildNode} from \"postcss\";\nimport * as scss from \"postcss-scss\";\n\ntype StyleSourceParts = {\n charsets: string[];\n sassPrelude: string[];\n cssPrelude: string[];\n body: string[];\n};\n\nexport const mergeStyleSources = (sharedStyle: string, appStyle: string): string => {\n const shared = splitStyleSource(sharedStyle);\n const app = splitStyleSource(appStyle);\n\n return [\n ...dedupePrelude([...shared.charsets, ...app.charsets]),\n ...dedupePrelude([...shared.sassPrelude, ...app.sassPrelude]),\n ...dedupePrelude([...shared.cssPrelude, ...app.cssPrelude]),\n ...shared.body,\n ...app.body,\n ]\n .map(part => part.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\n// App overrides repeat the shared @use/@forward; Sass rejects duplicate modules, so collapse exact matches while keeping differing statements that signal real conflicts.\nconst dedupePrelude = (parts: string[]): string[] => {\n const seen = new Set<string>();\n\n return parts.filter(part => {\n const key = part.trim();\n\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n\n return true;\n });\n};\n\nconst splitStyleSource = (source: string): StyleSourceParts => {\n const root = scss.parse(source);\n\n const parts: StyleSourceParts = {\n charsets: [],\n sassPrelude: [],\n cssPrelude: [],\n body: [],\n };\n\n let bodyStarted = false;\n let preludeType: \"sass\" | \"css\" = \"sass\";\n\n root.nodes?.forEach(node => {\n if (!bodyStarted && isCharsetNode(node)) {\n parts.charsets.push(stringifyNode(node));\n return;\n }\n\n if (!bodyStarted && node.type === \"comment\") {\n parts[preludeType === \"sass\" ? \"sassPrelude\" : \"cssPrelude\"].push(stringifyNode(node));\n return;\n }\n\n if (!bodyStarted && isSassPreludeNode(node)) {\n parts.sassPrelude.push(stringifyNode(node));\n return;\n }\n\n if (!bodyStarted && isCssPreludeNode(node)) {\n preludeType = \"css\";\n parts.cssPrelude.push(stringifyNode(node));\n return;\n }\n\n bodyStarted = true;\n parts.body.push(stringifyNode(node));\n });\n\n return parts;\n};\n\nconst stringifyNode = (node: ChildNode): string => {\n const content = node.toString(scss.stringify);\n\n if ((node.type === \"atrule\" && !node.nodes?.length) || node.type === \"decl\") {\n return `${content};`;\n }\n\n return content;\n};\n\nconst isCharsetNode = (node: ChildNode): boolean => node.type === \"atrule\" && node.name === \"charset\";\n\nconst isSassPreludeNode = (node: ChildNode): boolean => {\n if (node.type === \"decl\") {\n return node.prop.startsWith(\"$\");\n }\n\n if (node.type !== \"atrule\") {\n return false;\n }\n\n return [\"forward\", \"use\"].includes(node.name);\n};\n\nconst isCssPreludeNode = (node: ChildNode): boolean => {\n if (node.type !== \"atrule\" || node.nodes?.length) {\n return false;\n }\n\n return [\"import\", \"namespace\", \"layer\"].includes(node.name);\n};\n"],"mappings":"AACA,YAAY,UAAU;AASf,MAAM,oBAAoB,CAAC,aAAqB,aAA6B;AAChF,QAAM,SAAS,iBAAiB,WAAW;AAC3C,QAAM,MAAM,iBAAiB,QAAQ;AAErC,SAAO;AAAA,IACH,GAAG,cAAc,CAAC,GAAG,OAAO,UAAU,GAAG,IAAI,QAAQ,CAAC;AAAA,IACtD,GAAG,cAAc,CAAC,GAAG,OAAO,aAAa,GAAG,IAAI,WAAW,CAAC;AAAA,IAC5D,GAAG,cAAc,CAAC,GAAG,OAAO,YAAY,GAAG,IAAI,UAAU,CAAC;AAAA,IAC1D,GAAG,OAAO;AAAA,IACV,GAAG,IAAI;AAAA,EACX,EACK,IAAI,UAAQ,KAAK,KAAK,CAAC,EACvB,OAAO,OAAO,EACd,KAAK,MAAM;AACpB;AAGA,MAAM,gBAAgB,CAAC,UAA8B;AACjD,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,MAAM,OAAO,UAAQ;AACxB,UAAM,MAAM,KAAK,KAAK;AAEtB,QAAI,KAAK,IAAI,GAAG,GAAG;AACf,aAAO;AAAA,IACX;AAEA,SAAK,IAAI,GAAG;AAEZ,WAAO;AAAA,EACX,CAAC;AACL;AAEA,MAAM,mBAAmB,CAAC,WAAqC;AA3C/D;AA4CI,QAAM,OAAO,KAAK,MAAM,MAAM;AAE9B,QAAM,QAA0B;AAAA,IAC5B,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,IACd,YAAY,CAAC;AAAA,IACb,MAAM,CAAC;AAAA,EACX;AAEA,MAAI,cAAc;AAClB,MAAI,cAA8B;AAElC,aAAK,UAAL,mBAAY,QAAQ,UAAQ;AACxB,QAAI,CAAC,eAAe,cAAc,IAAI,GAAG;AACrC,YAAM,SAAS,KAAK,cAAc,IAAI,CAAC;AACvC;AAAA,IACJ;AAEA,QAAI,CAAC,eAAe,KAAK,SAAS,WAAW;AACzC,YAAM,gBAAgB,SAAS,gBAAgB,YAAY,EAAE,KAAK,cAAc,IAAI,CAAC;AACrF;AAAA,IACJ;AAEA,QAAI,CAAC,eAAe,kBAAkB,IAAI,GAAG;AACzC,YAAM,YAAY,KAAK,cAAc,IAAI,CAAC;AAC1C;AAAA,IACJ;AAEA,QAAI,CAAC,eAAe,iBAAiB,IAAI,GAAG;AACxC,oBAAc;AACd,YAAM,WAAW,KAAK,cAAc,IAAI,CAAC;AACzC;AAAA,IACJ;AAEA,kBAAc;AACd,UAAM,KAAK,KAAK,cAAc,IAAI,CAAC;AAAA,EACvC;AAEA,SAAO;AACX;AAEA,MAAM,gBAAgB,CAAC,SAA4B;AArFnD;AAsFI,QAAM,UAAU,KAAK,SAAS,KAAK,SAAS;AAE5C,MAAK,KAAK,SAAS,YAAY,GAAC,UAAK,UAAL,mBAAY,WAAW,KAAK,SAAS,QAAQ;AACzE,WAAO,GAAG,OAAO;AAAA,EACrB;AAEA,SAAO;AACX;AAEA,MAAM,gBAAgB,CAAC,SAA6B,KAAK,SAAS,YAAY,KAAK,SAAS;AAE5F,MAAM,oBAAoB,CAAC,SAA6B;AACpD,MAAI,KAAK,SAAS,QAAQ;AACtB,WAAO,KAAK,KAAK,WAAW,GAAG;AAAA,EACnC;AAEA,MAAI,KAAK,SAAS,UAAU;AACxB,WAAO;AAAA,EACX;AAEA,SAAO,CAAC,WAAW,KAAK,EAAE,SAAS,KAAK,IAAI;AAChD;AAEA,MAAM,mBAAmB,CAAC,SAA6B;AA7GvD;AA8GI,MAAI,KAAK,SAAS,cAAY,UAAK,UAAL,mBAAY,SAAQ;AAC9C,WAAO;AAAA,EACX;AAEA,SAAO,CAAC,UAAU,aAAa,OAAO,EAAE,SAAS,KAAK,IAAI;AAC9D;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/plugins/style/utils.ts"],"sourcesContent":["import {ChildNode} from \"postcss\";\nimport * as scss from \"postcss-scss\";\n\nimport {rebaseModuleRequest, rebaseUrlFunctions} from \"./rebase\";\n\nexport type StyleSource = {\n filename: string;\n content: string;\n};\n\ntype StyleSourceParts = {\n charsets: string[];\n sassPrelude: string[];\n cssPrelude: string[];\n body: string[];\n};\n\nexport const mergeStyleSources = (sharedStyle: StyleSource, appStyle: StyleSource): string => {\n const shared = splitStyleSource(sharedStyle, sharedStyle.filename);\n const app = splitStyleSource(appStyle, sharedStyle.filename);\n\n return [\n ...dedupePrelude([...shared.charsets, ...app.charsets]),\n ...dedupePrelude([...shared.sassPrelude, ...app.sassPrelude]),\n ...dedupePrelude([...shared.cssPrelude, ...app.cssPrelude]),\n ...shared.body,\n ...app.body,\n ]\n .map(part => part.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\n// App overrides repeat the shared @use/@forward; Sass rejects duplicate modules, so collapse exact matches while keeping differing statements that signal real conflicts.\nconst dedupePrelude = (parts: string[]): string[] => {\n const seen = new Set<string>();\n\n return parts.filter(part => {\n const key = part.trim();\n\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n\n return true;\n });\n};\n\nconst splitStyleSource = (source: StyleSource, target: string): StyleSourceParts => {\n const root = scss.parse(source.content, {from: source.filename});\n // Only a source compiled under another filename needs its resources rebased.\n const relocated = source.filename !== target;\n\n root.walkAtRules(node => {\n if (isModuleRuleNode(node)) {\n // Shared requests pass through the same normalization, so equivalent prepared\n // imports from both sources match when the prelude is deduplicated.\n node.params = rebaseModuleRequest(node.params, source.filename, target);\n }\n\n if (relocated) {\n // Module configuration such as `with ($font: url(...))` carries app resources as well.\n node.params = rebaseUrlFunctions(node.params, source.filename, target);\n }\n });\n\n if (relocated) {\n root.walkDecls(node => {\n node.value = rebaseUrlFunctions(node.value, source.filename, target);\n });\n }\n\n const parts: StyleSourceParts = {\n charsets: [],\n sassPrelude: [],\n cssPrelude: [],\n body: [],\n };\n\n let bodyStarted = false;\n let preludeType: \"sass\" | \"css\" = \"sass\";\n\n root.nodes?.forEach(node => {\n if (!bodyStarted && isCharsetNode(node)) {\n parts.charsets.push(stringifyNode(node));\n\n return;\n }\n\n if (!bodyStarted && node.type === \"comment\") {\n parts[preludeType === \"sass\" ? \"sassPrelude\" : \"cssPrelude\"].push(stringifyNode(node));\n\n return;\n }\n\n if (!bodyStarted && isSassPreludeNode(node)) {\n parts.sassPrelude.push(stringifyNode(node));\n\n return;\n }\n\n if (!bodyStarted && isCssPreludeNode(node)) {\n preludeType = \"css\";\n parts.cssPrelude.push(stringifyNode(node));\n\n return;\n }\n\n bodyStarted = true;\n parts.body.push(stringifyNode(node));\n });\n\n return parts;\n};\n\nconst stringifyNode = (node: ChildNode): string => {\n const content = node.toString(scss.stringify);\n\n if ((node.type === \"atrule\" && !node.nodes?.length) || node.type === \"decl\") {\n return `${content};`;\n }\n\n return content;\n};\n\nconst isCharsetNode = (node: ChildNode): boolean => node.type === \"atrule\" && node.name === \"charset\";\n\nconst isModuleRuleNode = (node: ChildNode): boolean => node.type === \"atrule\" && [\"forward\", \"use\"].includes(node.name);\n\nconst isSassPreludeNode = (node: ChildNode): boolean => {\n if (node.type === \"decl\") {\n return node.prop.startsWith(\"$\");\n }\n\n return isModuleRuleNode(node);\n};\n\nconst isCssPreludeNode = (node: ChildNode): boolean => {\n if (node.type !== \"atrule\" || node.nodes?.length) {\n return false;\n }\n\n return [\"import\", \"namespace\", \"layer\"].includes(node.name);\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import path from "path";
2
2
  import _ from "lodash";
3
3
  import FileBuilder from "./FileBuilder.js";
4
- import { getResolvePath } from "./../../../cli/resolvers/path.js";
4
+ import { resolveRootPath } from "./../../../cli/resolvers/path.js";
5
5
  import { PackageName } from "./../../../types/app.js";
6
6
  class TypescriptConfig_default extends FileBuilder {
7
7
  vendorAliases = {
@@ -36,7 +36,7 @@ class TypescriptConfig_default extends FileBuilder {
36
36
  aliases() {
37
37
  return _.merge(
38
38
  this.vendorAliases,
39
- _.mapValues(this.alias(), (value) => getResolvePath(value))
39
+ _.mapValues(this.alias(), (value) => path.resolve(resolveRootPath(this.config), value))
40
40
  );
41
41
  }
42
42
  paths() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/plugins/typescript/TypescriptConfig.ts"],"sourcesContent":["import path from \"path\";\nimport _ from \"lodash\";\nimport {TsConfigJson} from \"type-fest\";\n\nimport FileBuilder from \"./FileBuilder\";\n\nimport {getResolvePath} from \"@cli/resolvers/path\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {PackageName} from \"@typing/app\";\n\nexport default class extends FileBuilder {\n protected readonly vendorAliases = {\n [`${PackageName}/browser`]: \"@addon-core/browser\",\n [`${PackageName}/storage`]: \"@addon-core/storage\",\n };\n\n public constructor(config: ReadonlyConfig) {\n super(config);\n }\n\n protected filename(): string {\n return \"tsconfig.json\";\n }\n\n protected withBanner(): boolean {\n return false;\n }\n\n protected template(): string {\n return \"\"; // Not need is this place\n }\n\n protected content(): string {\n return JSON.stringify(this.json(), null, 2);\n }\n\n protected alias(): Record<string, string> {\n const srcDir = this.config.srcDir;\n const sharedDir = path.posix.join(srcDir, this.config.sharedDir);\n\n return {\n [srcDir]: srcDir,\n \"@\": srcDir,\n \"@shared\": sharedDir,\n \"~\": sharedDir,\n };\n }\n\n public aliases(): Record<string, string> {\n return _.merge(\n this.vendorAliases,\n _.mapValues(this.alias(), value => getResolvePath(value))\n );\n }\n\n public paths(): Record<string, string[]> {\n return _.reduce(\n this.alias(),\n (paths, value, key) => ({\n ...paths,\n [path.posix.join(key, \"*\")]: [path.posix.join(\"..\", value, \"*\")],\n }),\n {} as Record<string, string[]>\n );\n }\n\n public json(): TsConfigJson {\n const outputDir = path.posix.join(\"..\", this.config.outDir);\n\n return {\n compilerOptions: {\n target: \"ESNext\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n esModuleInterop: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n outDir: outputDir,\n paths: this.paths(),\n },\n include: [\"../**/*\", \"./*.d.ts\"],\n exclude: [outputDir],\n };\n }\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,OAAO;AAGd,OAAO,iBAAiB;AAExB,SAAQ,sBAAqB;AAG7B,SAAQ,mBAAkB;AAE1B,MAAO,iCAAsB,YAAY;AAAA,EAClB,gBAAgB;AAAA,IAC/B,CAAC,GAAG,WAAW,UAAU,GAAG;AAAA,IAC5B,CAAC,GAAG,WAAW,UAAU,GAAG;AAAA,EAChC;AAAA,EAEO,YAAY,QAAwB;AACvC,UAAM,MAAM;AAAA,EAChB;AAAA,EAEU,WAAmB;AACzB,WAAO;AAAA,EACX;AAAA,EAEU,aAAsB;AAC5B,WAAO;AAAA,EACX;AAAA,EAEU,WAAmB;AACzB,WAAO;AAAA,EACX;AAAA,EAEU,UAAkB;AACxB,WAAO,KAAK,UAAU,KAAK,KAAK,GAAG,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEU,QAAgC;AACtC,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,YAAY,KAAK,MAAM,KAAK,QAAQ,KAAK,OAAO,SAAS;AAE/D,WAAO;AAAA,MACH,CAAC,MAAM,GAAG;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EAEO,UAAkC;AACrC,WAAO,EAAE;AAAA,MACL,KAAK;AAAA,MACL,EAAE,UAAU,KAAK,MAAM,GAAG,WAAS,eAAe,KAAK,CAAC;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEO,QAAkC;AACrC,WAAO,EAAE;AAAA,MACL,KAAK,MAAM;AAAA,MACX,CAAC,OAAO,OAAO,SAAS;AAAA,QACpB,GAAG;AAAA,QACH,CAAC,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,MACnE;AAAA,MACA,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEO,OAAqB;AACxB,UAAM,YAAY,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,MAAM;AAE1D,WAAO;AAAA,MACH,iBAAiB;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,kCAAkC;AAAA,QAClC,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,KAAK,MAAM;AAAA,MACtB;AAAA,MACA,SAAS,CAAC,WAAW,UAAU;AAAA,MAC/B,SAAS,CAAC,SAAS;AAAA,IACvB;AAAA,EACJ;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/plugins/typescript/TypescriptConfig.ts"],"sourcesContent":["import path from \"path\";\nimport _ from \"lodash\";\nimport {TsConfigJson} from \"type-fest\";\n\nimport FileBuilder from \"./FileBuilder\";\n\nimport {resolveRootPath} from \"@cli/resolvers/path\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {PackageName} from \"@typing/app\";\n\nexport default class extends FileBuilder {\n protected readonly vendorAliases = {\n [`${PackageName}/browser`]: \"@addon-core/browser\",\n [`${PackageName}/storage`]: \"@addon-core/storage\",\n };\n\n public constructor(config: ReadonlyConfig) {\n super(config);\n }\n\n protected filename(): string {\n return \"tsconfig.json\";\n }\n\n protected withBanner(): boolean {\n return false;\n }\n\n protected template(): string {\n return \"\"; // Not need is this place\n }\n\n protected content(): string {\n return JSON.stringify(this.json(), null, 2);\n }\n\n protected alias(): Record<string, string> {\n const srcDir = this.config.srcDir;\n const sharedDir = path.posix.join(srcDir, this.config.sharedDir);\n\n return {\n [srcDir]: srcDir,\n \"@\": srcDir,\n \"@shared\": sharedDir,\n \"~\": sharedDir,\n };\n }\n\n public aliases(): Record<string, string> {\n return _.merge(\n this.vendorAliases,\n _.mapValues(this.alias(), value => path.resolve(resolveRootPath(this.config), value))\n );\n }\n\n public paths(): Record<string, string[]> {\n return _.reduce(\n this.alias(),\n (paths, value, key) => ({\n ...paths,\n [path.posix.join(key, \"*\")]: [path.posix.join(\"..\", value, \"*\")],\n }),\n {} as Record<string, string[]>\n );\n }\n\n public json(): TsConfigJson {\n const outputDir = path.posix.join(\"..\", this.config.outDir);\n\n return {\n compilerOptions: {\n target: \"ESNext\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n esModuleInterop: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n outDir: outputDir,\n paths: this.paths(),\n },\n include: [\"../**/*\", \"./*.d.ts\"],\n exclude: [outputDir],\n };\n }\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,OAAO;AAGd,OAAO,iBAAiB;AAExB,SAAQ,uBAAsB;AAG9B,SAAQ,mBAAkB;AAE1B,MAAO,iCAAsB,YAAY;AAAA,EAClB,gBAAgB;AAAA,IAC/B,CAAC,GAAG,WAAW,UAAU,GAAG;AAAA,IAC5B,CAAC,GAAG,WAAW,UAAU,GAAG;AAAA,EAChC;AAAA,EAEO,YAAY,QAAwB;AACvC,UAAM,MAAM;AAAA,EAChB;AAAA,EAEU,WAAmB;AACzB,WAAO;AAAA,EACX;AAAA,EAEU,aAAsB;AAC5B,WAAO;AAAA,EACX;AAAA,EAEU,WAAmB;AACzB,WAAO;AAAA,EACX;AAAA,EAEU,UAAkB;AACxB,WAAO,KAAK,UAAU,KAAK,KAAK,GAAG,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEU,QAAgC;AACtC,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,YAAY,KAAK,MAAM,KAAK,QAAQ,KAAK,OAAO,SAAS;AAE/D,WAAO;AAAA,MACH,CAAC,MAAM,GAAG;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EAEO,UAAkC;AACrC,WAAO,EAAE;AAAA,MACL,KAAK;AAAA,MACL,EAAE,UAAU,KAAK,MAAM,GAAG,WAAS,KAAK,QAAQ,gBAAgB,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,IACxF;AAAA,EACJ;AAAA,EAEO,QAAkC;AACrC,WAAO,EAAE;AAAA,MACL,KAAK,MAAM;AAAA,MACX,CAAC,OAAO,OAAO,SAAS;AAAA,QACpB,GAAG;AAAA,QACH,CAAC,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,MACnE;AAAA,MACA,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEO,OAAqB;AACxB,UAAM,YAAY,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,MAAM;AAE1D,WAAO;AAAA,MACH,iBAAiB;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,kCAAkC;AAAA,QAClC,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,KAAK,MAAM;AAAA,MACtB;AAAA,MACA,SAAS,CAAC,WAAW,UAAU;AAAA,MAC/B,SAAS,CAAC,SAAS;AAAA,IACvB;AAAA,EACJ;AACJ;","names":[]}
@@ -1,7 +1,9 @@
1
1
  import { RsdoctorRspackPlugin } from "@rsdoctor/rspack-plugin";
2
2
  import { merge as mergeConfig } from "webpack-merge";
3
+ import path from "node:path";
3
4
  import manifestFactory from "../builders/manifest/index.js";
4
5
  import { processPluginHandler } from "./plugin.js";
6
+ import { resolveRootPath } from "./path.js";
5
7
  import ManifestPlugin from "./../../cli/bundler/plugins/manifest/index.js";
6
8
  import WatchPlugin from "./../../cli/bundler/plugins/watch/index.js";
7
9
  import { Command } from "./../../types/app.js";
@@ -36,9 +38,15 @@ const getConfigForManifest = async (config) => {
36
38
  };
37
39
  var bundler_default = async (config) => {
38
40
  let rspack = {
41
+ context: resolveRootPath(config),
39
42
  entry: {},
40
43
  mode: config.mode,
41
- cache: false
44
+ cache: false,
45
+ resolve: {
46
+ // Virtual entry modules may live outside the application. Keep issuer-local
47
+ // lookup first, then resolve the consumer's packages from its project root.
48
+ modules: ["node_modules", path.join(resolveRootPath(config), "node_modules")]
49
+ }
42
50
  };
43
51
  rspack = mergeConfig(
44
52
  rspack,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/resolvers/bundler.ts"],"sourcesContent":["import {Configuration as RspackConfig, RspackPluginInstance} from \"@rspack/core\";\nimport {RsdoctorRspackPlugin} from \"@rsdoctor/rspack-plugin\";\nimport {merge as mergeConfig} from \"webpack-merge\";\n\nimport manifestFactory from \"../builders/manifest\";\nimport {processPluginHandler} from \"./plugin\";\n\nimport ManifestPlugin from \"@cli/bundler/plugins/manifest\";\nimport WatchPlugin from \"@cli/bundler/plugins/watch\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {Command} from \"@typing/app\";\n\nconst getConfigFromPlugins = async (rspack: RspackConfig, config: ReadonlyConfig): Promise<RspackConfig> => {\n let mergedConfig: RspackConfig = {};\n\n for await (const {result: pluginConfig} of processPluginHandler(config.plugins, \"bundler\", () => ({\n rspack: mergeConfig(rspack, mergedConfig),\n config,\n }))) {\n mergedConfig = mergeConfig(mergedConfig, pluginConfig);\n }\n\n return mergedConfig;\n};\n\nconst getConfigForManifest = async (config: ReadonlyConfig): Promise<RspackConfig> => {\n let manifest = manifestFactory(config);\n\n const update = async () => {\n // Each compilation describes current entries; removed WAR/CSP rules must not accumulate.\n const next = manifestFactory(config);\n await Array.fromAsync(processPluginHandler(config.plugins, \"manifest\", {manifest: next, config}));\n manifest = next;\n };\n\n await update();\n\n const plugins: RspackPluginInstance[] = [];\n\n if (config.command === Command.Watch) {\n plugins.push(\n new WatchPlugin(async () => {\n await update();\n })\n );\n }\n\n plugins.push(new ManifestPlugin(() => manifest));\n\n return {plugins};\n};\n\nexport default async (config: ReadonlyConfig): Promise<RspackConfig> => {\n let rspack: RspackConfig = {\n entry: {},\n mode: config.mode,\n cache: false,\n };\n\n // prettier-ignore\n rspack = mergeConfig(\n rspack,\n await getConfigFromPlugins(rspack, config),\n await getConfigForManifest(config)\n );\n\n if (config.debug) {\n rspack = mergeConfig(rspack, {\n stats: {\n errorDetails: true,\n },\n });\n }\n\n if (config.command === Command.Watch) {\n rspack = mergeConfig(rspack, {\n devtool: \"inline-source-map\",\n });\n }\n\n if (config.command === Command.Build) {\n if (config.analyze) {\n rspack = mergeConfig(rspack, {\n plugins: [\n new RsdoctorRspackPlugin({\n supports: {\n banner: true,\n parseBundle: true,\n generateTileGraph: true,\n },\n }),\n ],\n });\n }\n }\n\n return rspack;\n};\n"],"mappings":"AACA,SAAQ,4BAA2B;AACnC,SAAQ,SAAS,mBAAkB;AAEnC,OAAO,qBAAqB;AAC5B,SAAQ,4BAA2B;AAEnC,OAAO,oBAAoB;AAC3B,OAAO,iBAAiB;AAGxB,SAAQ,eAAc;AAEtB,MAAM,uBAAuB,OAAO,QAAsB,WAAkD;AACxG,MAAI,eAA6B,CAAC;AAElC,mBAAiB,EAAC,QAAQ,aAAY,KAAK,qBAAqB,OAAO,SAAS,WAAW,OAAO;AAAA,IAC9F,QAAQ,YAAY,QAAQ,YAAY;AAAA,IACxC;AAAA,EACJ,EAAE,GAAG;AACD,mBAAe,YAAY,cAAc,YAAY;AAAA,EACzD;AAEA,SAAO;AACX;AAEA,MAAM,uBAAuB,OAAO,WAAkD;AAClF,MAAI,WAAW,gBAAgB,MAAM;AAErC,QAAM,SAAS,YAAY;AAEvB,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAM,MAAM,UAAU,qBAAqB,OAAO,SAAS,YAAY,EAAC,UAAU,MAAM,OAAM,CAAC,CAAC;AAChG,eAAW;AAAA,EACf;AAEA,QAAM,OAAO;AAEb,QAAM,UAAkC,CAAC;AAEzC,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,YAAQ;AAAA,MACJ,IAAI,YAAY,YAAY;AACxB,cAAM,OAAO;AAAA,MACjB,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,UAAQ,KAAK,IAAI,eAAe,MAAM,QAAQ,CAAC;AAE/C,SAAO,EAAC,QAAO;AACnB;AAEA,IAAO,kBAAQ,OAAO,WAAkD;AACpE,MAAI,SAAuB;AAAA,IACvB,OAAO,CAAC;AAAA,IACR,MAAM,OAAO;AAAA,IACb,OAAO;AAAA,EACX;AAGA,WAAS;AAAA,IACL;AAAA,IACA,MAAM,qBAAqB,QAAQ,MAAM;AAAA,IACzC,MAAM,qBAAqB,MAAM;AAAA,EACrC;AAEA,MAAI,OAAO,OAAO;AACd,aAAS,YAAY,QAAQ;AAAA,MACzB,OAAO;AAAA,QACH,cAAc;AAAA,MAClB;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,aAAS,YAAY,QAAQ;AAAA,MACzB,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AAEA,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,QAAI,OAAO,SAAS;AAChB,eAAS,YAAY,QAAQ;AAAA,QACzB,SAAS;AAAA,UACL,IAAI,qBAAqB;AAAA,YACrB,UAAU;AAAA,cACN,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,mBAAmB;AAAA,YACvB;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/resolvers/bundler.ts"],"sourcesContent":["import {Configuration as RspackConfig, RspackPluginInstance} from \"@rspack/core\";\nimport {RsdoctorRspackPlugin} from \"@rsdoctor/rspack-plugin\";\nimport {merge as mergeConfig} from \"webpack-merge\";\nimport path from \"node:path\";\n\nimport manifestFactory from \"../builders/manifest\";\nimport {processPluginHandler} from \"./plugin\";\nimport {resolveRootPath} from \"./path\";\n\nimport ManifestPlugin from \"@cli/bundler/plugins/manifest\";\nimport WatchPlugin from \"@cli/bundler/plugins/watch\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {Command} from \"@typing/app\";\n\nconst getConfigFromPlugins = async (rspack: RspackConfig, config: ReadonlyConfig): Promise<RspackConfig> => {\n let mergedConfig: RspackConfig = {};\n\n for await (const {result: pluginConfig} of processPluginHandler(config.plugins, \"bundler\", () => ({\n rspack: mergeConfig(rspack, mergedConfig),\n config,\n }))) {\n mergedConfig = mergeConfig(mergedConfig, pluginConfig);\n }\n\n return mergedConfig;\n};\n\nconst getConfigForManifest = async (config: ReadonlyConfig): Promise<RspackConfig> => {\n let manifest = manifestFactory(config);\n\n const update = async () => {\n // Each compilation describes current entries; removed WAR/CSP rules must not accumulate.\n const next = manifestFactory(config);\n await Array.fromAsync(processPluginHandler(config.plugins, \"manifest\", {manifest: next, config}));\n manifest = next;\n };\n\n await update();\n\n const plugins: RspackPluginInstance[] = [];\n\n if (config.command === Command.Watch) {\n plugins.push(\n new WatchPlugin(async () => {\n await update();\n })\n );\n }\n\n plugins.push(new ManifestPlugin(() => manifest));\n\n return {plugins};\n};\n\nexport default async (config: ReadonlyConfig): Promise<RspackConfig> => {\n let rspack: RspackConfig = {\n context: resolveRootPath(config),\n entry: {},\n mode: config.mode,\n cache: false,\n resolve: {\n // Virtual entry modules may live outside the application. Keep issuer-local\n // lookup first, then resolve the consumer's packages from its project root.\n modules: [\"node_modules\", path.join(resolveRootPath(config), \"node_modules\")],\n },\n };\n\n // prettier-ignore\n rspack = mergeConfig(\n rspack,\n await getConfigFromPlugins(rspack, config),\n await getConfigForManifest(config)\n );\n\n if (config.debug) {\n rspack = mergeConfig(rspack, {\n stats: {\n errorDetails: true,\n },\n });\n }\n\n if (config.command === Command.Watch) {\n rspack = mergeConfig(rspack, {\n devtool: \"inline-source-map\",\n });\n }\n\n if (config.command === Command.Build) {\n if (config.analyze) {\n rspack = mergeConfig(rspack, {\n plugins: [\n new RsdoctorRspackPlugin({\n supports: {\n banner: true,\n parseBundle: true,\n generateTileGraph: true,\n },\n }),\n ],\n });\n }\n }\n\n return rspack;\n};\n"],"mappings":"AACA,SAAQ,4BAA2B;AACnC,SAAQ,SAAS,mBAAkB;AACnC,OAAO,UAAU;AAEjB,OAAO,qBAAqB;AAC5B,SAAQ,4BAA2B;AACnC,SAAQ,uBAAsB;AAE9B,OAAO,oBAAoB;AAC3B,OAAO,iBAAiB;AAGxB,SAAQ,eAAc;AAEtB,MAAM,uBAAuB,OAAO,QAAsB,WAAkD;AACxG,MAAI,eAA6B,CAAC;AAElC,mBAAiB,EAAC,QAAQ,aAAY,KAAK,qBAAqB,OAAO,SAAS,WAAW,OAAO;AAAA,IAC9F,QAAQ,YAAY,QAAQ,YAAY;AAAA,IACxC;AAAA,EACJ,EAAE,GAAG;AACD,mBAAe,YAAY,cAAc,YAAY;AAAA,EACzD;AAEA,SAAO;AACX;AAEA,MAAM,uBAAuB,OAAO,WAAkD;AAClF,MAAI,WAAW,gBAAgB,MAAM;AAErC,QAAM,SAAS,YAAY;AAEvB,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAM,MAAM,UAAU,qBAAqB,OAAO,SAAS,YAAY,EAAC,UAAU,MAAM,OAAM,CAAC,CAAC;AAChG,eAAW;AAAA,EACf;AAEA,QAAM,OAAO;AAEb,QAAM,UAAkC,CAAC;AAEzC,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,YAAQ;AAAA,MACJ,IAAI,YAAY,YAAY;AACxB,cAAM,OAAO;AAAA,MACjB,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,UAAQ,KAAK,IAAI,eAAe,MAAM,QAAQ,CAAC;AAE/C,SAAO,EAAC,QAAO;AACnB;AAEA,IAAO,kBAAQ,OAAO,WAAkD;AACpE,MAAI,SAAuB;AAAA,IACvB,SAAS,gBAAgB,MAAM;AAAA,IAC/B,OAAO,CAAC;AAAA,IACR,MAAM,OAAO;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA,MAGL,SAAS,CAAC,gBAAgB,KAAK,KAAK,gBAAgB,MAAM,GAAG,cAAc,CAAC;AAAA,IAChF;AAAA,EACJ;AAGA,WAAS;AAAA,IACL;AAAA,IACA,MAAM,qBAAqB,QAAQ,MAAM;AAAA,IACzC,MAAM,qBAAqB,MAAM;AAAA,EACrC;AAEA,MAAI,OAAO,OAAO;AACd,aAAS,YAAY,QAAQ;AAAA,MACzB,OAAO;AAAA,QACH,cAAc;AAAA,MAClB;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,aAAS,YAAY,QAAQ;AAAA,MACzB,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AAEA,MAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,QAAI,OAAO,SAAS;AAChB,eAAS,YAAY,QAAQ;AAAA,QACzB,SAAS;AAAA,UACL,IAAI,qBAAqB;AAAA,YACrB,UAAU;AAAA,cACN,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,mBAAmB;AAAA,YACvB;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
@@ -3,6 +3,7 @@ import dotenv from "dotenv";
3
3
  import { loadConfig } from "c12";
4
4
  import _ from "lodash";
5
5
  import {
6
+ pluginAction,
6
7
  pluginAsset,
7
8
  pluginBackground,
8
9
  pluginBundler,
@@ -60,7 +61,7 @@ const getUserConfig = async (config) => {
60
61
  if (existsSync(configFilePath)) {
61
62
  const { config: userConfig } = await loadConfig({
62
63
  configFile: configFilePath,
63
- dotenv: true
64
+ dotenv: false
64
65
  });
65
66
  if (config.debug) {
66
67
  console.log("Loaded user config:", configFilePath);
@@ -165,6 +166,7 @@ var config_default = async (config) => {
165
166
  author = void 0,
166
167
  homepage = "HOMEPAGE",
167
168
  icon = DefaultIconGroupName,
169
+ action,
168
170
  lang = Language.English,
169
171
  incognito,
170
172
  specific,
@@ -230,6 +232,7 @@ var config_default = async (config) => {
230
232
  homepage,
231
233
  lang: resolveLanguage(lang),
232
234
  icon,
235
+ action,
233
236
  incognito,
234
237
  specific,
235
238
  manifest,
@@ -306,6 +309,7 @@ var config_default = async (config) => {
306
309
  pluginStyle(),
307
310
  pluginLocale(),
308
311
  pluginMeta(),
312
+ pluginAction(),
309
313
  pluginContent(),
310
314
  pluginBackground(),
311
315
  pluginOptions(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/resolvers/config.ts"],"sourcesContent":["import {existsSync} from \"fs\";\nimport dotenv, {type DotenvParseOutput} from \"dotenv\";\nimport {loadConfig} from \"c12\";\nimport _ from \"lodash\";\n\nimport {\n pluginAsset,\n pluginBackground,\n pluginBundler,\n pluginContent,\n pluginDotenv,\n pluginHtml,\n pluginIcon,\n pluginLocale,\n pluginMeta,\n pluginOffscreen,\n pluginManifest,\n pluginOptimization,\n pluginOptions,\n pluginOutput,\n pluginOverride,\n pluginPage,\n pluginPopup,\n pluginPublic,\n pluginReact,\n pluginSandbox,\n pluginSidebar,\n pluginStyle,\n pluginTypescript,\n pluginVersion,\n pluginView,\n} from \"../plugins\";\n\nimport {fromRootPath, getAppPath, getAppSourcePath, getConfigFile} from \"../resolvers/path\";\n\nimport type {Config, OptionalConfig, ReadonlyConfig, UserConfig} from \"@typing/config\";\nimport {Command, Mode, Workspace} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {Plugin} from \"@typing/plugin\";\nimport {ManifestVersion} from \"@typing/manifest\";\nimport {Language, LanguageCodes} from \"@typing/locale\";\nimport {DefaultIconGroupName} from \"@typing/icon\";\n\nconst resolveLanguage = (lang?: `${Language}` | Language): Language => {\n if (!lang) {\n return Language.English;\n }\n\n if (LanguageCodes.has(lang)) {\n return lang as Language;\n }\n\n throw new Error(`Invalid language \"${lang}\" provided by config`);\n};\n\nconst resolveWorkspace = (workspace?: Workspace | `${Workspace}`): Workspace => {\n if (!workspace) {\n return Workspace.Single;\n }\n\n if (Object.values(Workspace).includes(workspace as Workspace)) {\n return workspace as Workspace;\n }\n\n throw new Error(`Invalid workspace \"${workspace}\" provided by config`);\n};\n\nconst resolveSharedDir = (workspace: Workspace, sharedDir: string): string => {\n return workspace === Workspace.Multi ? sharedDir : \".\";\n};\n\nconst getUserConfig = async (config: ReadonlyConfig): Promise<UserConfig> => {\n const configFilePath = getConfigFile(config);\n\n if (existsSync(configFilePath)) {\n const {config: userConfig} = await loadConfig<UserConfig>({\n configFile: configFilePath,\n dotenv: true,\n });\n\n if (config.debug) {\n console.log(\"Loaded user config:\", configFilePath);\n }\n\n return userConfig || {};\n } else if (config.debug) {\n console.warn(\"Config file not found:\", configFilePath);\n }\n\n return {};\n};\n\nconst validateConfig = (config: ReadonlyConfig): ReadonlyConfig => {\n const {\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n htmlDir,\n publicDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n } = config;\n\n if (\n [\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n htmlDir,\n publicDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n ]\n .filter(dir => _.isString(dir))\n .some(dir => dir.includes(\"..\"))\n ) {\n throw new Error('Directory paths cannot contain relative paths (\"..\") for security reasons.');\n }\n\n if (appsDir === sharedDir) {\n throw new Error(\"Apps directory (appsDir) and shared directory (sharedDir) cannot be the same.\");\n }\n\n if (srcDir === outDir) {\n throw new Error(\"Source directory (srcDir) and destination directory (outputDir) cannot be the same.\");\n }\n\n if (srcDir === \".\") {\n throw new Error('Source directory cannot be the root directory (\".\") for security reasons.');\n }\n\n if (publicDir === \".\" || [srcDir, outDir, appSrcDir].includes(publicDir)) {\n throw new Error(\n 'Public directory cannot be the root directory (\".\") or intersect with other root directories for security reasons.'\n );\n }\n\n return config;\n};\n\nconst updateLocalDotenv = (config: ReadonlyConfig): DotenvParseOutput => {\n const {mode, app, browser, manifestVersion} = config;\n\n const localVars: DotenvParseOutput = {\n APP: app,\n BROWSER: browser,\n MODE: mode,\n MANIFEST_VERSION: String(manifestVersion),\n };\n\n Object.assign(process.env, localVars);\n\n return localVars;\n};\n\nconst loadDotenv = (config: ReadonlyConfig): DotenvParseOutput => {\n const {mode, browser, debug} = config;\n\n const preset = [\n `.env.${mode}.${browser}.local`,\n `.env.${mode}.${browser}`,\n `.env.${browser}.local`,\n `.env.${browser}`,\n `.env.${mode}.local`,\n `.env.${mode}`,\n `.env.local`,\n `.env`,\n ];\n\n const appSourcePaths = preset.map(file => getAppSourcePath(config, file));\n const appPaths = preset.map(file => getAppPath(config, file));\n const rootPaths = preset.map(file => fromRootPath(config, file));\n\n const paths = [...appSourcePaths, ...appPaths, ...rootPaths];\n\n const {parsed: fileVars = {}} = dotenv.config({path: paths, quiet: !debug});\n\n return {...fileVars, ...updateLocalDotenv(config)};\n};\n\nexport default async (config: OptionalConfig): Promise<Config> => {\n let {\n command = Command.Build,\n debug = false,\n configFile = \"adnbn.config.ts\",\n browser = Browser.Chrome,\n app = \"myapp\",\n name = app,\n description,\n shortName,\n version = \"VERSION\",\n minimumVersion = \"MINIMUM_VERSION\",\n author = undefined,\n homepage = \"HOMEPAGE\",\n icon = DefaultIconGroupName,\n lang = Language.English,\n incognito,\n specific,\n workspace = Workspace.Single,\n rootDir = \".\",\n outDir = \"dist\",\n srcDir = \"src\",\n sharedDir = \"shared\",\n appsDir = \"apps\",\n appSrcDir = \".\",\n localeDir = \"locales\",\n iconSrcDir = \"icons\",\n iconOutDir = \"icons\",\n jsDir = \"js\",\n cssDir = \"css\",\n assetsDir = \"assets\",\n publicDir = \"public\",\n htmlDir = \".\",\n html = [],\n bundler = {},\n env = {},\n manifest,\n manifestVersion = (new Set<Browser>([Browser.Safari]).has(browser) ? 2 : 3) as ManifestVersion,\n mode = Mode.Development,\n analyze = false,\n plugins = [],\n mergeBackground = false,\n mergeCommands = false,\n mergeContentScripts = false,\n concatContentScripts = true,\n mergeStyles = true,\n mergeIcons = false,\n mergeLocales = true,\n mergePages = false,\n mergePopup = false,\n mergePublic = false,\n multiplePopup = false,\n mergeSidebar = false,\n multipleSidebar = false,\n mergeRelay = false,\n mergeService = false,\n mergeOffscreen = false,\n mergeSandbox = false,\n commonChunks = true,\n artifactName = \"[name]-[browser]-[mv]\",\n assetsFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:4][ext]\"\n : \"[name]-[contenthash:4][ext]\",\n jsFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:5].js\"\n : \"[name].js\",\n cssFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:5].css\"\n : \"[name].css\",\n cssIdentName = mode === Mode.Production && command === Command.Build && !debug\n ? \"[app]-[hash:base64:5]\"\n : \"[local]-[hash:base64:5]\",\n } = config;\n\n let resolvedConfig: Config = {\n command,\n debug,\n mode,\n browser,\n app,\n name,\n description,\n shortName,\n version,\n minimumVersion,\n author,\n homepage,\n lang: resolveLanguage(lang),\n icon,\n incognito,\n specific,\n manifest,\n manifestVersion,\n workspace: resolveWorkspace(workspace),\n rootDir,\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n publicDir,\n htmlDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n html,\n bundler,\n env,\n plugins,\n analyze,\n configFile,\n mergeBackground,\n mergeCommands,\n mergeContentScripts,\n concatContentScripts,\n mergeStyles,\n mergeIcons,\n mergeLocales,\n mergePages,\n mergePopup,\n mergePublic,\n multiplePopup,\n mergeSidebar,\n multipleSidebar,\n mergeRelay,\n mergeService,\n mergeOffscreen,\n mergeSandbox,\n commonChunks,\n artifactName,\n assetsFilename,\n jsFilename,\n cssFilename,\n cssIdentName,\n };\n\n let vars = loadDotenv(resolvedConfig);\n\n const {\n plugins: userPlugins = [],\n lang: userLang,\n workspace: userWorkspace,\n ...userConfig\n } = await getUserConfig(resolvedConfig);\n\n resolvedConfig = {\n ...resolvedConfig,\n ...userConfig,\n lang: resolveLanguage(userLang ?? resolvedConfig.lang),\n workspace: resolveWorkspace(userWorkspace ?? resolvedConfig.workspace),\n };\n\n resolvedConfig.sharedDir = resolveSharedDir(resolvedConfig.workspace, resolvedConfig.sharedDir);\n\n resolvedConfig = validateConfig(resolvedConfig);\n\n vars = {...vars, ...loadDotenv(resolvedConfig)};\n\n /**\n * IMPORTANT: the order of plugins matters. Early plugins prepare the environment and artifacts for the following ones\n * (e.g., environment variables/output/transpilation/assets → page/version generation → bundling).\n * Reordering may result in missing artifacts, incorrect configuration, or build failures.\n */\n const corePlugins: Plugin[] = [\n pluginDotenv(vars),\n pluginOutput(),\n pluginOptimization(),\n pluginTypescript(),\n pluginReact(),\n pluginIcon(),\n pluginAsset(),\n pluginStyle(),\n pluginLocale(),\n pluginMeta(),\n pluginContent(),\n pluginBackground(),\n pluginOptions(),\n pluginOverride(),\n pluginPopup(),\n pluginPublic(),\n pluginSidebar(),\n pluginOffscreen(),\n pluginSandbox(),\n pluginPage(),\n pluginView(),\n pluginHtml(),\n pluginVersion(),\n pluginBundler(),\n pluginManifest(),\n ];\n\n return {\n ...resolvedConfig,\n plugins: [...plugins, ...userPlugins, ...corePlugins],\n };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/resolvers/config.ts"],"sourcesContent":["import {existsSync} from \"fs\";\nimport dotenv, {type DotenvParseOutput} from \"dotenv\";\nimport {loadConfig} from \"c12\";\nimport _ from \"lodash\";\n\nimport {\n pluginAction,\n pluginAsset,\n pluginBackground,\n pluginBundler,\n pluginContent,\n pluginDotenv,\n pluginHtml,\n pluginIcon,\n pluginLocale,\n pluginMeta,\n pluginOffscreen,\n pluginManifest,\n pluginOptimization,\n pluginOptions,\n pluginOutput,\n pluginOverride,\n pluginPage,\n pluginPopup,\n pluginPublic,\n pluginReact,\n pluginSandbox,\n pluginSidebar,\n pluginStyle,\n pluginTypescript,\n pluginVersion,\n pluginView,\n} from \"../plugins\";\n\nimport {fromRootPath, getAppPath, getAppSourcePath, getConfigFile} from \"../resolvers/path\";\n\nimport type {Config, OptionalConfig, ReadonlyConfig, UserConfig} from \"@typing/config\";\nimport {Command, Mode, Workspace} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {Plugin} from \"@typing/plugin\";\nimport {ManifestVersion} from \"@typing/manifest\";\nimport {Language, LanguageCodes} from \"@typing/locale\";\nimport {DefaultIconGroupName} from \"@typing/icon\";\n\nconst resolveLanguage = (lang?: `${Language}` | Language): Language => {\n if (!lang) {\n return Language.English;\n }\n\n if (LanguageCodes.has(lang)) {\n return lang as Language;\n }\n\n throw new Error(`Invalid language \"${lang}\" provided by config`);\n};\n\nconst resolveWorkspace = (workspace?: Workspace | `${Workspace}`): Workspace => {\n if (!workspace) {\n return Workspace.Single;\n }\n\n if (Object.values(Workspace).includes(workspace as Workspace)) {\n return workspace as Workspace;\n }\n\n throw new Error(`Invalid workspace \"${workspace}\" provided by config`);\n};\n\nconst resolveSharedDir = (workspace: Workspace, sharedDir: string): string => {\n return workspace === Workspace.Multi ? sharedDir : \".\";\n};\n\nconst getUserConfig = async (config: ReadonlyConfig): Promise<UserConfig> => {\n const configFilePath = getConfigFile(config);\n\n if (existsSync(configFilePath)) {\n const {config: userConfig} = await loadConfig<UserConfig>({\n configFile: configFilePath,\n dotenv: false,\n });\n\n if (config.debug) {\n console.log(\"Loaded user config:\", configFilePath);\n }\n\n return userConfig || {};\n } else if (config.debug) {\n console.warn(\"Config file not found:\", configFilePath);\n }\n\n return {};\n};\n\nconst validateConfig = (config: ReadonlyConfig): ReadonlyConfig => {\n const {\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n htmlDir,\n publicDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n } = config;\n\n if (\n [\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n htmlDir,\n publicDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n ]\n .filter(dir => _.isString(dir))\n .some(dir => dir.includes(\"..\"))\n ) {\n throw new Error('Directory paths cannot contain relative paths (\"..\") for security reasons.');\n }\n\n if (appsDir === sharedDir) {\n throw new Error(\"Apps directory (appsDir) and shared directory (sharedDir) cannot be the same.\");\n }\n\n if (srcDir === outDir) {\n throw new Error(\"Source directory (srcDir) and destination directory (outputDir) cannot be the same.\");\n }\n\n if (srcDir === \".\") {\n throw new Error('Source directory cannot be the root directory (\".\") for security reasons.');\n }\n\n if (publicDir === \".\" || [srcDir, outDir, appSrcDir].includes(publicDir)) {\n throw new Error(\n 'Public directory cannot be the root directory (\".\") or intersect with other root directories for security reasons.'\n );\n }\n\n return config;\n};\n\nconst updateLocalDotenv = (config: ReadonlyConfig): DotenvParseOutput => {\n const {mode, app, browser, manifestVersion} = config;\n\n const localVars: DotenvParseOutput = {\n APP: app,\n BROWSER: browser,\n MODE: mode,\n MANIFEST_VERSION: String(manifestVersion),\n };\n\n Object.assign(process.env, localVars);\n\n return localVars;\n};\n\nconst loadDotenv = (config: ReadonlyConfig): DotenvParseOutput => {\n const {mode, browser, debug} = config;\n\n const preset = [\n `.env.${mode}.${browser}.local`,\n `.env.${mode}.${browser}`,\n `.env.${browser}.local`,\n `.env.${browser}`,\n `.env.${mode}.local`,\n `.env.${mode}`,\n `.env.local`,\n `.env`,\n ];\n\n const appSourcePaths = preset.map(file => getAppSourcePath(config, file));\n const appPaths = preset.map(file => getAppPath(config, file));\n const rootPaths = preset.map(file => fromRootPath(config, file));\n\n const paths = [...appSourcePaths, ...appPaths, ...rootPaths];\n\n const {parsed: fileVars = {}} = dotenv.config({path: paths, quiet: !debug});\n\n return {...fileVars, ...updateLocalDotenv(config)};\n};\n\nexport default async (config: OptionalConfig): Promise<Config> => {\n let {\n command = Command.Build,\n debug = false,\n configFile = \"adnbn.config.ts\",\n browser = Browser.Chrome,\n app = \"myapp\",\n name = app,\n description,\n shortName,\n version = \"VERSION\",\n minimumVersion = \"MINIMUM_VERSION\",\n author = undefined,\n homepage = \"HOMEPAGE\",\n icon = DefaultIconGroupName,\n action,\n lang = Language.English,\n incognito,\n specific,\n workspace = Workspace.Single,\n rootDir = \".\",\n outDir = \"dist\",\n srcDir = \"src\",\n sharedDir = \"shared\",\n appsDir = \"apps\",\n appSrcDir = \".\",\n localeDir = \"locales\",\n iconSrcDir = \"icons\",\n iconOutDir = \"icons\",\n jsDir = \"js\",\n cssDir = \"css\",\n assetsDir = \"assets\",\n publicDir = \"public\",\n htmlDir = \".\",\n html = [],\n bundler = {},\n env = {},\n manifest,\n manifestVersion = (new Set<Browser>([Browser.Safari]).has(browser) ? 2 : 3) as ManifestVersion,\n mode = Mode.Development,\n analyze = false,\n plugins = [],\n mergeBackground = false,\n mergeCommands = false,\n mergeContentScripts = false,\n concatContentScripts = true,\n mergeStyles = true,\n mergeIcons = false,\n mergeLocales = true,\n mergePages = false,\n mergePopup = false,\n mergePublic = false,\n multiplePopup = false,\n mergeSidebar = false,\n multipleSidebar = false,\n mergeRelay = false,\n mergeService = false,\n mergeOffscreen = false,\n mergeSandbox = false,\n commonChunks = true,\n artifactName = \"[name]-[browser]-[mv]\",\n assetsFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:4][ext]\"\n : \"[name]-[contenthash:4][ext]\",\n jsFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:5].js\"\n : \"[name].js\",\n cssFilename = mode === Mode.Production && command === Command.Build && !debug\n ? \"[contenthash:5].css\"\n : \"[name].css\",\n cssIdentName = mode === Mode.Production && command === Command.Build && !debug\n ? \"[app]-[hash:base64:5]\"\n : \"[local]-[hash:base64:5]\",\n } = config;\n\n let resolvedConfig: Config = {\n command,\n debug,\n mode,\n browser,\n app,\n name,\n description,\n shortName,\n version,\n minimumVersion,\n author,\n homepage,\n lang: resolveLanguage(lang),\n icon,\n action,\n incognito,\n specific,\n manifest,\n manifestVersion,\n workspace: resolveWorkspace(workspace),\n rootDir,\n outDir,\n srcDir,\n sharedDir,\n appsDir,\n appSrcDir,\n jsDir,\n cssDir,\n assetsDir,\n publicDir,\n htmlDir,\n localeDir,\n iconSrcDir,\n iconOutDir,\n html,\n bundler,\n env,\n plugins,\n analyze,\n configFile,\n mergeBackground,\n mergeCommands,\n mergeContentScripts,\n concatContentScripts,\n mergeStyles,\n mergeIcons,\n mergeLocales,\n mergePages,\n mergePopup,\n mergePublic,\n multiplePopup,\n mergeSidebar,\n multipleSidebar,\n mergeRelay,\n mergeService,\n mergeOffscreen,\n mergeSandbox,\n commonChunks,\n artifactName,\n assetsFilename,\n jsFilename,\n cssFilename,\n cssIdentName,\n };\n\n let vars = loadDotenv(resolvedConfig);\n\n const {\n plugins: userPlugins = [],\n lang: userLang,\n workspace: userWorkspace,\n ...userConfig\n } = await getUserConfig(resolvedConfig);\n\n resolvedConfig = {\n ...resolvedConfig,\n ...userConfig,\n lang: resolveLanguage(userLang ?? resolvedConfig.lang),\n workspace: resolveWorkspace(userWorkspace ?? resolvedConfig.workspace),\n };\n\n resolvedConfig.sharedDir = resolveSharedDir(resolvedConfig.workspace, resolvedConfig.sharedDir);\n\n resolvedConfig = validateConfig(resolvedConfig);\n\n vars = {...vars, ...loadDotenv(resolvedConfig)};\n\n /**\n * IMPORTANT: the order of plugins matters. Early plugins prepare the environment and artifacts for the following ones\n * (e.g., environment variables/output/transpilation/assets → page/version generation → bundling).\n * Reordering may result in missing artifacts, incorrect configuration, or build failures.\n */\n const corePlugins: Plugin[] = [\n pluginDotenv(vars),\n pluginOutput(),\n pluginOptimization(),\n pluginTypescript(),\n pluginReact(),\n pluginIcon(),\n pluginAsset(),\n pluginStyle(),\n pluginLocale(),\n pluginMeta(),\n pluginAction(),\n pluginContent(),\n pluginBackground(),\n pluginOptions(),\n pluginOverride(),\n pluginPopup(),\n pluginPublic(),\n pluginSidebar(),\n pluginOffscreen(),\n pluginSandbox(),\n pluginPage(),\n pluginView(),\n pluginHtml(),\n pluginVersion(),\n pluginBundler(),\n pluginManifest(),\n ];\n\n return {\n ...resolvedConfig,\n plugins: [...plugins, ...userPlugins, ...corePlugins],\n };\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import path from "path";
2
2
  import _ from "lodash";
3
3
  const toPosix = (to) => {
4
- return path.posix.join(...to.split(path.sep));
4
+ return path.normalize(to).split(path.sep).join("/");
5
5
  };
6
6
  const toPosixPath = (pathname) => {
7
7
  const { dir, name } = path.parse(pathname);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/utils/path.ts"],"sourcesContent":["import path from \"path\";\nimport _ from \"lodash\";\n\nexport const toPosix = (to: string): string => {\n return path.posix.join(...to.split(path.sep));\n};\n\nexport const toPosixPath = (pathname: string): string => {\n const {dir, name} = path.parse(pathname);\n\n return toPosix(name === \"index\" ? dir : path.join(dir, name));\n};\n\nexport const isFileExtension = (filename: string, extension: string | string[]): boolean => {\n if (_.isString(extension)) {\n extension = [extension];\n }\n\n let {ext} = path.parse(filename);\n\n if (ext.startsWith(\".\")) {\n ext = ext.slice(1);\n }\n\n return extension.includes(ext);\n};\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,OAAO;AAEP,MAAM,UAAU,CAAC,OAAuB;AAC3C,SAAO,KAAK,MAAM,KAAK,GAAG,GAAG,MAAM,KAAK,GAAG,CAAC;AAChD;AAEO,MAAM,cAAc,CAAC,aAA6B;AACrD,QAAM,EAAC,KAAK,KAAI,IAAI,KAAK,MAAM,QAAQ;AAEvC,SAAO,QAAQ,SAAS,UAAU,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;AAChE;AAEO,MAAM,kBAAkB,CAAC,UAAkB,cAA0C;AACxF,MAAI,EAAE,SAAS,SAAS,GAAG;AACvB,gBAAY,CAAC,SAAS;AAAA,EAC1B;AAEA,MAAI,EAAC,IAAG,IAAI,KAAK,MAAM,QAAQ;AAE/B,MAAI,IAAI,WAAW,GAAG,GAAG;AACrB,UAAM,IAAI,MAAM,CAAC;AAAA,EACrB;AAEA,SAAO,UAAU,SAAS,GAAG;AACjC;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/utils/path.ts"],"sourcesContent":["import path from \"path\";\nimport _ from \"lodash\";\n\nexport const toPosix = (to: string): string => {\n return path.normalize(to).split(path.sep).join(\"/\");\n};\n\nexport const toPosixPath = (pathname: string): string => {\n const {dir, name} = path.parse(pathname);\n\n return toPosix(name === \"index\" ? dir : path.join(dir, name));\n};\n\nexport const isFileExtension = (filename: string, extension: string | string[]): boolean => {\n if (_.isString(extension)) {\n extension = [extension];\n }\n\n let {ext} = path.parse(filename);\n\n if (ext.startsWith(\".\")) {\n ext = ext.slice(1);\n }\n\n return extension.includes(ext);\n};\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,OAAO;AAEP,MAAM,UAAU,CAAC,OAAuB;AAC3C,SAAO,KAAK,UAAU,EAAE,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AACtD;AAEO,MAAM,cAAc,CAAC,aAA6B;AACrD,QAAM,EAAC,KAAK,KAAI,IAAI,KAAK,MAAM,QAAQ;AAEvC,SAAO,QAAQ,SAAS,UAAU,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;AAChE;AAEO,MAAM,kBAAkB,CAAC,UAAkB,cAA0C;AACxF,MAAI,EAAE,SAAS,SAAS,GAAG;AACvB,gBAAY,CAAC,SAAS;AAAA,EAC1B;AAEA,MAAI,EAAC,IAAG,IAAI,KAAK,MAAM,QAAQ;AAE/B,MAAI,IAAI,WAAW,GAAG,GAAG;AACrB,UAAM,IAAI,MAAM,CAAC;AAAA,EACrB;AAEA,SAAO,UAAU,SAAS,GAAG;AACjC;","names":[]}
@@ -1,14 +1,15 @@
1
1
  import TransportBuilder from "./TransportBuilder.js";
2
2
  import EntrypointBuilder from "../core/Builder.js";
3
- import { RelayUnresolvedDefinition } from "../../types/relay.js";
4
- import { ContentScriptBuilder, ContentScriptDefinition, ContentScriptIsolation } from "../../types/content/index.js";
3
+ import { RelayDefinition, RelayUnresolvedDefinition } from "../../types/relay.js";
4
+ import { ContentScriptBuilder, ContentScriptBuilderConstructor, ContentScriptIsolation } from "../../types/content/index.js";
5
5
  import { TransportType } from "../../types/transport.js";
6
6
  export default class Builder<T extends TransportType, Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`> extends EntrypointBuilder {
7
7
  protected readonly definition: RelayUnresolvedDefinition<T, Data, Isolation>;
8
8
  private generation;
9
9
  protected readonly _transport: TransportBuilder<T, Data, Isolation>;
10
10
  protected readonly _content: ContentScriptBuilder;
11
- constructor(definition: RelayUnresolvedDefinition<T, Data, Isolation>, contentBuilder: new (definition: ContentScriptDefinition<Data, NoInfer<Isolation>>) => ContentScriptBuilder);
11
+ constructor(definition: RelayDefinition<T, Data, Isolation>, contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>);
12
+ constructor(definition: RelayUnresolvedDefinition<T, Data, Isolation>, contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>);
12
13
  build(): Promise<void>;
13
14
  destroy(): Promise<void>;
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/entry/relay/Builder.ts"],"sourcesContent":["import {resolveContentScriptIsolation} from \"@shared/content\";\n\nimport TransportBuilder from \"./TransportBuilder\";\n\nimport EntrypointBuilder from \"../core/Builder\";\n\nimport {RelayUnresolvedDefinition} from \"@typing/relay\";\nimport {ContentScriptBuilder, ContentScriptDefinition, ContentScriptIsolation} from \"@typing/content\";\nimport {TransportType} from \"@typing/transport\";\n\nexport default class Builder<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n> extends EntrypointBuilder {\n private generation = 0;\n\n protected readonly _transport: TransportBuilder<T, Data, Isolation>;\n protected readonly _content: ContentScriptBuilder;\n\n constructor(\n protected readonly definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: new (definition: ContentScriptDefinition<Data, NoInfer<Isolation>>) => ContentScriptBuilder\n ) {\n super();\n\n this._transport = new TransportBuilder(definition);\n\n const {init, main, name, method, allFrames, ...contentOptions} = definition;\n\n this._content = new contentBuilder({\n ...contentOptions,\n ...(allFrames === undefined ? {} : {allFrames: allFrames !== false}),\n } as ContentScriptDefinition<Data, Isolation>);\n }\n\n public async build(): Promise<void> {\n const destroying = this.destroy();\n const generation = this.generation;\n await destroying;\n\n if (generation !== this.generation) {\n return;\n }\n\n await this._transport.build();\n\n if (generation !== this.generation) {\n return;\n }\n\n await this._content.build();\n\n if (generation !== this.generation) {\n return;\n }\n\n const {prepare, boundary, target, ...options} = this.definition;\n const {main} = options;\n\n if (main) {\n await main(this._transport.get(), this._content.getContext(), {\n ...options,\n isolation: resolveContentScriptIsolation(this.definition.isolation, \"render\" in this.definition),\n });\n }\n }\n\n public async destroy(): Promise<void> {\n this.generation++;\n // Invalidate pending content work immediately; transport cleanup starts first.\n await Promise.all([this._transport.destroy(), this._content.destroy()]);\n }\n}\n"],"mappings":"AAAA,SAAQ,qCAAoC;AAE5C,OAAO,sBAAsB;AAE7B,OAAO,uBAAuB;AAM9B,MAAO,gBAIG,kBAAkB;AAAA,EAMxB,YACuB,YACnB,gBACF;AACE,UAAM;AAHa;AAKnB,SAAK,aAAa,IAAI,iBAAiB,UAAU;AAEjD,UAAM,EAAC,MAAM,MAAM,MAAM,QAAQ,WAAW,GAAG,eAAc,IAAI;AAEjE,SAAK,WAAW,IAAI,eAAe;AAAA,MAC/B,GAAG;AAAA,MACH,GAAI,cAAc,SAAY,CAAC,IAAI,EAAC,WAAW,cAAc,MAAK;AAAA,IACtE,CAA6C;AAAA,EACjD;AAAA,EAbuB;AAAA,EANf,aAAa;AAAA,EAEF;AAAA,EACA;AAAA,EAkBnB,MAAa,QAAuB;AAChC,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,aAAa,KAAK;AACxB,UAAM;AAEN,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,KAAK,WAAW,MAAM;AAE5B,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,KAAK,SAAS,MAAM;AAE1B,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,EAAC,SAAS,UAAU,QAAQ,GAAG,QAAO,IAAI,KAAK;AACrD,UAAM,EAAC,KAAI,IAAI;AAEf,QAAI,MAAM;AACN,YAAM,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,SAAS,WAAW,GAAG;AAAA,QAC1D,GAAG;AAAA,QACH,WAAW,8BAA8B,KAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AAAA,MACnG,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,MAAa,UAAyB;AAClC,SAAK;AAEL,UAAM,QAAQ,IAAI,CAAC,KAAK,WAAW,QAAQ,GAAG,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,EAC1E;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/entry/relay/Builder.ts"],"sourcesContent":["import {resolveContentScriptIsolation} from \"@shared/content\";\n\nimport TransportBuilder from \"./TransportBuilder\";\n\nimport EntrypointBuilder from \"../core/Builder\";\n\nimport {RelayDefinition, RelayUnresolvedDefinition} from \"@typing/relay\";\nimport {\n ContentScriptBuilder,\n ContentScriptBuilderConstructor,\n ContentScriptDefinition,\n ContentScriptIsolation,\n} from \"@typing/content\";\nimport {TransportType} from \"@typing/transport\";\n\nexport default class Builder<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n> extends EntrypointBuilder {\n private generation = 0;\n\n protected readonly _transport: TransportBuilder<T, Data, Isolation>;\n protected readonly _content: ContentScriptBuilder;\n\n // Preserve the named definition during inference instead of expanding its DOM option unions.\n constructor(\n definition: RelayDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n );\n\n constructor(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n );\n\n constructor(\n protected readonly definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n ) {\n super();\n\n this._transport = new TransportBuilder(definition);\n\n const {init, main, name, method, allFrames, ...contentOptions} = definition;\n\n this._content = new contentBuilder({\n ...contentOptions,\n ...(allFrames === undefined ? {} : {allFrames: allFrames !== false}),\n } as ContentScriptDefinition<Data, Isolation>);\n }\n\n public async build(): Promise<void> {\n const destroying = this.destroy();\n const generation = this.generation;\n await destroying;\n\n if (generation !== this.generation) {\n return;\n }\n\n await this._transport.build();\n\n if (generation !== this.generation) {\n return;\n }\n\n await this._content.build();\n\n if (generation !== this.generation) {\n return;\n }\n\n const {prepare, boundary, target, ...options} = this.definition;\n const {main} = options;\n\n if (main) {\n await main(this._transport.get(), this._content.getContext(), {\n ...options,\n isolation: resolveContentScriptIsolation(this.definition.isolation, \"render\" in this.definition),\n });\n }\n }\n\n public async destroy(): Promise<void> {\n this.generation++;\n // Invalidate pending content work immediately; transport cleanup starts first.\n await Promise.all([this._transport.destroy(), this._content.destroy()]);\n }\n}\n"],"mappings":"AAAA,SAAQ,qCAAoC;AAE5C,OAAO,sBAAsB;AAE7B,OAAO,uBAAuB;AAW9B,MAAO,gBAIG,kBAAkB;AAAA,EAiBxB,YACuB,YACnB,gBACF;AACE,UAAM;AAHa;AAKnB,SAAK,aAAa,IAAI,iBAAiB,UAAU;AAEjD,UAAM,EAAC,MAAM,MAAM,MAAM,QAAQ,WAAW,GAAG,eAAc,IAAI;AAEjE,SAAK,WAAW,IAAI,eAAe;AAAA,MAC/B,GAAG;AAAA,MACH,GAAI,cAAc,SAAY,CAAC,IAAI,EAAC,WAAW,cAAc,MAAK;AAAA,IACtE,CAA6C;AAAA,EACjD;AAAA,EAbuB;AAAA,EAjBf,aAAa;AAAA,EAEF;AAAA,EACA;AAAA,EA6BnB,MAAa,QAAuB;AAChC,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,aAAa,KAAK;AACxB,UAAM;AAEN,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,KAAK,WAAW,MAAM;AAE5B,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,KAAK,SAAS,MAAM;AAE1B,QAAI,eAAe,KAAK,YAAY;AAChC;AAAA,IACJ;AAEA,UAAM,EAAC,SAAS,UAAU,QAAQ,GAAG,QAAO,IAAI,KAAK;AACrD,UAAM,EAAC,KAAI,IAAI;AAEf,QAAI,MAAM;AACN,YAAM,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,SAAS,WAAW,GAAG;AAAA,QAC1D,GAAG;AAAA,QACH,WAAW,8BAA8B,KAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AAAA,MACnG,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,MAAa,UAAyB;AAClC,SAAK;AAEL,UAAM,QAAQ,IAAI,CAAC,KAAK,WAAW,QAAQ,GAAG,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,EAC1E;AACJ;","names":[]}
@@ -1,8 +1,9 @@
1
1
  import Builder from "./Builder.js";
2
- import type { RelayUnresolvedDefinition } from "../../types/relay.js";
2
+ import type { RelayDefinition, RelayUnresolvedDefinition } from "../../types/relay.js";
3
3
  import type { TransportType } from "../../types/transport.js";
4
- import type { ContentScriptIsolation } from "../../types/content/index.js";
4
+ import type { ContentScriptBuilderConstructor, ContentScriptIsolation } from "../../types/content/index.js";
5
5
  export { Builder };
6
6
  export { resolveDefinition } from "./resolvers/definition.js";
7
7
  export type { RelayUnresolvedDefinition } from "../../types/relay.js";
8
- export default function relay<T extends TransportType, Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`>(definition: RelayUnresolvedDefinition<T, Data, Isolation>, contentBuilder: ConstructorParameters<typeof Builder<T, Data, NoInfer<Isolation>>>[1]): void;
8
+ export default function relay<T extends TransportType, Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`>(definition: RelayDefinition<T, Data, Isolation>, contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>): void;
9
+ export default function relay<T extends TransportType, Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`>(definition: RelayUnresolvedDefinition<T, Data, Isolation>, contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>): void;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/entry/relay/index.ts"],"sourcesContent":["import Builder from \"./Builder\";\n\nimport type {RelayUnresolvedDefinition} from \"@typing/relay\";\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptIsolation} from \"@typing/content\";\n\nexport {Builder};\nexport {resolveDefinition} from \"./resolvers/definition\";\n\nexport type {RelayUnresolvedDefinition} from \"@typing/relay\";\n\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ConstructorParameters<typeof Builder<T, Data, NoInfer<Isolation>>>[1]\n): void {\n new Builder(definition, contentBuilder).build().catch(error => {\n console.error(\"Failed to build relay: \", error);\n });\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAOpB,SAAQ,yBAAwB;AAIjB,SAAR,MAKH,YACA,gBACI;AACJ,MAAI,QAAQ,YAAY,cAAc,EAAE,MAAM,EAAE,MAAM,WAAS;AAC3D,YAAQ,MAAM,2BAA2B,KAAK;AAAA,EAClD,CAAC;AACL;","names":[]}
1
+ {"version":3,"sources":["../../../src/entry/relay/index.ts"],"sourcesContent":["import Builder from \"./Builder\";\n\nimport type {RelayDefinition, RelayUnresolvedDefinition} from \"@typing/relay\";\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptBuilderConstructor, ContentScriptIsolation} from \"@typing/content\";\n\nexport {Builder};\nexport {resolveDefinition} from \"./resolvers/definition\";\n\nexport type {RelayUnresolvedDefinition} from \"@typing/relay\";\n\n// Match Builder's full-definition overload before the partial bootstrap input.\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n): void;\n\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n): void;\n\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ContentScriptBuilderConstructor<Data, Isolation>\n): void {\n new Builder(definition, contentBuilder).build().catch(error => {\n console.error(\"Failed to build relay: \", error);\n });\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAOpB,SAAQ,yBAAwB;AAuBjB,SAAR,MAKH,YACA,gBACI;AACJ,MAAI,QAAQ,YAAY,cAAc,EAAE,MAAM,EAAE,MAAM,WAAS;AAC3D,YAAQ,MAAM,2BAA2B,KAAK;AAAA,EAClD,CAAC;AACL;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { useMemo, useSyncExternalStore } from "react";
2
2
  import ReactLocale from "../ReactLocale.js";
3
- import { ObservableLocale } from "./../../../../locale/providers/index.js";
3
+ import { ObservableLocale } from "./../../../../locale/observers/index.js";
4
4
  const useLocale = (storage) => {
5
5
  const locale = useMemo(() => ObservableLocale.getInstance(storage), [storage]);
6
6
  const snapshot = useSyncExternalStore(locale.subscribe, locale.snapshot);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/locale/adapters/react/hooks/use-locale.ts"],"sourcesContent":["import {useMemo, useSyncExternalStore} from \"react\";\n\nimport ReactLocale from \"../ReactLocale\";\n\nimport {ObservableLocale} from \"@locale/providers\";\n\nimport type {LocaleReactDynamicContract} from \"../types\";\nimport type {LocaleRegistry, LocaleStorageDriver} from \"@typing/locale\";\n\nexport const useLocale = (storage?: LocaleStorageDriver | false): LocaleReactDynamicContract => {\n const locale = useMemo(() => ObservableLocale.getInstance(storage), [storage]);\n const snapshot = useSyncExternalStore(locale.subscribe, locale.snapshot);\n\n return useMemo(\n () =>\n Object.assign(new ReactLocale<LocaleRegistry>(snapshot), {\n change: locale.change,\n }),\n [locale, snapshot]\n );\n};\n"],"mappings":"AAAA,SAAQ,SAAS,4BAA2B;AAE5C,OAAO,iBAAiB;AAExB,SAAQ,wBAAuB;AAKxB,MAAM,YAAY,CAAC,YAAsE;AAC5F,QAAM,SAAS,QAAQ,MAAM,iBAAiB,YAAY,OAAO,GAAG,CAAC,OAAO,CAAC;AAC7E,QAAM,WAAW,qBAAqB,OAAO,WAAW,OAAO,QAAQ;AAEvE,SAAO;AAAA,IACH,MACI,OAAO,OAAO,IAAI,YAA4B,QAAQ,GAAG;AAAA,MACrD,QAAQ,OAAO;AAAA,IACnB,CAAC;AAAA,IACL,CAAC,QAAQ,QAAQ;AAAA,EACrB;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/locale/adapters/react/hooks/use-locale.ts"],"sourcesContent":["import {useMemo, useSyncExternalStore} from \"react\";\n\nimport ReactLocale from \"../ReactLocale\";\n\nimport {ObservableLocale} from \"@locale/observers\";\n\nimport type {LocaleReactDynamicContract} from \"../types\";\nimport type {LocaleRegistry, LocaleStorageDriver} from \"@typing/locale\";\n\nexport const useLocale = (storage?: LocaleStorageDriver | false): LocaleReactDynamicContract => {\n const locale = useMemo(() => ObservableLocale.getInstance(storage), [storage]);\n const snapshot = useSyncExternalStore(locale.subscribe, locale.snapshot);\n\n return useMemo(\n () =>\n Object.assign(new ReactLocale<LocaleRegistry>(snapshot), {\n change: locale.change,\n }),\n [locale, snapshot]\n );\n};\n"],"mappings":"AAAA,SAAQ,SAAS,4BAA2B;AAE5C,OAAO,iBAAiB;AAExB,SAAQ,wBAAuB;AAKxB,MAAM,YAAY,CAAC,YAAsE;AAC5F,QAAM,SAAS,QAAQ,MAAM,iBAAiB,YAAY,OAAO,GAAG,CAAC,OAAO,CAAC;AAC7E,QAAM,WAAW,qBAAqB,OAAO,WAAW,OAAO,QAAQ;AAEvE,SAAO;AAAA,IACH,MACI,OAAO,OAAO,IAAI,YAA4B,QAAQ,GAAG;AAAA,MACrD,QAAQ,OAAO;AAAA,IACnB,CAAC;AAAA,IACL,CAAC,QAAQ,QAAQ;AAAA,EACrB;AACJ;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { useMemo } from "react";
2
- import NativeLocale from "./../../../../locale/providers/NativeLocale.js";
3
2
  import ReactLocale from "../ReactLocale.js";
3
+ import { NativeLocale } from "./../../../../locale/providers/index.js";
4
4
  const useNativeLocale = () => {
5
5
  return useMemo(() => new ReactLocale(NativeLocale.getInstance()), []);
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/locale/adapters/react/hooks/use-native-locale.ts"],"sourcesContent":["import {useMemo} from \"react\";\nimport NativeLocale from \"@locale/providers/NativeLocale\";\nimport ReactLocale from \"../ReactLocale\";\nimport type {LocaleRegistry} from \"@typing/locale\";\nimport type {LocaleReactContract} from \"../types\";\n\n/** Uses browser-selected translations with React substitutions. */\nexport const useNativeLocale = (): LocaleReactContract => {\n return useMemo(() => new ReactLocale<LocaleRegistry>(NativeLocale.getInstance()), []);\n};\n"],"mappings":"AAAA,SAAQ,eAAc;AACtB,OAAO,kBAAkB;AACzB,OAAO,iBAAiB;AAKjB,MAAM,kBAAkB,MAA2B;AACtD,SAAO,QAAQ,MAAM,IAAI,YAA4B,aAAa,YAAY,CAAC,GAAG,CAAC,CAAC;AACxF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/locale/adapters/react/hooks/use-native-locale.ts"],"sourcesContent":["import {useMemo} from \"react\";\n\nimport ReactLocale from \"../ReactLocale\";\n\nimport {NativeLocale} from \"@locale/providers\";\n\nimport type {LocaleReactContract} from \"../types\";\n\nimport type {LocaleRegistry} from \"@typing/locale\";\n\n/** Uses browser-selected translations with React substitutions. */\nexport const useNativeLocale = (): LocaleReactContract => {\n return useMemo(() => new ReactLocale<LocaleRegistry>(NativeLocale.getInstance()), []);\n};\n"],"mappings":"AAAA,SAAQ,eAAc;AAEtB,OAAO,iBAAiB;AAExB,SAAQ,oBAAmB;AAOpB,MAAM,kBAAkB,MAA2B;AACtD,SAAO,QAAQ,MAAM,IAAI,YAA4B,aAAa,YAAY,CAAC,GAAG,CAAC,CAAC;AACxF;","names":[]}
@@ -1,4 +1,5 @@
1
1
  export * from "./providers/index.js";
2
+ export { ObservableLocale } from "./observers/index.js";
2
3
  export * from "./helpers.js";
3
4
  export * from "./storage/index.js";
4
5
  export { Language, LanguageCodes, LocaleDir, type LocaleStructure, type LocaleRegistry, type LocaleProvider, type LocaleDynamicProvider, type LocaleSnapshot, type LocaleStorageDriver, type LocaleKeys, type LocaleSubstitutionArgs, type LocaleSubstitutionKeys, type LocaleSubstitutionValue, type LocaleNonPluralKeys, type LocalePluralKeys, } from "../types/locale.js";
@@ -1,4 +1,5 @@
1
1
  export * from "./providers/index.js";
2
+ import { ObservableLocale } from "./observers/index.js";
2
3
  export * from "./helpers.js";
3
4
  export * from "./storage/index.js";
4
5
  import {
@@ -9,6 +10,7 @@ import {
9
10
  export {
10
11
  Language,
11
12
  LanguageCodes,
12
- LocaleDir
13
+ LocaleDir,
14
+ ObservableLocale
13
15
  };
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/locale/index.ts"],"sourcesContent":["export * from \"./providers\";\nexport * from \"./helpers\";\nexport * from \"./storage\";\n\nexport {\n Language,\n LanguageCodes,\n LocaleDir,\n type LocaleStructure,\n type LocaleRegistry,\n type LocaleProvider,\n type LocaleDynamicProvider,\n type LocaleSnapshot,\n type LocaleStorageDriver,\n type LocaleKeys,\n type LocaleSubstitutionArgs,\n type LocaleSubstitutionKeys,\n type LocaleSubstitutionValue,\n type LocaleNonPluralKeys,\n type LocalePluralKeys,\n} from \"@typing/locale\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAEd;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAaG;","names":[]}
1
+ {"version":3,"sources":["../../src/locale/index.ts"],"sourcesContent":["export * from \"./providers\";\nexport {ObservableLocale} from \"./observers\";\nexport * from \"./helpers\";\nexport * from \"./storage\";\n\nexport {\n Language,\n LanguageCodes,\n LocaleDir,\n type LocaleStructure,\n type LocaleRegistry,\n type LocaleProvider,\n type LocaleDynamicProvider,\n type LocaleSnapshot,\n type LocaleStorageDriver,\n type LocaleKeys,\n type LocaleSubstitutionArgs,\n type LocaleSubstitutionKeys,\n type LocaleSubstitutionValue,\n type LocaleNonPluralKeys,\n type LocalePluralKeys,\n} from \"@typing/locale\";\n"],"mappings":"AAAA,cAAc;AACd,SAAQ,wBAAuB;AAC/B,cAAc;AACd,cAAc;AAEd;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAaG;","names":[]}
@@ -1,5 +1,5 @@
1
- import DynamicLocale from "./DynamicLocale.js";
2
- import CustomLocale from "./CustomLocale.js";
1
+ import { DynamicLocale } from "../providers/index.js";
2
+ import CustomLocale from "../providers/CustomLocale.js";
3
3
  import { LocaleStorage } from "../storage/index.js";
4
4
  class ObservableLocale {
5
5
  static defaultInstance;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/locale/observers/ObservableLocale.ts"],"sourcesContent":["import {DynamicLocale} from \"../providers\";\nimport CustomLocale from \"../providers/CustomLocale\";\n\nimport {LocaleStorage} from \"../storage\";\n\nimport type {\n Language,\n LocaleDynamicProvider,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleRegistry,\n LocaleSnapshot,\n LocaleStorageDriver,\n LocaleSubstitutionArgs,\n LocaleSubstitutionValue,\n} from \"@typing/locale\";\n\n/** Dynamic translations with shared instances and subscriptions independent of any UI framework. */\nexport default class ObservableLocale<T extends object = LocaleRegistry> implements LocaleDynamicProvider<T> {\n private static defaultInstance?: ObservableLocale;\n private static memoryInstance?: ObservableLocale;\n\n private static readonly drivers = new WeakMap<LocaleStorageDriver, ObservableLocale>();\n\n public static getInstance(storage?: LocaleStorageDriver | false): ObservableLocale {\n if (typeof storage === \"object\") {\n let instance = this.drivers.get(storage);\n\n if (!instance) {\n instance = new ObservableLocale(storage);\n this.drivers.set(storage, instance);\n }\n\n return instance;\n }\n\n if (storage === false) {\n return (this.memoryInstance ??= new ObservableLocale(false));\n }\n\n return (this.defaultInstance ??= new ObservableLocale());\n }\n\n private readonly locale = new DynamicLocale<T>(false);\n private readonly storage?: LocaleStorageDriver;\n private readonly listeners = new Set<() => void>();\n private readonly languages: ReadonlySet<Language>;\n private readonly languageNames: ReadonlyMap<Language, string>;\n private currentSnapshot: LocaleSnapshot<T>;\n private revision = 0;\n private writes: Promise<void> = Promise.resolve();\n private pendingWrites = 0;\n private unsubscribe?: () => void;\n\n constructor(storage?: LocaleStorageDriver | false) {\n this.storage = storage === false ? undefined : (storage ?? new LocaleStorage());\n this.languages = this.langs();\n this.languageNames = this.langNames();\n this.currentSnapshot = this.createSnapshot();\n }\n\n public lang(): Language {\n return this.locale.lang();\n }\n\n public langs(): ReadonlySet<Language> {\n return this.locale.langs();\n }\n\n public langNames(): ReadonlyMap<Language, string> {\n return this.locale.langNames();\n }\n\n public keys(): Set<keyof T> {\n return this.locale.keys();\n }\n\n public get<K extends keyof T & string>(key: K, substitutions?: Record<string, LocaleSubstitutionValue>): string {\n return this.locale.get(key, substitutions);\n }\n\n public trans<K extends LocaleNonPluralKeys<T>>(key: K, ...args: LocaleSubstitutionArgs<T, K>): string {\n return this.locale.trans(key, ...args);\n }\n\n public choice<K extends LocalePluralKeys<T>>(key: K, count: number, ...args: LocaleSubstitutionArgs<T, K>): string {\n return this.locale.choice(key, count, ...args);\n }\n\n public readonly snapshot = (): LocaleSnapshot<T> => this.currentSnapshot;\n\n public readonly subscribe = (listener: () => void): (() => void) => {\n // Each subscription owns its cleanup, even when the same callback is subscribed twice.\n const notify = () => listener();\n\n this.listeners.add(notify);\n\n try {\n this.connect();\n } catch (error) {\n this.listeners.delete(notify);\n throw error;\n }\n\n if (this.listeners.size === 1) {\n void this.refresh();\n }\n\n return () => {\n this.listeners.delete(notify);\n this.disconnect();\n };\n };\n\n public readonly change = async (lang: Language): Promise<Language> => {\n this.locale.select(lang);\n\n const storage = this.storage;\n\n if (!storage) {\n this.publish();\n\n return lang;\n }\n\n this.revision++;\n\n // Register persistence before notifying: a subscriber may select another language immediately.\n this.pendingWrites++;\n\n const saved = this.writes.then(() => storage.set(lang));\n\n this.writes = saved.catch(() => undefined);\n\n this.publish();\n\n let succeeded = false;\n\n try {\n await saved;\n succeeded = true;\n\n return lang;\n } finally {\n if (--this.pendingWrites === 0 && succeeded) {\n void this.refresh();\n }\n }\n };\n\n public async sync(): Promise<Language> {\n if (!this.storage) {\n throw new Error(\"Language is not saving in storage\");\n }\n\n if (this.pendingWrites) {\n return this.lang();\n }\n\n const revision = ++this.revision;\n const lang = await this.storage.get();\n\n if (revision !== this.revision || this.pendingWrites) {\n return this.lang();\n }\n\n if (lang === undefined) {\n return this.lang();\n }\n\n if (!this.langs().has(lang)) {\n console.warn(`Incorrect language code in storage - \"${lang}\"`);\n\n return this.lang();\n }\n\n this.locale.select(lang);\n\n this.publish();\n\n return this.lang();\n }\n\n private connect(): void {\n if (!this.storage || this.unsubscribe) {\n return;\n }\n\n this.unsubscribe = this.storage.watch(() => {\n void this.refresh();\n });\n }\n\n private disconnect(): void {\n if (this.listeners.size) {\n return;\n }\n\n this.revision++;\n\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n }\n\n private async refresh(): Promise<void> {\n if (!this.storage || this.pendingWrites) {\n return;\n }\n\n try {\n await this.sync();\n } catch (error) {\n console.error(\"[ObservableLocale] Cannot synchronize language:\", error);\n }\n }\n\n private createSnapshot(): LocaleSnapshot<T> {\n const lang = this.lang();\n const langs = this.languages;\n const langNames = this.languageNames;\n\n const reader = new CustomLocale<T>(lang, this.locale.messages());\n\n return Object.freeze({\n lang: () => lang,\n langs: () => langs,\n langNames: () => langNames,\n get: reader.get.bind(reader),\n });\n }\n\n private publish(): void {\n if (this.currentSnapshot.lang() === this.lang()) {\n return;\n }\n\n this.currentSnapshot = this.createSnapshot();\n\n for (const listener of [...this.listeners]) {\n try {\n listener();\n } catch (error) {\n console.error(\"[ObservableLocale] Language subscriber failed:\", error);\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ export { default as ObservableLocale } from "./ObservableLocale.js";
@@ -0,0 +1,5 @@
1
+ import { default as default2 } from "./ObservableLocale.js";
2
+ export {
3
+ default2 as ObservableLocale
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/locale/observers/index.ts"],"sourcesContent":["export {default as ObservableLocale} from \"./ObservableLocale\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAAkC;","names":["default"]}