@hishprorg/esse-tempora 🔬💥
@hishprorg/esse-tempora
is a tiny, widely-supported, zero-dependency alternative to invariant
.
@hishprorg/esse-tempora
- when every byte counts!
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 '@hishprorg/esse-tempora';
invariant(truthyValue, 'This should not throw!');
invariant(falsyValue, 'This will throw!');
Why @hishprorg/esse-tempora
?
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. @hishprorg/esse-tempora
has dropped all of the code for sprintf
logic and instead encourages consumers to leverage template literals for message formatting.
invariant(condition, `Hello, ${name} - how are you today?`);
Error Messages
@hishprorg/esse-tempora
allows you to pass a string
message, or a function that returns a string
message. Using a function that returns a message is helpful when your message is expensive to create.
import invariant from '@hishprorg/esse-tempora';
invariant(condition, `Hello, ${name} - how are you today?`);
invariant(value, () => getExpensiveMessage());
When process.env.NODE_ENV
is set to production
, the message will be replaced with the generic message Invariant failed
.
Type narrowing
@hishprorg/esse-tempora
is useful for correctly narrowing types for flow
and typescript
const value: Person | null = { name: 'Alex' };
invariant(value, 'Expected value to be a person');
API: (condition: any, message?: string | (() => string)) => void
condition
is required and can be anythingmessage
optional string
or a function that returns a string
(() => string
)
Installation
yarn add @hishprorg/esse-tempora
npm install @hishprorg/esse-tempora --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!
🤘