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

rewrite-default-exports

v1.0.7

Published

Codemod to rewrite your default exports to named ones and replace old names everywhere

Downloads

79

Readme

rewrite-default-exports

It is codemod to rewrite your default exports to named ones and replace old names across your codebase.

Motivation

One day you might think about using named import and named export instead of default import and default export because it is a well-known best practice. After that you can add eslint rule for prohibiting export default in your code base with eslint/no-default-export or biomejs/no-default-export.

How to use it

Step 1: Gather Information

Run the following to collect default imports/exports:

IS_GATHER_INFO=true ENTRY="./path/to/your/entry.js" npx rewrite-default-exports

Step 2: Transform Imports/Exports

IS_TRANSFORM=true ENTRY="./path/to/your/entry.js" npx rewrite-default-exports

It uses jscodeshift (with babel inside) to transform files and the resolve package to resolve all imports. It will collect all relations between files and will transform all default imports and exports to named exports.

How to run and see the result as an example

  1. download this repo
  2. run yarn
  3. add .env file to the root with:
DEBUG_APP=true - to see debug logs, by default it is false
ENTRY=./packages/app/client.js - entry file to gather info from
IS_GATHER_INFO=true - to gather info
IS_TRANSFORM=false - to transform files
  1. run yarn transform
  2. you will see generated files in src/dump folder
defaultImports.json - info about files having used default import
exportsNames.json - info about files having used default export
preservedDefaultExports.json - info about files having been imported via dynamic import
proxyDefaultExports.json - info about files having used default import and having re-exported them with default export
  1. change in your .env file:
IS_GATHER_INFO=false
IS_TRANSFORM=true
  1. run yarn transform
  2. you will see transformed files in packages folder

Limitations

  1. namespace.default usage this won't be transformed yet:
    import * as allConst from './test-te-const';
    console.log(allConst.default);
  2. Conflicts in proxy files:
    1. source
    export { Modals as default } from './Modals';
    export { Modals } from './Modals';
    1. result
    export { Modals } from './Modals';
    export { Modals } from './Modals';
  3. Messed exports like:
    1. source
    export class GhostDataProvider {}
    export default hoc()(GhostDataProvider);
    1. will result in broken logic, because now it has two same exports with different implementation
    export class GhostDataProvider {}
    const GhostDataProviderAlias = hoc()(GhostDataProvider);
    export { GhostDataProviderAlias as GhostDataProvider };
    1. and imports for the entity should be fixed manually too
      1. source
      // was used to get the class without HOC
      import { GhostDataProvider } from '.'
      ...
      // was used to get the class with HOC
      import GhostDataProvider from '.'
      1. result
      // now you should manually resolve it to class without HOC somehow
      import { GhostDataProvider } from '.'
      ...
      // this will get the class with the HOC
      import { GhostDataProvider } from '.'

Links