# c2es

> `c2es` transforms your commonjs code into esm!

Latest version **0.2.1** (published 2023-12-13) · 0 weekly downloads

## Install

```sh
npm install c2es
pnpm add c2es
yarn add c2es
bun add c2es
```

Provides the command `c2es`.

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.2.1 |
| Published | 2023-12-13 |
| First published | 2023-11-12 |
| Weekly downloads | 0 |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 5 |
| Unpacked size | 17.5 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | do4ng |

## Links

- npm: https://www.npmjs.com/package/c2es
- Repository: https://github.com/do4ng/c2es
- Homepage: https://github.com/do4ng/c2es#readme
- Issues: https://github.com/do4ng/c2es/issues
- npm.io page: https://npm.io/package/c2es

## Dependencies (5)

- [acorn](https://npm.io/package/acorn.md) ^8.11.2
- [animaux](https://npm.io/package/animaux.md) ^0.0.4
- [estraverse](https://npm.io/package/estraverse.md) ^5.3.0
- [magic-string](https://npm.io/package/magic-string.md) ^0.30.5
- [@do4ng/exports](https://npm.io/package/@do4ng/exports.md) ^0.0.0

## Recent versions

- 0.2.1 (latest) — 2023-12-13
- 0.2.0 — 2023-12-12
- 0.1.2 — 2023-11-15
- 0.1.1 — 2023-11-15
- 0.1.0 — 2023-11-15
- 0.0.2 — 2023-11-12
- 0.0.1 — 2023-11-12
- 0.0.0 — 2023-11-12

## README

# 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:

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

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

output will be:

```js
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

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

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

Or You can simply compile with cli

```bash
npx c2es dist.js --output dist.mjs
```

> `--output` option must be provided.

## Examples

- Export Default

input:

```ts
function a() {}

function b() {}

function c() {}

module.exports = function () {};

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

output:

```ts
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:

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

output:

```ts
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:

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

output:

```ts
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:

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

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

output:

```ts
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](https://github.com/do4ng/asto), you can build nodejs package easily.

```txt
$ npm i --save-dev asto @asto/esm
```

```js
const { asto } = require('asto');
const { esmLoader } = require('@asto/esm');

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

## License

MIT

---
_Source: https://npm.io/package/c2es · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
