diff --git a/packages/happy-dom/src/browser/types/IBrowserSettings.ts b/packages/happy-dom/src/browser/types/IBrowserSettings.ts index ed8bb17ee..1ae878805 100644 --- a/packages/happy-dom/src/browser/types/IBrowserSettings.ts +++ b/packages/happy-dom/src/browser/types/IBrowserSettings.ts @@ -5,6 +5,12 @@ import BrowserNavigationCrossOriginPolicyEnum from '../enums/BrowserNavigationCr * Browser settings. */ export default interface IBrowserSettings { + /** + * Allows resource urls to be transformed. + * Ex: https://www.example.com/assets/index.js -> file:///Users/example-user/Projects/example/dist/assets/index.js + */ + resourceUrlTransformer?: (url: string) => string; + /** Disables JavaScript evaluation. */ disableJavaScriptEvaluation: boolean; diff --git a/packages/happy-dom/src/browser/types/IOptionalBrowserSettings.ts b/packages/happy-dom/src/browser/types/IOptionalBrowserSettings.ts index 33d314eea..9689f55d0 100644 --- a/packages/happy-dom/src/browser/types/IOptionalBrowserSettings.ts +++ b/packages/happy-dom/src/browser/types/IOptionalBrowserSettings.ts @@ -2,6 +2,12 @@ import BrowserErrorCaptureEnum from '../enums/BrowserErrorCaptureEnum.js'; import BrowserNavigationCrossOriginPolicyEnum from '../enums/BrowserNavigationCrossOriginPolicyEnum.js'; export default interface IOptionalBrowserSettings { + /** + * Allows resource urls to be transformed. + * Ex: https://www.example.com/assets/index.js -> file:///Users/example-user/Projects/example/dist/assets/index.js + */ + resourceUrlTransformer?: (url: string) => string; + /** Disables JavaScript evaluation. */ disableJavaScriptEvaluation?: boolean; diff --git a/packages/happy-dom/src/fetch/ResourceFetch.ts b/packages/happy-dom/src/fetch/ResourceFetch.ts index 70a33fa16..3e9cbc803 100644 --- a/packages/happy-dom/src/fetch/ResourceFetch.ts +++ b/packages/happy-dom/src/fetch/ResourceFetch.ts @@ -30,6 +30,12 @@ export default class ResourceFetch { * @returns Response. */ public async fetch(url: string): Promise { + if ( + typeof this.#browserFrame.page.context.browser.settings.resourceUrlTransformer === 'function' + ) { + url = this.#browserFrame.page.context.browser.settings.resourceUrlTransformer(url); + } + const fetch = new Fetch({ browserFrame: this.#browserFrame, window: this.window, @@ -56,6 +62,11 @@ export default class ResourceFetch { * @returns Response. */ public fetchSync(url: string): string { + if ( + typeof this.#browserFrame.page.context.browser.settings.resourceUrlTransformer === 'function' + ) { + url = this.#browserFrame.page.context.browser.settings.resourceUrlTransformer(url); + } const fetch = new SyncFetch({ browserFrame: this.#browserFrame, window: this.window, diff --git a/packages/happy-dom/vitest.config.ts.timestamp-1727264608254-e40f6185bc157.mjs b/packages/happy-dom/vitest.config.ts.timestamp-1727264608254-e40f6185bc157.mjs new file mode 100644 index 000000000..e13eb5e5d --- /dev/null +++ b/packages/happy-dom/vitest.config.ts.timestamp-1727264608254-e40f6185bc157.mjs @@ -0,0 +1,15 @@ +// vitest.config.ts +import { defineConfig } from "file:///Users/olsa02/Projects/happy-dom/node_modules/vitest/dist/config.js"; +var vitest_config_default = defineConfig({ + test: { + environment: "node", + include: ["./test/**/*.test.ts"], + setupFiles: ["./test/setup.ts"], + testTimeout: 500, + restoreMocks: true + } +}); +export { + vitest_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZXN0LmNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9vbHNhMDIvUHJvamVjdHMvaGFwcHktZG9tL3BhY2thZ2VzL2hhcHB5LWRvbVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL29sc2EwMi9Qcm9qZWN0cy9oYXBweS1kb20vcGFja2FnZXMvaGFwcHktZG9tL3ZpdGVzdC5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL29sc2EwMi9Qcm9qZWN0cy9oYXBweS1kb20vcGFja2FnZXMvaGFwcHktZG9tL3ZpdGVzdC5jb25maWcudHNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlc3QvY29uZmlnJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcblx0dGVzdDoge1xuXHRcdGVudmlyb25tZW50OiAnbm9kZScsXG5cdFx0aW5jbHVkZTogWycuL3Rlc3QvKiovKi50ZXN0LnRzJ10sXG5cdFx0c2V0dXBGaWxlczogWycuL3Rlc3Qvc2V0dXAudHMnXSxcblx0XHR0ZXN0VGltZW91dDogNTAwLFxuXHRcdHJlc3RvcmVNb2NrczogdHJ1ZVxuXHR9XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBK1UsU0FBUyxvQkFBb0I7QUFFNVcsSUFBTyx3QkFBUSxhQUFhO0FBQUEsRUFDM0IsTUFBTTtBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsU0FBUyxDQUFDLHFCQUFxQjtBQUFBLElBQy9CLFlBQVksQ0FBQyxpQkFBaUI7QUFBQSxJQUM5QixhQUFhO0FBQUEsSUFDYixjQUFjO0FBQUEsRUFDZjtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==