commonify icon indicating copy to clipboard operation
commonify copied to clipboard

Recursively publish ESM packages as CommonJS!

Commonify.js

For us who are still relying on CommonJS, or using Electron which does not support ESM.

🆕 See also build-electron

I made this tool that makes it easy to:

  • Pull any ESM package from npm
  • Transpile it from ESM to CommonJS using babel
  • Publish it under a custom npm scope
  • Recursively do the same for all dependencies

It is mostly an experiment, and it feels like a step back in terms of the ecosystem moving to ESM, so if anyone has any other great ideas, please submit an issue! I have thought about the possibility of doing something similar to the node_modules folder in an npm postinstall script.

Usage

First create your scope here: https://www.npmjs.com/org/create

git clone https://github.com/mifi/commonify.git
cd commonify

yarn
node cli.mjs lowdb 3.0.0 myscope

This will create the package @myscope/lowdb and its dependencies ready to publish to npm.

Example packages

I will publish commonified packages to the @commonify scope:

  • @commonify/lowdb
  • @commonify/steno
  • @commonify/execa
  • @commonify/strip-final-newline
  • @commonify/onetime
  • @commonify/mimic-fn
  • @commonify/npm-run-path
  • @commonify/path-key
  • @commonify/is-stream

Todo

  • Support already scoped packages
  • Must support dual modules (they also have "type": "module" set). Example: https://github.com/yargs/yargs-parser/blob/main/package.json
  • Automate when upstream package version updates
  • Auto-generate a list of versions and their version corresponding to upstream version