From 729ffbf6bf42094dbe45f0fd22ea5e9aa3171382 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Thu, 11 Mar 2021 14:43:44 +1100 Subject: [PATCH] feat!: add optional --main for `build` to include "main" (#8) Don't include "main" in package.json by default, but include it if --main is passed. --- src/build.js | 5 +++- src/package/index.js | 9 ++++-- .../output-main/cjs/src/browser.js | 11 ++++++++ .../output-main/cjs/src/deno.js | 11 ++++++++ .../output-main/cjs/src/index.js | 11 ++++++++ .../output-main/cjs/src/secondary.js | 5 ++++ .../output-main/cjs/src/sub.js | 5 ++++ .../output-main/cjs/src/sub/browser.js | 5 ++++ .../output-main/cjs/src/sub/index.js | 5 ++++ .../output-main/esm/package.json | 1 + .../output-main/esm/src/browser.js | 6 ++++ .../output-main/esm/src/deno.js | 6 ++++ .../output-main/esm/src/index.js | 6 ++++ .../output-main/esm/src/secondary.js | 1 + .../output-main/esm/src/sub.js | 1 + .../output-main/esm/src/sub/browser.js | 1 + .../output-main/esm/src/sub/index.js | 1 + .../pkg-kitchensink/output-main/package.json | 28 +++++++++++++++++++ .../output-notests/package.json | 1 - .../pkg-kitchensink/output-tests/package.json | 1 - test/test-build.js | 9 ++++++ 21 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/browser.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/deno.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/index.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/secondary.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/sub.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/browser.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/index.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/package.json create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/browser.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/deno.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/index.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/secondary.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/sub.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/sub/browser.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/esm/src/sub/index.js create mode 100644 test/fixtures/pkg-kitchensink/output-main/package.json diff --git a/src/build.js b/src/build.js index 9e8b0f3..e333891 100644 --- a/src/build.js +++ b/src/build.js @@ -25,6 +25,9 @@ const run = async opts => { pkg.dist = dist return pkg } -run.schema = { tests: false } +run.schema = { + tests: false, + main: false +} export default run diff --git a/src/package/index.js b/src/package/index.js index b2ad5f7..a9cb35d 100644 --- a/src/package/index.js +++ b/src/package/index.js @@ -18,13 +18,14 @@ const { writeFile, mkdir, unlink, readdir, readFile, copyFile } = fs const plugins = [preserveShebangs.preserveShebangs()] class Package { - constructor ({ cwd, hooks, tests }) { + constructor ({ cwd, hooks, tests, main }) { this.cwd = cwd this.hooks = hooks || {} this.parsed = this.parse() this.files = new Map() this.testFiles = new Map() this.includeTests = tests + this.includeMain = main } file (url) { @@ -181,7 +182,11 @@ class Package { const json = copy(this.pkgjson) delete json.type - json.main = `./${join('./cjs', json.main || './index.js')}` + if (this.includeMain) { + json.main = `./${join('./cjs', json.main || './index.js')}` + } else { + delete json.main + } json.browser = {} json.exports = {} const _join = (...args) => './' + join(...args) diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/browser.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/browser.js new file mode 100644 index 0000000..8dea9e4 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/browser.js @@ -0,0 +1,11 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var sub = require('./sub.js'); +var browser = require('./sub/browser.js'); + + + +exports.mod = sub; +exports.sub = browser; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/deno.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/deno.js new file mode 100644 index 0000000..7fa0f8c --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/deno.js @@ -0,0 +1,11 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var sub = require('./sub.js'); +var index = require('./sub/index.js'); + + + +exports.mod = sub; +exports.sub = index; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/index.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/index.js new file mode 100644 index 0000000..7fa0f8c --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/index.js @@ -0,0 +1,11 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var sub = require('./sub.js'); +var index = require('./sub/index.js'); + + + +exports.mod = sub; +exports.sub = index; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/secondary.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/secondary.js new file mode 100644 index 0000000..afce27a --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/secondary.js @@ -0,0 +1,5 @@ +'use strict'; + +var secondary = 'secondary'; + +module.exports = secondary; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub.js new file mode 100644 index 0000000..f8a0fad --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub.js @@ -0,0 +1,5 @@ +'use strict'; + +var sub = 'sub'; + +module.exports = sub; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/browser.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/browser.js new file mode 100644 index 0000000..c91e569 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/browser.js @@ -0,0 +1,5 @@ +'use strict'; + +var browser = 'browser'; + +module.exports = browser; diff --git a/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/index.js b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/index.js new file mode 100644 index 0000000..2f239aa --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/cjs/src/sub/index.js @@ -0,0 +1,5 @@ +'use strict'; + +var index = 'import'; + +module.exports = index; diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/package.json b/test/fixtures/pkg-kitchensink/output-main/esm/package.json new file mode 100644 index 0000000..a8f6d4f --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/package.json @@ -0,0 +1 @@ +{ "type" : "module" } \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/browser.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/browser.js new file mode 100644 index 0000000..9aea05b --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/browser.js @@ -0,0 +1,6 @@ +import mod from './sub.js'; +import sub from './sub/browser.js'; +export { + mod, + sub +}; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/deno.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/deno.js new file mode 100644 index 0000000..39b7760 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/deno.js @@ -0,0 +1,6 @@ +import mod from './sub.js'; +import sub from './sub/index.js'; +export { + mod, + sub +}; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/index.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/index.js new file mode 100644 index 0000000..39b7760 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/index.js @@ -0,0 +1,6 @@ +import mod from './sub.js'; +import sub from './sub/index.js'; +export { + mod, + sub +}; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/secondary.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/secondary.js new file mode 100644 index 0000000..582e514 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/secondary.js @@ -0,0 +1 @@ +export default 'secondary'; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/sub.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub.js new file mode 100644 index 0000000..e33ec9a --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub.js @@ -0,0 +1 @@ +export default 'sub'; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/browser.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/browser.js new file mode 100644 index 0000000..a748e7c --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/browser.js @@ -0,0 +1 @@ +export default 'browser'; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/index.js b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/index.js new file mode 100644 index 0000000..400e2a2 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/esm/src/sub/index.js @@ -0,0 +1 @@ +export default 'import'; \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-main/package.json b/test/fixtures/pkg-kitchensink/output-main/package.json new file mode 100644 index 0000000..08423f9 --- /dev/null +++ b/test/fixtures/pkg-kitchensink/output-main/package.json @@ -0,0 +1,28 @@ +{ + "name": "pkg-kitchensink", + "version": "0.0.0", + "description": "", + "main": "./cjs/src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "Mikeal Rogers (https://www.mikealrogers.com/)", + "license": "(Apache-2.0 AND MIT)", + "exports": { + ".": { + "browser": "./esm/src/browser.js", + "require": "./cjs/src/index.js", + "import": "./esm/src/index.js" + }, + "./secondary": { + "browser": "./esm/src/secondary.js", + "require": "./cjs/src/secondary.js", + "import": "./esm/src/secondary.js" + } + }, + "browser": { + ".": "./cjs/src/browser.js", + "./secondary": "./cjs/src/secondary.js" + } +} \ No newline at end of file diff --git a/test/fixtures/pkg-kitchensink/output-notests/package.json b/test/fixtures/pkg-kitchensink/output-notests/package.json index 08423f9..e1b70af 100644 --- a/test/fixtures/pkg-kitchensink/output-notests/package.json +++ b/test/fixtures/pkg-kitchensink/output-notests/package.json @@ -2,7 +2,6 @@ "name": "pkg-kitchensink", "version": "0.0.0", "description": "", - "main": "./cjs/src/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/test/fixtures/pkg-kitchensink/output-tests/package.json b/test/fixtures/pkg-kitchensink/output-tests/package.json index 08423f9..e1b70af 100644 --- a/test/fixtures/pkg-kitchensink/output-tests/package.json +++ b/test/fixtures/pkg-kitchensink/output-tests/package.json @@ -2,7 +2,6 @@ "name": "pkg-kitchensink", "version": "0.0.0", "description": "", - "main": "./cjs/src/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/test/test-build.js b/test/test-build.js index 8f52fb1..b52c830 100644 --- a/test/test-build.js +++ b/test/test-build.js @@ -60,4 +60,13 @@ export default async test => { } */ }) + + test('pkg-kitchensink w/ main', async test => { + const dist = pathToFileURL(await tempy.directory()) + test.after(() => rmtree(fileURLToPath(dist))) + const opts = { cwd, dist, main: true } + await build(opts) + await verify(new URL('./output-main', url), dist) + await verify(dist, new URL('./output-main', url)) + }) }