sitesmith: alias tiny-invariant to a diagnostic shim

The prod build of tiny-invariant strips all failure messages, leaving
us with bare 'Error: Invariant failed' and no actionable info. Aliasing
the package to a shim that always emits the message + a stack-trace
console.error before throwing — so the next Craft.js invariant we hit
tells us which assertion (ERROR_NOT_IN_RESOLVER, ERROR_NOPARENT,
ERROR_INVALID_NODE_ID, etc.) is actually failing.

Temporary; will revert once the Sitesmith apply flow is stable.
This commit is contained in:
2026-05-24 16:32:50 -07:00
parent 849f432330
commit 43627bddb0
2 changed files with 20 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
/**
* 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.
*/
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);
throw new Error(value);
}

View File

@@ -8,6 +8,9 @@ export default defineConfig({
resolve: { resolve: {
alias: { alias: {
'@': path.resolve(__dirname, './src'), '@': path.resolve(__dirname, './src'),
// Diagnostic: replace tiny-invariant with a shim that always logs the
// failure message (the upstream prod build strips it).
'tiny-invariant': path.resolve(__dirname, './src/utils/tiny-invariant-shim.ts'),
}, },
}, },
build: { build: {