diff --git a/.gitignore b/.gitignore index 467827414e..8e18df2050 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ docs/images/supporters docs/api mocha.js mocha.js.map +esm/mocha.js +esm/mocha.js.map +esm/package.json .karma/ !bin/mocha.js !lib/mocha.js diff --git a/eslint.config.js b/eslint.config.js index 4448037012..80f43f9c77 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -151,7 +151,8 @@ module.exports = [ 'out/**', 'test/integration/fixtures/**', '.karma/**', - 'mocha.js' + 'mocha.js', + 'esm/mocha.js' ], } ]; diff --git a/karma.conf.js b/karma.conf.js index d577bfd394..0d3248e89b 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -317,6 +317,10 @@ const chooseTestSuite = (cfg, value) => { { pattern: 'test/browser-specific/esm.spec.mjs', type: 'module' + }, + { + pattern: 'test/browser-specific/esm-build.spec.mjs', + type: 'module' } ] }); diff --git a/package.json b/package.json index a33296b93c..90d8d683ba 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "node": ">= 14.0.0" }, "scripts": { - "build": "rollup -c ./rollup.config.js", + "build": "rollup -c ./rollup.config.js && echo '{\"type\":\"module\"}' > esm/package.json", "clean": "rimraf mocha.js mocha.js.map", "docs-clean": "rimraf docs/_site docs/api", "docs-watch": "eleventy --serve", @@ -177,6 +177,9 @@ "mocha.css", "mocha.js", "mocha.js.map", + "esm/mocha.js", + "esm/mocha.js.map", + "esm/package.json", "browser-entry.js" ], "browser": { diff --git a/rollup.config.js b/rollup.config.js index b4794651ed..edb6e8cf7f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -10,37 +10,43 @@ import {visualizer} from 'rollup-plugin-visualizer'; import pickFromPackageJson from './scripts/pick-from-package-json'; import {version} from './package.json'; -const config = { - input: './browser-entry.js', - output: { - file: './mocha.js', - format: 'umd', - sourcemap: true, - name: 'mocha', - banner: `// mocha@${version} in javascript ES2018` - }, - plugins: [ - json(), - pickFromPackageJson({ - keys: ['name', 'version', 'homepage', 'notifyLogo'] - }), - commonjs(), - globals(), - nodePolyfills(), - nodeResolve({ - browser: true - }) - ], - onwarn: (warning, warn) => { - if (warning.code === 'CIRCULAR_DEPENDENCY') return; +function getConfig (format) { + const config = { + input: './browser-entry.js', + output: { + file: format === 'esm' ? './esm/mocha.js' : './mocha.js', + format, + sourcemap: true, + name: 'mocha', + banner: `// mocha@${version} in javascript ES2018` + }, + plugins: [ + json(), + pickFromPackageJson({ + keys: ['name', 'version', 'homepage', 'notifyLogo'] + }), + commonjs(), + globals(), + nodePolyfills(), + nodeResolve({ + browser: true + }) + ], + onwarn: (warning, warn) => { + if (warning.code === 'CIRCULAR_DEPENDENCY') return; - // Use default for everything else - warn(warning); - } -}; + // Use default for everything else + warn(warning); + } + }; -if (!process.env.CI) { - config.plugins.push(visualizer()); + if (!process.env.CI) { + config.plugins.push(visualizer()); + } + return config; } -export default config; +export default [ + getConfig('umd'), + getConfig('esm') +]; diff --git a/test/browser-specific/esm-build.spec.mjs b/test/browser-specific/esm-build.spec.mjs new file mode 100644 index 0000000000..eeefc4185c --- /dev/null +++ b/test/browser-specific/esm-build.spec.mjs @@ -0,0 +1,13 @@ +import './fixtures/esm-build.fixture.mjs'; + +it('should register a global if it did not fail', function () { + expect(window.MOCHA_IS_OK, 'to be ok'); +}); + +it('should have a global mocha', function () { + expect(window.mocha, 'not to be', undefined); +}); + +it('should have a global Mocha', function () { + expect(window.Mocha, 'not to be', undefined); +}); diff --git a/test/browser-specific/fixtures/esm-build.fixture.mjs b/test/browser-specific/fixtures/esm-build.fixture.mjs new file mode 100644 index 0000000000..4981bb837b --- /dev/null +++ b/test/browser-specific/fixtures/esm-build.fixture.mjs @@ -0,0 +1,4 @@ +/* eslint-disable-next-line import/no-absolute-path */ +import mocha from '/base/esm/mocha.js'; +window.MOCHA_IS_OK = true; +window.mocha = mocha;