/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails react-core */ 'use strict'; const rule = '../no-production-logging' |> require(%); const { RuleTester } = 'eslint' |> require(%); const ruleTester = new RuleTester(); ruleTester.run('no-production-logging', rule, { valid: [{ code: ` if (__DEV__) { console.error('Oh no'); } ` }, { code: ` if (__DEV__) { console.error('Hello %s', foo) } ` }, { code: ` if (__DEV__) { console.error('Hello %s %s', foo, bar) } ` }, { code: ` if (__DEV__) { console.warn('Oh no'); } ` }, { code: ` if (__DEV__) { console.warn('Oh no'); } ` }, // This is OK too because it's wrapped outside: { code: ` if (__DEV__) { if (potato) { while (true) { console.error('Oh no'); } } }` }, { code: ` var f; if (__DEV__) { f = function() { if (potato) { while (true) { console.error('Oh no'); } } }; }` }, // Don't do anything with these: { code: 'normalFunctionCall(test);' }, { code: 'invariant(test);' }, { code: ` if (__DEV__) { normalFunctionCall(test); } ` }, // This is OK because of the outer if. { code: ` if (__DEV__) { if (foo) { if (__DEV__) { } else { console.error('Oh no'); } } }` }, { // This is an escape hatch that makes it fire in production. code: ` console['error']('Oh no'); ` }], invalid: [{ code: "console.error('Oh no');", output: "if (__DEV__) {console.error('Oh no')};", errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: "console.warn('Oh no');", output: "if (__DEV__) {console.warn('Oh no')};", errors: [{ message: `Wrap console.warn() in an "if (__DEV__) {}" check` }] }, { code: "console.warn('Oh no')", output: "if (__DEV__) {console.warn('Oh no')}", errors: [{ message: `Wrap console.warn() in an "if (__DEV__) {}" check` }] }, { code: ` if (potato) { console.warn('Oh no'); } `, output: ` if (potato) { if (__DEV__) {console.warn('Oh no')}; } `, errors: [{ message: `Wrap console.warn() in an "if (__DEV__) {}" check` }] }, { code: ` if (__DEV__ || potato && true) { console.error('Oh no'); } `, output: ` if (__DEV__ || potato && true) { if (__DEV__) {console.error('Oh no')}; } `, errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (banana && __DEV__ && potato && kitten) { console.error('Oh no'); } `, output: ` if (banana && __DEV__ && potato && kitten) { if (__DEV__) {console.error('Oh no')}; } `, // Technically this code is valid but we prefer // explicit standalone __DEV__ blocks that stand out. errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (!__DEV__) { console.error('Oh no'); } `, output: ` if (!__DEV__) { if (__DEV__) {console.error('Oh no')}; } `, errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (foo || x && __DEV__) { console.error('Oh no'); } `, output: ` if (foo || x && __DEV__) { if (__DEV__) {console.error('Oh no')}; } `, errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (__DEV__) { } else { console.error('Oh no'); } `, output: ` if (__DEV__) { } else { if (__DEV__) {console.error('Oh no')}; } `, errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (__DEV__) { } else { if (__DEV__) { } else { console.error('Oh no'); } } `, output: ` if (__DEV__) { } else { if (__DEV__) { } else { if (__DEV__) {console.error('Oh no')}; } } `, errors: [{ message: `Wrap console.error() in an "if (__DEV__) {}" check` }] }, { code: ` if (__DEV__) { console.log('Oh no'); } `, errors: [{ message: 'Unexpected use of console' }] }, { code: ` if (__DEV__) { console.log.apply(console, 'Oh no'); } `, errors: [{ message: 'Unexpected use of console' }] }] });