0.2.1 • Published 5 months ago

c2es v0.2.1

Weekly downloads
-
License
-
Repository
github
Last release
5 months ago

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 };

License

MIT

0.2.1

5 months ago

0.2.0

5 months ago

0.1.2

6 months ago

0.1.1

6 months ago

0.1.0

6 months ago

0.0.2

6 months ago

0.0.1

6 months ago

0.0.0

6 months ago