diff --git a/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js b/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js index d8da57a3509..e6bd184a5d7 100644 --- a/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js +++ b/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js @@ -22,7 +22,7 @@ function writeJson(fileName, object) { } function verifyNoTypeScript() { - const typescriptFiles = globby('**/*.(ts|tsx)', { cwd: paths.appSrc }); + const typescriptFiles = globby(['**/*.(ts|tsx)', '!**/node_modules'], { cwd: paths.appSrc }); if (typescriptFiles.length > 0) { console.warn( chalk.yellow( diff --git a/test/fixtures/issue-5947-not-typescript/index.test.js b/test/fixtures/issue-5947-not-typescript/index.test.js new file mode 100644 index 00000000000..c0d38261f6f --- /dev/null +++ b/test/fixtures/issue-5947-not-typescript/index.test.js @@ -0,0 +1,36 @@ +const testSetup = require('../__shared__/test-setup'); +const path = require('path'); +const fs = require('fs'); + +test('Ignores node_modules when detecting TypeScript', async () => { + // CRA build will check for TypeScript files by + // globbing for src/**/*.ts however this shouldn't + // include any node_modules directories within src. + // See https://github.com/facebook/create-react-app/issues/5947 + + const tsConfigPath = path.join(testSetup.testDirectory, 'tsconfig.json'); + const tsPackagePath = [ + testSetup.testDirectory, + 'src', + 'node_modules', + 'package', + 'index.ts', + ]; + const tsSrcPath = path.join(testSetup.testDirectory, 'src', 'index.ts'); + + // Step 1. + // See if src/node_modules/package/index.ts is treated + // as a JS project + fs.mkdirSync(path.join(...tsPackagePath.slice(0, 2))); + fs.mkdirSync(path.join(...tsPackagePath.slice(0, 3))); + fs.mkdirSync(path.join(...tsPackagePath.slice(0, 4))); + fs.writeFileSync(path.join(...tsPackagePath)); + await testSetup.scripts.build(); + expect(fs.existsSync(tsConfigPath)).toBe(false); + + // Step 2. + // Add TS and ensure tsconfig.json is generated + fs.writeFileSync(tsSrcPath); + await testSetup.scripts.build(); + expect(fs.existsSync(tsConfigPath)).toBe(true); +}); diff --git a/test/fixtures/issue-5947-not-typescript/package.json b/test/fixtures/issue-5947-not-typescript/package.json new file mode 100644 index 00000000000..18a1e415e56 --- /dev/null +++ b/test/fixtures/issue-5947-not-typescript/package.json @@ -0,0 +1,3 @@ +{ + "dependencies": {} +}