npm.io
0.2.1 • Published 2 years agoCLI

c2es

Licence
—
Version
0.2.1
Deps
5
Size
17 kB
Vulns
0
Weekly
0

c2es

c2es transforms your commonjs code into esm!

This package is still very experimental.
It converts commonjs code to esm but does not minify it.

input source code:

const { readFileSync } = require('fs');
const { join: j } = require('path');

module.exports.readme = readFileSync(j(process.cwd(), 'package.json'), 'utf-8');

output will be:

import * as $require_a from 'node:fs';
import * as $require_b from 'node:path';

var $m = (m) => m.default || m;
var module = { exports: {} };
const { readFileSync } = $m($require_a);
const { join: j } = $m($require_b);

module.exports.readme = readFileSync(j(process.cwd(), 'package.json'), 'utf-8');

var $default = module.exports;
var { readme: $export_readme } = module.exports;

export { $export_readme as readme, $default as default };

Apis

Provide entry and output filename. Automatically compiles and outputs to the appropriate file

const { c2es } = require('c2es');

c2es('dist.js', 'dist.mjs', {
  dynamicImport: false,
  requirePrefix: '$require_',
});

Or You can simply compile with cli

npx c2es dist.js --output dist.mjs

--output option must be provided.

Examples

  • Export Default

input:

function a() {}

function b() {}

function c() {}

module.exports = function () {};

module.exports.a = a;
module.exports.b = b;
module.exports.c = c;

output:

var module = { exports: {} };
function a() {}
function b() {}
function c() {}

module.exports = function () {};
module.exports.a = a;
module.exports.b = b;
module.exports.c = c;

var $default = module.exports;
var { a: $export_a, b: $export_b, c: $export_c } = module.exports;

export { $export_a as a, $export_b as b, $export_c as c, $default as default };
  • Dynamic Import

If your code has dynamic require, please add option --dynamic.

npx c2es input.js --output output.js --dynamic

tip: Prefix await before require

input:

const target = './main.js';
const m = require(target);

output:

var $dynamic = async (m) => {
  if (global.require) {
    return require(m);
  }
  return $m(await import(m));
};
var $m = (m) => m.default || m;
var module = { exports: {} };
const target = './main.js';
const m = $dynamic(target);
var $default = module.exports;
var {} = module.exports;
export { $default as default };

Dynamic import is not yet supported. You can get it to work by defining require().

  • Scope

input:

function a() {
  const { name: n, version: v } = JSON.parse(
    require('fs').readFileSync('./package.json', 'utf-8')
  );
  console.log(n, v);
}
a();

output:

import * as $require_a from 'node:fs';
var $m = (m) => m.default || m;
var module = { exports: {} };
function a() {
  const { name: n, version: v } = JSON.parse(
    $m($require_a).readFileSync('./package.json', 'utf-8')
  );
  console.log(n, v);
}
a();
var $default = module.exports;
var {} = module.exports;
export { $default as default };
  • require prefix

--require-prefix=<prefix>

npx c2es input.js --output output.js --require-prefix=_require_

input:

const { readFileSync } = require('fs');

console.log(readFileSync('./main.js', 'utf-8'));

output:

import * as _require_a from 'node:fs';
var $m = (m) => m.default || m;
var module = { exports: {} };
const { readFileSync } = $m(_require_a);

console.log(readFileSync('./main.js', 'utf-8'));
var $default = module.exports;
var {} = module.exports;
export { $default as default };

Build Package

Using asto, you can build nodejs package easily.

$ npm i --save-dev asto @asto/esm
const { asto } = require('asto');
const { esmLoader } = require('@asto/esm');

asto({
  loader: esmLoader(),
  entryPoints: [
    {
      input: 'src/index.js',
    },
  ],
});

License

MIT