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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/builders/manifest/ManifestV3.ts"],"sourcesContent":["import ManifestBase, {ManifestError} from \"./ManifestBase\";\n\nimport {filterHostPatterns, filterOptionalPermissions, filterPermissionsForMV3} from \"./utils\";\n\nimport {CoreManifest, ManifestAccessibleResource, ManifestVersion} from \"@typing/manifest\";\nimport {Browser} from \"@typing/browser\";\n\ntype ManifestV3 = chrome.runtime.ManifestV3;\n\nexport default class extends ManifestBase<ManifestV3> {\n public constructor(browser: Browser) {\n super(browser);\n }\n\n public getManifestVersion(): ManifestVersion {\n return 3;\n }\n\n protected buildBackground(): Partial<CoreManifest> | undefined {\n if (this.browser === Browser.Firefox) {\n const manifest = super.buildBackground();\n\n if (manifest) {\n const {background, ...other} = manifest;\n\n return {...other, background: {...background, persistent: undefined}};\n }\n\n return;\n }\n\n if (this.background) {\n const {entry} = this.background;\n\n const dependencies = this.dependencies.get(entry);\n\n if (!dependencies) {\n throw new ManifestError(`Background entry \"${entry}\" not found in dependencies`);\n }\n\n if (dependencies.js.size === 0) {\n throw new ManifestError(`Background entry \"${entry}\" has no dependencies`);\n }\n\n if (dependencies.js.size > 1) {\n throw new ManifestError(`Background entry \"${entry}\" has more than one dependency`);\n }\n\n const [js] = Array.from(dependencies.js);\n\n return {background: {service_worker: js}};\n }\n }\n\n protected buildAction(): Partial<ManifestV3> | undefined {\n if (this.popup) {\n const {path, icon, title} = this.popup;\n\n return {\n action: {\n default_title: title || this.name,\n default_popup: path,\n default_icon: this.getIconsByName(icon),\n },\n };\n } else if (this.hasExecuteActionCommand()) {\n return {\n action: {\n default_title: this.name,\n },\n };\n }\n }\n\n protected buildPermissions(): Partial<ManifestV3> | undefined {\n const permissions = Array.from(filterPermissionsForMV3(this.combinedPermissions));\n\n if (permissions.length > 0) {\n return {permissions};\n }\n }\n\n protected buildOptionalPermissions(): Partial<ManifestV3> | undefined {\n const optionalPermissions = filterOptionalPermissions(\n filterPermissionsForMV3(this.combinedOptionalPermissions),\n filterPermissionsForMV3(this.combinedPermissions)\n );\n\n if (optionalPermissions.length > 0) {\n return {optional_permissions: optionalPermissions};\n }\n }\n\n protected buildHostPermissions(): Partial<ManifestV3> | undefined {\n if (this.combinedHostPermissions.size > 0) {\n return {host_permissions: [...filterHostPatterns(this.combinedHostPermissions)]};\n }\n }\n\n protected buildOptionalHostPermissions(): Partial<ManifestV3> | undefined {\n // prettier-ignore\n const optionalHostPermissions = Array\n .from(filterHostPatterns(new Set([...this.combinedHostPermissions, ...this.combinedOptionalHostPermissions])))\n .filter((permission) => !this.combinedHostPermissions.has(permission));\n\n if (optionalHostPermissions.length > 0) {\n return {optional_host_permissions: optionalHostPermissions};\n }\n }\n\n protected buildWebAccessibleResources(): Partial<ManifestV3> | undefined {\n const resources: ManifestAccessibleResource[] = this.getWebAccessibleResources();\n\n const transformedResources = resources.map(resource => {\n const entry = {\n resources: resource.resources,\n ...(resource.useDynamicUrl !== undefined ? {use_dynamic_url: resource.useDynamicUrl} : {}),\n };\n\n return resource.extensionIds\n ? {\n ...entry,\n extension_ids: resource.extensionIds,\n ...(resource.matches ? {matches: resource.matches} : {}),\n }\n : {...entry, matches: resource.matches || []};\n });\n\n if (resources.length > 0) {\n return {web_accessible_resources: transformedResources};\n }\n }\n\n protected buildSandbox(): Partial<ManifestV3> | undefined {\n if (this.browser === Browser.Firefox) {\n return;\n }\n\n const rawSandbox = (this.combinedRaws.sandbox || {}) as Record<string, any>;\n const sandboxes = this.getSandboxes();\n\n if (sandboxes.length === 0 && Object.keys(rawSandbox).length === 0) {\n return;\n }\n\n return {\n sandbox: {\n ...rawSandbox,\n pages: sandboxes,\n },\n } as Partial<ManifestV3>;\n }\n\n protected buildCsp(): Partial<ManifestV3> | undefined {\n const rawCsp = this.combinedRaws.content_security_policy;\n const csp = this.csp.build();\n const sandboxCsp = this.sandboxCsp.build();\n\n if (this.browser === Browser.Firefox) {\n if (!rawCsp && !csp) {\n return;\n }\n\n if (typeof rawCsp === \"string\") {\n if (csp) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with a string content_security_policy.\"\n );\n }\n\n return {content_security_policy: rawCsp} as Partial<ManifestV3>;\n }\n\n const {sandbox, ...contentCsp} = rawCsp || {};\n\n if (csp && contentCsp.extension_pages) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with raw content_security_policy.extension_pages.\"\n );\n }\n\n if (csp) {\n contentCsp.extension_pages = csp;\n }\n\n return Object.keys(contentCsp).length > 0\n ? ({content_security_policy: contentCsp} as Partial<ManifestV3>)\n : undefined;\n }\n\n if (!rawCsp && !sandboxCsp && !csp) {\n return;\n }\n\n if (typeof rawCsp === \"string\") {\n if (sandboxCsp || csp) {\n throw new ManifestError(\n \"Cannot merge framework content security policy with a string content_security_policy.\"\n );\n }\n\n return {content_security_policy: rawCsp} as Partial<ManifestV3>;\n }\n\n if (csp && rawCsp?.extension_pages) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with raw content_security_policy.extension_pages.\"\n );\n }\n\n return {\n content_security_policy: {\n ...rawCsp,\n ...(csp ? {extension_pages: csp} : {}),\n ...(sandboxCsp || rawCsp?.sandbox ? {sandbox: sandboxCsp || rawCsp?.sandbox} : {}),\n },\n } as Partial<ManifestV3>;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/builders/manifest/ManifestV3.ts"],"sourcesContent":["import ManifestBase, {ManifestError} from \"./ManifestBase\";\n\nimport {filterHostPatterns, filterOptionalPermissions, filterPermissionsForMV3} from \"./utils\";\n\nimport {CoreManifest, ManifestAccessibleResource, ManifestVersion} from \"@typing/manifest\";\nimport {Browser} from \"@typing/browser\";\n\ntype ManifestV3 = chrome.runtime.ManifestV3;\n\nexport default class extends ManifestBase<ManifestV3> {\n public constructor(browser: Browser) {\n super(browser);\n }\n\n public getManifestVersion(): ManifestVersion {\n return 3;\n }\n\n protected buildBackground(): Partial<CoreManifest> | undefined {\n if (this.browser === Browser.Firefox) {\n const manifest = super.buildBackground();\n\n if (manifest) {\n const {background, ...other} = manifest;\n\n return {...other, background: {...background, persistent: undefined}};\n }\n\n return;\n }\n\n if (this.background) {\n const {entry} = this.background;\n\n const dependencies = this.dependencies.get(entry);\n\n if (!dependencies) {\n throw new ManifestError(`Background entry \"${entry}\" not found in dependencies`);\n }\n\n if (dependencies.js.size === 0) {\n throw new ManifestError(`Background entry \"${entry}\" has no dependencies`);\n }\n\n if (dependencies.js.size > 1) {\n throw new ManifestError(`Background entry \"${entry}\" has more than one dependency`);\n }\n\n const [js] = Array.from(dependencies.js);\n\n return {background: {service_worker: js}};\n }\n }\n\n protected buildAction(): Partial<ManifestV3> | undefined {\n const action = this.getAction();\n\n if (action) {\n return {action};\n }\n }\n\n protected buildPermissions(): Partial<ManifestV3> | undefined {\n const permissions = Array.from(filterPermissionsForMV3(this.combinedPermissions));\n\n if (permissions.length > 0) {\n return {permissions};\n }\n }\n\n protected buildOptionalPermissions(): Partial<ManifestV3> | undefined {\n const optionalPermissions = filterOptionalPermissions(\n filterPermissionsForMV3(this.combinedOptionalPermissions),\n filterPermissionsForMV3(this.combinedPermissions)\n );\n\n if (optionalPermissions.length > 0) {\n return {optional_permissions: optionalPermissions};\n }\n }\n\n protected buildHostPermissions(): Partial<ManifestV3> | undefined {\n if (this.combinedHostPermissions.size > 0) {\n return {host_permissions: [...filterHostPatterns(this.combinedHostPermissions)]};\n }\n }\n\n protected buildOptionalHostPermissions(): Partial<ManifestV3> | undefined {\n // prettier-ignore\n const optionalHostPermissions = Array\n .from(filterHostPatterns(new Set([...this.combinedHostPermissions, ...this.combinedOptionalHostPermissions])))\n .filter((permission) => !this.combinedHostPermissions.has(permission));\n\n if (optionalHostPermissions.length > 0) {\n return {optional_host_permissions: optionalHostPermissions};\n }\n }\n\n protected buildWebAccessibleResources(): Partial<ManifestV3> | undefined {\n const resources: ManifestAccessibleResource[] = this.getWebAccessibleResources();\n\n const transformedResources = resources.map(resource => {\n const entry = {\n resources: resource.resources,\n ...(resource.useDynamicUrl !== undefined ? {use_dynamic_url: resource.useDynamicUrl} : {}),\n };\n\n return resource.extensionIds\n ? {\n ...entry,\n extension_ids: resource.extensionIds,\n ...(resource.matches ? {matches: resource.matches} : {}),\n }\n : {...entry, matches: resource.matches || []};\n });\n\n if (resources.length > 0) {\n return {web_accessible_resources: transformedResources};\n }\n }\n\n protected buildSandbox(): Partial<ManifestV3> | undefined {\n if (this.browser === Browser.Firefox) {\n return;\n }\n\n const rawSandbox = (this.combinedRaws.sandbox || {}) as Record<string, any>;\n const sandboxes = this.getSandboxes();\n\n if (sandboxes.length === 0 && Object.keys(rawSandbox).length === 0) {\n return;\n }\n\n return {\n sandbox: {\n ...rawSandbox,\n pages: sandboxes,\n },\n } as Partial<ManifestV3>;\n }\n\n protected buildCsp(): Partial<ManifestV3> | undefined {\n const rawCsp = this.combinedRaws.content_security_policy;\n const csp = this.csp.build();\n const sandboxCsp = this.sandboxCsp.build();\n\n if (this.browser === Browser.Firefox) {\n if (!rawCsp && !csp) {\n return;\n }\n\n if (typeof rawCsp === \"string\") {\n if (csp) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with a string content_security_policy.\"\n );\n }\n\n return {content_security_policy: rawCsp} as Partial<ManifestV3>;\n }\n\n const {sandbox, ...contentCsp} = rawCsp || {};\n\n if (csp && contentCsp.extension_pages) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with raw content_security_policy.extension_pages.\"\n );\n }\n\n if (csp) {\n contentCsp.extension_pages = csp;\n }\n\n return Object.keys(contentCsp).length > 0\n ? ({content_security_policy: contentCsp} as Partial<ManifestV3>)\n : undefined;\n }\n\n if (!rawCsp && !sandboxCsp && !csp) {\n return;\n }\n\n if (typeof rawCsp === \"string\") {\n if (sandboxCsp || csp) {\n throw new ManifestError(\n \"Cannot merge framework content security policy with a string content_security_policy.\"\n );\n }\n\n return {content_security_policy: rawCsp} as Partial<ManifestV3>;\n }\n\n if (csp && rawCsp?.extension_pages) {\n throw new ManifestError(\n \"Cannot merge extension pages content security policy with raw content_security_policy.extension_pages.\"\n );\n }\n\n return {\n content_security_policy: {\n ...rawCsp,\n ...(csp ? {extension_pages: csp} : {}),\n ...(sandboxCsp || rawCsp?.sandbox ? {sandbox: sandboxCsp || rawCsp?.sandbox} : {}),\n },\n } as Partial<ManifestV3>;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,6 @@
1
1
  import _ from "lodash";
2
2
  import path from "path";
3
+ import { createHash } from "node:crypto";
3
4
  import { DynamicEntryPlugin } from "@rspack/core";
4
5
  import { RspackVirtualModulePlugin as VirtualModulesPlugin } from "rspack-plugin-virtual-module";
5
6
  class EntrypointPlugin {
@@ -18,6 +19,9 @@ class EntrypointPlugin {
18
19
  if (file.external) {
19
20
  const { ext } = path.parse(name);
20
21
  name = file.import + ext;
22
+ } else if (path.isAbsolute(name)) {
23
+ const key = createHash("sha256").update(name).digest("hex");
24
+ name = path.join(key, path.basename(name));
21
25
  }
22
26
  return path.join("virtual", name);
23
27
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/bundler/plugins/entrypoint/EntrypointPlugin.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\n\nimport {Compiler, DynamicEntryPlugin, type EntryDescription, EntryNormalized} from \"@rspack/core\";\nimport {RspackVirtualModulePlugin as VirtualModulesPlugin} from \"rspack-plugin-virtual-module\";\n\nimport {EntrypointEntries, EntrypointFile} from \"@typing/entrypoint\";\n\nexport type EntrypointPluginTemplate = (file: EntrypointFile) => string;\n\nexport type EntrypointPluginUpdate = (files: ReadonlySet<string>) => Promise<EntrypointEntries>;\n\nexport interface EntrypointPluginModule {\n /**\n * Virtual module name, used in the rspack entry and virtual module.\n */\n name: string;\n\n /**\n * Virtual module content.\n */\n module: string;\n}\n\nexport type EntrypointPluginModules = Map<EntrypointFile, EntrypointPluginModule>;\n\nexport type EntrypointPluginEntryModules = Map<string, EntrypointPluginModules>;\n\nexport type EntrypointPluginEntryOptions = Omit<EntryDescription, \"import\">;\n\nexport type EntrypointPluginEntryOptionsResolver = (name: string) => EntrypointPluginEntryOptions;\n\nexport default class EntrypointPlugin {\n private readonly pluginName: string = \"EntrypointPlugin\";\n\n private _plugin?: VirtualModulesPlugin;\n private _modules?: EntrypointPluginEntryModules;\n private readonly _entryOptions: EntrypointPluginEntryOptionsResolver[] = [];\n\n protected template?: EntrypointPluginTemplate;\n protected update?: EntrypointPluginUpdate;\n\n public static filename(file: EntrypointFile): string {\n let name = file.file;\n\n if (file.external) {\n const {ext} = path.parse(name);\n name = file.import + ext;\n }\n\n return path.join(\"virtual\", name);\n }\n\n protected get plugin(): VirtualModulesPlugin {\n if (this._plugin) {\n return this._plugin;\n }\n\n const modules = Object.fromEntries(this.getModuleContents(this.modules));\n\n return (this._plugin = new VirtualModulesPlugin(modules, \"entrypoint\"));\n }\n\n protected get modules(): EntrypointPluginEntryModules {\n return (this._modules ??= this.createModules(this.entries));\n }\n\n protected get watchFiles(): ReadonlySet<string> {\n const files = Array.from(this.modules.values())\n .flatMap(modules => Array.from(modules.keys()))\n .filter(({external}) => !external)\n .map(({file}) => file);\n\n return new Set(files);\n }\n\n public static from(entries: EntrypointEntries): EntrypointPlugin {\n return new EntrypointPlugin(entries);\n }\n\n constructor(private readonly entries: EntrypointEntries = new Map()) {}\n\n public virtual(template: EntrypointPluginTemplate): this {\n this.template = template;\n\n return this;\n }\n\n public entryOptions(options: EntrypointPluginEntryOptions | EntrypointPluginEntryOptionsResolver): this {\n this._entryOptions.push(_.isFunction(options) ? options : () => options);\n\n return this;\n }\n\n public watch(update: EntrypointPluginUpdate): this {\n this.update = update;\n\n return this;\n }\n\n public apply(compiler: Compiler): void {\n this.plugin.apply(compiler);\n\n compiler.hooks.entryOption.tap(this.pluginName, (_, entry) => {\n this.hookEntryOption(entry);\n });\n\n if (this.update) {\n // Static EntryPlugin captures options once. Resolve the completed entry table\n // per compilation so watch changes to layers and asyncChunks reach Rspack too.\n // Register after other plugins have prepared their entryOption hooks, but\n // before Rspack installs its default static entry handler.\n compiler.hooks.afterEnvironment.tap(this.pluginName, () => {\n compiler.hooks.entryOption.tap(`${this.pluginName}:watch`, (context, entry) => {\n compiler.options.entry = entry;\n\n new DynamicEntryPlugin(context, async () => {\n const entry = compiler.options.entry;\n\n return typeof entry === \"function\" ? entry() : entry;\n }).apply(compiler);\n\n return true;\n });\n });\n\n compiler.hooks.watchRun.tapAsync(this.pluginName, (compiler, callback) => {\n this.hookWatchRun(compiler)\n .then(() => callback())\n .catch(callback);\n });\n }\n }\n\n protected hookEntryOption(entry: EntryNormalized): void {\n if (_.isPlainObject(entry)) {\n this.modules.entries().forEach(([name, modules]) => {\n const current = structuredClone(entry[name] ?? []);\n let currentFiles = current;\n let currentOptions: EntrypointPluginEntryOptions = {};\n\n if (\"import\" in currentFiles) {\n currentOptions = currentFiles;\n currentFiles = currentFiles.import;\n }\n\n currentFiles.push(...Array.from(modules.values(), ({name}) => name));\n\n entry[name] = {\n ...currentOptions,\n ...this.resolveEntryOptions(name),\n import: _.uniq(currentFiles),\n };\n });\n } else {\n throw new Error(\"EntrypointPlugin: entry is not an object\");\n }\n }\n\n protected async hookWatchRun(compiler: Compiler): Promise<void> {\n const {modifiedFiles = new Set()} = compiler;\n\n const watchFiles = new Set(Array.from(this.watchFiles, file => path.resolve(compiler.context, file)));\n const needUpdate = Array.from(modifiedFiles).some(file => watchFiles.has(path.resolve(compiler.context, file)));\n\n if (!needUpdate) {\n return;\n }\n\n const updatedEntries = await this.update!(modifiedFiles);\n\n const updatedModules = this.createModules(updatedEntries);\n\n const currentContents = this.getModuleContents(this.modules);\n const updatedContents = this.getModuleContents(updatedModules);\n\n const removedContents = new Map(Array.from(currentContents).filter(entry => !updatedContents.has(entry[0])));\n\n const changedContents = new Map(\n Array.from(updatedContents).filter(([name, content]) => currentContents.get(name) !== content)\n );\n\n removedContents.keys().forEach(name => {\n this.plugin.writeModule(name, \"\");\n });\n\n changedContents.forEach((content, name) => {\n this.plugin.writeModule(name, content);\n });\n\n this.modules.keys().forEach(name => {\n if (!updatedModules.has(name)) {\n delete compiler.options.entry[name];\n }\n });\n\n updatedModules.entries().forEach(([name, modules]) => {\n const current = structuredClone(compiler.options.entry[name] ?? []);\n let entry = current;\n let currentOptions: EntrypointPluginEntryOptions = {};\n\n if (\"import\" in entry) {\n currentOptions = entry;\n entry = entry.import as string[];\n }\n\n entry = entry.filter(file => !removedContents.has(file));\n\n entry.push(...Array.from(modules.values(), ({name}) => name));\n\n compiler.options.entry[name] = {\n ...currentOptions,\n ...this.resolveEntryOptions(name),\n import: _.uniq(entry),\n };\n });\n\n this._modules = updatedModules;\n }\n\n protected resolveEntryOptions(name: string): EntrypointPluginEntryOptions {\n return Object.assign({}, ...this._entryOptions.map(resolve => resolve(name)));\n }\n\n protected createModules(entries: EntrypointEntries): EntrypointPluginEntryModules {\n const entryModules: EntrypointPluginEntryModules = new Map();\n\n for (const [name, files] of entries) {\n const modules: EntrypointPluginModules = new Map();\n\n for (const file of files) {\n modules.set(file, {\n name: EntrypointPlugin.filename(file),\n module: this.template ? this.template(file) : \"\",\n });\n }\n\n entryModules.set(name, modules);\n }\n\n return entryModules;\n }\n\n protected getModuleContents(modules: EntrypointPluginEntryModules): Map<string, string> {\n const content = new Map<string, string>();\n\n modules.values().forEach(modules => {\n modules.forEach(({name, module}) => {\n content.set(name, module);\n });\n });\n\n return content;\n }\n}\n"],"mappings":"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","names":["_","entry","compiler","name","modules"]}
1
+ {"version":3,"sources":["../../../../../src/cli/bundler/plugins/entrypoint/EntrypointPlugin.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport {createHash} from \"node:crypto\";\n\nimport {Compiler, DynamicEntryPlugin, type EntryDescription, EntryNormalized} from \"@rspack/core\";\nimport {RspackVirtualModulePlugin as VirtualModulesPlugin} from \"rspack-plugin-virtual-module\";\n\nimport {EntrypointEntries, EntrypointFile} from \"@typing/entrypoint\";\n\nexport type EntrypointPluginTemplate = (file: EntrypointFile) => string;\n\nexport type EntrypointPluginUpdate = (files: ReadonlySet<string>) => Promise<EntrypointEntries>;\n\nexport interface EntrypointPluginModule {\n /**\n * Virtual module name, used in the rspack entry and virtual module.\n */\n name: string;\n\n /**\n * Virtual module content.\n */\n module: string;\n}\n\nexport type EntrypointPluginModules = Map<EntrypointFile, EntrypointPluginModule>;\n\nexport type EntrypointPluginEntryModules = Map<string, EntrypointPluginModules>;\n\nexport type EntrypointPluginEntryOptions = Omit<EntryDescription, \"import\">;\n\nexport type EntrypointPluginEntryOptionsResolver = (name: string) => EntrypointPluginEntryOptions;\n\nexport default class EntrypointPlugin {\n private readonly pluginName: string = \"EntrypointPlugin\";\n\n private _plugin?: VirtualModulesPlugin;\n private _modules?: EntrypointPluginEntryModules;\n private readonly _entryOptions: EntrypointPluginEntryOptionsResolver[] = [];\n\n protected template?: EntrypointPluginTemplate;\n protected update?: EntrypointPluginUpdate;\n\n public static filename(file: EntrypointFile): string {\n let name = file.file;\n\n if (file.external) {\n const {ext} = path.parse(name);\n name = file.import + ext;\n } else if (path.isAbsolute(name)) {\n // A drive or UNC root cannot be embedded inside the virtual directory.\n // Keep distinct absolute files distinct without carrying their root into it.\n const key = createHash(\"sha256\").update(name).digest(\"hex\");\n name = path.join(key, path.basename(name));\n }\n\n return path.join(\"virtual\", name);\n }\n\n protected get plugin(): VirtualModulesPlugin {\n if (this._plugin) {\n return this._plugin;\n }\n\n const modules = Object.fromEntries(this.getModuleContents(this.modules));\n\n return (this._plugin = new VirtualModulesPlugin(modules, \"entrypoint\"));\n }\n\n protected get modules(): EntrypointPluginEntryModules {\n return (this._modules ??= this.createModules(this.entries));\n }\n\n protected get watchFiles(): ReadonlySet<string> {\n const files = Array.from(this.modules.values())\n .flatMap(modules => Array.from(modules.keys()))\n .filter(({external}) => !external)\n .map(({file}) => file);\n\n return new Set(files);\n }\n\n public static from(entries: EntrypointEntries): EntrypointPlugin {\n return new EntrypointPlugin(entries);\n }\n\n constructor(private readonly entries: EntrypointEntries = new Map()) {}\n\n public virtual(template: EntrypointPluginTemplate): this {\n this.template = template;\n\n return this;\n }\n\n public entryOptions(options: EntrypointPluginEntryOptions | EntrypointPluginEntryOptionsResolver): this {\n this._entryOptions.push(_.isFunction(options) ? options : () => options);\n\n return this;\n }\n\n public watch(update: EntrypointPluginUpdate): this {\n this.update = update;\n\n return this;\n }\n\n public apply(compiler: Compiler): void {\n this.plugin.apply(compiler);\n\n compiler.hooks.entryOption.tap(this.pluginName, (_, entry) => {\n this.hookEntryOption(entry);\n });\n\n if (this.update) {\n // Static EntryPlugin captures options once. Resolve the completed entry table\n // per compilation so watch changes to layers and asyncChunks reach Rspack too.\n // Register after other plugins have prepared their entryOption hooks, but\n // before Rspack installs its default static entry handler.\n compiler.hooks.afterEnvironment.tap(this.pluginName, () => {\n compiler.hooks.entryOption.tap(`${this.pluginName}:watch`, (context, entry) => {\n compiler.options.entry = entry;\n\n new DynamicEntryPlugin(context, async () => {\n const entry = compiler.options.entry;\n\n return typeof entry === \"function\" ? entry() : entry;\n }).apply(compiler);\n\n return true;\n });\n });\n\n compiler.hooks.watchRun.tapAsync(this.pluginName, (compiler, callback) => {\n this.hookWatchRun(compiler)\n .then(() => callback())\n .catch(callback);\n });\n }\n }\n\n protected hookEntryOption(entry: EntryNormalized): void {\n if (_.isPlainObject(entry)) {\n this.modules.entries().forEach(([name, modules]) => {\n const current = structuredClone(entry[name] ?? []);\n let currentFiles = current;\n let currentOptions: EntrypointPluginEntryOptions = {};\n\n if (\"import\" in currentFiles) {\n currentOptions = currentFiles;\n currentFiles = currentFiles.import;\n }\n\n currentFiles.push(...Array.from(modules.values(), ({name}) => name));\n\n entry[name] = {\n ...currentOptions,\n ...this.resolveEntryOptions(name),\n import: _.uniq(currentFiles),\n };\n });\n } else {\n throw new Error(\"EntrypointPlugin: entry is not an object\");\n }\n }\n\n protected async hookWatchRun(compiler: Compiler): Promise<void> {\n const {modifiedFiles = new Set()} = compiler;\n\n const watchFiles = new Set(Array.from(this.watchFiles, file => path.resolve(compiler.context, file)));\n const needUpdate = Array.from(modifiedFiles).some(file => watchFiles.has(path.resolve(compiler.context, file)));\n\n if (!needUpdate) {\n return;\n }\n\n const updatedEntries = await this.update!(modifiedFiles);\n\n const updatedModules = this.createModules(updatedEntries);\n\n const currentContents = this.getModuleContents(this.modules);\n const updatedContents = this.getModuleContents(updatedModules);\n\n const removedContents = new Map(Array.from(currentContents).filter(entry => !updatedContents.has(entry[0])));\n\n const changedContents = new Map(\n Array.from(updatedContents).filter(([name, content]) => currentContents.get(name) !== content)\n );\n\n removedContents.keys().forEach(name => {\n this.plugin.writeModule(name, \"\");\n });\n\n changedContents.forEach((content, name) => {\n this.plugin.writeModule(name, content);\n });\n\n this.modules.keys().forEach(name => {\n if (!updatedModules.has(name)) {\n delete compiler.options.entry[name];\n }\n });\n\n updatedModules.entries().forEach(([name, modules]) => {\n const current = structuredClone(compiler.options.entry[name] ?? []);\n let entry = current;\n let currentOptions: EntrypointPluginEntryOptions = {};\n\n if (\"import\" in entry) {\n currentOptions = entry;\n entry = entry.import as string[];\n }\n\n entry = entry.filter(file => !removedContents.has(file));\n\n entry.push(...Array.from(modules.values(), ({name}) => name));\n\n compiler.options.entry[name] = {\n ...currentOptions,\n ...this.resolveEntryOptions(name),\n import: _.uniq(entry),\n };\n });\n\n this._modules = updatedModules;\n }\n\n protected resolveEntryOptions(name: string): EntrypointPluginEntryOptions {\n return Object.assign({}, ...this._entryOptions.map(resolve => resolve(name)));\n }\n\n protected createModules(entries: EntrypointEntries): EntrypointPluginEntryModules {\n const entryModules: EntrypointPluginEntryModules = new Map();\n\n for (const [name, files] of entries) {\n const modules: EntrypointPluginModules = new Map();\n\n for (const file of files) {\n modules.set(file, {\n name: EntrypointPlugin.filename(file),\n module: this.template ? this.template(file) : \"\",\n });\n }\n\n entryModules.set(name, modules);\n }\n\n return entryModules;\n }\n\n protected getModuleContents(modules: EntrypointPluginEntryModules): Map<string, string> {\n const content = new Map<string, string>();\n\n modules.values().forEach(modules => {\n modules.forEach(({name, module}) => {\n content.set(name, module);\n });\n });\n\n return content;\n }\n}\n"],"mappings":"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","names":["_","entry","compiler","name","modules"]}
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import cac from "cac";
2
2
  import { consola } from "consola";
3
3
  import fs from "fs";
4
- import app from "./builders/app/index.js";
4
+ import app, { BuildError } from "./builders/app/index.js";
5
5
  import { Command } from "./../types/app.js";
6
6
  import { Browser } from "./../types/browser.js";
7
7
  const pkg = fs.readFileSync(new URL("../../package.json", import.meta.url), { encoding: "utf-8" });
@@ -30,7 +30,7 @@ cli.command("watch [root]", "Start watch mode").option("-m, --mode <mode>", "Set
30
30
  });
31
31
  cli.command("build [root]", "Build for production").option("-m, --mode <mode>", "Set env mode", { default: "production" }).option("-c, --config <config>", "Path to config file").option("-a, --app <app>", "Specify an app to run", { default: "myapp" }).option("-b, --browser <browser>", "Specify a browser", { default: Browser.Chrome }).option("--mv2", "Target manifest v2").option("--analyze", "Visualize extension bundle").action(async (root, options) => {
32
32
  try {
33
- await app({
33
+ const stats = await app({
34
34
  command: Command.Build,
35
35
  mode: options.mode,
36
36
  debug: options.debug,
@@ -41,8 +41,21 @@ cli.command("build [root]", "Build for production").option("-m, --mode <mode>",
41
41
  configFile: options.config,
42
42
  analyze: options.analyze
43
43
  });
44
+ if (stats) {
45
+ console.log(stats.toString({ colors: true }));
46
+ }
44
47
  } catch (e) {
45
- consola.error(e);
48
+ if (e instanceof BuildError) {
49
+ console.error(e.message);
50
+ if (e.stats) {
51
+ console.error(e.stats.toString({ colors: true, errors: true }));
52
+ }
53
+ if (e.cause !== void 0) {
54
+ console.error(e.cause);
55
+ }
56
+ } else {
57
+ consola.error(e);
58
+ }
46
59
  process.exitCode = 1;
47
60
  }
48
61
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["import cac from \"cac\";\nimport {consola} from \"consola\";\nimport fs from \"fs\";\n\nimport app from \"./builders/app\";\n\nimport {Command} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\n\nconst pkg = fs.readFileSync(new URL(\"../../package.json\", import.meta.url), {encoding: \"utf-8\"});\nconst {name, version} = JSON.parse(pkg);\n\nconst cli = cac(name);\n\ncli.option(\"--debug\", \"Enable debug mode\");\n\ncli.command(\"init\", \"Initialize a new project\").action(() => {\n consola.box(\"Coming soon...\");\n});\n\ncli.command(\"watch [root]\", \"Start watch mode\")\n .option(\"-m, --mode <mode>\", \"Set env mode\", {default: \"development\"})\n .option(\"-c, --config <config>\", \"Path to config file\")\n .option(\"-a, --app <app>\", \"Specify an app to run\", {default: \"myapp\"})\n .option(\"-b, --browser <browser>\", \"Specify a browser\")\n .option(\"--mv2\", \"Target manifest v2\")\n .action(async (root, options) => {\n try {\n await app({\n command: Command.Watch,\n mode: options.mode,\n debug: options.debug,\n app: options.app,\n browser: options.browser,\n manifestVersion: options.mv2 ? 2 : 3,\n rootDir: root,\n configFile: options.config,\n });\n } catch (e) {\n consola.error(e);\n process.exitCode = 1;\n }\n });\n\ncli.command(\"build [root]\", \"Build for production\")\n .option(\"-m, --mode <mode>\", \"Set env mode\", {default: \"production\"})\n .option(\"-c, --config <config>\", \"Path to config file\")\n .option(\"-a, --app <app>\", \"Specify an app to run\", {default: \"myapp\"})\n .option(\"-b, --browser <browser>\", \"Specify a browser\", {default: Browser.Chrome})\n .option(\"--mv2\", \"Target manifest v2\")\n .option(\"--analyze\", \"Visualize extension bundle\")\n .action(async (root, options) => {\n try {\n await app({\n command: Command.Build,\n mode: options.mode,\n debug: options.debug,\n app: options.app,\n browser: options.browser,\n manifestVersion: options.mv2 ? 2 : 3,\n rootDir: root,\n configFile: options.config,\n analyze: options.analyze,\n });\n } catch (e) {\n consola.error(e);\n process.exitCode = 1;\n }\n });\n\ncli.version(version);\ncli.help();\ncli.parse();\n"],"mappings":"AAAA,OAAO,SAAS;AAChB,SAAQ,eAAc;AACtB,OAAO,QAAQ;AAEf,OAAO,SAAS;AAEhB,SAAQ,eAAc;AACtB,SAAQ,eAAc;AAEtB,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,sBAAsB,YAAY,GAAG,GAAG,EAAC,UAAU,QAAO,CAAC;AAC/F,MAAM,EAAC,MAAM,QAAO,IAAI,KAAK,MAAM,GAAG;AAEtC,MAAM,MAAM,IAAI,IAAI;AAEpB,IAAI,OAAO,WAAW,mBAAmB;AAEzC,IAAI,QAAQ,QAAQ,0BAA0B,EAAE,OAAO,MAAM;AACzD,UAAQ,IAAI,gBAAgB;AAChC,CAAC;AAED,IAAI,QAAQ,gBAAgB,kBAAkB,EACzC,OAAO,qBAAqB,gBAAgB,EAAC,SAAS,cAAa,CAAC,EACpE,OAAO,yBAAyB,qBAAqB,EACrD,OAAO,mBAAmB,yBAAyB,EAAC,SAAS,QAAO,CAAC,EACrE,OAAO,2BAA2B,mBAAmB,EACrD,OAAO,SAAS,oBAAoB,EACpC,OAAO,OAAO,MAAM,YAAY;AAC7B,MAAI;AACA,UAAM,IAAI;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,iBAAiB,QAAQ,MAAM,IAAI;AAAA,MACnC,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL,SAAS,GAAG;AACR,YAAQ,MAAM,CAAC;AACf,YAAQ,WAAW;AAAA,EACvB;AACJ,CAAC;AAEL,IAAI,QAAQ,gBAAgB,sBAAsB,EAC7C,OAAO,qBAAqB,gBAAgB,EAAC,SAAS,aAAY,CAAC,EACnE,OAAO,yBAAyB,qBAAqB,EACrD,OAAO,mBAAmB,yBAAyB,EAAC,SAAS,QAAO,CAAC,EACrE,OAAO,2BAA2B,qBAAqB,EAAC,SAAS,QAAQ,OAAM,CAAC,EAChF,OAAO,SAAS,oBAAoB,EACpC,OAAO,aAAa,4BAA4B,EAChD,OAAO,OAAO,MAAM,YAAY;AAC7B,MAAI;AACA,UAAM,IAAI;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,iBAAiB,QAAQ,MAAM,IAAI;AAAA,MACnC,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,IACrB,CAAC;AAAA,EACL,SAAS,GAAG;AACR,YAAQ,MAAM,CAAC;AACf,YAAQ,WAAW;AAAA,EACvB;AACJ,CAAC;AAEL,IAAI,QAAQ,OAAO;AACnB,IAAI,KAAK;AACT,IAAI,MAAM;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["import cac from \"cac\";\nimport {consola} from \"consola\";\nimport fs from \"fs\";\n\nimport app, {BuildError} from \"./builders/app\";\n\nimport {Command} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\n\nconst pkg = fs.readFileSync(new URL(\"../../package.json\", import.meta.url), {encoding: \"utf-8\"});\nconst {name, version} = JSON.parse(pkg);\n\nconst cli = cac(name);\n\ncli.option(\"--debug\", \"Enable debug mode\");\n\ncli.command(\"init\", \"Initialize a new project\").action(() => {\n consola.box(\"Coming soon...\");\n});\n\ncli.command(\"watch [root]\", \"Start watch mode\")\n .option(\"-m, --mode <mode>\", \"Set env mode\", {default: \"development\"})\n .option(\"-c, --config <config>\", \"Path to config file\")\n .option(\"-a, --app <app>\", \"Specify an app to run\", {default: \"myapp\"})\n .option(\"-b, --browser <browser>\", \"Specify a browser\")\n .option(\"--mv2\", \"Target manifest v2\")\n .action(async (root, options) => {\n try {\n await app({\n command: Command.Watch,\n mode: options.mode,\n debug: options.debug,\n app: options.app,\n browser: options.browser,\n manifestVersion: options.mv2 ? 2 : 3,\n rootDir: root,\n configFile: options.config,\n });\n } catch (e) {\n consola.error(e);\n process.exitCode = 1;\n }\n });\n\ncli.command(\"build [root]\", \"Build for production\")\n .option(\"-m, --mode <mode>\", \"Set env mode\", {default: \"production\"})\n .option(\"-c, --config <config>\", \"Path to config file\")\n .option(\"-a, --app <app>\", \"Specify an app to run\", {default: \"myapp\"})\n .option(\"-b, --browser <browser>\", \"Specify a browser\", {default: Browser.Chrome})\n .option(\"--mv2\", \"Target manifest v2\")\n .option(\"--analyze\", \"Visualize extension bundle\")\n .action(async (root, options) => {\n try {\n const stats = await app({\n command: Command.Build,\n mode: options.mode,\n debug: options.debug,\n app: options.app,\n browser: options.browser,\n manifestVersion: options.mv2 ? 2 : 3,\n rootDir: root,\n configFile: options.config,\n analyze: options.analyze,\n });\n\n if (stats) {\n console.log(stats.toString({colors: true}));\n }\n } catch (e) {\n if (e instanceof BuildError) {\n console.error(e.message);\n\n if (e.stats) {\n console.error(e.stats.toString({colors: true, errors: true}));\n }\n\n if (e.cause !== undefined) {\n console.error(e.cause);\n }\n } else {\n consola.error(e);\n }\n\n process.exitCode = 1;\n }\n });\n\ncli.version(version);\ncli.help();\ncli.parse();\n"],"mappings":"AAAA,OAAO,SAAS;AAChB,SAAQ,eAAc;AACtB,OAAO,QAAQ;AAEf,OAAO,OAAM,kBAAiB;AAE9B,SAAQ,eAAc;AACtB,SAAQ,eAAc;AAEtB,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,sBAAsB,YAAY,GAAG,GAAG,EAAC,UAAU,QAAO,CAAC;AAC/F,MAAM,EAAC,MAAM,QAAO,IAAI,KAAK,MAAM,GAAG;AAEtC,MAAM,MAAM,IAAI,IAAI;AAEpB,IAAI,OAAO,WAAW,mBAAmB;AAEzC,IAAI,QAAQ,QAAQ,0BAA0B,EAAE,OAAO,MAAM;AACzD,UAAQ,IAAI,gBAAgB;AAChC,CAAC;AAED,IAAI,QAAQ,gBAAgB,kBAAkB,EACzC,OAAO,qBAAqB,gBAAgB,EAAC,SAAS,cAAa,CAAC,EACpE,OAAO,yBAAyB,qBAAqB,EACrD,OAAO,mBAAmB,yBAAyB,EAAC,SAAS,QAAO,CAAC,EACrE,OAAO,2BAA2B,mBAAmB,EACrD,OAAO,SAAS,oBAAoB,EACpC,OAAO,OAAO,MAAM,YAAY;AAC7B,MAAI;AACA,UAAM,IAAI;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,iBAAiB,QAAQ,MAAM,IAAI;AAAA,MACnC,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL,SAAS,GAAG;AACR,YAAQ,MAAM,CAAC;AACf,YAAQ,WAAW;AAAA,EACvB;AACJ,CAAC;AAEL,IAAI,QAAQ,gBAAgB,sBAAsB,EAC7C,OAAO,qBAAqB,gBAAgB,EAAC,SAAS,aAAY,CAAC,EACnE,OAAO,yBAAyB,qBAAqB,EACrD,OAAO,mBAAmB,yBAAyB,EAAC,SAAS,QAAO,CAAC,EACrE,OAAO,2BAA2B,qBAAqB,EAAC,SAAS,QAAQ,OAAM,CAAC,EAChF,OAAO,SAAS,oBAAoB,EACpC,OAAO,aAAa,4BAA4B,EAChD,OAAO,OAAO,MAAM,YAAY;AAC7B,MAAI;AACA,UAAM,QAAQ,MAAM,IAAI;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,iBAAiB,QAAQ,MAAM,IAAI;AAAA,MACnC,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,IACrB,CAAC;AAED,QAAI,OAAO;AACP,cAAQ,IAAI,MAAM,SAAS,EAAC,QAAQ,KAAI,CAAC,CAAC;AAAA,IAC9C;AAAA,EACJ,SAAS,GAAG;AACR,QAAI,aAAa,YAAY;AACzB,cAAQ,MAAM,EAAE,OAAO;AAEvB,UAAI,EAAE,OAAO;AACT,gBAAQ,MAAM,EAAE,MAAM,SAAS,EAAC,QAAQ,MAAM,QAAQ,KAAI,CAAC,CAAC;AAAA,MAChE;AAEA,UAAI,EAAE,UAAU,QAAW;AACvB,gBAAQ,MAAM,EAAE,KAAK;AAAA,MACzB;AAAA,IACJ,OAAO;AACH,cAAQ,MAAM,CAAC;AAAA,IACnB;AAEA,YAAQ,WAAW;AAAA,EACvB;AACJ,CAAC;AAEL,IAAI,QAAQ,OAAO;AACnB,IAAI,KAAK;AACT,IAAI,MAAM;","names":[]}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("../../main/plugin.js").PluginDefinition<[]>;
2
+ export default _default;
@@ -0,0 +1,13 @@
1
+ import { definePlugin } from "./../../main/plugin.js";
2
+ import { modifyLocaleMessageKey } from "./../../shared/locale/index.js";
3
+ var action_default = definePlugin(() => ({
4
+ name: "adnbn:action",
5
+ manifest: ({ config, manifest }) => {
6
+ const { action } = config;
7
+ manifest.setAction(action ? { icon: action.icon, title: modifyLocaleMessageKey(action.title) } : void 0);
8
+ }
9
+ }));
10
+ export {
11
+ action_default as default
12
+ };
13
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/plugins/action.ts"],"sourcesContent":["import {definePlugin} from \"@main/plugin\";\nimport {modifyLocaleMessageKey} from \"@shared/locale\";\n\nexport default definePlugin(() => ({\n name: \"adnbn:action\",\n manifest: ({config, manifest}) => {\n const {action} = config;\n\n manifest.setAction(action ? {icon: action.icon, title: modifyLocaleMessageKey(action.title)} : undefined);\n },\n}));\n"],"mappings":"AAAA,SAAQ,oBAAmB;AAC3B,SAAQ,8BAA6B;AAErC,IAAO,iBAAQ,aAAa,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,UAAU,CAAC,EAAC,QAAQ,SAAQ,MAAM;AAC9B,UAAM,EAAC,OAAM,IAAI;AAEjB,aAAS,UAAU,SAAS,EAAC,MAAM,OAAO,MAAM,OAAO,uBAAuB,OAAO,KAAK,EAAC,IAAI,MAAS;AAAA,EAC5G;AACJ,EAAE;","names":[]}
@@ -1,3 +1,4 @@
1
+ export { default as pluginAction } from "./action.js";
1
2
  export { default as pluginAsset } from "./asset.js";
2
3
  export { default as pluginBundler } from "./bundler.js";
3
4
  export { default as pluginBackground } from "./background/index.js";
@@ -1,56 +1,58 @@
1
- import { default as default2 } from "./asset.js";
2
- import { default as default3 } from "./bundler.js";
3
- import { default as default4 } from "./background/index.js";
4
- import { default as default5 } from "./content/index.js";
5
- import { default as default6 } from "./dotenv/index.js";
6
- import { default as default7 } from "./html.js";
7
- import { default as default8 } from "./manifest.js";
8
- import { default as default9 } from "./optimization.js";
9
- import { default as default10 } from "./output/index.js";
10
- import { default as default11 } from "./icon/index.js";
11
- import { default as default12 } from "./locale/index.js";
12
- import { default as default13 } from "./meta/index.js";
13
- import { default as default14 } from "./offscreen/index.js";
14
- import { default as default15 } from "./options/index.js";
15
- import { default as default16 } from "./override/index.js";
16
- import { default as default17 } from "./page/index.js";
17
- import { default as default18 } from "./popup/index.js";
18
- import { default as default19 } from "./public.js";
19
- import { default as default20 } from "./sandbox/index.js";
20
- import { default as default21 } from "./sidebar/index.js";
21
- import { default as default22, TypescriptConfig, FileBuilder, VendorDeclaration } from "./typescript/index.js";
22
- import { default as default23 } from "./react.js";
23
- import { default as default24 } from "./style/index.js";
24
- import { default as default25 } from "./view/index.js";
25
- import { default as default26 } from "./version/index.js";
1
+ import { default as default2 } from "./action.js";
2
+ import { default as default3 } from "./asset.js";
3
+ import { default as default4 } from "./bundler.js";
4
+ import { default as default5 } from "./background/index.js";
5
+ import { default as default6 } from "./content/index.js";
6
+ import { default as default7 } from "./dotenv/index.js";
7
+ import { default as default8 } from "./html.js";
8
+ import { default as default9 } from "./manifest.js";
9
+ import { default as default10 } from "./optimization.js";
10
+ import { default as default11 } from "./output/index.js";
11
+ import { default as default12 } from "./icon/index.js";
12
+ import { default as default13 } from "./locale/index.js";
13
+ import { default as default14 } from "./meta/index.js";
14
+ import { default as default15 } from "./offscreen/index.js";
15
+ import { default as default16 } from "./options/index.js";
16
+ import { default as default17 } from "./override/index.js";
17
+ import { default as default18 } from "./page/index.js";
18
+ import { default as default19 } from "./popup/index.js";
19
+ import { default as default20 } from "./public.js";
20
+ import { default as default21 } from "./sandbox/index.js";
21
+ import { default as default22 } from "./sidebar/index.js";
22
+ import { default as default23, TypescriptConfig, FileBuilder, VendorDeclaration } from "./typescript/index.js";
23
+ import { default as default24 } from "./react.js";
24
+ import { default as default25 } from "./style/index.js";
25
+ import { default as default26 } from "./view/index.js";
26
+ import { default as default27 } from "./version/index.js";
26
27
  export {
27
28
  FileBuilder,
28
29
  TypescriptConfig,
29
30
  VendorDeclaration,
30
- default2 as pluginAsset,
31
- default4 as pluginBackground,
32
- default3 as pluginBundler,
33
- default5 as pluginContent,
34
- default6 as pluginDotenv,
35
- default7 as pluginHtml,
36
- default11 as pluginIcon,
37
- default12 as pluginLocale,
38
- default8 as pluginManifest,
39
- default13 as pluginMeta,
40
- default14 as pluginOffscreen,
41
- default9 as pluginOptimization,
42
- default15 as pluginOptions,
43
- default10 as pluginOutput,
44
- default16 as pluginOverride,
45
- default17 as pluginPage,
46
- default18 as pluginPopup,
47
- default19 as pluginPublic,
48
- default23 as pluginReact,
49
- default20 as pluginSandbox,
50
- default21 as pluginSidebar,
51
- default24 as pluginStyle,
52
- default22 as pluginTypescript,
53
- default26 as pluginVersion,
54
- default25 as pluginView
31
+ default2 as pluginAction,
32
+ default3 as pluginAsset,
33
+ default5 as pluginBackground,
34
+ default4 as pluginBundler,
35
+ default6 as pluginContent,
36
+ default7 as pluginDotenv,
37
+ default8 as pluginHtml,
38
+ default12 as pluginIcon,
39
+ default13 as pluginLocale,
40
+ default9 as pluginManifest,
41
+ default14 as pluginMeta,
42
+ default15 as pluginOffscreen,
43
+ default10 as pluginOptimization,
44
+ default16 as pluginOptions,
45
+ default11 as pluginOutput,
46
+ default17 as pluginOverride,
47
+ default18 as pluginPage,
48
+ default19 as pluginPopup,
49
+ default20 as pluginPublic,
50
+ default24 as pluginReact,
51
+ default21 as pluginSandbox,
52
+ default22 as pluginSidebar,
53
+ default25 as pluginStyle,
54
+ default23 as pluginTypescript,
55
+ default27 as pluginVersion,
56
+ default26 as pluginView
55
57
  };
56
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/plugins/index.ts"],"sourcesContent":["export {default as pluginAsset} from \"./asset\";\nexport {default as pluginBundler} from \"./bundler\";\nexport {default as pluginBackground} from \"./background\";\nexport {default as pluginContent} from \"./content\";\nexport {default as pluginDotenv} from \"./dotenv\";\nexport {default as pluginHtml} from \"./html\";\nexport {default as pluginManifest} from \"./manifest\";\nexport {default as pluginOptimization} from \"./optimization\";\nexport {default as pluginOutput} from \"./output\";\nexport {default as pluginIcon} from \"./icon\";\nexport {default as pluginLocale} from \"./locale\";\nexport {default as pluginMeta} from \"./meta\";\nexport {default as pluginOffscreen} from \"./offscreen\";\nexport {default as pluginOptions} from \"./options\";\nexport {default as pluginOverride} from \"./override\";\nexport {default as pluginPage} from \"./page\";\nexport {default as pluginPopup} from \"./popup\";\nexport {default as pluginPublic} from \"./public\";\nexport {default as pluginSandbox} from \"./sandbox\";\nexport {default as pluginSidebar} from \"./sidebar\";\nexport {default as pluginTypescript, TypescriptConfig, FileBuilder, VendorDeclaration} from \"./typescript\";\nexport {default as pluginReact} from \"./react\";\nexport {default as pluginStyle} from \"./style\";\nexport {default as pluginView} from \"./view\";\nexport {default as pluginVersion} from \"./version\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAA6B;AACrC,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAAkC;AAC1C,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAA8B;AACtC,SAAmB,WAAXA,gBAA4B;AACpC,SAAmB,WAAXA,gBAAgC;AACxC,SAAmB,WAAXA,gBAAoC;AAC5C,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAAiC;AACzC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,iBAAgC;AACxC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,WAA6B,kBAAkB,aAAa,yBAAwB;AAC5F,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA+B;","names":["default"]}
1
+ {"version":3,"sources":["../../../src/cli/plugins/index.ts"],"sourcesContent":["export {default as pluginAction} from \"./action\";\nexport {default as pluginAsset} from \"./asset\";\nexport {default as pluginBundler} from \"./bundler\";\nexport {default as pluginBackground} from \"./background\";\nexport {default as pluginContent} from \"./content\";\nexport {default as pluginDotenv} from \"./dotenv\";\nexport {default as pluginHtml} from \"./html\";\nexport {default as pluginManifest} from \"./manifest\";\nexport {default as pluginOptimization} from \"./optimization\";\nexport {default as pluginOutput} from \"./output\";\nexport {default as pluginIcon} from \"./icon\";\nexport {default as pluginLocale} from \"./locale\";\nexport {default as pluginMeta} from \"./meta\";\nexport {default as pluginOffscreen} from \"./offscreen\";\nexport {default as pluginOptions} from \"./options\";\nexport {default as pluginOverride} from \"./override\";\nexport {default as pluginPage} from \"./page\";\nexport {default as pluginPopup} from \"./popup\";\nexport {default as pluginPublic} from \"./public\";\nexport {default as pluginSandbox} from \"./sandbox\";\nexport {default as pluginSidebar} from \"./sidebar\";\nexport {default as pluginTypescript, TypescriptConfig, FileBuilder, VendorDeclaration} from \"./typescript\";\nexport {default as pluginReact} from \"./react\";\nexport {default as pluginStyle} from \"./style\";\nexport {default as pluginView} from \"./view\";\nexport {default as pluginVersion} from \"./version\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAA8B;AACtC,SAAmB,WAAXA,gBAA6B;AACrC,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAAkC;AAC1C,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAA8B;AACtC,SAAmB,WAAXA,gBAA4B;AACpC,SAAmB,WAAXA,gBAAgC;AACxC,SAAmB,WAAXA,iBAAoC;AAC5C,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAAiC;AACzC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,iBAAgC;AACxC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA8B;AACtC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,iBAA+B;AACvC,SAAmB,WAAXA,WAA6B,kBAAkB,aAAa,yBAAwB;AAC5F,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA6B;AACrC,SAAmB,WAAXA,iBAA4B;AACpC,SAAmB,WAAXA,iBAA+B;","names":["default"]}
@@ -1,4 +1,3 @@
1
- import path from "path";
2
1
  import { HtmlRspackPlugin } from "@rspack/core";
3
2
  import { RspackVirtualModulePlugin } from "rspack-plugin-virtual-module";
4
3
  import HtmlRspackTagsPlugin from "html-rspack-tags-plugin";
@@ -11,7 +10,6 @@ import { createOffscreenModule, OffscreenModuleName } from "./offscreen-module.j
11
10
  import { Command } from "./../../../types/app.js";
12
11
  import { Browser } from "./../../../types/browser.js";
13
12
  import { BackgroundEntryName } from "./../../../types/background.js";
14
- const OffscreenTempDir = "virtual";
15
13
  const OffscreenBackgroundModule = "offscreen.background.ts";
16
14
  var offscreen_default = definePlugin(() => {
17
15
  let offscreen;
@@ -53,13 +51,13 @@ var offscreen_default = definePlugin(() => {
53
51
  {
54
52
  [OffscreenBackgroundModule]: virtualOffscreenBackgroundModule()
55
53
  },
56
- OffscreenTempDir
54
+ "virtual"
57
55
  )
58
56
  );
59
57
  rspack = {
60
58
  entry: {
61
59
  [BackgroundEntryName]: {
62
- import: [path.join(OffscreenTempDir, OffscreenBackgroundModule)]
60
+ import: [OffscreenBackgroundModule]
63
61
  }
64
62
  }
65
63
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/plugins/offscreen/index.ts"],"sourcesContent":["import path from \"path\";\nimport {Configuration as RspackConfig, HtmlRspackPlugin, Plugins} from \"@rspack/core\";\nimport {RspackVirtualModulePlugin} from \"rspack-plugin-virtual-module\";\nimport HtmlRspackTagsPlugin from \"html-rspack-tags-plugin\";\n\nimport {definePlugin} from \"@main/plugin\";\n\nimport {EntrypointPlugin, GenerateModulePlugin} from \"@cli/bundler\";\nimport {virtualOffscreenBackgroundModule} from \"@cli/virtual/index.js\";\n\nimport Offscreen from \"./Offscreen\";\nimport OffscreenDeclaration from \"./OffscreenDeclaration\";\nimport {createOffscreenModule, OffscreenModuleName} from \"./offscreen-module\";\n\nimport {Command} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {BackgroundEntryName} from \"@typing/background\";\nimport type {OffscreenParametersMap} from \"@typing/offscreen\";\n\nconst OffscreenTempDir = \"virtual\";\nconst OffscreenBackgroundModule = \"offscreen.background.ts\";\n\nexport default definePlugin(() => {\n let offscreen: Offscreen;\n let declaration: OffscreenDeclaration;\n\n return {\n name: \"adnbn:offscreen\",\n startup: ({config}) => {\n offscreen = new Offscreen(config);\n declaration = new OffscreenDeclaration(config);\n },\n offscreen: () => offscreen.files(),\n bundler: async ({config}) => {\n declaration.dictionary(await offscreen.dictionary()).build();\n\n let build: boolean = true;\n let rspack: RspackConfig = {};\n\n if (await offscreen.empty()) {\n if (config.debug) {\n console.info(\"Offscreen entries not found\");\n }\n\n build = false;\n }\n\n const plugins: Plugins = [];\n\n let parameters: OffscreenParametersMap = {};\n\n if (build) {\n parameters = await offscreen.parameters();\n\n // prettier-ignore\n const plugin = EntrypointPlugin.from(await offscreen.view().entries())\n .virtual(file => offscreen.virtual(file));\n\n if (config.command === Command.Watch) {\n plugin.watch(async () => {\n declaration.dictionary(await offscreen.clear().dictionary()).build();\n\n return offscreen.view().entries();\n });\n }\n\n const htmlPlugins = (await offscreen.view().html()).map(options => new HtmlRspackPlugin(options));\n const tagsPlugins = (await offscreen.view().tags()).map(options => new HtmlRspackTagsPlugin(options));\n\n plugins.push(plugin, ...htmlPlugins, ...tagsPlugins);\n\n if (config.manifestVersion === 2 || config.browser === Browser.Firefox) {\n plugins.push(\n new RspackVirtualModulePlugin(\n {\n [OffscreenBackgroundModule]: virtualOffscreenBackgroundModule(),\n },\n OffscreenTempDir\n )\n );\n\n rspack = {\n entry: {\n [BackgroundEntryName]: {\n import: [path.join(OffscreenTempDir, OffscreenBackgroundModule)],\n },\n },\n };\n }\n }\n\n return {\n ...rspack,\n plugins: [\n new GenerateModulePlugin({\n [OffscreenModuleName]: createOffscreenModule(parameters),\n }),\n ...plugins,\n ],\n } satisfies RspackConfig;\n },\n manifest: async ({manifest, config}) => {\n manifest.appendCsp(await offscreen.views().csp());\n\n if (config.manifestVersion !== 2 && config.browser !== Browser.Firefox && (await offscreen.exists())) {\n manifest.addPermission(\"offscreen\");\n }\n },\n };\n});\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,SAAuC,wBAAgC;AACvE,SAAQ,iCAAgC;AACxC,OAAO,0BAA0B;AAEjC,SAAQ,oBAAmB;AAE3B,SAAQ,kBAAkB,4BAA2B;AACrD,SAAQ,wCAAuC;AAE/C,OAAO,eAAe;AACtB,OAAO,0BAA0B;AACjC,SAAQ,uBAAuB,2BAA0B;AAEzD,SAAQ,eAAc;AACtB,SAAQ,eAAc;AACtB,SAAQ,2BAA0B;AAGlC,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAElC,IAAO,oBAAQ,aAAa,MAAM;AAC9B,MAAI;AACJ,MAAI;AAEJ,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,EAAC,OAAM,MAAM;AACnB,kBAAY,IAAI,UAAU,MAAM;AAChC,oBAAc,IAAI,qBAAqB,MAAM;AAAA,IACjD;AAAA,IACA,WAAW,MAAM,UAAU,MAAM;AAAA,IACjC,SAAS,OAAO,EAAC,OAAM,MAAM;AACzB,kBAAY,WAAW,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM;AAE3D,UAAI,QAAiB;AACrB,UAAI,SAAuB,CAAC;AAE5B,UAAI,MAAM,UAAU,MAAM,GAAG;AACzB,YAAI,OAAO,OAAO;AACd,kBAAQ,KAAK,6BAA6B;AAAA,QAC9C;AAEA,gBAAQ;AAAA,MACZ;AAEA,YAAM,UAAmB,CAAC;AAE1B,UAAI,aAAqC,CAAC;AAE1C,UAAI,OAAO;AACP,qBAAa,MAAM,UAAU,WAAW;AAGxC,cAAM,SAAS,iBAAiB,KAAK,MAAM,UAAU,KAAK,EAAE,QAAQ,CAAC,EAChE,QAAQ,UAAQ,UAAU,QAAQ,IAAI,CAAC;AAE5C,YAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,iBAAO,MAAM,YAAY;AACrB,wBAAY,WAAW,MAAM,UAAU,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;AAEnE,mBAAO,UAAU,KAAK,EAAE,QAAQ;AAAA,UACpC,CAAC;AAAA,QACL;AAEA,cAAM,eAAe,MAAM,UAAU,KAAK,EAAE,KAAK,GAAG,IAAI,aAAW,IAAI,iBAAiB,OAAO,CAAC;AAChG,cAAM,eAAe,MAAM,UAAU,KAAK,EAAE,KAAK,GAAG,IAAI,aAAW,IAAI,qBAAqB,OAAO,CAAC;AAEpG,gBAAQ,KAAK,QAAQ,GAAG,aAAa,GAAG,WAAW;AAEnD,YAAI,OAAO,oBAAoB,KAAK,OAAO,YAAY,QAAQ,SAAS;AACpE,kBAAQ;AAAA,YACJ,IAAI;AAAA,cACA;AAAA,gBACI,CAAC,yBAAyB,GAAG,iCAAiC;AAAA,cAClE;AAAA,cACA;AAAA,YACJ;AAAA,UACJ;AAEA,mBAAS;AAAA,YACL,OAAO;AAAA,cACH,CAAC,mBAAmB,GAAG;AAAA,gBACnB,QAAQ,CAAC,KAAK,KAAK,kBAAkB,yBAAyB,CAAC;AAAA,cACnE;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,QACH,GAAG;AAAA,QACH,SAAS;AAAA,UACL,IAAI,qBAAqB;AAAA,YACrB,CAAC,mBAAmB,GAAG,sBAAsB,UAAU;AAAA,UAC3D,CAAC;AAAA,UACD,GAAG;AAAA,QACP;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,UAAU,OAAO,EAAC,UAAU,OAAM,MAAM;AACpC,eAAS,UAAU,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC;AAEhD,UAAI,OAAO,oBAAoB,KAAK,OAAO,YAAY,QAAQ,WAAY,MAAM,UAAU,OAAO,GAAI;AAClG,iBAAS,cAAc,WAAW;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AACJ,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/plugins/offscreen/index.ts"],"sourcesContent":["import {Configuration as RspackConfig, HtmlRspackPlugin, Plugins} from \"@rspack/core\";\nimport {RspackVirtualModulePlugin} from \"rspack-plugin-virtual-module\";\nimport HtmlRspackTagsPlugin from \"html-rspack-tags-plugin\";\n\nimport {definePlugin} from \"@main/plugin\";\n\nimport {EntrypointPlugin, GenerateModulePlugin} from \"@cli/bundler\";\nimport {virtualOffscreenBackgroundModule} from \"@cli/virtual/index.js\";\n\nimport Offscreen from \"./Offscreen\";\nimport OffscreenDeclaration from \"./OffscreenDeclaration\";\nimport {createOffscreenModule, OffscreenModuleName} from \"./offscreen-module\";\n\nimport {Command} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {BackgroundEntryName} from \"@typing/background\";\nimport type {OffscreenParametersMap} from \"@typing/offscreen\";\n\nconst OffscreenBackgroundModule = \"offscreen.background.ts\";\n\nexport default definePlugin(() => {\n let offscreen: Offscreen;\n let declaration: OffscreenDeclaration;\n\n return {\n name: \"adnbn:offscreen\",\n startup: ({config}) => {\n offscreen = new Offscreen(config);\n declaration = new OffscreenDeclaration(config);\n },\n offscreen: () => offscreen.files(),\n bundler: async ({config}) => {\n declaration.dictionary(await offscreen.dictionary()).build();\n\n let build: boolean = true;\n let rspack: RspackConfig = {};\n\n if (await offscreen.empty()) {\n if (config.debug) {\n console.info(\"Offscreen entries not found\");\n }\n\n build = false;\n }\n\n const plugins: Plugins = [];\n\n let parameters: OffscreenParametersMap = {};\n\n if (build) {\n parameters = await offscreen.parameters();\n\n // prettier-ignore\n const plugin = EntrypointPlugin.from(await offscreen.view().entries())\n .virtual(file => offscreen.virtual(file));\n\n if (config.command === Command.Watch) {\n plugin.watch(async () => {\n declaration.dictionary(await offscreen.clear().dictionary()).build();\n\n return offscreen.view().entries();\n });\n }\n\n const htmlPlugins = (await offscreen.view().html()).map(options => new HtmlRspackPlugin(options));\n const tagsPlugins = (await offscreen.view().tags()).map(options => new HtmlRspackTagsPlugin(options));\n\n plugins.push(plugin, ...htmlPlugins, ...tagsPlugins);\n\n if (config.manifestVersion === 2 || config.browser === Browser.Firefox) {\n plugins.push(\n new RspackVirtualModulePlugin(\n {\n [OffscreenBackgroundModule]: virtualOffscreenBackgroundModule(),\n },\n \"virtual\"\n )\n );\n\n rspack = {\n entry: {\n [BackgroundEntryName]: {\n import: [OffscreenBackgroundModule],\n },\n },\n };\n }\n }\n\n return {\n ...rspack,\n plugins: [\n new GenerateModulePlugin({\n [OffscreenModuleName]: createOffscreenModule(parameters),\n }),\n ...plugins,\n ],\n } satisfies RspackConfig;\n },\n manifest: async ({manifest, config}) => {\n manifest.appendCsp(await offscreen.views().csp());\n\n if (config.manifestVersion !== 2 && config.browser !== Browser.Firefox && (await offscreen.exists())) {\n manifest.addPermission(\"offscreen\");\n }\n },\n };\n});\n"],"mappings":"AAAA,SAAuC,wBAAgC;AACvE,SAAQ,iCAAgC;AACxC,OAAO,0BAA0B;AAEjC,SAAQ,oBAAmB;AAE3B,SAAQ,kBAAkB,4BAA2B;AACrD,SAAQ,wCAAuC;AAE/C,OAAO,eAAe;AACtB,OAAO,0BAA0B;AACjC,SAAQ,uBAAuB,2BAA0B;AAEzD,SAAQ,eAAc;AACtB,SAAQ,eAAc;AACtB,SAAQ,2BAA0B;AAGlC,MAAM,4BAA4B;AAElC,IAAO,oBAAQ,aAAa,MAAM;AAC9B,MAAI;AACJ,MAAI;AAEJ,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,EAAC,OAAM,MAAM;AACnB,kBAAY,IAAI,UAAU,MAAM;AAChC,oBAAc,IAAI,qBAAqB,MAAM;AAAA,IACjD;AAAA,IACA,WAAW,MAAM,UAAU,MAAM;AAAA,IACjC,SAAS,OAAO,EAAC,OAAM,MAAM;AACzB,kBAAY,WAAW,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM;AAE3D,UAAI,QAAiB;AACrB,UAAI,SAAuB,CAAC;AAE5B,UAAI,MAAM,UAAU,MAAM,GAAG;AACzB,YAAI,OAAO,OAAO;AACd,kBAAQ,KAAK,6BAA6B;AAAA,QAC9C;AAEA,gBAAQ;AAAA,MACZ;AAEA,YAAM,UAAmB,CAAC;AAE1B,UAAI,aAAqC,CAAC;AAE1C,UAAI,OAAO;AACP,qBAAa,MAAM,UAAU,WAAW;AAGxC,cAAM,SAAS,iBAAiB,KAAK,MAAM,UAAU,KAAK,EAAE,QAAQ,CAAC,EAChE,QAAQ,UAAQ,UAAU,QAAQ,IAAI,CAAC;AAE5C,YAAI,OAAO,YAAY,QAAQ,OAAO;AAClC,iBAAO,MAAM,YAAY;AACrB,wBAAY,WAAW,MAAM,UAAU,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;AAEnE,mBAAO,UAAU,KAAK,EAAE,QAAQ;AAAA,UACpC,CAAC;AAAA,QACL;AAEA,cAAM,eAAe,MAAM,UAAU,KAAK,EAAE,KAAK,GAAG,IAAI,aAAW,IAAI,iBAAiB,OAAO,CAAC;AAChG,cAAM,eAAe,MAAM,UAAU,KAAK,EAAE,KAAK,GAAG,IAAI,aAAW,IAAI,qBAAqB,OAAO,CAAC;AAEpG,gBAAQ,KAAK,QAAQ,GAAG,aAAa,GAAG,WAAW;AAEnD,YAAI,OAAO,oBAAoB,KAAK,OAAO,YAAY,QAAQ,SAAS;AACpE,kBAAQ;AAAA,YACJ,IAAI;AAAA,cACA;AAAA,gBACI,CAAC,yBAAyB,GAAG,iCAAiC;AAAA,cAClE;AAAA,cACA;AAAA,YACJ;AAAA,UACJ;AAEA,mBAAS;AAAA,YACL,OAAO;AAAA,cACH,CAAC,mBAAmB,GAAG;AAAA,gBACnB,QAAQ,CAAC,yBAAyB;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,QACH,GAAG;AAAA,QACH,SAAS;AAAA,UACL,IAAI,qBAAqB;AAAA,YACrB,CAAC,mBAAmB,GAAG,sBAAsB,UAAU;AAAA,UAC3D,CAAC;AAAA,UACD,GAAG;AAAA,QACP;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,UAAU,OAAO,EAAC,UAAU,OAAM,MAAM;AACpC,eAAS,UAAU,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC;AAEhD,UAAI,OAAO,oBAAoB,KAAK,OAAO,YAAY,QAAQ,WAAY,MAAM,UAAU,OAAO,GAAI;AAClG,iBAAS,cAAc,WAAW;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AACJ,CAAC;","names":[]}
@@ -1,36 +1,41 @@
1
1
  import _ from "lodash";
2
2
  import path from "path";
3
3
  import fs from "fs";
4
- import { CssExtractRspackPlugin } from "@rspack/core";
4
+ import {
5
+ CssExtractRspackPlugin
6
+ } from "@rspack/core";
5
7
  import { mergeStyleSources } from "./utils.js";
6
8
  import { DocumentStylesLayer, DefaultStylesLayer } from "./../../../cli/bundler/layers.js";
7
9
  import { definePlugin } from "./../../../main/plugin.js";
8
10
  import { appFilenameResolver } from "./../../../cli/bundler/index.js";
9
11
  import { getAppSourcePath, getResolvePath, getSharedPath } from "./../../../cli/resolvers/path.js";
10
- import { toPosix } from "./../../../cli/utils/path.js";
11
12
  const DefaultAsIsLoaderIdent = "adnbn-default-asis";
12
13
  const DefaultModulesLoaderIdent = "adnbn-default-modules";
13
- const styleMergerLoader = (config) => (sharedStyle, sharedPath) => {
14
+ const createStyleMerger = (config) => {
14
15
  const sharedDir = getResolvePath(getSharedPath(config));
15
- if (sharedPath.startsWith(sharedDir)) {
16
- const relativePath = path.relative(sharedDir, sharedPath);
17
- const appDir = getResolvePath(getAppSourcePath(config));
18
- const appPath = getResolvePath(path.join(appDir, relativePath));
19
- if (fs.existsSync(appPath)) {
20
- let appStyle = fs.readFileSync(appPath, "utf8");
21
- appStyle = appStyle.replace(/url\((['"]?)(.*?)\1\)/g, (match, quote, filePath) => {
22
- if (filePath.startsWith("/") || filePath.startsWith("http") || filePath.startsWith("data:")) {
23
- return match;
24
- }
25
- const cssDir = path.dirname(appPath);
26
- const assetAbs = path.resolve(cssDir, filePath);
27
- const sharedFileDir = path.dirname(sharedPath);
28
- const relativeToSharedFile = path.relative(sharedFileDir, assetAbs);
29
- return `url("${toPosix(relativeToSharedFile)}")`;
30
- });
31
- return mergeStyleSources(sharedStyle, appStyle);
16
+ const appDir = getResolvePath(getAppSourcePath(config));
17
+ return (content, context) => {
18
+ const filename = context.resourcePath;
19
+ const relative = path.relative(sharedDir, filename);
20
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
21
+ return content;
22
+ }
23
+ const appPath = path.join(appDir, relative);
24
+ if (!fs.existsSync(appPath)) {
25
+ context.addMissingDependency(appPath);
26
+ return content;
32
27
  }
33
- }
28
+ context.addDependency(appPath);
29
+ try {
30
+ return mergeStyleSources(
31
+ { filename, content },
32
+ { filename: appPath, content: fs.readFileSync(appPath, "utf8") }
33
+ );
34
+ } catch (error) {
35
+ context.emitError(error instanceof Error ? error : new Error(String(error)));
36
+ return "";
37
+ }
38
+ };
34
39
  };
35
40
  var style_default = definePlugin(() => {
36
41
  return {
@@ -40,16 +45,14 @@ var style_default = definePlugin(() => {
40
45
  const filename = appFilenameResolver(app, cssFilename, cssDir);
41
46
  const kebabApp = _.kebabCase(app);
42
47
  const createSassRuleSet = (rule) => {
43
- const rules = [CssExtractRspackPlugin.loader, rule, "sass-loader"];
44
- if (mergeStyles) {
45
- rules.push({
46
- loader: "source-modifier-loader",
47
- options: {
48
- modify: styleMergerLoader(config)
49
- }
50
- });
51
- }
52
- return rules;
48
+ return [
49
+ CssExtractRspackPlugin.loader,
50
+ rule,
51
+ {
52
+ loader: "sass-loader",
53
+ options: mergeStyles ? { additionalData: createStyleMerger(config) } : {}
54
+ }
55
+ ];
53
56
  };
54
57
  const createStyleRules = (defaultStyles = false) => [
55
58
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/plugins/style/index.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {Configuration as RspackConfig, CssExtractRspackPlugin, RuleSetUse, RuleSetUseItem} from \"@rspack/core\";\n\nimport {mergeStyleSources} from \"./utils\";\nimport {DocumentStylesLayer, DefaultStylesLayer} from \"@cli/bundler/layers\";\n\nimport {definePlugin} from \"@main/plugin\";\n\nimport {appFilenameResolver} from \"@cli/bundler\";\nimport {getAppSourcePath, getResolvePath, getSharedPath} from \"@cli/resolvers/path\";\nimport {toPosix} from \"@cli/utils/path\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\n\n// CssExtract also identifies dependencies by loader request, not just by layer.\n// Keep default and document styles distinct even when their contents are identical.\nconst DefaultAsIsLoaderIdent = \"adnbn-default-asis\";\nconst DefaultModulesLoaderIdent = \"adnbn-default-modules\";\n\n// prettier-ignore\nconst styleMergerLoader =\n (config: ReadonlyConfig) =>\n (sharedStyle: string, sharedPath: string): string | void => {\n const sharedDir = getResolvePath(getSharedPath(config));\n\n if (sharedPath.startsWith(sharedDir)) {\n const relativePath = path.relative(sharedDir, sharedPath);\n\n const appDir = getResolvePath(getAppSourcePath(config));\n const appPath = getResolvePath(path.join(appDir, relativePath));\n\n if (fs.existsSync(appPath)) {\n let appStyle = fs.readFileSync(appPath, \"utf8\");\n\n appStyle = appStyle.replace(/url\\((['\"]?)(.*?)\\1\\)/g, (match, quote, filePath) => {\n if (\n filePath.startsWith(\"/\") ||\n filePath.startsWith(\"http\") ||\n filePath.startsWith(\"data:\")\n ) {\n return match;\n }\n\n const cssDir = path.dirname(appPath);\n const assetAbs = path.resolve(cssDir, filePath);\n\n const sharedFileDir = path.dirname(sharedPath);\n\n const relativeToSharedFile = path.relative(sharedFileDir, assetAbs);\n\n return `url(\"${toPosix(relativeToSharedFile)}\")`;\n });\n\n return mergeStyleSources(sharedStyle, appStyle);\n }\n }\n };\n\nexport default definePlugin(() => {\n return {\n name: \"adnbn:styles\",\n bundler: ({config}) => {\n const {app, cssDir, cssFilename, cssIdentName, mergeStyles} = config;\n\n const filename = appFilenameResolver(app, cssFilename, cssDir);\n const kebabApp = _.kebabCase(app);\n\n const createSassRuleSet = (rule: RuleSetUseItem): RuleSetUse => {\n const rules: RuleSetUse = [CssExtractRspackPlugin.loader, rule, \"sass-loader\"];\n\n if (mergeStyles) {\n rules.push({\n loader: \"source-modifier-loader\",\n options: {\n modify: styleMergerLoader(config),\n },\n });\n }\n\n return rules;\n };\n\n const createStyleRules = (defaultStyles = false) => [\n {\n resourceQuery: /[?&]asis(?:[=&]|$)/,\n use: createSassRuleSet({\n loader: \"css-loader\",\n ...(defaultStyles ? {ident: DefaultAsIsLoaderIdent} : {}),\n options: {esModule: true, modules: false},\n }),\n },\n {\n use: createSassRuleSet({\n loader: \"css-loader\",\n ...(defaultStyles ? {ident: DefaultModulesLoaderIdent} : {}),\n options: {\n esModule: true,\n modules: {\n exportLocalsConvention: \"as-is\",\n namedExport: false,\n localIdentName: cssIdentName.replaceAll(\"[app]\", kebabApp),\n localIdentHashSalt: kebabApp,\n },\n },\n }),\n },\n ];\n\n return {\n resolve: {\n extensions: [\".css\", \".scss\"],\n },\n plugins: [\n new CssExtractRspackPlugin({\n filename,\n chunkFilename: filename,\n }),\n ],\n module: {\n rules: [\n {\n test: /\\.(scss|css)$/,\n type: \"javascript/auto\",\n oneOf: [\n {\n resourceQuery: /[?&]unisolated(?:[=&]|$)/,\n layer: DocumentStylesLayer,\n oneOf: createStyleRules(),\n },\n {\n // Nested CSS imports preserve an explicit document destination.\n issuerLayer: DocumentStylesLayer,\n layer: DocumentStylesLayer,\n oneOf: createStyleRules(),\n },\n {layer: DefaultStylesLayer, oneOf: createStyleRules(true)},\n ],\n },\n ],\n },\n } satisfies RspackConfig;\n },\n };\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/cli/plugins/style/index.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n Configuration as RspackConfig,\n CssExtractRspackPlugin,\n LoaderContext,\n RuleSetUse,\n RuleSetUseItem,\n} from \"@rspack/core\";\n\nimport {mergeStyleSources} from \"./utils\";\nimport {DocumentStylesLayer, DefaultStylesLayer} from \"@cli/bundler/layers\";\n\nimport {definePlugin} from \"@main/plugin\";\n\nimport {appFilenameResolver} from \"@cli/bundler\";\nimport {getAppSourcePath, getResolvePath, getSharedPath} from \"@cli/resolvers/path\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\n\n// CssExtract also identifies dependencies by loader request, not just by layer.\n// Keep default and document styles distinct even when their contents are identical.\nconst DefaultAsIsLoaderIdent = \"adnbn-default-asis\";\nconst DefaultModulesLoaderIdent = \"adnbn-default-modules\";\n\nconst createStyleMerger = (config: ReadonlyConfig) => {\n const sharedDir = getResolvePath(getSharedPath(config));\n const appDir = getResolvePath(getAppSourcePath(config));\n\n return (content: string, context: LoaderContext): string => {\n const filename = context.resourcePath;\n const relative = path.relative(sharedDir, filename);\n\n if (relative === \"..\" || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {\n return content;\n }\n\n const appPath = path.join(appDir, relative);\n\n if (!fs.existsSync(appPath)) {\n context.addMissingDependency(appPath);\n\n return content;\n }\n\n context.addDependency(appPath);\n\n try {\n return mergeStyleSources(\n {filename, content},\n {filename: appPath, content: fs.readFileSync(appPath, \"utf8\")}\n );\n } catch (error) {\n // sass-loader prepares additionalData outside its error handler. Fail the compilation\n // explicitly and supply no stylesheet instead of compiling an incomplete shared fallback.\n context.emitError(error instanceof Error ? error : new Error(String(error)));\n\n return \"\";\n }\n };\n};\n\nexport default definePlugin(() => {\n return {\n name: \"adnbn:styles\",\n bundler: ({config}) => {\n const {app, cssDir, cssFilename, cssIdentName, mergeStyles} = config;\n\n const filename = appFilenameResolver(app, cssFilename, cssDir);\n const kebabApp = _.kebabCase(app);\n\n const createSassRuleSet = (rule: RuleSetUseItem): RuleSetUse => {\n return [\n CssExtractRspackPlugin.loader,\n rule,\n {\n loader: \"sass-loader\",\n options: mergeStyles ? {additionalData: createStyleMerger(config)} : {},\n },\n ];\n };\n\n const createStyleRules = (defaultStyles = false) => [\n {\n resourceQuery: /[?&]asis(?:[=&]|$)/,\n use: createSassRuleSet({\n loader: \"css-loader\",\n ...(defaultStyles ? {ident: DefaultAsIsLoaderIdent} : {}),\n options: {esModule: true, modules: false},\n }),\n },\n {\n use: createSassRuleSet({\n loader: \"css-loader\",\n ...(defaultStyles ? {ident: DefaultModulesLoaderIdent} : {}),\n options: {\n esModule: true,\n modules: {\n exportLocalsConvention: \"as-is\",\n namedExport: false,\n localIdentName: cssIdentName.replaceAll(\"[app]\", kebabApp),\n localIdentHashSalt: kebabApp,\n },\n },\n }),\n },\n ];\n\n return {\n resolve: {\n extensions: [\".css\", \".scss\"],\n },\n plugins: [\n new CssExtractRspackPlugin({\n filename,\n chunkFilename: filename,\n }),\n ],\n module: {\n rules: [\n {\n test: /\\.(scss|css)$/,\n type: \"javascript/auto\",\n oneOf: [\n {\n resourceQuery: /[?&]unisolated(?:[=&]|$)/,\n layer: DocumentStylesLayer,\n oneOf: createStyleRules(),\n },\n {\n // Nested CSS imports preserve an explicit document destination.\n issuerLayer: DocumentStylesLayer,\n layer: DocumentStylesLayer,\n oneOf: createStyleRules(),\n },\n {layer: DefaultStylesLayer, oneOf: createStyleRules(true)},\n ],\n },\n ],\n },\n } satisfies RspackConfig;\n },\n };\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Rebases the explicit `./` or `../` module request of `@use` or `@forward` parameters written in the
3
+ * stylesheet `from` so it resolves from the stylesheet `to`. Namespaces, `show`, `hide` and `with`
4
+ * configuration stay as written; package, alias, built-in and interpolated requests keep their normal
5
+ * resolution. When both stylesheets are the same file, the request is only normalized.
6
+ */
7
+ export declare const rebaseModuleRequest: (params: string, from: string, to: string) => string;
8
+ /**
9
+ * Rebases literal relative `url(...)` values written in the stylesheet `from` so they resolve from the
10
+ * stylesheet `to`, including values nested in lists, functions and module configuration. Absolute URLs,
11
+ * schemes, root-relative paths, fragments, queries, ~-prefixed requests and Sass expressions stay as written.
12
+ * Rebased URLs are quoted and keep their query and fragment.
13
+ */
14
+ export declare const rebaseUrlFunctions: (value: string, from: string, to: string) => string;