diff --git a/package-lock.json b/package-lock.json index 85d6746c..78618feb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "devDependencies": { "@babel/core": "^7.13.15", "@rollup/plugin-json": "^4.1.0", + "@swc/core": "^1.2.112", "@types/buble": "^0.19.2", "@types/debug": "^4.1.5", "@types/flat": "^5.0.2", @@ -864,6 +865,21 @@ "node": ">= 10.14.2" } }, + "node_modules/@napi-rs/triples": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", + "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==", + "dev": true + }, + "node_modules/@node-rs/helper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz", + "integrity": "sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==", + "dev": true, + "dependencies": { + "@napi-rs/triples": "^1.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -944,6 +960,228 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@swc/core": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.112.tgz", + "integrity": "sha512-SAqxo1NZil28Xn5ft8U3t9LHPgAmr32tY1cSIB6wPD/qR07BDez/MkHXti9J+xI7F/CnErDvwDcTDiURUyBQnA==", + "dev": true, + "dependencies": { + "@node-rs/helper": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-android-arm64": "^1.2.112", + "@swc/core-darwin-arm64": "^1.2.112", + "@swc/core-darwin-x64": "^1.2.112", + "@swc/core-freebsd-x64": "^1.2.112", + "@swc/core-linux-arm-gnueabihf": "^1.2.112", + "@swc/core-linux-arm64-gnu": "^1.2.112", + "@swc/core-linux-arm64-musl": "^1.2.112", + "@swc/core-linux-x64-gnu": "^1.2.112", + "@swc/core-linux-x64-musl": "^1.2.112", + "@swc/core-win32-arm64-msvc": "^1.2.112", + "@swc/core-win32-ia32-msvc": "^1.2.112", + "@swc/core-win32-x64-msvc": "^1.2.112" + } + }, + "node_modules/@swc/core-android-arm64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.112.tgz", + "integrity": "sha512-eTzOc2Dyob3F3T/0VeBG15ww+9XxpShKaCOGIeWpm37eHnKeqLMabezfZ3vIDFIFrVLRRmFKAVRBTX9LzglxCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.112.tgz", + "integrity": "sha512-XPswjeaYLRxnjLq4xEsTpOutd+5rDc4JcgDzAjhuJ3PnziQGFKE/946PvI3om6WXw4lyZcF23+ZQsHjmIl9CDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.112.tgz", + "integrity": "sha512-QcYINU0+eM9FWQHyjsKESzfxSQo0UuMNmNVNkFzsgK8Nyy9z3ECHt+NDLZg9I3k0LNYX06OyPlCtf/SfoSloew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.112.tgz", + "integrity": "sha512-MM0cY+21azCk+GYjU+omkExZvG3K+JBe97ApZiWoh2pbmVxNcH9kcGkPOkvr1ioXNeN4XewX4Xx9bLPwKMfzpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.112.tgz", + "integrity": "sha512-17f/lEzvnsJXmOlMbnHQ4TQU9w9xaeInEILV9PdRs4doW7SWvvnQS+3Gj5MjJ+kRIaLGDgpyOsiYqBzBENygIQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.112.tgz", + "integrity": "sha512-TMTxHhaC7wCw3/ApPabpXrmbDvGU7dOa77aFsMPunl1JiVds71GT+SGt80mAL+G8uHK17Yy6DiIJkrdF9DncsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.112.tgz", + "integrity": "sha512-PehpgJkVS1C1CccL13nWq2yTCiKNYqPCmvhb0w3L1F6C0yXGeNr0TWdSokIZ1VNuj3c6GSNUOv+UL+wEvI1XYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.112.tgz", + "integrity": "sha512-n000mK+bGHfMS8dPzdgs7ddkg2BDLv9jgHpmTFnqamhzTlXGb3D2V4egE9BgLLGCOtPyw9D4hkDGI9xHioCIog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.112.tgz", + "integrity": "sha512-u2cZCl3e1dwkB4CN+Pyfga5xBMv5JN2bBHZOTfZmlS7+Dj5eU4SSPbeuf4YdveUsxIxEBMjAlyBRRul9DROYzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.112.tgz", + "integrity": "sha512-xLI9JPfBuwjR339UybwJ21o0D62JfEJ1vMG3VTDHG3t9nOBZuNJF5kiU9imWr6otqiP44Av5lRR3ZDK2d6IypA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.112.tgz", + "integrity": "sha512-l6pkdTK9z+S95A9QtzA4vlAYgPqC4uoCm6H00jZERmnc+hiadVu86DQoPRpIT7U0zaNR1FQ6BDUEC2lf6slGiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.112.tgz", + "integrity": "sha512-pJjrfU/mlhoRXZv5oiVuGoQx+zuXgkrs7rAiUZdzYd9GmNmQGEkJNVYMBigEL57BU5RK9Qugzw/YVeu3eWbEjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -8052,6 +8290,21 @@ "chalk": "^4.0.0" } }, + "@napi-rs/triples": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", + "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==", + "dev": true + }, + "@node-rs/helper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz", + "integrity": "sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==", + "dev": true, + "requires": { + "@napi-rs/triples": "^1.0.3" + } + }, "@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -8113,6 +8366,111 @@ "@sinonjs/commons": "^1.7.0" } }, + "@swc/core": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.112.tgz", + "integrity": "sha512-SAqxo1NZil28Xn5ft8U3t9LHPgAmr32tY1cSIB6wPD/qR07BDez/MkHXti9J+xI7F/CnErDvwDcTDiURUyBQnA==", + "dev": true, + "requires": { + "@node-rs/helper": "^1.0.0", + "@swc/core-android-arm64": "^1.2.112", + "@swc/core-darwin-arm64": "^1.2.112", + "@swc/core-darwin-x64": "^1.2.112", + "@swc/core-freebsd-x64": "^1.2.112", + "@swc/core-linux-arm-gnueabihf": "^1.2.112", + "@swc/core-linux-arm64-gnu": "^1.2.112", + "@swc/core-linux-arm64-musl": "^1.2.112", + "@swc/core-linux-x64-gnu": "^1.2.112", + "@swc/core-linux-x64-musl": "^1.2.112", + "@swc/core-win32-arm64-msvc": "^1.2.112", + "@swc/core-win32-ia32-msvc": "^1.2.112", + "@swc/core-win32-x64-msvc": "^1.2.112" + } + }, + "@swc/core-android-arm64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.112.tgz", + "integrity": "sha512-eTzOc2Dyob3F3T/0VeBG15ww+9XxpShKaCOGIeWpm37eHnKeqLMabezfZ3vIDFIFrVLRRmFKAVRBTX9LzglxCQ==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-arm64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.112.tgz", + "integrity": "sha512-XPswjeaYLRxnjLq4xEsTpOutd+5rDc4JcgDzAjhuJ3PnziQGFKE/946PvI3om6WXw4lyZcF23+ZQsHjmIl9CDg==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.112.tgz", + "integrity": "sha512-QcYINU0+eM9FWQHyjsKESzfxSQo0UuMNmNVNkFzsgK8Nyy9z3ECHt+NDLZg9I3k0LNYX06OyPlCtf/SfoSloew==", + "dev": true, + "optional": true + }, + "@swc/core-freebsd-x64": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.112.tgz", + "integrity": "sha512-MM0cY+21azCk+GYjU+omkExZvG3K+JBe97ApZiWoh2pbmVxNcH9kcGkPOkvr1ioXNeN4XewX4Xx9bLPwKMfzpQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.112.tgz", + "integrity": "sha512-17f/lEzvnsJXmOlMbnHQ4TQU9w9xaeInEILV9PdRs4doW7SWvvnQS+3Gj5MjJ+kRIaLGDgpyOsiYqBzBENygIQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.112.tgz", + "integrity": "sha512-TMTxHhaC7wCw3/ApPabpXrmbDvGU7dOa77aFsMPunl1JiVds71GT+SGt80mAL+G8uHK17Yy6DiIJkrdF9DncsQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.112.tgz", + "integrity": "sha512-PehpgJkVS1C1CccL13nWq2yTCiKNYqPCmvhb0w3L1F6C0yXGeNr0TWdSokIZ1VNuj3c6GSNUOv+UL+wEvI1XYw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.112.tgz", + "integrity": "sha512-n000mK+bGHfMS8dPzdgs7ddkg2BDLv9jgHpmTFnqamhzTlXGb3D2V4egE9BgLLGCOtPyw9D4hkDGI9xHioCIog==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.112.tgz", + "integrity": "sha512-u2cZCl3e1dwkB4CN+Pyfga5xBMv5JN2bBHZOTfZmlS7+Dj5eU4SSPbeuf4YdveUsxIxEBMjAlyBRRul9DROYzw==", + "dev": true, + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.112.tgz", + "integrity": "sha512-xLI9JPfBuwjR339UybwJ21o0D62JfEJ1vMG3VTDHG3t9nOBZuNJF5kiU9imWr6otqiP44Av5lRR3ZDK2d6IypA==", + "dev": true, + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.112.tgz", + "integrity": "sha512-l6pkdTK9z+S95A9QtzA4vlAYgPqC4uoCm6H00jZERmnc+hiadVu86DQoPRpIT7U0zaNR1FQ6BDUEC2lf6slGiw==", + "dev": true, + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.2.112", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.112.tgz", + "integrity": "sha512-pJjrfU/mlhoRXZv5oiVuGoQx+zuXgkrs7rAiUZdzYd9GmNmQGEkJNVYMBigEL57BU5RK9Qugzw/YVeu3eWbEjA==", + "dev": true, + "optional": true + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", diff --git a/package.json b/package.json index 5591137f..8f70888e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "devDependencies": { "@babel/core": "^7.13.15", "@rollup/plugin-json": "^4.1.0", + "@swc/core": "^1.2.112", "@types/buble": "^0.19.2", "@types/debug": "^4.1.5", "@types/flat": "^5.0.2", diff --git a/src/esbuild/index.ts b/src/esbuild/index.ts index 72f17a6a..473ca010 100644 --- a/src/esbuild/index.ts +++ b/src/esbuild/index.ts @@ -1,7 +1,12 @@ import fs from 'fs' import path from 'path' import { transform as transformToEs5 } from 'buble' -import { build as esbuild, BuildResult, formatMessages } from 'esbuild' +import { + build as esbuild, + BuildResult, + formatMessages, + Plugin as EsbuildPlugin, +} from 'esbuild' import { NormalizedOptions, Format } from '..' import { getDeps, loadPkg } from '../load' import { Logger } from '../log' @@ -10,9 +15,10 @@ import { externalPlugin } from './external' import { postcssPlugin } from './postcss' import { sveltePlugin } from './svelte' import consola from 'consola' -import { getBabel } from '../utils' +import { getBabel, truthy } from '../utils' import { PrettyError } from '../errors' import { transform } from 'sucrase' +import { swcPlugin } from './swc' const getOutputExtensionMap = ( pkgTypeField: string | undefined, @@ -81,6 +87,30 @@ export async function runEsbuild( const platform = options.platform || 'node' const loader = options.loader || {} + const esbuildPlugins: Array = [ + format === 'cjs' && nodeProtocolPlugin(), + { + name: 'modify-options', + setup(build) { + if (options.esbuildOptions) { + options.esbuildOptions(build.initialOptions, { format }) + } + }, + }, + // esbuild's `external` option doesn't support RegExp + // So here we use a custom plugin to implement it + format !== 'iife' && + externalPlugin({ + patterns: external, + skipNodeModulesBundle: options.skipNodeModulesBundle, + tsconfigResolvePaths: options.tsconfigResolvePaths, + }), + options.tsconfigDecoratorMetadata && swcPlugin(), + postcssPlugin({ css }), + sveltePlugin({ css }), + ...(options.esbuildPlugins || []), + ] + try { result = await esbuild({ entryPoints: options.entryPoints, @@ -121,31 +151,7 @@ export async function runEsbuild( platform === 'node' ? ['module', 'main'] : ['browser', 'module', 'main'], - plugins: [ - ...(format === 'cjs' ? [nodeProtocolPlugin()] : []), - { - name: 'modify-options', - setup(build) { - if (options.esbuildOptions) { - options.esbuildOptions(build.initialOptions, { format }) - } - }, - }, - // esbuild's `external` option doesn't support RegExp - // So here we use a custom plugin to implement it - ...(format !== 'iife' - ? [ - externalPlugin({ - patterns: external, - skipNodeModulesBundle: options.skipNodeModulesBundle, - tsconfigResolvePaths: options.tsconfigResolvePaths, - }), - ] - : []), - postcssPlugin({ css }), - sveltePlugin({ css }), - ...(options.esbuildPlugins || []), - ], + plugins: esbuildPlugins.filter(truthy), define: { ...(format === 'cjs' ? { diff --git a/src/esbuild/swc.ts b/src/esbuild/swc.ts new file mode 100644 index 00000000..8f373a5d --- /dev/null +++ b/src/esbuild/swc.ts @@ -0,0 +1,51 @@ +/** + * Use SWC to emit decorator metadata + */ +import { JscConfig } from '@swc/core' +import { Plugin } from 'esbuild' +import { localRequire } from '../utils' + +export const swcPlugin = (): Plugin => { + return { + name: 'swc', + + async setup(build) { + const swc: typeof import('@swc/core') = localRequire('@swc/core') + + if (!swc) { + return + } + + // Force esbuild to keep class names as well + build.initialOptions.keepNames = true + + build.onLoad({ filter: /\.[jt]sx?$/ }, async (args) => { + const isTs = /\.tsx?$/.test(args.path) + + const jsc: JscConfig = { + parser: { + syntax: isTs ? 'typescript' : 'ecmascript', + decorators: true, + }, + transform: { + legacyDecorator: true, + decoratorMetadata: true, + }, + keepClassNames: true, + target: 'es2022', + } + + const result = await swc.transformFile(args.path, { + jsc, + sourceMaps: 'inline', + configFile: false, + swcrc: false, + }) + + return { + contents: result.code, + } + }) + }, + } +} diff --git a/src/index.ts b/src/index.ts index ff72c0df..132086dc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,9 @@ import path from 'path' import fs from 'fs' import { Worker } from 'worker_threads' -import type { Buildable, DeepPartial, MarkRequired } from 'ts-essentials' +import type { Buildable, MarkRequired } from 'ts-essentials' import { removeFiles, debouncePromise, slash } from './utils' -import { loadTsupConfig, resolveTsConfig } from './load' +import { loadTsupConfig } from './load' import glob from 'globby' import { loadTsConfig } from 'bundle-require' import { handleError, PrettyError } from './errors' @@ -25,6 +25,7 @@ export type NormalizedOptions = Omit< > & { dts?: DtsConfig tsconfigResolvePaths: Record + tsconfigDecoratorMetadata?: boolean } export const defineConfig = ( @@ -106,6 +107,8 @@ const normalizeOptions = async ( ) options.tsconfig = tsconfig.path options.tsconfigResolvePaths = tsconfig.data?.compilerOptions?.paths || {} + options.tsconfigDecoratorMetadata = + tsconfig.data?.compilerOptions?.emitDecoratorMetadata } else if (options.tsconfig) { throw new PrettyError(`Cannot find tsconfig: ${options.tsconfig}`) } diff --git a/src/load.ts b/src/load.ts index d712c831..a98fb6d1 100644 --- a/src/load.ts +++ b/src/load.ts @@ -32,10 +32,6 @@ const jsonLoader = { joycon.addLoader(jsonLoader) -export function resolveTsConfig(cwd: string, tsconfig = 'tsconfig.json') { - return joycon.resolve([tsconfig], cwd, path.dirname(cwd)) -} - export async function loadTsupConfig( cwd: string ): Promise<{ path?: string; data?: ReturnType }> { diff --git a/src/utils.ts b/src/utils.ts index 46b7bfa1..506980ae 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -115,3 +115,9 @@ export function slash(path: string) { return path.replace(/\\/g, '/') } + +type Truthy = T extends false | '' | 0 | null | undefined ? never : T // from lodash + +export function truthy(value: T): value is Truthy { + return Boolean(value) +} diff --git a/test/index.test.ts b/test/index.test.ts index 4aa89814..1f772e42 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1133,3 +1133,25 @@ test('emit declaration files only', async () => { ] `) }) + +test('decorator metadata', async () => { + const { getFileContent } = await run(getTestName(), { + 'input.ts': ` + function Injectable() {} + + @Injectable() + export class Foo { + @Field() + bar() {} + } + `, + 'tsconfig.json': `{ + "compilerOptions": { + "emitDecoratorMetadata": true, + } + }`, + }) + expect(await getFileContent('dist/input.js')).toContain( + `Reflect.metadata("design:type"` + ) +})