Files
site-builder/craft/src/utils/tiny-invariant-shim.ts

29 lines
1.2 KiB
TypeScript
Raw Normal View History

/**
* Diagnostic shim for tiny-invariant. The prod tiny-invariant strips
* the failure message, so we lose the actual reason for any Craft.js
* Invariant. Aliasing tiny-invariant -> this shim restores it.
*/
/**
* Some Craft.js invariants are used as control-flow (try/catch wraps them
* to test a condition without explicit branching). Logging every one would
* drown out the actually-interesting failures. Suppress the well-known
* "is-it-X check" messages and log only the unfamiliar ones.
*/
const BENIGN = new Set<string>([
'A top-level Node cannot be moved',
'Cannot drag a non-canvas Node onto another Node',
]);
export default function invariant(condition: unknown, message?: string | (() => string)): asserts condition {
if (condition) return;
const provided = typeof message === 'function' ? message() : message;
const value = provided ? `Invariant failed: ${provided}` : 'Invariant failed';
if (!provided || !BENIGN.has(String(provided))) {
// eslint-disable-next-line no-console
console.error('[CRAFT INVARIANT]', value);
// eslint-disable-next-line no-console
console.error(new Error('stack-only').stack);
}
throw new Error(value);
}