alexreardon / tiny-invariant

A tiny invariant function

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Exported as `.default` in CJS build

overlookmotel opened this issue · comments

At present when requiring this library from CJS code (e.g. in Node), require('tiny-invariant') returns an object and you have to access the function from the .default property.

const invariant = require('tiny-invariant').default;

I know the purpose of this module is primarily for client-side code as then it can be effectively minimised in production builds. However, I like it so much, I now use it everywhere including pure Node.js code!

Would you consider reconfiguring the CJS builds so require('tiny-invariant') returns the actual invariant function?

To avoid breaking changes, it'd be possible to also export invariant as property .default of itself e.g.:

// Compiled CJS build
function invariant(condition, message) { /* ... */ }
invariant.default = invariant;
module.exports = invariant;

Or, to also issue a deprecation warning:

const warning = require('tiny-warning');
Object.defineProperty(invariant, 'default', {
  get() {
    warning(
      false,
      'Accessing `invariant` as `require('tiny-invariant').default` is deprecated.\n'
      + "Use `require('tiny-invariant')` (without `.default` instead)."
    );
    return invariant;
  }
});

How do you feel about this?

I'd be happy to submit a PR.

hello? anyone home?

@thanpolas I published an alternative simple-invariant designed for use in NodeJS from CommonJS (although importing from ESM works fine too).

I cannot reproduce this issue, see https://stackblitz.com/edit/node-znq7it:

❯ npm run test
$ node ./lib/test.js
console.log after successful invariant usage!

Maybe some change since this issue was opened fixed the issue?

Thanks for looking into this @pkerschbaum!