diff --git a/jest.config.js b/jest.config.js index 343a47e7..25c2b0f0 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,9 +4,9 @@ module.exports = { preset: 'ts-jest', globals: { __DEV__: true, + __TEST__: true, __VERSION__: lernaJson.version, __BROWSER__: false, - __JSDOM__: true, __RUNTIME_COMPILE__: true, __FEATURE_OPTIONS__: true, __FEATURE_SUSPENSE__: true diff --git a/packages/global.d.ts b/packages/global.d.ts index d84d24ac..5ddded48 100644 --- a/packages/global.d.ts +++ b/packages/global.d.ts @@ -1,6 +1,6 @@ // Global compile-time constants declare var __DEV__: boolean -declare var __JSDOM__: boolean +declare var __TEST__: boolean declare var __BROWSER__: boolean declare var __RUNTIME_COMPILE__: boolean declare var __COMMIT__: string diff --git a/packages/runtime-core/__tests__/errorHandling.spec.ts b/packages/runtime-core/__tests__/errorHandling.spec.ts index feb2b30c..77ddc8dc 100644 --- a/packages/runtime-core/__tests__/errorHandling.spec.ts +++ b/packages/runtime-core/__tests__/errorHandling.spec.ts @@ -10,10 +10,19 @@ import { mockWarn, createComponent } from '@vue/runtime-test' +import { setErrorRecovery } from '../src/errorHandling' describe('error handling', () => { mockWarn() + beforeEach(() => { + setErrorRecovery(true) + }) + + afterEach(() => { + setErrorRecovery(false) + }) + test('propagation', () => { const err = new Error('foo') const fn = jest.fn() @@ -384,9 +393,6 @@ describe('error handling', () => { }) it('should warn unhandled', () => { - // temporarily simulate non-test env - process.env.NODE_ENV = 'dev' - const onError = jest.spyOn(console, 'error') onError.mockImplementation(() => {}) const groupCollapsed = jest.spyOn(console, 'groupCollapsed') @@ -423,7 +429,6 @@ describe('error handling', () => { onError.mockRestore() groupCollapsed.mockRestore() log.mockRestore() - process.env.NODE_ENV = 'test' }) // native event handler handling should be tested in respective renderers diff --git a/packages/runtime-core/src/errorHandling.ts b/packages/runtime-core/src/errorHandling.ts index cc5e42c4..88d5af35 100644 --- a/packages/runtime-core/src/errorHandling.ts +++ b/packages/runtime-core/src/errorHandling.ts @@ -126,12 +126,15 @@ export function handleError( logError(err, type, contextVNode) } +// Test-only toggle for testing the uhandled warning behavior +let forceRecover = false +export function setErrorRecovery(value: boolean) { + forceRecover = value +} + function logError(err: Error, type: ErrorTypes, contextVNode: VNode | null) { // default behavior is crash in prod & test, recover in dev. - if ( - __DEV__ && - !(typeof process !== 'undefined' && process.env.NODE_ENV === 'test') - ) { + if (__DEV__ && (forceRecover || !__TEST__)) { const info = ErrorTypeStrings[type] if (contextVNode) { pushWarningContext(contextVNode) diff --git a/packages/runtime-core/src/warning.ts b/packages/runtime-core/src/warning.ts index 0c6d2bda..8e5a84d6 100644 --- a/packages/runtime-core/src/warning.ts +++ b/packages/runtime-core/src/warning.ts @@ -53,7 +53,7 @@ export function warn(msg: string, ...args: any[]) { if ( trace.length && // avoid spamming console during tests - (typeof process === 'undefined' || process.env.NODE_ENV !== 'test') + !__TEST__ ) { warnArgs.push(`\n`, ...formatTrace(trace)) } diff --git a/rollup.config.js b/rollup.config.js index 66b8ddcc..e689068f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -147,9 +147,11 @@ function createReplacePlugin( __VERSION__: `"${lernaJson.version}"`, __DEV__: isBundlerESMBuild ? // preserve to be handled by bundlers - `process.env.NODE_ENV !== 'production'` + `(process.env.NODE_ENV !== 'production')` : // hard coded dev/prod builds !isProduction, + // this is only used during tests + __TEST__: isBundlerESMBuild ? `(process.env.NODE_ENV === 'test')` : false, // If the build is expected to run directly in the browser (global / esm-browser builds) __BROWSER__: isBrowserBuild, // support compile in browser? @@ -157,9 +159,7 @@ function createReplacePlugin( // support options? // the lean build drops options related code with buildOptions.lean: true __FEATURE_OPTIONS__: !packageOptions.lean && !process.env.LEAN, - __FEATURE_SUSPENSE__: true, - // this is only used during tests - __JSDOM__: false + __FEATURE_SUSPENSE__: true }) }