Skip to content

Commit dc83155

Browse files
committed
Fix: tsconfig is always overwritten by default
1 parent e1dfdff commit dc83155

File tree

8 files changed

+93
-16
lines changed

8 files changed

+93
-16
lines changed

packages/techor/src/commands/build.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'
2525
import commonjs from '@rollup/plugin-commonjs'
2626
import swc from '../plugins/swc'
2727
import preserveDirectives from 'rollup-plugin-preserve-directives'
28+
import { getTsconfig, TsConfigJson } from 'get-tsconfig'
2829

2930
declare type OutputResult = (BuildOutputOptions & { artifact: (RollupOutputAsset | RollupOutputChunk) })
3031
declare type BuildOutputOptions = BuildCommonOptions & { output: RollupOutputOptions }
@@ -60,6 +61,18 @@ export default async function build() {
6061
process.env.NODE_ENV = 'production'
6162
}
6263

64+
const tsconfigFile = config.build.swc.tsconfigFile || config.build.tsconfig
65+
let tsconfig: TsConfigJson
66+
if (tsconfigFile) {
67+
if (tsconfigFile === true) {
68+
tsconfig = getTsconfig('.')?.config
69+
} else {
70+
tsconfig = getTsconfig(tsconfigFile)?.config
71+
if (!tsconfig) {
72+
tsconfig = getTsconfig('.')?.config
73+
}
74+
}
75+
}
6376
if (process.env.DEBUG) console.log('[techor] cmdConfig', cmdConfig)
6477
const pkg: PackageJson = readJSONFileSync('package.json') || {}
6578
const { dependencies, peerDependencies, optionalDependencies, types } = pkg
@@ -139,18 +152,16 @@ export default async function build() {
139152
} as RollupInputOptions, config.build.input)
140153
buildOptions.input.input = entries
141154
buildOptions.input.external = (config.build.input.external && !forceBundle) && getWideExternal(config.build.input.external)
142-
const extendedSWCOptions: Config['build']['swc'] = extend(
143-
config.build.swc, { tsconfigFile: config.build.tsconfig } as Config['build']['swc'])
155+
const extendedSWCOptions: Config['build']['swc'] = extend(config.build.swc, { tsconfigFile: config.build.tsconfig } as Config['build']['swc'])
144156
if (extendedBuild.minify) {
145157
extendedSWCOptions.minify = true
146-
147158
} else {
148159
delete extendedSWCOptions.minify
149160
delete extendedSWCOptions.jsc.minify
150161
}
151162
(buildOptions.input.plugins as RollupInputPluginOption[]).unshift(
152163
...[
153-
swc(extendedSWCOptions),
164+
swc(extendedSWCOptions, tsconfig),
154165
config.build.commonjs && commonjs(config.build.commonjs),
155166
config.build.nodeResolve && nodeResolve(config.build.nodeResolve),
156167
config.build.esmShim && esmShim(),

packages/techor/src/plugins/swc.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Plugin } from 'rollup'
2-
import { getTsconfig } from 'get-tsconfig'
3-
import { Options as SWCOptions, transform } from '@swc/core'
2+
import { getTsconfig, TsConfigJson } from 'get-tsconfig'
3+
import { JscTarget, Options as SWCOptions, transform } from '@swc/core'
44
import extend from '@techor/extend'
55
import { FilterPattern, createFilter } from '@rollup/pluginutils'
66

@@ -10,29 +10,30 @@ export type Options = SWCOptions & {
1010
tsconfigFile?: string | boolean
1111
}
1212

13-
export default function swc({ tsconfigFile, include, exclude, minify, ...options }: Options = {}): Plugin {
13+
export default function swc({ tsconfigFile, include, exclude, minify, ...options }: Options = {}, tsconfig: TsConfigJson): Plugin {
1414
const filter = createFilter(include, exclude)
15-
const compilerOptions = tsconfigFile === false ? {} : getTsconfig('.', tsconfigFile === true ? undefined : tsconfigFile)?.config?.compilerOptions || {}
1615
let swcOptions = {
1716
jsc: {
18-
target: compilerOptions.target,
1917
parser: {},
2018
transform: {}
2119
}
2220
} as SWCOptions
23-
if (compilerOptions.experimentalDecorators) {
21+
swcOptions = extend(swcOptions, options)
22+
if (tsconfig?.compilerOptions?.experimentalDecorators) {
2423
swcOptions.jsc.parser.decorators = true
2524
swcOptions.jsc.transform.legacyDecorator = true
26-
swcOptions.jsc.transform.decoratorMetadata = compilerOptions.emitDecoratorMetadata
25+
swcOptions.jsc.transform.decoratorMetadata = tsconfig?.compilerOptions.emitDecoratorMetadata
2726
}
28-
if (compilerOptions.jsx) {
27+
if (tsconfig?.compilerOptions?.jsx) {
2928
swcOptions.jsc.transform.react = {
30-
pragma: compilerOptions.jsxFactory,
31-
pragmaFrag: compilerOptions.jsxFragmentFactory,
32-
importSource: compilerOptions.jsxImportSource,
29+
pragma: tsconfig?.compilerOptions.jsxFactory,
30+
pragmaFrag: tsconfig?.compilerOptions.jsxFragmentFactory,
31+
importSource: tsconfig?.compilerOptions.jsxImportSource,
3332
}
3433
}
35-
swcOptions = extend(swcOptions, options)
34+
if (tsconfig?.compilerOptions?.target) {
35+
swcOptions.jsc.target = tsconfig?.compilerOptions.target.toLocaleLowerCase() as JscTarget
36+
}
3637
return {
3738
name: 'techor-swc',
3839
async transform(code, id) {

packages/techor/tests/pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@test/target-es5",
3+
"version": "1.0.0",
4+
"private": true,
5+
"main": "dist/index.cjs",
6+
"files": [
7+
"dist"
8+
]
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function getUserName(name?: string | null) {
2+
const displayName = name ?? 'Guest'
3+
return `Hello, ${displayName}!`
4+
}
5+
6+
console.log(getUserName('JoyHe'))
7+
console.log(getUserName())
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { execSync } from 'node:child_process'
2+
import { readFileSync } from 'node:fs'
3+
import { join } from 'node:path'
4+
import dedent from 'ts-dedent'
5+
6+
beforeAll(() => {
7+
execSync('tsx ../../src/bin build', { cwd: __dirname, stdio: 'inherit' })
8+
})
9+
10+
test('main', () => {
11+
expect(readFileSync(join(__dirname, './dist/index.cjs'), 'utf-8')).toContain(dedent`
12+
'use strict';
13+
14+
function getUserName(name) {
15+
var displayName = name !== null && name !== void 0 ? name : 'Guest';
16+
return "Hello, ".concat(displayName, "!");
17+
}
18+
console.log(getUserName('JoyHe'));
19+
console.log(getUserName());`)
20+
})
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"extends": "../../../../tsconfig.json",
3+
"compilerOptions": {
4+
"baseUrl": ".",
5+
"outDir": "dist",
6+
"target": "ES5"
7+
},
8+
"include": [
9+
"src/**/*"
10+
],
11+
"exclude": [
12+
"src/**/*.test.ts"
13+
]
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"extends": "../../../../tsconfig.json",
3+
"compilerOptions": {
4+
"baseUrl": ".",
5+
"outDir": "dist"
6+
},
7+
"include": [
8+
"src/**/*"
9+
],
10+
"exclude": [
11+
"src/**/*.test.ts"
12+
]
13+
}

0 commit comments

Comments
 (0)