MCPcopy
hub / github.com/alexreardon/tiny-invariant

github.com/alexreardon/tiny-invariant @v1.3.3 sqlite

repository ↗ · DeepWiki ↗ · release v1.3.3 ↗
5 symbols 15 edges 8 files 0 documented · 0%
README

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!');

You can also provide a function to generate your message, for when your message is expensive to create

import invariant from 'tiny-invariant';

invariant(value, () => getExpensiveMessage());

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 | (() => string)) => void

  • condition is required and can be anything
  • message optional string or a function that returns a string (() => string)

Installation

# yarn
yarn add tiny-invariant

# npm
npm install 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
  • 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!

🤘

Core symbols most depended-on inside this repo

invariant
called by 11
src/tiny-invariant.ts
generateBundle
called by 0
rollup.config.mjs
invariant
called by 0
src/tiny-invariant.flow.js

Shape

Function 5

Languages

TypeScript100%

Modules by API surface

test/type-narrowing.spec.ts1 symbols
test/bundle-behaviour.spec.ts1 symbols
src/tiny-invariant.ts1 symbols
src/tiny-invariant.flow.js1 symbols
rollup.config.mjs1 symbols

Dependencies from manifests, versioned

@rollup/plugin-replace5.0.5 · 1×
@rollup/plugin-typescript11.1.6 · 1×
@size-limit/preset-small-lib11.0.2 · 1×
@types/jest29.5.12 · 1×
@types/node20.11.20 · 1×
@types/rollup0.54.0 · 1×
expect-type0.17.3 · 1×
jest29.7.0 · 1×
prettier3.2.5 · 1×
rimraf5.0.5 · 1×
rollup4.12.0 · 1×
rollup-plugin-terser7.0.2 · 1×

For agents

$ claude mcp add tiny-invariant \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact