diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46df47c17..3916f2cd3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,21 @@ jobs: - run: yarn run type - run: yarn run coverage - run: yarn run lint + compat: + name: Compatibility + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + cache: yarn + - run: yarn install --immutable + - run: yarn run setup + - run: yarn run build + - run: node ./scripts/testPackemonImports.cjs + - run: node ./scripts/testPackemonImports.mjs + # Requires TS 4.7+ + # - run: ts-node ./scripts/testPackemonImports.ts pack: name: Pack runs-on: ubuntu-latest diff --git a/package.json b/package.json index a049ede1c..da1deef41 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "docs": "cd website && yarn run start", "prepare": "beemo create-config", - "setup": "yarn run prepare && node ./scripts/setup.mjs", + "setup": "yarn dlx --package packemon@2.0.0 --package typescript --quiet packemon build", "build": "yarn run packemon build", "validate": "yarn run packemon validate", "check": "yarn run type && yarn run test && yarn run lint", @@ -20,7 +20,7 @@ "release": "yarn prerelease && beemo run-script lerna-release", "version": "yarn install && git add yarn.lock", "pack": "NODE_ENV=production yarn run packemon build --addEngines --addExports --declaration", - "packemon": "node ./packages/packemon/lib/bin.js" + "packemon": "node ./packages/packemon/cjs/bin.cjs" }, "workspaces": [ "packages/*", diff --git a/packages/packemon/babel.cjs b/packages/packemon/babel.cjs deleted file mode 100644 index 600871d52..000000000 --- a/packages/packemon/babel.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/babel'); diff --git a/packages/packemon/package.json b/packages/packemon/package.json index 691596d16..3cdb36156 100644 --- a/packages/packemon/package.json +++ b/packages/packemon/package.json @@ -1,7 +1,8 @@ { "name": "packemon", "version": "2.0.0", - "description": "Build and prepare packages for NPM distribution using standardized configurations and practices. Gotta pack 'em all!", + "type": "commonjs", + "description": "Build and prepare packages for npm distribution using standardized configurations and practices. Gotta pack 'em all!", "keywords": [ "build", "prepare", @@ -15,26 +16,37 @@ }, "author": "Miles Johnson", "license": "MIT", - "main": "./lib/index.js", + "main": "./cjs/index.cjs", "types": "./dts/index.d.ts", - "bin": "./lib/bin.js", + "bin": "./cjs/bin.cjs", "files": [ - "babel.js", + "cjs/**/*.{cjs,mjs,map}", "dts/**/*.d.ts", - "lib/**/*.{js,map}", "src/**/*.{ts,tsx,json}", "templates/**/*" ], "exports": { "./package.json": "./package.json", - "./babel": "./babel.cjs", - "./*": { - "types": "./dts/*.d.ts", - "node": "./lib/*.js" + "./babel": { + "types": "./dts/babel.d.ts", + "node": { + "import": "./cjs/babel-wrapper.mjs", + "require": "./cjs/babel.cjs" + } + }, + "./bin": { + "types": "./dts/bin.d.ts", + "node": { + "import": "./cjs/bin-wrapper.mjs", + "require": "./cjs/bin.cjs" + } }, ".": { "types": "./dts/index.d.ts", - "node": "./lib/index.js" + "node": { + "import": "./cjs/index-wrapper.mjs", + "require": "./cjs/index.cjs" + } } }, "engines": { @@ -42,12 +54,13 @@ "npm": ">=6.14.0" }, "packemon": { + "api": "private", "inputs": { "index": "src/index.ts", "babel": "src/babel.ts", "bin": "src/bin.ts" }, - "format": "lib", + "format": "cjs", "platform": "node" }, "dependencies": { diff --git a/packages/packemon/src/CodeArtifact.ts b/packages/packemon/src/CodeArtifact.ts index 8d1feeeab..31070c874 100644 --- a/packages/packemon/src/CodeArtifact.ts +++ b/packages/packemon/src/CodeArtifact.ts @@ -139,11 +139,13 @@ export class CodeArtifact extends Artifact { } const ext = format === 'cjs' || format === 'mjs' ? format : 'js'; + const extGroup = format === 'cjs' ? 'cjs,mjs,map' : `${ext},map`; const folder = format === 'lib' && this.sharedLib ? `lib/${this.platform}` : format; const file = `${name}.${ext}`; return { ext, + extGroup, file, folder, path: `./${new VirtualPath(folder, file)}`, @@ -216,7 +218,7 @@ export class CodeArtifact extends Artifact { case 'cjs': // Automatically apply the wrapper - if (!paths.import) { + if (!paths.import && outputName !== '*') { paths.import = entry.replace('.cjs', '-wrapper.mjs'); } diff --git a/packages/packemon/src/Package.ts b/packages/packemon/src/Package.ts index fdf229777..8f51edd7a 100644 --- a/packages/packemon/src/Package.ts +++ b/packages/packemon/src/Package.ts @@ -523,7 +523,7 @@ export class Package { // Build files if (artifact instanceof CodeArtifact) { artifact.builds.forEach(({ format }) => { - files.add(`${format}/**/*.{${artifact.getBuildOutput(format).ext},map}`); + files.add(`${format}/**/*.{${artifact.getBuildOutput(format).extGroup}}`); }); files.add(`src/**/*.{${this.getSourceFileExts(artifact.inputs)}}`); diff --git a/packages/packemon/tests/CodeArtifact.test.ts b/packages/packemon/tests/CodeArtifact.test.ts index d72aef98b..8101cf646 100644 --- a/packages/packemon/tests/CodeArtifact.test.ts +++ b/packages/packemon/tests/CodeArtifact.test.ts @@ -122,6 +122,7 @@ describe('CodeArtifact', () => { it('returns metadata for `lib` format', () => { expect(artifact.getBuildOutput('lib', 'index')).toEqual({ ext: 'js', + extGroup: 'js,map', file: 'index.js', folder: 'lib', path: './lib/index.js', @@ -131,6 +132,7 @@ describe('CodeArtifact', () => { it('returns metadata for `esm` format', () => { expect(artifact.getBuildOutput('esm', 'index')).toEqual({ ext: 'js', + extGroup: 'js,map', file: 'index.js', folder: 'esm', path: './esm/index.js', @@ -140,6 +142,7 @@ describe('CodeArtifact', () => { it('returns metadata for `umd` format', () => { expect(artifact.getBuildOutput('umd', 'index')).toEqual({ ext: 'js', + extGroup: 'js,map', file: 'index.js', folder: 'umd', path: './umd/index.js', @@ -149,6 +152,7 @@ describe('CodeArtifact', () => { it('returns metadata for `cjs` format', () => { expect(artifact.getBuildOutput('cjs', 'index')).toEqual({ ext: 'cjs', + extGroup: 'cjs,mjs,map', file: 'index.cjs', folder: 'cjs', path: './cjs/index.cjs', @@ -158,6 +162,7 @@ describe('CodeArtifact', () => { it('returns metadata for `mjs` format', () => { expect(artifact.getBuildOutput('mjs', 'index')).toEqual({ ext: 'mjs', + extGroup: 'mjs,map', file: 'index.mjs', folder: 'mjs', path: './mjs/index.mjs', @@ -170,6 +175,7 @@ describe('CodeArtifact', () => { expect(artifact.getBuildOutput('lib', 'index')).toEqual({ ext: 'js', + extGroup: 'js,map', file: 'index.js', folder: 'lib/node', path: './lib/node/index.js', @@ -181,6 +187,7 @@ describe('CodeArtifact', () => { expect(artifact.getBuildOutput('esm', 'index')).toEqual({ ext: 'js', + extGroup: 'js,map', file: 'index.js', folder: 'esm', path: './esm/index.js', @@ -194,6 +201,7 @@ describe('CodeArtifact', () => { expect(artifact.getBuildOutput('mjs', 'index')).toEqual({ ext: 'mjs', + extGroup: 'mjs,map', file: 'some/other/file.mjs', folder: 'mjs', path: './mjs/some/other/file.mjs', diff --git a/packages/packemon/tests/Package.test.ts b/packages/packemon/tests/Package.test.ts index 2c8624efb..cb68269a5 100644 --- a/packages/packemon/tests/Package.test.ts +++ b/packages/packemon/tests/Package.test.ts @@ -712,7 +712,7 @@ describe('Package', () => { expect(pkg.packageJson).toEqual( expect.objectContaining({ files: [ - 'cjs/**/*.{cjs,map}', + 'cjs/**/*.{cjs,mjs,map}', 'lib/**/*.{js,map}', 'src/**/*.{ts,tsx,json}', 'umd/**/*.{js,map}', diff --git a/scripts/setup.mjs b/scripts/setup.mjs deleted file mode 100644 index f80cf8e61..000000000 --- a/scripts/setup.mjs +++ /dev/null @@ -1,31 +0,0 @@ -import execa from 'execa'; -import glob from 'fast-glob'; - -process.env.NODE_ENV = 'production'; - -async function build(pkg, noInterop) { - return execa('yarn', ['beemo', 'babel', `${pkg}/src`, '--out-dir', `${pkg}/lib`], { - env: { - NO_INTEROP: noInterop ? 'true' : undefined, - }, - }); -} - -// Running `beemo babel` as a package script through Yarn 2 -// seems to hang on Windows, so let's run things manually here... -async function setup() { - const pkgs = await glob('./packages/*', { onlyDirectories: true }); - - // We need `babel-plugin-cjs-esm-interop` to build first since all other packages rely on it! - const interopIndex = pkgs.findIndex((pkg) => pkg.includes('cjs-esm-interop')); - - await build(pkgs.slice(interopIndex, 1)[0], true); - - // We can build all the other packages in parallel now - await Promise.all(pkgs.map((pkg) => build(pkg, false))); -} - -setup().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/scripts/testPackemonImports.cjs b/scripts/testPackemonImports.cjs new file mode 100644 index 000000000..e2f09efea --- /dev/null +++ b/scripts/testPackemonImports.cjs @@ -0,0 +1,15 @@ +const assert = require('assert'); +const packemon = require('packemon'); +const { Packemon } = require('packemon'); +const { createRootConfig } = require('packemon/babel'); + +console.log(Packemon, createRootConfig); + +import('packemon').then((result) => { + assert(Packemon === result.Packemon); + assert.deepStrictEqual({ ...packemon }, { ...result }); +}); + +import('packemon/babel').then((result) => { + assert(createRootConfig === result.createRootConfig); +}); diff --git a/scripts/testPackemonImports.mjs b/scripts/testPackemonImports.mjs new file mode 100644 index 000000000..ac1ba903c --- /dev/null +++ b/scripts/testPackemonImports.mjs @@ -0,0 +1,15 @@ +import assert from 'assert'; +import * as packemon from 'packemon'; +import { Packemon } from 'packemon'; +import { createRootConfig } from 'packemon/babel'; + +console.log(Packemon, createRootConfig); + +import('packemon').then((result) => { + assert(Packemon === result.Packemon); + assert.deepStrictEqual({ ...packemon }, { ...result }); +}); + +import('packemon/babel').then((result) => { + assert(createRootConfig === result.createRootConfig); +}); diff --git a/scripts/testPackemonImports.ts b/scripts/testPackemonImports.ts new file mode 100644 index 000000000..ac1ba903c --- /dev/null +++ b/scripts/testPackemonImports.ts @@ -0,0 +1,15 @@ +import assert from 'assert'; +import * as packemon from 'packemon'; +import { Packemon } from 'packemon'; +import { createRootConfig } from 'packemon/babel'; + +console.log(Packemon, createRootConfig); + +import('packemon').then((result) => { + assert(Packemon === result.Packemon); + assert.deepStrictEqual({ ...packemon }, { ...result }); +}); + +import('packemon/babel').then((result) => { + assert(createRootConfig === result.createRootConfig); +}); diff --git a/yarn.lock b/yarn.lock index 80768e310..6721b74a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16189,7 +16189,7 @@ __metadata: typescript: optional: true bin: - packemon: ./lib/bin.js + packemon: ./cjs/bin.cjs languageName: unknown linkType: soft