From 5e0e21c89e6013987a4ef732db5420bc46d5afc1 Mon Sep 17 00:00:00 2001 From: Rene Haas Date: Mon, 31 Oct 2022 14:27:42 +0100 Subject: [PATCH] improve build setup --- local/rollup/package.json | 4 +- local/rollup/src/bundle/packageJson.js | 44 ----------------- local/rollup/src/bundle/pre.js | 47 +++++++++++++++++++ local/rollup/src/createRollupConfig.js | 23 ++------- local/rollup/src/defaultOptions.js | 1 + local/rollup/src/pipeline.default.js | 8 ++-- local/rollup/src/plugins/clean.js | 2 +- local/rollup/src/plugins/copy.js | 25 ++++++++++ local/rollup/src/plugins/packageJson.js | 20 ++++++++ packages/overlayscrollbars-react/package.json | 4 -- .../overlayscrollbars-react/vite.config.js | 36 ++++++++++++++ packages/overlayscrollbars/rollup.config.js | 5 +- 12 files changed, 144 insertions(+), 75 deletions(-) delete mode 100644 local/rollup/src/bundle/packageJson.js create mode 100644 local/rollup/src/bundle/pre.js create mode 100644 local/rollup/src/plugins/copy.js create mode 100644 local/rollup/src/plugins/packageJson.js diff --git a/local/rollup/package.json b/local/rollup/package.json index fc25d10..f201c90 100644 --- a/local/rollup/package.json +++ b/local/rollup/package.json @@ -26,7 +26,9 @@ }, "exports": { ".": "./src/createRollupConfig.js", - "./playwright": "./src/playwright/createPlaywrightRollupConfig.js" + "./playwright": "./src/playwright/createPlaywrightRollupConfig.js", + "./plugin/copy": "./src/plugins/copy.js", + "./plugin/packageJson": "./src/plugins/packageJson.js" }, "version": "0.0.0" } diff --git a/local/rollup/src/bundle/packageJson.js b/local/rollup/src/bundle/packageJson.js deleted file mode 100644 index 1f052fb..0000000 --- a/local/rollup/src/bundle/packageJson.js +++ /dev/null @@ -1,44 +0,0 @@ -const path = require('path'); -const { rollupVirtual } = require('./plugins'); - -module.exports = (_, options) => { - const { extractPackageJson, outDir } = options; - - const { - input = './package.json', - output = './package.json', - json, - } = typeof extractPackageJson === 'object' ? extractPackageJson : {}; - const resolvedInput = path.resolve(input); - const inputPackageJson = require(resolvedInput); - - return { - input: resolvedInput, - onwarn: (warning, warn) => { - if (warning.code !== 'EMPTY_BUNDLE') { - warn(warning); - } - }, - output: { - file: path.resolve(outDir, output), - }, - plugins: [ - rollupVirtual({ - [resolvedInput]: '', - }), - { - generateBundle(__, bundle) { - const bundleKeys = Object.keys(bundle); - if (bundleKeys.length > 1) { - throw new Error('Unexpected entries length.'); - } - bundle[bundleKeys[0]].code = JSON.stringify( - typeof json === 'function' ? json(inputPackageJson) : inputPackageJson, - null, - 2 - ); - }, - }, - ], - }; -}; diff --git a/local/rollup/src/bundle/pre.js b/local/rollup/src/bundle/pre.js new file mode 100644 index 0000000..8fba9bd --- /dev/null +++ b/local/rollup/src/bundle/pre.js @@ -0,0 +1,47 @@ +const { rollupVirtual } = require('./plugins'); +const rollupPluginClean = require('../plugins/clean'); +const rollupPluginCopy = require('../plugins/copy'); +const rollupPluginPackageJson = require('../plugins/packageJson'); + +module.exports = (_, options) => { + const { project, verbose, clean, copy, outDir, projectDir, extractPackageJson } = options; + + return { + input: 'preBuild', + onwarn: (warning, warn) => { + if (warning.code !== 'EMPTY_BUNDLE') { + warn(warning); + } + }, + output: { + dir: outDir, + }, + plugins: [ + verbose && { + name: 'PROJECT', + buildStart() { + // eslint-disable-next-line no-console + console.log(''); + // eslint-disable-next-line no-console + console.log('PROJECT : ', project); + // eslint-disable-next-line no-console + console.log('OPTIONS : ', options); + }, + }, + clean && outDir !== projectDir && rollupPluginClean({ paths: [outDir], verbose }), + extractPackageJson && rollupPluginPackageJson(extractPackageJson), + copy && rollupPluginCopy({ paths: copy, verbose }), + rollupVirtual({ + preBuild: '', + }), + { + generateBundle(__, bundle) { + const virtualEntry = Object.keys(bundle).find((key) => key.includes('virtual')); + if (virtualEntry) { + delete bundle[virtualEntry]; + } + }, + }, + ].filter(Boolean), + }; +}; diff --git a/local/rollup/src/createRollupConfig.js b/local/rollup/src/createRollupConfig.js index 8a8940f..98836e4 100644 --- a/local/rollup/src/createRollupConfig.js +++ b/local/rollup/src/createRollupConfig.js @@ -7,7 +7,6 @@ const glob = require('glob'); const resolve = require('@~local/config/resolve'); const defaultOptions = require('./defaultOptions'); const pipelineDefault = require('./pipeline.default'); -const rollupPluginClean = require('./plugins/clean'); const workspaceRoot = path.dirname(execSync('npm root').toString()); const pkg = require(`${workspaceRoot}/package.json`); @@ -32,6 +31,7 @@ const resolvePath = (basePath, pathToResolve, appendExt) => { const mergeAndResolveOptions = (userOptions) => { const { clean: defaultClean, + copy: defaultCopy, outDir: defaultOutDir, paths: defaultPaths, versions: defaultVersions, @@ -47,6 +47,7 @@ const mergeAndResolveOptions = (userOptions) => { const { project, clean: rawClean, + copy: rawCopy, outDir: rawOutDir, paths: rawPaths = {}, alias: rawAlias = {}, @@ -74,6 +75,7 @@ const mergeAndResolveOptions = (userOptions) => { versions: rawVersions ?? defaultVersions, useEsbuild: rawUseEsbuild ?? defaultUseEsbuild, clean: rawClean ?? defaultClean, + copy: rawCopy ?? defaultCopy, outDir: rawOutDir ?? defaultOutDir, paths: { ...defaultPaths, @@ -120,26 +122,9 @@ const mergeAndResolveOptions = (userOptions) => { const createConfig = (userOptions = {}) => { const options = mergeAndResolveOptions(userOptions); - const { project, useEsbuild, verbose, clean, outDir, projectDir } = options; + const { useEsbuild } = options; const result = pipelineDefault(resolve, options, useEsbuild); const resultArr = Array.isArray(result) ? result : [result]; - const prePlugins = !Array.isArray(resultArr[0].plugins) ? [] : resultArr[0].plugins; - - resultArr[0].plugins = prePlugins; - - if (verbose) { - prePlugins.push({ - name: 'PROJECT', - buildStart() { - console.log(''); - console.log('PROJECT : ', project); - console.log('OPTIONS : ', options); - }, - }); - } - if (clean && outDir !== projectDir) { - prePlugins.push(rollupPluginClean({ paths: [outDir], verbose })); - } return resultArr; }; diff --git a/local/rollup/src/defaultOptions.js b/local/rollup/src/defaultOptions.js index b1602df..523dffe 100644 --- a/local/rollup/src/defaultOptions.js +++ b/local/rollup/src/defaultOptions.js @@ -5,6 +5,7 @@ module.exports = { useEsbuild: false, outDir: './dist', clean: false, + copy: false, paths: { js: '.', types: './types', diff --git a/local/rollup/src/pipeline.default.js b/local/rollup/src/pipeline.default.js index bee12dc..b510a1e 100644 --- a/local/rollup/src/pipeline.default.js +++ b/local/rollup/src/pipeline.default.js @@ -2,16 +2,16 @@ const bundleScriptDefault = require('./bundle/script.default'); const bundleScriptEsbuild = require('./bundle/script.esbuild'); const bundleStyles = require('./bundle/styles'); const bundleTypes = require('./bundle/types'); -const bundlePackageJson = require('./bundle/packageJson'); +const preBuild = require('./bundle/pre'); module.exports = (resolve, options, esbuild) => { - const { extractTypes, extractStyles, extractPackageJson } = options; + const { extractTypes, extractStyles } = options; const bundleScript = esbuild ? bundleScriptEsbuild : bundleScriptDefault; - const pkgJson = extractPackageJson && bundlePackageJson(resolve, options); + const pre = preBuild(resolve, options); const styles = extractStyles && bundleStyles(resolve, options); const types = extractTypes && bundleTypes(resolve, options); const js = bundleScript(resolve, options); - return [pkgJson, styles, types, js].flat().filter((build) => !!build); + return [pre, styles, types, js].flat().filter((build) => !!build); }; diff --git a/local/rollup/src/plugins/clean.js b/local/rollup/src/plugins/clean.js index cc4f84b..505bf77 100644 --- a/local/rollup/src/plugins/clean.js +++ b/local/rollup/src/plugins/clean.js @@ -5,7 +5,7 @@ module.exports = ({ paths = [], verbose = false } = {}) => { let cleaned = false; return { name: 'clean', - async buildStart() { + buildStart() { if (!cleaned) { paths.forEach((currPath) => { const resolvedPath = path.resolve(currPath); diff --git a/local/rollup/src/plugins/copy.js b/local/rollup/src/plugins/copy.js new file mode 100644 index 0000000..0e2d49f --- /dev/null +++ b/local/rollup/src/plugins/copy.js @@ -0,0 +1,25 @@ +const path = require('path'); +const fs = require('fs'); + +module.exports = ({ paths = [], verbose = false } = {}) => { + return { + name: 'copy', + buildStart() { + paths.forEach((currPath) => { + const resolvedPath = path.resolve(currPath); + + if (fs.existsSync(resolvedPath)) { + if (verbose) { + // eslint-disable-next-line no-console + console.log(`Copy: ${resolvedPath}`); + } + this.emitFile({ + type: 'asset', + source: fs.readFileSync(resolvedPath), + fileName: path.basename(resolvedPath), + }); + } + }); + }, + }; +}; diff --git a/local/rollup/src/plugins/packageJson.js b/local/rollup/src/plugins/packageJson.js new file mode 100644 index 0000000..ef4d6df --- /dev/null +++ b/local/rollup/src/plugins/packageJson.js @@ -0,0 +1,20 @@ +const path = require('path'); + +module.exports = ({ input = 'package.json', output = 'package.json', json } = {}) => { + const resolvedInput = path.resolve(input); + const inputPackageJson = require(resolvedInput); + return { + name: 'packageJson', + buildStart() { + this.emitFile({ + type: 'asset', + source: JSON.stringify( + typeof json === 'function' ? json(inputPackageJson) : inputPackageJson, + null, + 2 + ), + fileName: output, + }); + }, + }; +}; diff --git a/packages/overlayscrollbars-react/package.json b/packages/overlayscrollbars-react/package.json index aac06ae..a8e6ab1 100644 --- a/packages/overlayscrollbars-react/package.json +++ b/packages/overlayscrollbars-react/package.json @@ -2,10 +2,6 @@ "name": "overlayscrollbars-react", "private": true, "version": "0.4.0", - "files": [ - "dist", - "README.md" - ], "main": "./dist/overlayscrollbars-react.umd.js", "module": "./dist/overlayscrollbars-react.es.js", "types": "./dist/overlayscrollbars-react.d.ts", diff --git a/packages/overlayscrollbars-react/vite.config.js b/packages/overlayscrollbars-react/vite.config.js index 27cab02..15795ec 100644 --- a/packages/overlayscrollbars-react/vite.config.js +++ b/packages/overlayscrollbars-react/vite.config.js @@ -1,6 +1,8 @@ import { resolve } from 'node:path'; import { defineConfig } from 'vite'; import { esbuildResolve } from 'rollup-plugin-esbuild-resolve'; +import rollupPluginPackageJson from '@~local/rollup/plugin/packageJson'; +import rollupPluginCopy from '@~local/rollup/plugin/copy'; import react from '@vitejs/plugin-react'; export default defineConfig({ @@ -20,6 +22,40 @@ export default defineConfig({ overlayscrollbars: 'OverlayScrollbarsGlobal', }, }, + plugins: [ + rollupPluginCopy({ paths: ['README.md'] }), + rollupPluginPackageJson({ + json: ({ + name, + version, + description, + author, + license, + homepage, + bugs, + repository, + keywords, + peerDependencies, + }) => { + return { + name, + version, + description, + author, + license, + homepage, + bugs, + repository, + keywords, + main: 'overlayscrollbars-react.umd.js', + module: 'overlayscrollbars-react.es.js', + types: 'types/overlayscrollbars-react.d.ts', + peerDependencies, + sideEffects: false, + }; + }, + }), + ], }, }, plugins: [esbuildResolve(), react({ jsxRuntime: 'classic' })], diff --git a/packages/overlayscrollbars/rollup.config.js b/packages/overlayscrollbars/rollup.config.js index ee37699..35cf79d 100644 --- a/packages/overlayscrollbars/rollup.config.js +++ b/packages/overlayscrollbars/rollup.config.js @@ -10,10 +10,11 @@ module.exports = createRollupConfig({ extractStyles: true, extractTypes: true, clean: true, + copy: ['README.md'], extractPackageJson: { json: ({ name, - version: originalVersion, + version: v, description, author, license, @@ -24,7 +25,7 @@ module.exports = createRollupConfig({ }) => { return { name, - version: originalVersion, + version: v, description, author, license,