Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 26.9k
Set baseUrl from jsconfig.json/tsconfig.json#6656
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
13f65e83237f4c8d352637ab30a4503bd634dd6005d7f0816b16bad29eca658a7b084f8193cef92af3474f627e9c629a9e359a0b2e72d38c84a479206902311d8f29c255a6bd0e0b19ef039bf5File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| // @remove-on-eject-begin | ||
| /** | ||
| * Copyright (c) 2015-present, Facebook, Inc. | ||
| * | ||
| * This source code is licensed under the MIT license found in the | ||
| * LICENSE file in the root directory of this source tree. | ||
| */ | ||
| // @remove-on-eject-end | ||
| 'use strict'; | ||
| const fs = require('fs'); | ||
| const path = require('path'); | ||
| const paths = require('./paths'); | ||
| const chalk = require('react-dev-utils/chalk'); | ||
| /** | ||
| * Get the baseUrl of a compilerOptions object. | ||
| * | ||
| * @param {Object} options | ||
| */ | ||
| function getAdditionalModulePaths(options = {}) { | ||
| const baseUrl = options.baseUrl; | ||
| // We need to explicitly check for null and undefined (and not a falsy value) because | ||
| // TypeScript treats an empty string as `.`. | ||
| if (baseUrl == null) { | ||
| // If there's no baseUrl set we respect NODE_PATH | ||
| // Note that NODE_PATH is deprecated and will be removed | ||
| // in the next major release of create-react-app. | ||
| const nodePath = process.env.NODE_PATH || ''; | ||
| return nodePath.split(path.delimiter).filter(Boolean); | ||
| } | ||
| const baseUrlResolved = path.resolve(paths.appPath, baseUrl); | ||
| // We don't need to do anything if `baseUrl` is set to `node_modules`. This is | ||
| // the default behavior. | ||
| if (path.relative(paths.appNodeModules, baseUrlResolved) === '') { | ||
| return null; | ||
| } | ||
| // Allow the user set the `baseUrl` to `appSrc`. | ||
| if (path.relative(paths.appSrc, baseUrlResolved) === '') { | ||
| return [paths.appSrc]; | ||
| } | ||
| // Otherwise, throw an error. | ||
| throw new Error( | ||
| chalk.red.bold( | ||
| "Your project's `baseUrl` can only be set to `src` or `node_modules`." + | ||
| ' Create React App does not support other values at this time.' | ||
| ) | ||
| ); | ||
| } | ||
| function getModules() { | ||
| // Check if TypeScript is setup | ||
| const hasTsConfig = fs.existsSync(paths.appTsConfig); | ||
| const hasJsConfig = fs.existsSync(paths.appJsConfig); | ||
| if (hasTsConfig && hasJsConfig) { | ||
| throw new Error( | ||
| 'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.' | ||
| ); | ||
| } | ||
| let config; | ||
| // If there's a tsconfig.json we assume it's a | ||
| // TypeScript project and set up the config | ||
| // based on tsconfig.json | ||
| if (hasTsConfig) { | ||
| config = require(paths.appTsConfig); | ||
| // Otherwise we'll check if there is jsconfig.json | ||
| // for non TS projects. | ||
| } else if (hasJsConfig) { | ||
| config = require(paths.appJsConfig); | ||
| } | ||
| config = config || {}; | ||
| const options = config.compilerOptions || {}; | ||
| const additionalModulePaths = getAdditionalModulePaths(options); | ||
| return { | ||
| additionalModulePaths: additionalModulePaths, | ||
| hasTsConfig, | ||
| }; | ||
| } | ||
| module.exports = getModules(); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /** | ||
| * Copyright (c) 2015-present, Facebook, Inc. | ||
| * | ||
| * This source code is licensed under the MIT license found in the | ||
| * LICENSE file in the root directory of this source tree. | ||
| */ | ||
| import initDOM from './initDOM'; | ||
| describe('Integration', () => { | ||
| describe('jsconfig.json/tsconfig.json', () => { | ||
| it('Supports setting baseUrl to src', async () => { | ||
| const doc = await initDOM('base-url'); | ||
| expect(doc.getElementById('feature-base-url').childElementCount).toBe(4); | ||
| doc.defaultView.close(); | ||
| }); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -43,12 +43,6 @@ describe('Integration', () => { | ||
| } | ||
| }); | ||
| it('NODE_PATH', async () => { | ||
iansu marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| doc = await initDOM('node-path'); | ||
| expect(doc.getElementById('feature-node-path').childElementCount).toBe(4); | ||
| }); | ||
| it('PUBLIC_URL', async () => { | ||
| doc = await initDOM('public-url'); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| { | ||
| "compilerOptions": { | ||
| "baseUrl": "src" | ||
mrmckeb marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -166,9 +166,6 @@ class App extends Component { | ||
| this.setFeature(f.default) | ||
| ); | ||
| break; | ||
| case 'node-path': | ||
iansu marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| import('./features/env/NodePath').then(f => this.setFeature(f.default)); | ||
| break; | ||
| case 'no-ext-inclusion': | ||
| import('./features/webpack/NoExtInclusion').then(f => | ||
| this.setFeature(f.default) | ||
| @@ -239,6 +236,11 @@ class App extends Component { | ||
| this.setFeature(f.default) | ||
| ); | ||
| break; | ||
| case 'base-url': | ||
| import('./features/config/BaseUrl').then(f => | ||
| this.setFeature(f.default) | ||
| ); | ||
| break; | ||
| default: | ||
| this.setState({ error: `Missing feature "${feature}"` }); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| NODE_PATH=src |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| const testSetup = require('../__shared__/test-setup'); | ||
| test('builds in development', async () => { | ||
| const { fulfilled } = await testSetup.scripts.start({ smoke: true }); | ||
| expect(fulfilled).toBe(true); | ||
| }); | ||
| test('builds in production', async () => { | ||
| const { fulfilled } = await testSetup.scripts.build(); | ||
| expect(fulfilled).toBe(true); | ||
| }); | ||
| test('passes tests', async () => { | ||
| const { fulfilled } = await testSetup.scripts.test(); | ||
| expect(fulfilled).toBe(true); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| { | ||
| "dependencies": { | ||
| "prop-types": "^15.7.2", | ||
| "react": "latest", | ||
| "react-dom": "latest" | ||
| } | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.