From 41191f3a92a74be9729e46601f618e80d7f24adf Mon Sep 17 00:00:00 2001 From: Stephen Russell Crane Date: Fri, 9 Feb 2024 13:42:04 -0600 Subject: [PATCH 1/2] only doing file I/O once during webpack loader. --- packages/loader/src/index.ts | 46 +++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts index 07cbd3020..3fa7b7b3b 100644 --- a/packages/loader/src/index.ts +++ b/packages/loader/src/index.ts @@ -1,8 +1,36 @@ -import { transform } from '@swc-node/core' +import { transform, Options } from '@swc-node/core' import { readDefaultTsConfig, tsCompilerOptionsToSwcConfig } from '@swc-node/register/read-default-tsconfig' import { CompilerOptions, convertCompilerOptionsFromJson } from 'typescript' import type { LoaderContext } from 'webpack' +let swcConfig: Options +function getSwcConfig( + this: LoaderContext<{ + compilerOptions?: CompilerOptions + configFile?: string + fastRefresh?: boolean + }>, +): Options { + if (!swcConfig) { + const { compilerOptions, configFile, fastRefresh } = this.getOptions() ?? {} + const { options: assignedOptions } = convertCompilerOptionsFromJson(compilerOptions, '') + const options = + !assignedOptions || Object.keys(assignedOptions).length === 0 ? readDefaultTsConfig(configFile) : assignedOptions + swcConfig = tsCompilerOptionsToSwcConfig(options, this.resourcePath) + if (fastRefresh) { + if (swcConfig.react) { + swcConfig.react.refresh = true + } else { + swcConfig.react = { + refresh: true, + } + } + } + } + + return swcConfig +} + export function loader( this: LoaderContext<{ compilerOptions?: CompilerOptions @@ -12,21 +40,7 @@ export function loader( source: string, ) { const callback = this.async() - const { compilerOptions, configFile, fastRefresh } = this.getOptions() ?? {} - const { options: assignedOptions } = convertCompilerOptionsFromJson(compilerOptions, '') - const options = - !assignedOptions || Object.keys(assignedOptions).length === 0 ? readDefaultTsConfig(configFile) : assignedOptions - const swcOptions = tsCompilerOptionsToSwcConfig(options, this.resourcePath) - if (fastRefresh) { - if (swcOptions.react) { - swcOptions.react.refresh = true - } else { - swcOptions.react = { - refresh: true, - } - } - } - transform(source, this.resourcePath, swcOptions) + transform(source, this.resourcePath, getSwcConfig.call(this)) .then(({ code, map }) => callback(null, code, map)) .catch((err) => callback(err)) } From a721794d68d2a35e67972ddcda21371ed3dfe217 Mon Sep 17 00:00:00 2001 From: Stephen Russell Crane Date: Fri, 9 Feb 2024 14:14:50 -0600 Subject: [PATCH 2/2] trying to get email to come thru in commit. --- packages/loader/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts index 3fa7b7b3b..35da5ddf4 100644 --- a/packages/loader/src/index.ts +++ b/packages/loader/src/index.ts @@ -4,6 +4,7 @@ import { CompilerOptions, convertCompilerOptionsFromJson } from 'typescript' import type { LoaderContext } from 'webpack' let swcConfig: Options + function getSwcConfig( this: LoaderContext<{ compilerOptions?: CompilerOptions