diff --git a/packages/building-rollup/demo/mpa/homepage-side-effect.js b/packages/building-rollup/demo/mpa/homepage-side-effect.js new file mode 100644 index 00000000..42e9b3a3 --- /dev/null +++ b/packages/building-rollup/demo/mpa/homepage-side-effect.js @@ -0,0 +1,3 @@ +import './js/homepage-side-effect-dep.js'; + +window.__homepageSideEffectMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/homepage.js b/packages/building-rollup/demo/mpa/homepage.js new file mode 100644 index 00000000..4eddb3da --- /dev/null +++ b/packages/building-rollup/demo/mpa/homepage.js @@ -0,0 +1,2 @@ +export { homepageDepMetaUrl } from './js/homepage-dep.js'; +export const homepageMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/index.html b/packages/building-rollup/demo/mpa/index.html new file mode 100644 index 00000000..bf7c53ac --- /dev/null +++ b/packages/building-rollup/demo/mpa/index.html @@ -0,0 +1,49 @@ + + + + + + + + My Demo + + + +

Static content in index.html is preserved

+ + SubPage + +
+ + + + + + diff --git a/packages/building-rollup/demo/mpa/js/homepage-dep.js b/packages/building-rollup/demo/mpa/js/homepage-dep.js new file mode 100644 index 00000000..7b1bf787 --- /dev/null +++ b/packages/building-rollup/demo/mpa/js/homepage-dep.js @@ -0,0 +1 @@ +export const homepageDepMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/js/homepage-side-effect-dep.js b/packages/building-rollup/demo/mpa/js/homepage-side-effect-dep.js new file mode 100644 index 00000000..a1a95eeb --- /dev/null +++ b/packages/building-rollup/demo/mpa/js/homepage-side-effect-dep.js @@ -0,0 +1 @@ +window.__homepageSideEffectDepMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/js/subpage-dep.js b/packages/building-rollup/demo/mpa/js/subpage-dep.js new file mode 100644 index 00000000..c9e67ec2 --- /dev/null +++ b/packages/building-rollup/demo/mpa/js/subpage-dep.js @@ -0,0 +1 @@ +export const subpageDepMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/js/subpage-side-effect-dep.js b/packages/building-rollup/demo/mpa/js/subpage-side-effect-dep.js new file mode 100644 index 00000000..e20cecd3 --- /dev/null +++ b/packages/building-rollup/demo/mpa/js/subpage-side-effect-dep.js @@ -0,0 +1 @@ +window.__subpageSideEffectDepMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/navigation.js b/packages/building-rollup/demo/mpa/navigation.js new file mode 100644 index 00000000..81aa9e43 --- /dev/null +++ b/packages/building-rollup/demo/mpa/navigation.js @@ -0,0 +1 @@ +export const navigationMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/rollup.mpa.config.js b/packages/building-rollup/demo/mpa/rollup.mpa.config.js new file mode 100644 index 00000000..d611420c --- /dev/null +++ b/packages/building-rollup/demo/mpa/rollup.mpa.config.js @@ -0,0 +1,12 @@ +const merge = require('deepmerge'); +const { createMpaConfig } = require('../../index.js'); + +const baseConfig = createMpaConfig({ + developmentMode: true, + injectServiceWorker: true, + rootDir: 'demo/mpa', +}); + +module.exports = merge(baseConfig, { + input: '**/*.html', +}); diff --git a/packages/building-rollup/demo/mpa/subpage/index.html b/packages/building-rollup/demo/mpa/subpage/index.html new file mode 100644 index 00000000..412448ed --- /dev/null +++ b/packages/building-rollup/demo/mpa/subpage/index.html @@ -0,0 +1,49 @@ + + + + + + + + My Demo Subpage + + + +

Static content in subpage/index.html is preserved

+ +
+ + + + + + diff --git a/packages/building-rollup/demo/mpa/subpage/subpage-side-effect.js b/packages/building-rollup/demo/mpa/subpage/subpage-side-effect.js new file mode 100644 index 00000000..50121c5c --- /dev/null +++ b/packages/building-rollup/demo/mpa/subpage/subpage-side-effect.js @@ -0,0 +1,3 @@ +import '../js/subpage-side-effect-dep.js'; + +window.__subpageSideEffectMetaUrl = import.meta.url; diff --git a/packages/building-rollup/demo/mpa/subpage/subpage.js b/packages/building-rollup/demo/mpa/subpage/subpage.js new file mode 100644 index 00000000..b0f91a81 --- /dev/null +++ b/packages/building-rollup/demo/mpa/subpage/subpage.js @@ -0,0 +1,2 @@ +export { subpageDepMetaUrl } from '../js/subpage-dep.js'; +export const subpageMetaUrl = import.meta.url; diff --git a/packages/building-rollup/index.js b/packages/building-rollup/index.js index 1e771956..474fceed 100644 --- a/packages/building-rollup/index.js +++ b/packages/building-rollup/index.js @@ -5,5 +5,6 @@ const { createBasicConfig } = require('./src/createBasicConfig'); const { createSpaConfig } = require('./src/createSpaConfig'); +const { createMpaConfig } = require('./src/createMpaConfig'); -module.exports = { createBasicConfig, createSpaConfig }; +module.exports = { createBasicConfig, createSpaConfig, createMpaConfig }; diff --git a/packages/building-rollup/package.json b/packages/building-rollup/package.json index 75f59499..4f16b535 100644 --- a/packages/building-rollup/package.json +++ b/packages/building-rollup/package.json @@ -19,16 +19,18 @@ "build:basic": "rimraf dist && rollup -c demo/js/rollup.basic.config.js", "build:cjs": "rimraf dist && rollup -c demo/cjs/rollup.spa.config.js", "build:modify-babel-plugin": "rimraf dist && rollup -c demo/modify-babel-plugin/rollup.config.js", + "build:mpa": "rimraf dist && rollup -c demo/mpa/rollup.mpa.config.js", "build:spa": "rimraf dist && rollup -c demo/js/rollup.spa.config.js", "build:spa-js-input": "rimraf dist && rollup -c demo/js/rollup.spa-js-input.config.js", "build:spa-nomodule": "rimraf dist && rollup -c demo/js/rollup.spa-nomodule.config.js", "build:ts": "rimraf dist && rollup -c demo/ts/rollup.spa.config.js", "prepublishOnly": "../../scripts/insert-header.js", "start:babelrc": "npm run build:babelrc && npm run start:build", - "start:build": "es-dev-server --root-dir dist --compatibility none --open", + "start:build": "node ../es-dev-server/dist/cli.js --root-dir dist --compatibility none --open", "start:cjs": "npm run build:cjs && npm run start:build", - "start:demo": "es-dev-server --app-index demo/js/index.html --open --compatibility none", + "start:demo": "node ../es-dev-server/dist/cli.js --app-index demo/js/index.html --open --compatibility none", "start:modify-babel-plugin": "npm run build:modify-babel-plugin && npm run start:build", + "start:mpa": "npm run build:mpa && npm run start:build", "start:spa": "npm run build:spa && npm run start:build", "start:spa-js-input": "npm run build:spa-js-input && npm run start:build", "start:spa-nomodule": "npm run build:spa-nomodule && npm run start:build", diff --git a/packages/building-rollup/src/babel/babel-configs.js b/packages/building-rollup/src/babel/babel-configs.js index 026c1cdd..66bcd243 100644 --- a/packages/building-rollup/src/babel/babel-configs.js +++ b/packages/building-rollup/src/babel/babel-configs.js @@ -1,7 +1,7 @@ const { babelPluginBundledHelpers } = require('./babel-plugin-bundled-helpers'); const { isFalsy } = require('../utils'); -const createBabelConfigRollupBuild = developmentMode => ({ +const createBabelConfigRollupBuild = ({ developmentMode, rootDir }) => ({ babelHelpers: 'bundled', compact: true, plugins: [ @@ -11,7 +11,7 @@ const createBabelConfigRollupBuild = developmentMode => ({ // plugins that aren't part of @babel/preset-env should be applied regularly in // the rollup build phase - require.resolve('babel-plugin-bundled-import-meta'), + [require.resolve('babel-plugin-bundled-import-meta'), { bundleDir: rootDir }], !developmentMode && [ require.resolve('babel-plugin-template-html-minifier'), { diff --git a/packages/building-rollup/src/createBasicConfig.js b/packages/building-rollup/src/createBasicConfig.js index 059b571f..37edaf2b 100644 --- a/packages/building-rollup/src/createBasicConfig.js +++ b/packages/building-rollup/src/createBasicConfig.js @@ -28,7 +28,7 @@ function createBasicConfig(userOptions = {}) { }, userOptions, ); - const { developmentMode } = userOptions; + const { developmentMode, rootDir } = userOptions; const fileName = `[${developmentMode ? 'name' : 'hash'}].js`; const assetName = `[${developmentMode ? 'name' : 'hash'}][extname]`; @@ -60,7 +60,11 @@ function createBasicConfig(userOptions = {}) { // build non-standard syntax to standard syntax and other babel optimization plugins // user plugins are deduped to allow overriding - dedupedBabelPlugin(babel, opts.babel, createBabelConfigRollupBuild(developmentMode)), + dedupedBabelPlugin( + babel, + opts.babel, + createBabelConfigRollupBuild({ developmentMode, rootDir }), + ), // minify js code !developmentMode && pluginWithOptions(terser, opts.terser, { output: { comments: false } }), diff --git a/packages/building-rollup/src/createMpaConfig.js b/packages/building-rollup/src/createMpaConfig.js new file mode 100644 index 00000000..63ec934e --- /dev/null +++ b/packages/building-rollup/src/createMpaConfig.js @@ -0,0 +1,20 @@ +/* eslint-disable */ +/** @typedef {import('./types').MpaOptions} MpaOptions */ + +const merge = require('deepmerge'); +const { createSpaConfig } = require('./createSpaConfig.js'); + +/** + * @param {MpaOptions} options + */ +function createMpaConfig(options) { + const userOptions = merge( + { + html: { flatten: false }, + }, + options, + ); + return createSpaConfig(userOptions); +} + +module.exports = { createMpaConfig }; diff --git a/packages/building-rollup/src/createSpaConfig.js b/packages/building-rollup/src/createSpaConfig.js index 00632641..b94cd0f0 100644 --- a/packages/building-rollup/src/createSpaConfig.js +++ b/packages/building-rollup/src/createSpaConfig.js @@ -8,12 +8,7 @@ const polyfillsLoader = require('@open-wc/rollup-plugin-polyfills-loader'); const path = require('path'); const { generateSW } = require('rollup-plugin-workbox'); const { createBasicConfig } = require('./createBasicConfig'); -const { - pluginWithOptions, - applyServiceWorkerRegistration, - isFalsy, - createSwPath, -} = require('./utils'); +const { pluginWithOptions, applyServiceWorkerRegistration, isFalsy } = require('./utils'); const { defaultPolyfills } = require('./polyfills'); /** @@ -34,8 +29,19 @@ function createSpaConfig(options) { ); let outputDir = basicConfig.output.dir; - const swPath = createSwPath(userOptions, outputDir); - const applySw = htmlString => applyServiceWorkerRegistration(htmlString, swPath); + if (userOptions.rootDir) { + if (typeof userOptions.html === 'boolean' && userOptions.html) { + userOptions.html = { + rootDir: userOptions.rootDir, + }; + } + if (typeof userOptions.html === 'object') { + userOptions.html.rootDir = userOptions.rootDir; + } + } + + const applySw = (htmlString, transformOptions) => + applyServiceWorkerRegistration(htmlString, transformOptions, userOptions, outputDir); const htmlPlugin = pluginWithOptions(html, userOptions.html, { minify: !userOptions.developmentMode, diff --git a/packages/building-rollup/src/types.d.ts b/packages/building-rollup/src/types.d.ts index 9605d24d..c7407080 100644 --- a/packages/building-rollup/src/types.d.ts +++ b/packages/building-rollup/src/types.d.ts @@ -1,3 +1,5 @@ +import { PluginOptions } from '@open-wc/rollup-plugin-html'; + export interface BasicOptions { outputDir?: string; nodeResolve?: boolean | object; @@ -5,16 +7,19 @@ export interface BasicOptions { terser?: boolean | object; legacyBuild?: boolean; developmentMode?: boolean; + rootDir?: string; } export interface SpaOptions extends BasicOptions { - html?: boolean | object; + html?: boolean | PluginOptions; polyfillsLoader?: boolean | object; workbox?: boolean | WorkboxOptions; injectServiceWorker?: boolean; } +export interface MpaOptions extends SpaOptions {} + interface WorkboxOptions { - swDest?: string, - globDirectory?: string, -} \ No newline at end of file + swDest?: string; + globDirectory?: string; +} diff --git a/packages/building-rollup/src/utils.js b/packages/building-rollup/src/utils.js index 2360308f..069dcb04 100644 --- a/packages/building-rollup/src/utils.js +++ b/packages/building-rollup/src/utils.js @@ -1,6 +1,7 @@ /** @typedef {import('./types').SpaOptions} SpaOptions */ const merge = require('deepmerge'); +const path = require('path'); const { createScript } = require('@open-wc/building-utils'); const { parse, serialize } = require('parse5'); const { append, predicates, query } = require('@open-wc/building-utils/dom5-fork'); @@ -39,11 +40,30 @@ function pluginWithOptions(plugin, userConfig, defaultConfig, ...otherParams) { return plugin(config, ...otherParams); } +/** + * + * @param {SpaOptions} userOptions + * @param {string} outputDir + * @param {string} htmlFileName + */ +function createSwPath(userOptions, outputDir, htmlFileName) { + let swPath; + if (typeof userOptions.workbox === 'object' && userOptions.workbox.swDest) { + swPath = userOptions.workbox.swDest.replace(`${outputDir}/`, ''); + } else { + swPath = './sw.js'; + } + + swPath = path.relative(path.dirname(htmlFileName), swPath); + return swPath; +} + /** * @param {string} htmlString * @returns {string} */ -function applyServiceWorkerRegistration(htmlString, swPath) { +function applyServiceWorkerRegistration(htmlString, transformOptions, userOptions, outputDir) { + const swPath = createSwPath(userOptions, outputDir, transformOptions.htmlFileName); const documentAst = parse(htmlString); const body = query(documentAst, predicates.hasTagName('body')); const swRegistration = createScript( @@ -68,21 +88,6 @@ function applyServiceWorkerRegistration(htmlString, swPath) { return serialize(documentAst); } -/** - * - * @param {SpaOptions} userOptions - * @param {string} outputDir - */ -function createSwPath(userOptions, outputDir) { - let swPath; - if (typeof userOptions.workbox === 'object' && userOptions.workbox.swDest) { - swPath = userOptions.workbox.swDest.replace(`${outputDir}/`, ''); - } else { - swPath = './sw.js'; - } - return swPath; -} - module.exports = { isFalsy, pluginWithOptions, diff --git a/packages/building-rollup/test/mpa-integration.test.js b/packages/building-rollup/test/mpa-integration.test.js new file mode 100644 index 00000000..cfde7a2d --- /dev/null +++ b/packages/building-rollup/test/mpa-integration.test.js @@ -0,0 +1,96 @@ +/* eslint-disable global-require, import/no-dynamic-require */ +const puppeteer = require('puppeteer'); +const { expect } = require('chai'); +const path = require('path'); +const fs = require('fs'); +const rimraf = require('rimraf'); +const { rollup } = require('rollup'); +const { startServer, createConfig } = require('es-dev-server'); + +const rootDir = path.resolve(__dirname, '..', 'dist'); + +describe('integration tests', () => { + let server; + let serverConfig; + /** @type {import('puppeteer').Browser} */ + let browser; + + before(async () => { + serverConfig = createConfig({ + port: 8081, + rootDir, + }); + + ({ server } = await startServer(serverConfig)); + browser = await puppeteer.launch(); + rimraf.sync(rootDir); + }); + + after(async () => { + await browser.close(); + await new Promise(resolve => + server.close(() => { + resolve(); + }), + ); + }); + + describe(`Mpa Config`, function describe() { + this.timeout(10000); + let page; + + before(async () => { + rimraf.sync(rootDir); + const configPath = path.join(__dirname, '..', 'demo', 'mpa', 'rollup.mpa.config.js'); + const config = require(configPath); + const bundle = await rollup(config); + if (Array.isArray(config.output)) { + await Promise.all([bundle.write(config.output[0]), bundle.write(config.output[1])]); + } else { + await bundle.write(config.output); + } + + page = await browser.newPage(); + }); + + after(() => { + rimraf.sync(rootDir); + }); + + it('passes the in-browser tests for index.html', async () => { + await page.goto('http://localhost:8081/', { + waitUntil: 'networkidle0', + }); + // @ts-ignore + const browserTests = await page.evaluate(() => window.__tests); + expect(browserTests).to.eql({ + homepageMetaUrl: 'http://localhost:8081/homepage.js', + homepageDepMetaUrl: 'http://localhost:8081/js/homepage-dep.js', + __homepageSideEffectMetaUrl: 'http://localhost:8081/homepage-side-effect.js', + __homepageSideEffectDepMetaUrl: 'http://localhost:8081/js/homepage-side-effect-dep.js', + navigationMetaUrl: 'http://localhost:8081/navigation.js', + serviceWorkerScriptUrl: 'sw.js', + }); + }); + + it('passes the in-browser tests for subpage/index.html', async () => { + await page.goto('http://localhost:8081/subpage/', { + waitUntil: 'networkidle0', + }); + // @ts-ignore + const browserTests = await page.evaluate(() => window.__tests); + expect(browserTests).to.eql({ + subpageMetaUrl: 'http://localhost:8081/subpage/subpage.js', + subpageDepMetaUrl: 'http://localhost:8081/js/subpage-dep.js', + __subpageSideEffectMetaUrl: 'http://localhost:8081/subpage/subpage-side-effect.js', + __subpageSideEffectDepMetaUrl: 'http://localhost:8081/js/subpage-side-effect-dep.js', + navigationMetaUrl: 'http://localhost:8081/navigation.js', + serviceWorkerScriptUrl: '../sw.js', + }); + }); + + it('outputs a service worker', () => { + expect(fs.existsSync(path.join(rootDir, 'sw.js'))).to.be.true; + }); + }); +}); diff --git a/packages/building-rollup/test/unit.test.js b/packages/building-rollup/test/unit.test.js index def1b611..cd82485b 100644 --- a/packages/building-rollup/test/unit.test.js +++ b/packages/building-rollup/test/unit.test.js @@ -13,11 +13,12 @@ describe('createSwPath', () => { }, }, 'dist', + 'index.html', ), - ).to.equal('./foo.js'); + ).to.equal('foo.js'); }); - it('uses "./sw.js" as swPath if no swDest is provided by the workbox config', () => { + it('uses "sw.js" as swPath if no swDest is provided by the workbox config', () => { expect( createSwPath( { @@ -26,26 +27,29 @@ describe('createSwPath', () => { }, }, 'dist', + 'index.html', ), - ).to.equal('./sw.js'); + ).to.equal('sw.js'); }); - it('returns "./sw.js" as swPath if the workbox property is a boolean', () => { + it('returns "sw.js" as swPath if the workbox property is a boolean', () => { expect( createSwPath( { workbox: true, }, 'dist', + 'index.html', ), - ).to.equal('./sw.js'); + ).to.equal('sw.js'); expect( createSwPath( { workbox: false, }, 'dist', + 'index.html', ), - ).to.equal('./sw.js'); + ).to.equal('sw.js'); }); }); diff --git a/packages/create/test/snapshots/fully-loaded-app/package.json b/packages/create/test/snapshots/fully-loaded-app/package.json index efef51fd..6313b14f 100644 --- a/packages/create/test/snapshots/fully-loaded-app/package.json +++ b/packages/create/test/snapshots/fully-loaded-app/package.json @@ -61,4 +61,4 @@ "lit-html": "^1.0.0", "lit-element": "^2.0.1" } -} +} \ No newline at end of file diff --git a/packages/rollup-plugin-html/rollup-plugin-html.js b/packages/rollup-plugin-html/rollup-plugin-html.js index bd29598c..71dc20e9 100644 --- a/packages/rollup-plugin-html/rollup-plugin-html.js +++ b/packages/rollup-plugin-html/rollup-plugin-html.js @@ -24,6 +24,15 @@ const { createHtmlAsset, createHtmlAssets } = require('./src/createHtmlAssets'); const watchMode = process.env.ROLLUP_WATCH === 'true'; const defaultFileName = 'index.html'; +/** + * @param {string} id + * @param {string} rootDir + * @return {boolean} + */ +function isAbsoluteUrl(id, rootDir) { + return id.startsWith('/') && !id.startsWith(rootDir); +} + /** * @param {PluginOptions} pluginOptions * @returns {RollupPluginHtml} @@ -128,6 +137,9 @@ function rollupPluginHtml(pluginOptions) { }, resolveId(id) { + if (pluginOptions.rootDir && isAbsoluteUrl(id, pluginOptions.rootDir)) { + return path.join(pluginOptions.rootDir, id); + } for (const file of htmlFiles) { if (file.inlineModules && file.inlineModules.has(id)) { return id; diff --git a/packages/rollup-plugin-html/src/createHtmlAssets.js b/packages/rollup-plugin-html/src/createHtmlAssets.js index 5a98e9c5..7739d14e 100644 --- a/packages/rollup-plugin-html/src/createHtmlAssets.js +++ b/packages/rollup-plugin-html/src/createHtmlAssets.js @@ -39,6 +39,7 @@ async function createHtmlAsset( entrypointBundles, html, externalTransformFns, + htmlFileName, }); return { fileName: htmlFileName, diff --git a/packages/rollup-plugin-html/src/getEntrypointBundles.js b/packages/rollup-plugin-html/src/getEntrypointBundles.js index ba92cde9..40f3cd67 100644 --- a/packages/rollup-plugin-html/src/getEntrypointBundles.js +++ b/packages/rollup-plugin-html/src/getEntrypointBundles.js @@ -39,7 +39,7 @@ function createImportPath({ publicPath, mainOutputDir, fileOutputDir, htmlFileNa * @param {PluginOptions} args.pluginOptions * @param {GeneratedBundle[]} args.generatedBundles * @param {string} args.mainOutputDir - * @param {string} args.htmlFileName + * @param {string | undefined} [args.htmlFileName] * @param {string[] | undefined} [args.inputModuleIds] */ function getEntrypointBundles({ diff --git a/packages/rollup-plugin-html/src/getOutputHtml.js b/packages/rollup-plugin-html/src/getOutputHtml.js index 7a9c88c4..43a06483 100644 --- a/packages/rollup-plugin-html/src/getOutputHtml.js +++ b/packages/rollup-plugin-html/src/getOutputHtml.js @@ -15,8 +15,15 @@ const defaultHtml = '} args.entrypointBundles * @param {TransformFunction[]} [args.externalTransformFns] * @param {string | undefined} [args.html] + * @param {string | undefined} [args.htmlFileName] */ -async function getOutputHtml({ pluginOptions, entrypointBundles, externalTransformFns, html }) { +async function getOutputHtml({ + pluginOptions, + entrypointBundles, + externalTransformFns, + html, + htmlFileName, +}) { const { template, inject, minify } = pluginOptions; let outputHtml; @@ -55,6 +62,7 @@ async function getOutputHtml({ pluginOptions, entrypointBundles, externalTransfo outputHtml = await transform(outputHtml, { bundle: defaultBundle, bundles: multiBundles, + htmlFileName, }); } diff --git a/packages/rollup-plugin-html/src/types.d.ts b/packages/rollup-plugin-html/src/types.d.ts index 01113eb5..f364b5bf 100644 --- a/packages/rollup-plugin-html/src/types.d.ts +++ b/packages/rollup-plugin-html/src/types.d.ts @@ -25,6 +25,7 @@ export interface PluginOptions { inputHtml?: string; /** @deprecated use files instead */ inputPath?: string; + htmlFileName?: string; } export type MinifyFunction = (html: string) => string | Promise; @@ -68,6 +69,7 @@ export interface TransformArgs { bundle: EntrypointBundle; // see TemplateArgs bundles: Record; + htmlFileName: string; } export type TransformFunction = (html: string, args: TransformArgs) => string | Promise; diff --git a/packages/rollup-plugin-polyfills-loader/rollup-plugin-polyfills-loader.js b/packages/rollup-plugin-polyfills-loader/rollup-plugin-polyfills-loader.js index afb34dda..3d546783 100644 --- a/packages/rollup-plugin-polyfills-loader/rollup-plugin-polyfills-loader.js +++ b/packages/rollup-plugin-polyfills-loader/rollup-plugin-polyfills-loader.js @@ -7,6 +7,7 @@ /** @typedef {import('polyfills-loader').GeneratedFile} GeneratedFile */ /** @typedef {import('./src/types').PluginOptions} PluginOptions */ +const path = require('path'); const { injectPolyfillsLoader } = require('polyfills-loader'); const { createError, shouldInjectLoader } = require('./src/utils'); const { createPolyfillsLoaderConfig } = require('./src/createPolyfillsLoaderConfig'); @@ -72,7 +73,12 @@ function rollupPluginPolyfillsLoader(pluginOptions = {}) { let preloaded = []; for (const entrypoint of entrypoints) { preloaded.push(entrypoint.importPath); - preloaded.push(...entrypoint.chunk.imports); + + // js files (incl. chunks) will always be in the root directory + const pathToRoot = path.posix.relative('./', path.posix.dirname(entrypoint.importPath)); + for (const chunkPath of entrypoint.chunk.imports) { + preloaded.push(path.posix.join(pathToRoot, chunkPath)); + } } preloaded = [...new Set(preloaded)];