From 94536d81c50cd1444b19b4f9f96ed864e560f9ff Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Thu, 25 Jul 2024 02:09:48 +0100 Subject: [PATCH] Demos: Add Rollup example with a mix of import, input, and output Ref https://github.com/qunitjs/qunit/issues/1551. --- .eslintrc.json | 3 +- .gitignore | 2 + demos/rollup.js | 77 +++++++++++++ demos/rollup/Gruntfile.js | 39 +++++++ demos/rollup/build.mjs | 103 ++++++++++++++++++ demos/rollup/favicon.ico | 0 demos/rollup/package.json | 16 +++ demos/rollup/test/.eslintrc.json | 6 + demos/rollup/test/package.json | 3 + demos/rollup/test/src.js | 3 + .../test/test-import-default-from-cjs.js | 10 ++ demos/rollup/test/test-import-from-cjs.js | 10 ++ demos/rollup/test/test-mixed-to-import.js | 16 +++ demos/rollup/test/test-mixed-to-require.js | 16 +++ demos/rollup/test/test-require-from-cjs.js | 10 ++ 15 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 demos/rollup.js create mode 100644 demos/rollup/Gruntfile.js create mode 100644 demos/rollup/build.mjs create mode 100644 demos/rollup/favicon.ico create mode 100644 demos/rollup/package.json create mode 100644 demos/rollup/test/.eslintrc.json create mode 100644 demos/rollup/test/package.json create mode 100644 demos/rollup/test/src.js create mode 100644 demos/rollup/test/test-import-default-from-cjs.js create mode 100644 demos/rollup/test/test-import-from-cjs.js create mode 100644 demos/rollup/test/test-mixed-to-import.js create mode 100644 demos/rollup/test/test-mixed-to-require.js create mode 100644 demos/rollup/test/test-require-from-cjs.js diff --git a/.eslintrc.json b/.eslintrc.json index f758a8d45..0536dd5ab 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -14,6 +14,7 @@ "coverage/**", "demos/*/qunit/**", "demos/*/coverage/**", + "demos/*/dist/**", "demos/*/package-lock.json", "docs/.jekyll-cache/**", "docs/_site/**", @@ -190,7 +191,7 @@ } }, { - "files": ["demos/**/*.js"], + "files": ["demos/**/*.js", "demos/**/*.mjs"], "env": { "browser": true, "es2017": true, diff --git a/.gitignore b/.gitignore index c5c2d9ded..6749b61d8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ /coverage/ /demos/*/package-lock.json /demos/*/node_modules/ +/demos/*/dist/ +/demos/rollup/test-*.html /docs/.jekyll-cache/ /docs/_site/ /docs/Gemfile.lock diff --git a/demos/rollup.js b/demos/rollup.js new file mode 100644 index 000000000..ab4b9bd48 --- /dev/null +++ b/demos/rollup.js @@ -0,0 +1,77 @@ +const cp = require('child_process'); +const path = require('path'); +const DIR = path.join(__dirname, 'rollup'); + +function normalize (str) { + return str + .replace(/^localhost:\d+/g, 'localhost:8000') + .replace(/\b\d+ms\b/g, '42ms'); +} + +QUnit.module('rollup', { + before: () => { + cp.execSync('npm install --prefer-offline --no-audit --update-notifier=false', { cwd: DIR, encoding: 'utf8' }); + cp.execSync('npx npm run build', { cwd: DIR, encoding: 'utf8' }); + } +}); + +QUnit.test('test', assert => { + const expected = `Running "connect:all" (connect) task +Started connect web server on http://localhost:8000 + +Running "qunit:all" (qunit) task +Testing http://localhost:8000/test-import-default-from-cjs.es.html .OK +>> passed test "import default from qunit.cjs > example" +Testing http://localhost:8000/test-import-default-from-cjs.iife.html .OK +>> passed test "import default from qunit.cjs > example" +Testing http://localhost:8000/test-import-default-from-cjs.umd.html .OK +>> passed test "import default from qunit.cjs > example" +Testing http://localhost:8000/test-import-from-cjs.es.html .OK +>> passed test "import { module,test } from qunit.cjs > example" +Testing http://localhost:8000/test-import-from-cjs.iife.html .OK +>> passed test "import { module,test } from qunit.cjs > example" +Testing http://localhost:8000/test-import-from-cjs.umd.html .OK +>> passed test "import { module,test } from qunit.cjs > example" +Testing http://localhost:8000/test-mixed-to-import.es.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-mixed-to-import.iife.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-mixed-to-import.umd.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-mixed-to-require.es.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-mixed-to-require.iife.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-mixed-to-require.umd.html ....OK +>> passed test "import default from qunit.cjs > example" +>> passed test "import { module,test } from qunit.cjs > example" +>> passed test "require from qunit.cjs > example" +>> passed test "mixed" +Testing http://localhost:8000/test-require-from-cjs.es.html .OK +>> passed test "require from qunit.cjs > example" +Testing http://localhost:8000/test-require-from-cjs.iife.html .OK +>> passed test "require from qunit.cjs > example" +Testing http://localhost:8000/test-require-from-cjs.umd.html .OK +>> passed test "require from qunit.cjs > example" +>> 33 tests completed in 42ms, with 0 failed, 0 skipped, and 0 todo. + +Done.`; + + const actual = cp.execSync('npx npm -s test', { cwd: DIR, env: { PATH: process.env.PATH }, encoding: 'utf8' }); + assert.equal(normalize(actual).trim(), expected); +}); diff --git a/demos/rollup/Gruntfile.js b/demos/rollup/Gruntfile.js new file mode 100644 index 000000000..5d780e89f --- /dev/null +++ b/demos/rollup/Gruntfile.js @@ -0,0 +1,39 @@ +/* eslint-env node */ +module.exports = function (grunt) { + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-contrib-qunit'); + + grunt.initConfig({ + connect: { + all: { + options: { + useAvailablePort: true, + base: '.' + } + } + }, + qunit: { + options: { + }, + all: ['test-*.html'] + } + }); + + grunt.event.once('connect.all.listening', function (_host, port) { + grunt.config('qunit.options.httpBase', `http://localhost:${port}`); + // console.log(grunt.config()); // DEBUG + }); + + let results = []; + grunt.event.on('qunit.on.testEnd', function (test) { + results.push( + `>> ${test.status} test "${test.fullName.join(' > ')}"` + ); + }); + grunt.event.on('qunit.on.runEnd', function () { + grunt.log.writeln(results.join('\n')); + results = []; + }); + + grunt.registerTask('test', ['connect', 'qunit']); +}; diff --git a/demos/rollup/build.mjs b/demos/rollup/build.mjs new file mode 100644 index 000000000..846157ea7 --- /dev/null +++ b/demos/rollup/build.mjs @@ -0,0 +1,103 @@ +import fs from 'node:fs'; + +import { rollup } from 'rollup'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; + +const plugins = [commonjs(), resolve()]; + +const inputs = [ + { + input: 'test/test-import-default-from-cjs.js', + plugins + }, + { + input: 'test/test-import-from-cjs.js', + plugins + }, + { + input: 'test/test-mixed-to-import.js', + plugins + }, + { + input: 'test/test-mixed-to-require.js', + plugins, + // Ignore "output.name" warning for test-require-from-cjs.iife.js + onwarn: () => {} + }, + { + input: 'test/test-require-from-cjs.js', + plugins, + // Ignore "output.name" warning for test-require-from-cjs.iife.js + onwarn: () => {} + } +]; +const outputs = [ + { + dir: 'dist/', + entryFileNames: '[name].[format].js', + format: 'es' + }, + { + dir: 'dist/', + entryFileNames: '[name].[format].js', + format: 'cjs' + }, + { + dir: 'dist/', + entryFileNames: '[name].[format].js', + format: 'iife' + }, + { + dir: 'dist/', + entryFileNames: '[name].[format].js', + format: 'umd', + name: 'UNUSED' + } +]; +const htmlTemplate = ` + + + +{{title}} + +{{scriptTag}} + + +
+ + +`; + +(async function main () { + const entries = fs.readdirSync('.'); + for (const entry of entries) { + if (entry.match(/^test-.*\.html$/)) { + fs.rmSync(entry); + } + } + for (const input of inputs) { + const bundle = await rollup(input); + + for (const outputOptions of outputs) { + const { output } = await bundle.write(outputOptions); + const fileName = output[0].fileName; + console.log('... built ' + fileName); + + if (outputOptions.format !== 'cjs') { + const html = htmlTemplate + .replace('{{title}}', fileName) + .replace('{{scriptTag}}', ( + fileName.endsWith('.es.js') + ? `` + : `` + )); + + fs.writeFileSync( + fileName.replace('.js', '') + '.html', + html + ); + } + } + } +}()); diff --git a/demos/rollup/favicon.ico b/demos/rollup/favicon.ico new file mode 100644 index 000000000..e69de29bb diff --git a/demos/rollup/package.json b/demos/rollup/package.json new file mode 100644 index 000000000..710d7c9b2 --- /dev/null +++ b/demos/rollup/package.json @@ -0,0 +1,16 @@ +{ + "private": true, + "devDependencies": { + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "grunt": "1.6.1", + "grunt-contrib-connect": "^5.0.0", + "grunt-contrib-qunit": "10.1.1", + "qunit": "file:../..", + "rollup": "^4.18.0" + }, + "scripts": { + "build": "node build.mjs", + "test": "grunt test" + } +} diff --git a/demos/rollup/test/.eslintrc.json b/demos/rollup/test/.eslintrc.json new file mode 100644 index 000000000..612fe1bdc --- /dev/null +++ b/demos/rollup/test/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + } +} diff --git a/demos/rollup/test/package.json b/demos/rollup/test/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/demos/rollup/test/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/demos/rollup/test/src.js b/demos/rollup/test/src.js new file mode 100644 index 000000000..3b9c0b421 --- /dev/null +++ b/demos/rollup/test/src.js @@ -0,0 +1,3 @@ +export function add (a, b) { + return a + b; +} diff --git a/demos/rollup/test/test-import-default-from-cjs.js b/demos/rollup/test/test-import-default-from-cjs.js new file mode 100644 index 000000000..26dca9e0e --- /dev/null +++ b/demos/rollup/test/test-import-default-from-cjs.js @@ -0,0 +1,10 @@ +import QUnit from 'qunit'; +import { add } from './src.js'; + +QUnit._hello_a6 = QUnit.assert._hello_a6 = 'test-import-default-from-cjs'; + +QUnit.module('import default from qunit.cjs', function () { + QUnit.test('example', function (assert) { + assert.equal(add(2, 3), 5); + }); +}); diff --git a/demos/rollup/test/test-import-from-cjs.js b/demos/rollup/test/test-import-from-cjs.js new file mode 100644 index 000000000..72c6e1672 --- /dev/null +++ b/demos/rollup/test/test-import-from-cjs.js @@ -0,0 +1,10 @@ +import { QUnit, assert, module, test } from 'qunit'; +import { add } from './src.js'; + +QUnit._hello_b4 = assert._hello_b4 = 'test-import-from-cjs'; + +module('import { module,test } from qunit.cjs', function () { + test('example', function (assert) { + assert.equal(add(2, 3), 5); + }); +}); diff --git a/demos/rollup/test/test-mixed-to-import.js b/demos/rollup/test/test-mixed-to-import.js new file mode 100644 index 000000000..5af5bc234 --- /dev/null +++ b/demos/rollup/test/test-mixed-to-import.js @@ -0,0 +1,16 @@ +import './test-import-default-from-cjs.js'; +import './test-import-from-cjs.js'; +import './test-require-from-cjs.js'; + +import QUnit from 'qunit'; + +QUnit.test('mixed', function (assert) { + assert.strictEqual(QUnit._hello_a6, 'test-import-default-from-cjs'); + assert.strictEqual(assert._hello_a6, 'test-import-default-from-cjs'); + + assert.strictEqual(QUnit._hello_b4, 'test-import-from-cjs'); + assert.strictEqual(assert._hello_b4, 'test-import-from-cjs'); + + assert.strictEqual(QUnit._hello_c9, 'test-require-from-cjs'); + assert.strictEqual(assert._hello_c9, 'test-require-from-cjs'); +}); diff --git a/demos/rollup/test/test-mixed-to-require.js b/demos/rollup/test/test-mixed-to-require.js new file mode 100644 index 000000000..9bbce59e1 --- /dev/null +++ b/demos/rollup/test/test-mixed-to-require.js @@ -0,0 +1,16 @@ +const QUnit = require('qunit'); + +require('./test-import-default-from-cjs.js'); +require('./test-import-from-cjs.js'); +require('./test-require-from-cjs.js'); + +QUnit.test('mixed', function (assert) { + assert.strictEqual(QUnit._hello_a6, 'test-import-default-from-cjs'); + assert.strictEqual(assert._hello_a6, 'test-import-default-from-cjs'); + + assert.strictEqual(QUnit._hello_b4, 'test-import-from-cjs'); + assert.strictEqual(assert._hello_b4, 'test-import-from-cjs'); + + assert.strictEqual(QUnit._hello_c9, 'test-require-from-cjs'); + assert.strictEqual(assert._hello_c9, 'test-require-from-cjs'); +}); diff --git a/demos/rollup/test/test-require-from-cjs.js b/demos/rollup/test/test-require-from-cjs.js new file mode 100644 index 000000000..a544d4fc5 --- /dev/null +++ b/demos/rollup/test/test-require-from-cjs.js @@ -0,0 +1,10 @@ +const QUnit = require('qunit'); +const { add } = require('./src.js'); + +QUnit._hello_c9 = QUnit.assert._hello_c9 = 'test-require-from-cjs'; + +QUnit.module('require from qunit.cjs', function () { + QUnit.test('example', function (assert) { + assert.equal(add(2, 3), 5); + }); +});