Wondering what’s next for npm?Check out our public roadmap! »

    tiny-invariant
    TypeScript icon, indicating that this package has built-in type declarations

    1.1.0 • Public • Published

    tiny-invariant 🔬💥

    Build Status npm dependencies types minzip Downloads per month

    A tiny invariant alternative.

    What is invariant?

    An invariant function takes a value, and if the value is falsy then the invariant function will throw. If the value is truthy, then the function will not throw.

    import invariant from 'tiny-invariant';
     
    invariant(truthyValue, 'This should not throw!');
     
    invariant(falsyValue, 'This will throw!');
    // Error('Invariant violation: This will throw!');

    Why tiny-invariant?

    The library: invariant supports passing in arguments to the invariant function in a sprintf style (condition, format, a, b, c, d, e, f). It has internal logic to execute the sprintf substitutions. The sprintf logic is not removed in production builds. tiny-invariant has dropped all of the sprintf logic. tiny-invariant allows you to pass a single string message. With template literals there is really no need for a custom message formatter to be built into the library. If you need a multi part message you can just do this: invariant(condition, 'Hello, ${name} - how are you today?')

    Type narrowing

    tiny-invariant is useful for correctly narrowing types for flow and typescript

    const value: Person | null = { name: 'Alex' }; // type of value == 'Person | null'
    invariant(value, 'Expected value to be a person');
    // type of value has been narrowed to 'Person'

    API: (condition: any, message?: string) => void

    • condition is required and can be anything
    • message is an optional string

    Installation

    # yarn 
    yarn add tiny-invariant
     
    # npm 
    npm add tiny-invariant --save

    Dropping your message for kb savings!

    Big idea: you will want your compiler to convert this code:

    invariant(condition, 'My cool message that takes up a lot of kbs');

    Into this:

    if (!condition) {
      if ('production' !== process.env.NODE_ENV) {
        invariant(false, 'My cool message that takes up a lot of kbs');
      } else {
        invariant(false);
      }
    }

    Your bundler can then drop the code in the "production" !== process.env.NODE_ENV block for your production builds to end up with this:

    if (!condition) {
      invariant(false);
    }

    Builds

    • We have a es (EcmaScript module) build (because you know you want to deduplicate this super heavy library)
    • We have a cjs (CommonJS) build
    • We have a umd (Universal module definition) build in case you needed it

    We expect process.env.NODE_ENV to be available at module compilation. We cache this value

    That's it!

    🤘

    Install

    npm i tiny-invariant

    DownloadsWeekly Downloads

    3,936,016

    Version

    1.1.0

    License

    MIT

    Unpacked Size

    9.54 kB

    Total Files

    10

    Last publish

    Collaborators

    • avatar