ES2015 to CommonJS import/export transformer
HTML JavaScript CSS
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
coverage added export default object/array compatibility Nov 7, 2017
test fixed issue with default Oct 18, 2017
.gitignore ignoring lock file Oct 18, 2017
.npmignore
.travis.yml Update to node 10 in .travis.yml May 17, 2018
LICENSE.txt added LICENSE.txt Oct 17, 2017
README.md updated README info about babylon Oct 30, 2017
bin.js added recursive mkdir on destination folder Oct 31, 2017
index.js added export default object/array compatibility Nov 7, 2017
package.json 2.4.0 Nov 7, 2017
test.js added export default object/array compatibility Nov 7, 2017

README.md

ascjs

Greenkeeper badge

License: ISC Build Status Coverage Status donate

ES2015 to CommonJS import/export transformer


Looking for a CommonJS minimalistic bundler ?

Fully based on ascjs, asbundle is a no-brainer to create out of the box browser compatible bundles. Don't miss it out!


This module does one thing only: it loosely transpiles ES2015 import/export statements into valid CommonJS in order to fix the only part of Node that's incompatible with modern JS.

How to

You can use ascjs as binary utility or as module.

npm install -g ascjs

# to see what you can do
ascjs --help

As executable, you can use ascjs to output, or save, some code content.

ascjs code
ascjs sourceFile
ascjs sourceFile destFile

# folders are recursively parsed
# destFolder is mandatory
ascjs sourceFolder destFolder

You can also use it via pipe operator.

echo code | ascjs
cat source.js | ascjs | uglifyjs -o dest.js

As module, you can require it and use it to convert ESM to CJS.

const ascjs = require('ascjs');

ascjs('import "test";');
// require("test");

Features

  • extremely lightweight, based on babylon for performance and reliability, it transforms only imports/exports ignoring everything else
  • produces modern JavaScript, you are in charge of extra transformations if needed
  • indentation, spaces, semi or no-semi are preserved: beautiful source code remains beautiful
  • uses same Babel convention, resolving export default ... intent as exports.default
  • you can finally write .js code and transform it for Node only before publishing on npm
  • you could write .mjs modules and transform them into CommonJS for Browserify or other bundlers as target

Constrains

  • live bindings for exported values are not preserved. You need to delegate in scope eventual changes
  • dynamic import(...) is untouched. If you write that, let Webpack handle it for you later on
  • there is no magic whatsoever in module names resolution, what you write in ESM is what you get as CJS

Example

This module can transform the following ES2015+ code

import func, {a, b} from './module.js';
import * as tmp from 'other';

const val = 123;

export default function test() {
  console.log('ascjs');
};

export {func, val};

into the following one:

'use strict';
const func = (m => m.__esModule ? m.default : m)(require('./module.js'));
const {a, b} = require('./module.js');
const tmp = require('other');

const val = 123;

function test() {
  console.log('ascjs');
}
Object.defineProperty(exports, '__esModule', {value: true}).default = test;

exports.func = func;
exports.val = val;