Skip to content

Commit

Permalink
improves baseUrl resolution in typescript monorepos (#13542)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeantil authored Jul 28, 2020
1 parent fdfc508 commit 17420c7
Show file tree
Hide file tree
Showing 17 changed files with 180 additions and 1 deletion.
5 changes: 4 additions & 1 deletion packages/next/build/webpack-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
} from '../lib/constants'
import { fileExists } from '../lib/file-exists'
import { resolveRequest } from '../lib/resolve-request'
import { getTypeScriptConfiguration } from '../lib/typescript/getTypeScriptConfiguration'
import {
CLIENT_STATIC_FILES_RUNTIME_MAIN,
CLIENT_STATIC_FILES_RUNTIME_POLYFILLS,
Expand Down Expand Up @@ -261,7 +262,9 @@ export default async function getBaseWebpackConfig(
let jsConfig
// jsconfig is a subset of tsconfig
if (useTypeScript) {
jsConfig = parseJsonFile(tsConfigPath)
const ts = (await import(typeScriptPath)) as typeof import('typescript')
const tsConfig = await getTypeScriptConfiguration(ts, tsConfigPath)
jsConfig = { compilerOptions: tsConfig.options }
}

const jsConfigPath = path.join(dir, 'jsconfig.json')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//this line uses typescript specific syntax
//to demonstrate that transpilation occurs
export type API = () => string
const api: API = () => 'Hello from a'
export default api
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { API } from '@lib/api'

const b: API = () => 'Hello from b'
export default b
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { API } from '@lib/api'

const b: API = () => 'Hello from only b'
export default b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default () => any
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const Named = () => {
return <>Not aliased to d.ts file</>
}
export default Named
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react'

export function Hello() {
return <>Hello</>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react'

export function World(): JSX.Element {
return <>World</>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const path = require('path')
module.exports = {
webpack: function (config, { defaultLoaders }) {
const resolvedBaseUrl = path.resolve(config.context, '../../')
config.module.rules = [
...config.module.rules,
{
test: /\.(tsx|ts|js|mjs|jsx)$/,
include: [resolvedBaseUrl],
use: defaultLoaders.babel,
exclude: (excludePath) => {
return /node_modules/.test(excludePath)
},
},
]
return config
},

onDemandEntries: {
// Make sure entries are not getting disposed.
maxInactiveAge: 1000 * 60 * 60,
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react'
import NotAliasedToDTS from 'd-ts-alias'

export default function HelloPage(): JSX.Element {
return (
<div>
<NotAliasedToDTS />
</div>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import React from 'react'
import { World } from '@c/world'
export default function HelloPage(): JSX.Element {
return (
<div>
<World />
</div>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react'
import api from '@lib/b-only'
export default function ResolveOrder(): JSX.Element {
return <div>{api()}</div>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react'
import api from '@lib/api'
export default function ResolveOrder(): JSX.Element {
return <div>{api()}</div>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Hello } from '@mycomponent'

export default function SingleAlias() {
return (
<div>
<Hello />
</div>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/* eslint-env jest */

import { join } from 'path'
import cheerio from 'cheerio'
import { renderViaHTTP, findPort, launchApp, killApp } from 'next-test-utils'

jest.setTimeout(1000 * 60 * 2)

const appDir = join(__dirname, '..')
let appPort
let app

async function get$(path, query) {
const html = await renderViaHTTP(appPort, path, query)
return cheerio.load(html)
}

describe('TypeScript Features', () => {
describe('default behavior', () => {
beforeAll(async () => {
appPort = await findPort()
app = await launchApp(appDir, appPort, {})
})
afterAll(() => killApp(app))

it('should alias components', async () => {
const $ = await get$('/basic-alias')
expect($('body').text()).toMatch(/World/)
})

it('should resolve the first item in the array first', async () => {
const $ = await get$('/resolve-order')
expect($('body').text()).toMatch(/Hello from a/)
})

it('should resolve the second item in as a fallback', async () => {
const $ = await get$('/resolve-fallback')
expect($('body').text()).toMatch(/Hello from only b/)
})

it('should resolve a single matching alias', async () => {
const $ = await get$('/single-alias')
expect($('body').text()).toMatch(/Hello/)
})

it('should not resolve to .d.ts files', async () => {
const $ = await get$('/alias-to-d-ts')
expect($('body').text()).toMatch(/Not aliased to d\.ts file/)
})
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/* This is a single line comment to check if that works */
{
"extends": "../../tsconfig.json",
"exclude": ["node_modules"],
"include": ["next-env.d.ts", "components", "pages"]
}
30 changes: 30 additions & 0 deletions test/integration/typescript-workspaces-paths/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/* This is a single line comment to check if that works */
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"isomorphic-unfetch": ["packages/www/types/unfetch.d.ts"],
"@c/*": ["packages/www/components/*"],
"@lib/*": ["packages/lib/a/*", "packages/lib/b/*"],
"@mycomponent": ["packages/www/components/hello.tsx"],
"d-ts-alias": [
"packages/www/components/alias-to-d-ts.d.ts",
"packages/www/components/alias-to-d-ts.tsx"
]
// This is a single line comment to check if that works
},
"esModuleInterop": true,
"module": "esnext",
"jsx": "preserve",
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true
}
}

0 comments on commit 17420c7

Please sign in to comment.