npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

babel-plugin-transform-cjs-dew

v1.0.2

Published

Converts CommonJS modules into ES modules

Downloads

839

Readme

Babel CommonJS -> ES Deferred Execution Wrapper Format

This plugin implements a deferred execution wodule format that allows supporting CommonJS execution semantics through an ES modules protocol.

Modules converted in this way can only import from other modules converted to this format.

This project aims for accuracy and reliability transforming a tree of CommonJS modules into a spec-compliant tree of ES Modules.

require('babel-core').transform('<source>', {
  parserOpts: {
    allowReturnOutsideFunction: true
  },
  plugins: [
    ['transform-cjs-dew', {
      filename: '"custom-filename.js"',
      dirname: '"/dirname"',
      define: {
        'process.env.NODE_ENV': '"development"'
      },
      resolve (name, { wildcard?, optional?, browserResolve? }) {
        if (name === 'process')
          return 'process-path';
        if (name === './x')
          return './x.js';
      },
      // for wildcard requires, return a string or array or null to indicate unknown resolution
      // '@empty' indicates an empty object resolution, where all named exports are undefined
      // by default, a null resolve embeds a Node require through a import 'module' path
      // browserOnly just inlines the module not found error directly
      browserOnly: false,
      // when a wildcard ends in *, permit automatic extension variations
      // in the conditional expression output
      wildcardExtensions: ['.js'],
      // optional support for ESM dependencies with default export
      esmDependencies (resolved) {
        return resolved.endsWith('.mjs');
      }
    }]
  ]
});

Output:

import { dew as _depDew } from './dep.dew.js';
import depB from './dep.mjs';
var exports = {};
var module = {
  get exports () {
    return exports;
  }
  set exports (_exports) {
    exports = _exports;
  }
};
export function dew () {
  if (executed)
    return module.exports;
  executed = true;
  __dew__ = null;
  module.exports = function () {};
  exports.blah = 'hi';
  var a = _depDew().y;
  var b = depB;
  return module.exports;
}

To import a CommonJS module tree converted via the above into an ES module, the following execution wrapper is required:

x.js

import { dew } from './x.dew.js';
export default dew();

As well as execution wrapping, the following code transformations are handled:

  • Simple 'use strict' code conversion if not already strict.
  • Defines the exports and module variables in module scope.
  • Any use of global or GLOBAL defines global in the module scope.
  • Top-level this is replaced with an exports reference.
  • Top-level return is adjusted to always ensure a falsy return value.
  • Internal this references that are not direct calls, fallback to _global.
  • Implicit globals of the form globalName = ... are rescoped for a simple strict module conversion.
  • Use of Buffer and process is transformed into an import of buffer or process. This module name can be customized by the map configuration option.

The remaining strict conversion cases that don't convert are then just the edge cases of loose -> strict mode conversion:

  • Any use of with statements will throw
  • Multiple duplicate function parameters
  • Relying on dynamic arguments
  • Assigning to reserved names
  • Using eval to define variables
  • Expecting this being the global as the default context for function calls
  • delete statements of local variables are removed

The above should comprehensively cover the failure cases.

License

MIT