diff --git a/craft/src/utils/tiny-invariant-shim.ts b/craft/src/utils/tiny-invariant-shim.ts index e9ec33b..05becd8 100644 --- a/craft/src/utils/tiny-invariant-shim.ts +++ b/craft/src/utils/tiny-invariant-shim.ts @@ -3,15 +3,26 @@ * 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([ + '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'; - // Surface the message + stack to the console BEFORE throwing so even - // an uncaught throw leaves a trace we can read. - // eslint-disable-next-line no-console - console.error('[CRAFT INVARIANT]', value); - // eslint-disable-next-line no-console - console.error(new Error('stack-only').stack); + 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); }