From 7f628ef8b81285d80b41570be1ee8686b549a46b Mon Sep 17 00:00:00 2001 From: Aleksandr Kitov Date: Tue, 3 Sep 2024 16:03:36 +0300 Subject: [PATCH 1/4] feat(*): add useSwc option --- .changeset/three-camels-repeat.md | 5 + packages/arui-scripts/.eslintrc.js | 2 + packages/arui-scripts/docs/settings.md | 9 + packages/arui-scripts/package.json | 4 + .../arui-scripts/src/commands/build/client.ts | 3 +- .../arui-scripts/src/commands/build/server.ts | 3 +- .../src/commands/start-prod/index.ts | 2 +- .../src/configs/app-configs/get-defaults.ts | 1 + .../src/configs/app-configs/types.ts | 1 + .../app-configs/warn-about-deprecations.ts | 1 - .../arui-scripts/src/configs/jest/settings.js | 21 +- packages/arui-scripts/src/configs/swc.ts | 33 ++++ .../src/configs/util/apply-overrides.ts | 5 + .../src/configs/webpack.client.ts | 80 +++++--- .../src/configs/webpack.server.ts | 50 +++-- .../example-modules/arui-scripts.config.ts | 1 + packages/example/arui-scripts.config.ts | 1 + packages/example/src/utils.ts | 12 ++ yarn.lock | 184 ++++++++++++++++++ 19 files changed, 364 insertions(+), 54 deletions(-) create mode 100644 .changeset/three-camels-repeat.md create mode 100644 packages/arui-scripts/src/configs/swc.ts diff --git a/.changeset/three-camels-repeat.md b/.changeset/three-camels-repeat.md new file mode 100644 index 00000000..85030e4c --- /dev/null +++ b/.changeset/three-camels-repeat.md @@ -0,0 +1,5 @@ +--- +'arui-scripts': minor +--- + +Добавлен флаг `useSwc` для использования swc-loader и swc-jest для транспиляции кода. Использование swc значительно ускоряет сборку (до 2 раз), без особых негативных последствий. Для большинства проектов миграция на swc будет абсолютно незаметна diff --git a/packages/arui-scripts/.eslintrc.js b/packages/arui-scripts/.eslintrc.js index 3142e2e8..0967300e 100644 --- a/packages/arui-scripts/.eslintrc.js +++ b/packages/arui-scripts/.eslintrc.js @@ -11,5 +11,7 @@ module.exports = { 'import/no-named-as-default': 'warn', // чтобы могли использовать for и генераторы 'no-restricted-syntax': 'off', + // проект - cli-тулза, и она должна писать в консоль + 'no-console': 'off', }, }; diff --git a/packages/arui-scripts/docs/settings.md b/packages/arui-scripts/docs/settings.md index b6df41be..4d42e2b2 100644 --- a/packages/arui-scripts/docs/settings.md +++ b/packages/arui-scripts/docs/settings.md @@ -221,6 +221,15 @@ babel-loader является предпочтительным инструме Добавлять ли инструменты для сборки coverage при сборке. По умолчанию определяется по env переменным - будет выставлено в `true` если `NODE_ENV = 'cypress'` или `USE_ISTANBUL = 'enabled'`. Сбор coverage не будет работать при использовании `useTscLoader=true`. +#### useSwc +Использовать ли swc для обработки js и ts файлов. По умолчанию `false`. + +Использование swc позволяет значительно ускорить сборку (до 2 раз на больших проектах), но не будет создавать полностью идентичный с babel код. +Итоговый может получиться немного больше, чем при использовании babel, но разница полностью компенсируется при использовании сжатия. + +При включении, swc будет использоваться вместо babel-loader при сборке, а так же для транспиляции файлов в jest. +Настройки `useTscLoader` и `jestUseTsJest` имеют приоритет над этой настройкой. + ### Обработка изображений #### dataUrlMaxSize Ресурсы, не превышающие данный размер (в байтах), будут включены в исходники `inline`, иначе вынесены в отдельный файл. По умолчанию `1536`. diff --git a/packages/arui-scripts/package.json b/packages/arui-scripts/package.json index f3d2bf51..611e403e 100644 --- a/packages/arui-scripts/package.json +++ b/packages/arui-scripts/package.json @@ -38,6 +38,8 @@ "@babel/runtime": "^7.23.8", "@csstools/postcss-global-data": "^2.0.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", + "@swc/core": "~1.6.13", + "@swc/jest": "^0.2.36", "assets-webpack-plugin": "7.1.1", "autoprefixer": "^10.3.16", "babel-core": "^7.0.0-bridge.0", @@ -96,6 +98,8 @@ "shelljs": "0.8.5", "strip-ansi": "6.0.1", "style-loader": "3.3.3", + "swc-loader": "^0.2.6", + "swc-plugin-coverage-instrument": "^0.0.24", "tar": "6.2.1", "terser-webpack-plugin": "5.3.9", "ts-jest": "28.0.8", diff --git a/packages/arui-scripts/src/commands/build/client.ts b/packages/arui-scripts/src/commands/build/client.ts index 38fd5679..883cc562 100644 --- a/packages/arui-scripts/src/commands/build/client.ts +++ b/packages/arui-scripts/src/commands/build/client.ts @@ -9,9 +9,10 @@ import config from '../../configs/webpack.client.prod'; import { MultiStats } from 'webpack'; console.log(chalk.magenta('Building client...')); - +console.time('build client'); build(config) .then(({ stats, warnings }) => { + console.timeEnd('build client'); if (warnings.length) { console.log(chalk.yellow('Client compiled with warnings.\n')); console.log(warnings.join('\n\n')); diff --git a/packages/arui-scripts/src/commands/build/server.ts b/packages/arui-scripts/src/commands/build/server.ts index 512ad175..601238cb 100644 --- a/packages/arui-scripts/src/commands/build/server.ts +++ b/packages/arui-scripts/src/commands/build/server.ts @@ -7,9 +7,10 @@ import build from './build-wrapper'; import config from '../../configs/webpack.server.prod'; console.log(chalk.magenta('Building server...')); - +console.time('build server'); build(config as any) .then(({ warnings }) => { + console.timeEnd('build server'); if (warnings.length) { console.log(chalk.yellow('Server compiled with warnings.\n')); console.log(warnings.join('\n\n')); diff --git a/packages/arui-scripts/src/commands/start-prod/index.ts b/packages/arui-scripts/src/commands/start-prod/index.ts index a8a477e2..5530af70 100644 --- a/packages/arui-scripts/src/commands/start-prod/index.ts +++ b/packages/arui-scripts/src/commands/start-prod/index.ts @@ -1,6 +1,6 @@ import { configs } from '../../configs/app-configs'; -import { getTscWatchCommand } from '../util/tsc'; import { runCompilers } from '../util/run-compilers'; +import { getTscWatchCommand } from '../util/tsc'; process.env.BROWSERSLIST_CONFIG = process.env.BROWSERSLIST_CONFIG || require.resolve('../../../.browserslistrc'); diff --git a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts index 1fad3017..86c8a334 100644 --- a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts +++ b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts @@ -47,6 +47,7 @@ export function getDefaultAppConfig(): AppConfigs { // build tuning keepPropTypes: false, useTscLoader: false, + useSwc: false, webpack4Compatibility: false, installServerSourceMaps: false, disableDevWebpackTypecheck: true, diff --git a/packages/arui-scripts/src/configs/app-configs/types.ts b/packages/arui-scripts/src/configs/app-configs/types.ts index 80719b76..73a1f049 100644 --- a/packages/arui-scripts/src/configs/app-configs/types.ts +++ b/packages/arui-scripts/src/configs/app-configs/types.ts @@ -42,6 +42,7 @@ export type AppConfigs = { * @deprecated использование ts-loader крайне не рекомендуется - он медленнее и не имеет преимуществ перед babel */ useTscLoader: boolean; + useSwc: boolean; webpack4Compatibility: boolean; installServerSourceMaps: boolean; disableDevWebpackTypecheck: boolean; diff --git a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts index 4fa53af4..1577191c 100644 --- a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts +++ b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts @@ -2,7 +2,6 @@ import { AppContextWithConfigs } from './types'; export function warnAboutDeprecations(config: AppContextWithConfigs) { if (config.useTscLoader) { - // eslint-disable-next-line no-console console.warn( 'Использование опции `useTscLoader` не рекомендуется и будет удалено в будущих версиях. ', 'Обратитесь к документации https://github.com/core-ds/arui-scripts/blob/master/packages/arui-scripts/docs/settings.md#usetscloader', diff --git a/packages/arui-scripts/src/configs/jest/settings.js b/packages/arui-scripts/src/configs/jest/settings.js index 3f009270..caf7dd26 100644 --- a/packages/arui-scripts/src/configs/jest/settings.js +++ b/packages/arui-scripts/src/configs/jest/settings.js @@ -6,6 +6,7 @@ const fs = require('fs'); const { pathsToModuleNameMapper } = require('ts-jest'); const { parseConfigFileTextToJson } = require('typescript'); +const { swcClientConfig } = require('../swc'); const configs = require('../app-configs').default; @@ -18,6 +19,18 @@ if (configs.tsconfig) { tsConfigPaths = tsConfig.config.compilerOptions?.paths || {}; } +let tsxTransformer = require.resolve('./babel-transform'); +const jsTransformer = configs.useSwc + ? [require.resolve('@swc/jest'), swcClientConfig] + : require.resolve('./babel-transform'); + +if (configs.useSwc) { + tsxTransformer = [require.resolve('@swc/jest'), swcClientConfig]; +} +if (configs.jestUseTsJest) { + tsxTransformer = require.resolve('ts-jest'); +} + module.exports = { testRegex: 'src/.*(((/__test__/|/__tests__/).*)|(test|spec|tests)).(jsx?|tsx?)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], @@ -26,11 +39,9 @@ module.exports = { url: 'http://localhost', }, transform: { - '^.+\\.jsx?$': require.resolve('./babel-transform'), - '^.+\\.mjs$': require.resolve('./babel-transform'), - '^.+\\.tsx?$': configs.jestUseTsJest - ? require.resolve('ts-jest') - : require.resolve('./babel-transform'), + '^.+\\.jsx?$': jsTransformer, + '^.+\\.mjs$': jsTransformer, + '^.+\\.tsx?$': tsxTransformer, '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': require.resolve('./file-transform'), }, moduleNameMapper: { diff --git a/packages/arui-scripts/src/configs/swc.ts b/packages/arui-scripts/src/configs/swc.ts new file mode 100644 index 00000000..690ea1df --- /dev/null +++ b/packages/arui-scripts/src/configs/swc.ts @@ -0,0 +1,33 @@ +import type { Options } from '@swc/core'; + +import applyOverrides from './util/apply-overrides'; +import { configs } from './app-configs'; + +const swcConfig: Options = { + env: { coreJs: '3', mode: 'entry' }, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + decorators: true, + }, + loose: true, + transform: { + legacyDecorator: true, + react: { + runtime: 'automatic', + }, + }, + experimental: configs.collectCoverage + ? { + plugins: [ + ['swc-plugin-coverage-instrument', {}], + ], + } + : {}, + }, +}; + +export const swcClientConfig = applyOverrides(['swc', 'swcClient'], swcConfig); + +export const swcServerConfig = applyOverrides(['swc', 'swcServer'], swcConfig); diff --git a/packages/arui-scripts/src/configs/util/apply-overrides.ts b/packages/arui-scripts/src/configs/util/apply-overrides.ts index 524e4788..c6264d45 100644 --- a/packages/arui-scripts/src/configs/util/apply-overrides.ts +++ b/packages/arui-scripts/src/configs/util/apply-overrides.ts @@ -1,6 +1,7 @@ // TODO: remove eslint-disable-next-line import type { Configuration as WebpackConfiguration, WebpackOptionsNormalized } from 'webpack'; import type { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server'; +import type { Options as SwcOptions } from '@swc/core' import appConfigs from '../app-configs'; import { AppContextWithConfigs } from '../app-configs/types'; @@ -27,6 +28,10 @@ type Overrides = { babelServer: any; babelDependencies: any; + swc: SwcOptions; + swcServer: SwcOptions; + swcClient: SwcOptions; + postcss: any[]; // TODO: где взять typedef-ы для postcss browsers: string[]; supportingBrowsers: string[]; diff --git a/packages/arui-scripts/src/configs/webpack.client.ts b/packages/arui-scripts/src/configs/webpack.client.ts index 69470165..e65e7c29 100644 --- a/packages/arui-scripts/src/configs/webpack.client.ts +++ b/packages/arui-scripts/src/configs/webpack.client.ts @@ -33,6 +33,7 @@ import { addEnvToHtmlTemplate, ClientConfigPlugin } from './client-env-config'; import { patchMainWebpackConfigForModules, patchWebpackConfigForCompat } from './modules'; import postcssConf from './postcss'; import { processAssetsPluginOutput } from './process-assets-plugin-output'; +import { swcClientConfig } from './swc'; const PnpWebpackPlugin = require('pnp-webpack-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); @@ -264,21 +265,41 @@ export const createSingleClientWebpackConfig = ( ? /\.(js|jsx|mjs|cjs)$/ : /\.(js|jsx|mjs|ts|tsx|cjs)$/, include: configs.appSrc, - loader: require.resolve('babel-loader'), - options: { - ...babelConf, - cacheDirectory: mode === 'dev', - cacheCompression: false, - plugins: [ - ...babelConf.plugins, - mode === 'dev' - ? [ - require.resolve('react-refresh/babel'), - { skipEnvCheck: true }, - ] - : undefined, - ].filter(Boolean), - }, + ...(configs.useSwc + ? { + loader: require.resolve('swc-loader'), + options: { + ...swcClientConfig, + jsc: { + ...swcClientConfig.jsc, + transform: { + ...swcClientConfig.jsc?.transform, + react: { + ...swcClientConfig.jsc?.transform?.react, + refresh: mode === 'dev', + }, + }, + }, + }, + } + : { + loader: require.resolve('babel-loader'), + options: { + ...babelConf, + cacheDirectory: mode === 'dev', + cacheCompression: false, + plugins: [ + ...babelConf.plugins, + mode === 'dev' + ? [ + require.resolve('react-refresh/babel'), + { skipEnvCheck: true }, + ] + : undefined, + ].filter(Boolean), + }, + } + ), }, configs.tsconfig && configs.useTscLoader && { @@ -287,10 +308,9 @@ export const createSingleClientWebpackConfig = ( { loader: require.resolve('babel-loader'), options: { + ...babelConf, cacheDirectory: mode === 'dev', cacheCompression: false, - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore plugins: mode === 'dev' ? [ @@ -298,7 +318,6 @@ export const createSingleClientWebpackConfig = ( { skipEnvCheck: true }, ] : undefined, - ...babelConf, }, }, { @@ -321,18 +340,25 @@ export const createSingleClientWebpackConfig = ( { test: /\.(js|mjs)$/, exclude: /@babel(?:\/|\\{1,2})runtime/, - loader: require.resolve('babel-loader'), resolve: { fullySpecified: false, }, - options: { - ...babelDependencies, - babelrc: false, - configFile: false, - compact: false, - cacheDirectory: mode === 'dev', - cacheCompression: false, - }, + ...(configs.useSwc + ? { + loader: require.resolve('swc-loader'), + } + : { + loader: require.resolve('babel-loader'), + options: { + ...babelDependencies, + babelrc: false, + configFile: false, + compact: false, + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, + } + ), }, // process simple css files with postcss loader and css loader { diff --git a/packages/arui-scripts/src/configs/webpack.server.ts b/packages/arui-scripts/src/configs/webpack.server.ts index 673d2b0b..73f58b17 100644 --- a/packages/arui-scripts/src/configs/webpack.server.ts +++ b/packages/arui-scripts/src/configs/webpack.server.ts @@ -11,12 +11,13 @@ import webpack, { Configuration } from 'webpack'; import nodeExternals from 'webpack-node-externals'; import getEntry from './util/get-entry'; +import { getWebpackCacheDependencies } from './util/get-webpack-cache-dependencies'; import configs from './app-configs'; import { babelDependencies } from './babel-dependencies'; import babelConf from './babel-server'; import postcssConf from './postcss'; import { serverExternalsExemptions } from './server-externals-exemptions'; -import { getWebpackCacheDependencies } from './util/get-webpack-cache-dependencies'; +import { swcServerConfig } from './swc'; const ReloadServerPlugin = require('../plugins/reload-server-webpack-plugin'); const WatchMissingNodeModulesPlugin = require('../plugins/watch-missing-node-modules-plugin'); @@ -130,14 +131,21 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ { test: configs.useTscLoader ? /\.(js|jsx|mjs)$/ : /\.(js|jsx|mjs|ts|tsx)$/, include: configs.appSrc, - loader: require.resolve('babel-loader'), - options: { - ...babelConf, - // This is a feature of `babel-loader` for webpack (not Babel itself). - // It enables caching results in ./node_modules/.cache/babel-loader/ - // directory for faster rebuilds. - cacheDirectory: mode === 'dev', - }, + ...(configs.useSwc + ? { + loader: require.resolve('swc-loader'), + options: swcServerConfig, + } + : { + loader: require.resolve('babel-loader'), + options: { + ...babelConf, + // This is a feature of `babel-loader` for webpack (not Babel itself). + // It enables caching results in ./node_modules/.cache/babel-loader/ + // directory for faster rebuilds. + cacheDirectory: mode === 'dev', + }, + }), }, configs.tsconfig && configs.useTscLoader && { @@ -169,18 +177,24 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ { test: /\.(js|mjs)$/, exclude: /@babel(?:\/|\\{1,2})runtime/, - loader: require.resolve('babel-loader'), resolve: { fullySpecified: false, }, - options: { - ...babelDependencies, - babelrc: false, - configFile: false, - compact: false, - cacheDirectory: mode === 'dev', - cacheCompression: false, - }, + ...(configs.useSwc + ? { + loader: require.resolve('swc-loader'), + } + : { + loader: require.resolve('babel-loader'), + options: { + ...babelDependencies, + babelrc: false, + configFile: false, + compact: false, + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, + }), }, // replace css imports with empty files { diff --git a/packages/example-modules/arui-scripts.config.ts b/packages/example-modules/arui-scripts.config.ts index 439744e0..b73bb6c9 100644 --- a/packages/example-modules/arui-scripts.config.ts +++ b/packages/example-modules/arui-scripts.config.ts @@ -10,6 +10,7 @@ const aruiScriptsConfig: PackageSettings = { clientEntry: './src/client', componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, + useSwc: true, debug: true, compatModules: { shared: { diff --git a/packages/example/arui-scripts.config.ts b/packages/example/arui-scripts.config.ts index 36389aec..4a38c4f3 100644 --- a/packages/example/arui-scripts.config.ts +++ b/packages/example/arui-scripts.config.ts @@ -8,6 +8,7 @@ const aruiScriptsConfig: PackageSettings = { componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, debug: true, + useSwc: true, compatModules: { shared: { 'react': 'react', diff --git a/packages/example/src/utils.ts b/packages/example/src/utils.ts index 31ab60a6..aaa23759 100644 --- a/packages/example/src/utils.ts +++ b/packages/example/src/utils.ts @@ -23,6 +23,18 @@ export function testOptionalChaining(smth: OptionalChainingTest) { return smth?.foo?.bar; } +export class SomethingWithPrivateFields { + #name = 'really private'; + + getName() { + return this.#name; + } +} + +export function withNullishCoalescing(something: null | string) { + return something ?? 'other value'; +} + export const constObject = { name: 'someString', } as const; diff --git a/yarn.lock b/yarn.lock index 402568e5..debbc428 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3588,6 +3588,15 @@ __metadata: languageName: node linkType: hard +"@jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + checksum: 681bc761fa1d6fa3dd77578d444f97f28296ea80755e90e46d1c8fa68661b9e67f54dd38b988742db636d26cf160450dc6011892cec98b3a7ceb58cad8ff3aae + languageName: node + linkType: hard + "@jest/environment@npm:^28.1.3": version: 28.1.3 resolution: "@jest/environment@npm:28.1.3" @@ -4145,6 +4154,151 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-darwin-arm64@npm:1.6.13" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-darwin-x64@npm:1.6.13" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.13" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-linux-arm64-gnu@npm:1.6.13" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-linux-arm64-musl@npm:1.6.13" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-linux-x64-gnu@npm:1.6.13" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-linux-x64-musl@npm:1.6.13" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-win32-arm64-msvc@npm:1.6.13" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-win32-ia32-msvc@npm:1.6.13" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.6.13": + version: 1.6.13 + resolution: "@swc/core-win32-x64-msvc@npm:1.6.13" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:~1.6.13": + version: 1.6.13 + resolution: "@swc/core@npm:1.6.13" + dependencies: + "@swc/core-darwin-arm64": 1.6.13 + "@swc/core-darwin-x64": 1.6.13 + "@swc/core-linux-arm-gnueabihf": 1.6.13 + "@swc/core-linux-arm64-gnu": 1.6.13 + "@swc/core-linux-arm64-musl": 1.6.13 + "@swc/core-linux-x64-gnu": 1.6.13 + "@swc/core-linux-x64-musl": 1.6.13 + "@swc/core-win32-arm64-msvc": 1.6.13 + "@swc/core-win32-ia32-msvc": 1.6.13 + "@swc/core-win32-x64-msvc": 1.6.13 + "@swc/counter": ^0.1.3 + "@swc/types": ^0.1.9 + peerDependencies: + "@swc/helpers": "*" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 4b2cddfac17e48ec5afc1942a6a39e9ea5af7fe15b4cebbc72f4569bffbea8ddf66ddf3055a931a6d79e713e3991a0ba9f0c764fc88175358084261dadffe277 + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 + languageName: node + linkType: hard + +"@swc/jest@npm:^0.2.36": + version: 0.2.36 + resolution: "@swc/jest@npm:0.2.36" + dependencies: + "@jest/create-cache-key-function": ^29.7.0 + "@swc/counter": ^0.1.3 + jsonc-parser: ^3.2.0 + peerDependencies: + "@swc/core": "*" + checksum: 14f2e696ac093e23dae1e2e57d894bbcde4de6fe80341a26c8d0d8cbae5aae31832f8fa32dc698529f128d19a76aeedf2227f59480de6dab5eb3f30bfdf9b71a + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.9": + version: 0.1.12 + resolution: "@swc/types@npm:0.1.12" + dependencies: + "@swc/counter": ^0.1.3 + checksum: cf7f89e46f859864075d7965582baea9c5f98830f45b1046251568c9bdf1ca484b1bf37f6d3c32b7c82ecf8cd5df89d22f05268c391819c44e49911bb1a8e71a + languageName: node + linkType: hard + "@testing-library/react-hooks@npm:^8.0.1": version: 8.0.1 resolution: "@testing-library/react-hooks@npm:8.0.1" @@ -6243,6 +6397,8 @@ __metadata: "@babel/runtime": ^7.23.8 "@csstools/postcss-global-data": ^2.0.1 "@pmmmwh/react-refresh-webpack-plugin": 0.5.11 + "@swc/core": ~1.6.13 + "@swc/jest": ^0.2.36 "@types/assets-webpack-plugin": 6.1.2 "@types/case-sensitive-paths-webpack-plugin": 2.1.6 "@types/compression-webpack-plugin": 4.0.1 @@ -6323,6 +6479,8 @@ __metadata: strip-ansi: 6.0.1 style-loader: 3.3.3 stylelint: ^14.9.1 + swc-loader: ^0.2.6 + swc-plugin-coverage-instrument: ^0.0.24 tar: 6.2.1 terser-webpack-plugin: 5.3.9 ts-jest: 28.0.8 @@ -12943,6 +13101,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.2.0": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 81ef19d98d9c6bd6e4a37a95e2753c51c21705cbeffd895e177f4b542cca9cda5fda12fb942a71a2e824a9132cf119dc2e642e9286386055e1365b5478f49a47 + languageName: node + linkType: hard + "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -18445,6 +18610,25 @@ __metadata: languageName: node linkType: hard +"swc-loader@npm:^0.2.6": + version: 0.2.6 + resolution: "swc-loader@npm:0.2.6" + dependencies: + "@swc/counter": ^0.1.3 + peerDependencies: + "@swc/core": ^1.2.147 + webpack: ">=2" + checksum: fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb + languageName: node + linkType: hard + +"swc-plugin-coverage-instrument@npm:^0.0.24": + version: 0.0.24 + resolution: "swc-plugin-coverage-instrument@npm:0.0.24" + checksum: 3f9e775b026d6993a2502450a813ca441b17abd8571219b218773d52bc2d8aa52169b23e3a0598077d5ba919c9abb2dcf6ec0ad925cda8b42a1c4705121a09a0 + languageName: node + linkType: hard + "swiper@npm:^6.8.2": version: 6.8.4 resolution: "swiper@npm:6.8.4" From f6f9cdeec3f78afd866bddaaa7d79ce453fd88ed Mon Sep 17 00:00:00 2001 From: Aleksandr Kitov Date: Wed, 4 Sep 2024 11:49:30 +0300 Subject: [PATCH 2/4] feat(swc): separate configuration option for swc-jest --- .changeset/three-camels-repeat.md | 6 +++++- packages/arui-scripts/docs/overrides.md | 3 +++ packages/arui-scripts/docs/settings.md | 9 ++++++++- .../src/configs/app-configs/get-defaults.ts | 3 ++- packages/arui-scripts/src/configs/app-configs/types.ts | 3 ++- .../src/configs/app-configs/warn-about-deprecations.ts | 8 ++++++++ packages/arui-scripts/src/configs/jest/settings.js | 10 +++++----- packages/arui-scripts/src/configs/swc.ts | 2 ++ .../arui-scripts/src/configs/util/apply-overrides.ts | 1 + packages/arui-scripts/src/configs/webpack.client.ts | 10 ++++++++-- packages/arui-scripts/src/configs/webpack.server.ts | 4 ++-- packages/example-modules/arui-scripts.config.ts | 3 ++- packages/example/arui-scripts.config.ts | 3 ++- 13 files changed, 50 insertions(+), 15 deletions(-) diff --git a/.changeset/three-camels-repeat.md b/.changeset/three-camels-repeat.md index 85030e4c..d2956b79 100644 --- a/.changeset/three-camels-repeat.md +++ b/.changeset/three-camels-repeat.md @@ -2,4 +2,8 @@ 'arui-scripts': minor --- -Добавлен флаг `useSwc` для использования swc-loader и swc-jest для транспиляции кода. Использование swc значительно ускоряет сборку (до 2 раз), без особых негативных последствий. Для большинства проектов миграция на swc будет абсолютно незаметна +Добавлены флаги `useSwcLoader` для использования swc-loader и `jestUseSwc` для использования @swc/jest. + +Использование swc значительно ускоряет сборку (до 2 раз), без особых негативных последствий. + +Для большинства проектов миграция на swc будет абсолютно незаметна diff --git a/packages/arui-scripts/docs/overrides.md b/packages/arui-scripts/docs/overrides.md index 109f16c5..5c80dc06 100644 --- a/packages/arui-scripts/docs/overrides.md +++ b/packages/arui-scripts/docs/overrides.md @@ -72,6 +72,9 @@ export default overrides; - `start.sh` - шаблон entrypoint докер контейнера. Базовый шаблон [тут](../src/templates/start.template.ts). - `serverExternalsExemptions` - список модулей, которые не будут добавлены в список внешних зависимостей сервера. [Подробнее](caveats.md#node-externals). - `html` - шаблон для htmlWebpackPlugin, будет использоваться только в режиме [`clientOnly`](./settings.md#clientonly). +- `swc-client` - конфигурация `swc` для клиентского кода. Ключи: `swc`, `swcClient`. +- `swc-server` - конфигурация `swc` для серверного кода. Ключи: `swc`, `swcServer`. +- `swc-jest` - конфигурация `swc` для тестов. Ключи: `swc`, `swcJest`. Для некоторых конфигураций определены несколько ключей, они будут применяться в том порядке, в котором они приведены в этом файле. diff --git a/packages/arui-scripts/docs/settings.md b/packages/arui-scripts/docs/settings.md index 4d42e2b2..33be7d1e 100644 --- a/packages/arui-scripts/docs/settings.md +++ b/packages/arui-scripts/docs/settings.md @@ -221,7 +221,7 @@ babel-loader является предпочтительным инструме Добавлять ли инструменты для сборки coverage при сборке. По умолчанию определяется по env переменным - будет выставлено в `true` если `NODE_ENV = 'cypress'` или `USE_ISTANBUL = 'enabled'`. Сбор coverage не будет работать при использовании `useTscLoader=true`. -#### useSwc +#### useSwcLoader Использовать ли swc для обработки js и ts файлов. По умолчанию `false`. Использование swc позволяет значительно ускорить сборку (до 2 раз на больших проектах), но не будет создавать полностью идентичный с babel код. @@ -230,6 +230,13 @@ babel-loader является предпочтительным инструме При включении, swc будет использоваться вместо babel-loader при сборке, а так же для транспиляции файлов в jest. Настройки `useTscLoader` и `jestUseTsJest` имеют приоритет над этой настройкой. +#### jestUseSwc +Позволяет использовать `@swc/jest` вместо `babel-jest` для обработки `ts`/`js` файлов при запуске тестов. По умолчанию `false`. + +Аналогично использованию swc в сборке - значительно ускоряет запуск тестов. + +swc более строго следует спецификациям и [не дает возможности](https://github.com/swc-project/swc/issues/5059) делать `spyOn` для экспортов из esm модулей. + ### Обработка изображений #### dataUrlMaxSize Ресурсы, не превышающие данный размер (в байтах), будут включены в исходники `inline`, иначе вынесены в отдельный файл. По умолчанию `1536`. diff --git a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts index 86c8a334..ba7ce97a 100644 --- a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts +++ b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts @@ -47,11 +47,12 @@ export function getDefaultAppConfig(): AppConfigs { // build tuning keepPropTypes: false, useTscLoader: false, - useSwc: false, + useSwcLoader: false, webpack4Compatibility: false, installServerSourceMaps: false, disableDevWebpackTypecheck: true, jestUseTsJest: false, + jestUseSwc: false, collectCoverage: process.env.NODE_ENV === 'cypress' || process.env.USE_ISTANBUL === 'enabled', // image processing diff --git a/packages/arui-scripts/src/configs/app-configs/types.ts b/packages/arui-scripts/src/configs/app-configs/types.ts index 73a1f049..58090055 100644 --- a/packages/arui-scripts/src/configs/app-configs/types.ts +++ b/packages/arui-scripts/src/configs/app-configs/types.ts @@ -42,11 +42,12 @@ export type AppConfigs = { * @deprecated использование ts-loader крайне не рекомендуется - он медленнее и не имеет преимуществ перед babel */ useTscLoader: boolean; - useSwc: boolean; + useSwcLoader: boolean; webpack4Compatibility: boolean; installServerSourceMaps: boolean; disableDevWebpackTypecheck: boolean; jestUseTsJest: boolean; + jestUseSwc: boolean; collectCoverage: boolean; // image processing diff --git a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts index 1577191c..4d4b969c 100644 --- a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts +++ b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts @@ -8,4 +8,12 @@ export function warnAboutDeprecations(config: AppContextWithConfigs) { 'для получения дополнительной информации.' ); } + + if (config.useSwcLoader && config.useTscLoader) { + console.warn('Одновременное использование опций `useSwcLoader` и `useTscLoader` не поддерживается, выберите что-то одно'); + } + + if (config.jestUseSwc && config.jestUseTsJest) { + console.warn('Одновременное использование опций `jestUseSwc` и `jestUseTsJest` не поддерживается, выберите что-то одно'); + } } diff --git a/packages/arui-scripts/src/configs/jest/settings.js b/packages/arui-scripts/src/configs/jest/settings.js index caf7dd26..77a577b1 100644 --- a/packages/arui-scripts/src/configs/jest/settings.js +++ b/packages/arui-scripts/src/configs/jest/settings.js @@ -6,7 +6,7 @@ const fs = require('fs'); const { pathsToModuleNameMapper } = require('ts-jest'); const { parseConfigFileTextToJson } = require('typescript'); -const { swcClientConfig } = require('../swc'); +const { swcJestConfig } = require('../swc'); const configs = require('../app-configs').default; @@ -20,12 +20,12 @@ if (configs.tsconfig) { } let tsxTransformer = require.resolve('./babel-transform'); -const jsTransformer = configs.useSwc - ? [require.resolve('@swc/jest'), swcClientConfig] +const jsTransformer = configs.jestUseSwc + ? [require.resolve('@swc/jest'), swcJestConfig] : require.resolve('./babel-transform'); -if (configs.useSwc) { - tsxTransformer = [require.resolve('@swc/jest'), swcClientConfig]; +if (configs.jestUseSwc) { + tsxTransformer = [require.resolve('@swc/jest'), swcJestConfig]; } if (configs.jestUseTsJest) { tsxTransformer = require.resolve('ts-jest'); diff --git a/packages/arui-scripts/src/configs/swc.ts b/packages/arui-scripts/src/configs/swc.ts index 690ea1df..2dd3b392 100644 --- a/packages/arui-scripts/src/configs/swc.ts +++ b/packages/arui-scripts/src/configs/swc.ts @@ -31,3 +31,5 @@ const swcConfig: Options = { export const swcClientConfig = applyOverrides(['swc', 'swcClient'], swcConfig); export const swcServerConfig = applyOverrides(['swc', 'swcServer'], swcConfig); + +export const swcJestConfig = applyOverrides(['swc', 'swcJest'], swcConfig); diff --git a/packages/arui-scripts/src/configs/util/apply-overrides.ts b/packages/arui-scripts/src/configs/util/apply-overrides.ts index c6264d45..83e564cf 100644 --- a/packages/arui-scripts/src/configs/util/apply-overrides.ts +++ b/packages/arui-scripts/src/configs/util/apply-overrides.ts @@ -31,6 +31,7 @@ type Overrides = { swc: SwcOptions; swcServer: SwcOptions; swcClient: SwcOptions; + swcJest: SwcOptions; postcss: any[]; // TODO: где взять typedef-ы для postcss browsers: string[]; diff --git a/packages/arui-scripts/src/configs/webpack.client.ts b/packages/arui-scripts/src/configs/webpack.client.ts index e65e7c29..0e1db494 100644 --- a/packages/arui-scripts/src/configs/webpack.client.ts +++ b/packages/arui-scripts/src/configs/webpack.client.ts @@ -265,10 +265,12 @@ export const createSingleClientWebpackConfig = ( ? /\.(js|jsx|mjs|cjs)$/ : /\.(js|jsx|mjs|ts|tsx|cjs)$/, include: configs.appSrc, - ...(configs.useSwc + ...(configs.useSwcLoader ? { loader: require.resolve('swc-loader'), options: { + cacheDirectory: mode === 'dev', + cacheCompression: false, ...swcClientConfig, jsc: { ...swcClientConfig.jsc, @@ -343,9 +345,13 @@ export const createSingleClientWebpackConfig = ( resolve: { fullySpecified: false, }, - ...(configs.useSwc + ...(configs.useSwcLoader ? { loader: require.resolve('swc-loader'), + options: { + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, } : { loader: require.resolve('babel-loader'), diff --git a/packages/arui-scripts/src/configs/webpack.server.ts b/packages/arui-scripts/src/configs/webpack.server.ts index 73f58b17..8f0a4be8 100644 --- a/packages/arui-scripts/src/configs/webpack.server.ts +++ b/packages/arui-scripts/src/configs/webpack.server.ts @@ -131,7 +131,7 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ { test: configs.useTscLoader ? /\.(js|jsx|mjs)$/ : /\.(js|jsx|mjs|ts|tsx)$/, include: configs.appSrc, - ...(configs.useSwc + ...(configs.useSwcLoader ? { loader: require.resolve('swc-loader'), options: swcServerConfig, @@ -180,7 +180,7 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ resolve: { fullySpecified: false, }, - ...(configs.useSwc + ...(configs.useSwcLoader ? { loader: require.resolve('swc-loader'), } diff --git a/packages/example-modules/arui-scripts.config.ts b/packages/example-modules/arui-scripts.config.ts index b73bb6c9..38471268 100644 --- a/packages/example-modules/arui-scripts.config.ts +++ b/packages/example-modules/arui-scripts.config.ts @@ -10,7 +10,8 @@ const aruiScriptsConfig: PackageSettings = { clientEntry: './src/client', componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, - useSwc: true, + useSwcLoader: true, + jestUseSwc: true, debug: true, compatModules: { shared: { diff --git a/packages/example/arui-scripts.config.ts b/packages/example/arui-scripts.config.ts index 4a38c4f3..3df0330b 100644 --- a/packages/example/arui-scripts.config.ts +++ b/packages/example/arui-scripts.config.ts @@ -8,7 +8,8 @@ const aruiScriptsConfig: PackageSettings = { componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, debug: true, - useSwc: true, + useSwcLoader: true, + jestUseSwc: true, compatModules: { shared: { 'react': 'react', From ec984ae472717dfbd563731a1d42e232f02822fc Mon Sep 17 00:00:00 2001 From: Aleksandr Kitov Date: Thu, 10 Oct 2024 11:23:33 +0300 Subject: [PATCH 3/4] chore(*): remove console.log --- packages/arui-scripts/src/commands/build/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/arui-scripts/src/commands/build/client.ts b/packages/arui-scripts/src/commands/build/client.ts index 883cc562..0624fb91 100644 --- a/packages/arui-scripts/src/commands/build/client.ts +++ b/packages/arui-scripts/src/commands/build/client.ts @@ -9,7 +9,7 @@ import config from '../../configs/webpack.client.prod'; import { MultiStats } from 'webpack'; console.log(chalk.magenta('Building client...')); -console.time('build client'); + build(config) .then(({ stats, warnings }) => { console.timeEnd('build client'); From 4a60f856415ec313ecc62c1a16106512414931e0 Mon Sep 17 00:00:00 2001 From: Aleksandr Kitov Date: Tue, 15 Oct 2024 13:22:40 +0300 Subject: [PATCH 4/4] refactor(swc): change useSwcLoader option to codeLoader --- .changeset/three-camels-repeat.md | 13 +- packages/arui-scripts/docs/settings.md | 43 ++-- packages/arui-scripts/package.json | 2 +- .../arui-scripts/src/commands/build/client.ts | 1 - .../arui-scripts/src/commands/build/server.ts | 3 +- .../app-configs/calculate-dependent-config.ts | 4 +- .../src/configs/app-configs/get-defaults.ts | 4 +- .../src/configs/app-configs/types.ts | 10 +- .../app-configs/warn-about-deprecations.ts | 11 +- .../arui-scripts/src/configs/jest/settings.js | 60 +++-- .../src/configs/webpack.client.ts | 236 ++++++++++-------- .../src/configs/webpack.server.ts | 162 +++++++----- .../example-modules/arui-scripts.config.ts | 4 +- packages/example/arui-scripts.config.ts | 4 +- yarn.lock | 100 ++++---- 15 files changed, 368 insertions(+), 289 deletions(-) diff --git a/.changeset/three-camels-repeat.md b/.changeset/three-camels-repeat.md index d2956b79..7e15bd88 100644 --- a/.changeset/three-camels-repeat.md +++ b/.changeset/three-camels-repeat.md @@ -2,8 +2,17 @@ 'arui-scripts': minor --- -Добавлены флаги `useSwcLoader` для использования swc-loader и `jestUseSwc` для использования @swc/jest. +Добавляем возможность использовать swc для загрузки кода в webpack и jest. +- Добавлена настройка `codeLoader` для выбора используемого загрузчика кода. +Настройка заменяет собой уже существовавшую `useTscLoader` и добавляет возможность использовать в качестве +загрузчика swc. Использование swc значительно ускоряет сборку (до 2 раз), без особых негативных последствий. -Для большинства проектов миграция на swc будет абсолютно незаметна +- Добавлена настройка `jestCodeTransformer` для выбора обработчика кода для jest. +Заменяет собой `jestUseTsJest` и добавляет возможность использовать `@swc/jest`. swc в jest немного меняет поведение при использовании +spyOn для esm модулей. + +- Флаг `useTscLoader` помечен как deprecated и будет удален в следующем мажорном релизе. Используйте `codeLoader: 'tsc'`. +- Флаг `jestUseTsJest` помечен как deprecated и будет удален в следующем мажорном релизе. Используйте `jestCodeTransformer: 'tsc'`. +- Флаг `webpack4Compatibility` помечен как deprecated и будет удален в следующем мажорном релизе. diff --git a/packages/arui-scripts/docs/settings.md b/packages/arui-scripts/docs/settings.md index 33be7d1e..efb4cad6 100644 --- a/packages/arui-scripts/docs/settings.md +++ b/packages/arui-scripts/docs/settings.md @@ -197,6 +197,8 @@ const settings = { - `/^thrift-services\/proptypes/` #### useTscLoader +**Deprecated** Используйте настройку [codeLoader](#codeloader) + Использовать ts-loader вместо babel-loader для обработки ts файлов. **Не рекомендуется к использованию**. babel-loader является предпочтительным инструментом сборки, его стоят заменять только если в вашем проекте используется неподдерживаемый им синтаксис: @@ -208,35 +210,44 @@ babel-loader является предпочтительным инструме Рекомендуется обновить код проекта до поддерживаемого синтаксиса и использовать babel-loader. +#### codeLoader +Позволяет выбрать какой инструмент использовать для обработки js и ts кода приложения. По умолчанию `babel`. + +Возможные значения: +- `babel` - для всего кода будет использоваться `babel-loader`; +- `tsc` - для ts кода будет использоваться `ts-loader`, для всего остального - `babel-loader`; +- `swc` - для всего кода будет использоваться `swc-loader`. + +`swc` является предпочтительным режимом, дефолты не меняются для сохранения обратной совместимости. +Использование swc позволяет значительно ускорить сборку (до 2 раз на больших проектах), но не будет создавать полностью идентичный с babel код. +Итоговый бандл может получиться немного больше, чем при использовании babel, но разница полностью компенсируется при использовании сжатия. + #### webpack4Compatibility +**Deprecated** Эта настройка будет удалена в будущих версиях скриптов + Включить ли режим совместимости с webpack 4. По умолчанию `false`. Подробнее можно почитать в этом [issue](https://github.com/webpack/webpack/issues/14580). #### installServerSourceMaps Добавлять ли в серверную сборку пакет source-map-support. По умолчанию `false`. #### jestUseTsJest +**Deprecated** Используйте настройку [jestCodeTransformer](#jestcodetransformer) + Позволяет использовать `ts-jest` вместо `babel-jest` для обработки `ts` файлов при запуске тестов. По умолчанию `false`. +#### jestCodeTransformer +Позволяет выбрать какой инструмент использовать для обработки js и ts кода приложения при запуске тестов. По умолчанию `babel`. + +Возможные значения: +- `babel` - для всего кода будет использоваться `babel-jest`; +- `tsc` - для ts кода будет использоваться `ts-jest`, для всего остального - `babel-jest`; +- `swc` - для всего кода будет использоваться `@swc/jest`. + Swc более строго следует спецификациям и [не дает возможности](https://github.com/swc-project/swc/issues/5059) делать `spyOn` для экспортов из esm модулей. + #### collectCoverage Добавлять ли инструменты для сборки coverage при сборке. По умолчанию определяется по env переменным - будет выставлено в `true` если `NODE_ENV = 'cypress'` или `USE_ISTANBUL = 'enabled'`. Сбор coverage не будет работать при использовании `useTscLoader=true`. -#### useSwcLoader -Использовать ли swc для обработки js и ts файлов. По умолчанию `false`. - -Использование swc позволяет значительно ускорить сборку (до 2 раз на больших проектах), но не будет создавать полностью идентичный с babel код. -Итоговый может получиться немного больше, чем при использовании babel, но разница полностью компенсируется при использовании сжатия. - -При включении, swc будет использоваться вместо babel-loader при сборке, а так же для транспиляции файлов в jest. -Настройки `useTscLoader` и `jestUseTsJest` имеют приоритет над этой настройкой. - -#### jestUseSwc -Позволяет использовать `@swc/jest` вместо `babel-jest` для обработки `ts`/`js` файлов при запуске тестов. По умолчанию `false`. - -Аналогично использованию swc в сборке - значительно ускоряет запуск тестов. - -swc более строго следует спецификациям и [не дает возможности](https://github.com/swc-project/swc/issues/5059) делать `spyOn` для экспортов из esm модулей. - ### Обработка изображений #### dataUrlMaxSize Ресурсы, не превышающие данный размер (в байтах), будут включены в исходники `inline`, иначе вынесены в отдельный файл. По умолчанию `1536`. diff --git a/packages/arui-scripts/package.json b/packages/arui-scripts/package.json index 611e403e..f6cf8c3a 100644 --- a/packages/arui-scripts/package.json +++ b/packages/arui-scripts/package.json @@ -38,7 +38,7 @@ "@babel/runtime": "^7.23.8", "@csstools/postcss-global-data": "^2.0.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@swc/core": "~1.6.13", + "@swc/core": "^1.7.35", "@swc/jest": "^0.2.36", "assets-webpack-plugin": "7.1.1", "autoprefixer": "^10.3.16", diff --git a/packages/arui-scripts/src/commands/build/client.ts b/packages/arui-scripts/src/commands/build/client.ts index 0624fb91..38fd5679 100644 --- a/packages/arui-scripts/src/commands/build/client.ts +++ b/packages/arui-scripts/src/commands/build/client.ts @@ -12,7 +12,6 @@ console.log(chalk.magenta('Building client...')); build(config) .then(({ stats, warnings }) => { - console.timeEnd('build client'); if (warnings.length) { console.log(chalk.yellow('Client compiled with warnings.\n')); console.log(warnings.join('\n\n')); diff --git a/packages/arui-scripts/src/commands/build/server.ts b/packages/arui-scripts/src/commands/build/server.ts index 601238cb..512ad175 100644 --- a/packages/arui-scripts/src/commands/build/server.ts +++ b/packages/arui-scripts/src/commands/build/server.ts @@ -7,10 +7,9 @@ import build from './build-wrapper'; import config from '../../configs/webpack.server.prod'; console.log(chalk.magenta('Building server...')); -console.time('build server'); + build(config as any) .then(({ warnings }) => { - console.timeEnd('build server'); if (warnings.length) { console.log(chalk.yellow('Server compiled with warnings.\n')); console.log(warnings.join('\n\n')); diff --git a/packages/arui-scripts/src/configs/app-configs/calculate-dependent-config.ts b/packages/arui-scripts/src/configs/app-configs/calculate-dependent-config.ts index a148b87c..007f7a79 100644 --- a/packages/arui-scripts/src/configs/app-configs/calculate-dependent-config.ts +++ b/packages/arui-scripts/src/configs/app-configs/calculate-dependent-config.ts @@ -10,9 +10,11 @@ import { AppConfigs, AppContext } from './types'; /** * Обновление ключей конфига, зависящих от других. Это нужно делать в самый последний момент */ -export function calculateDependentConfig(config: AppConfigs) { +export function calculateDependentConfig(config: AppConfigs): AppConfigs { return { ...config, + codeLoader: config.useTscLoader ? 'tsc' : config.codeLoader, + jestCodeTransformer: config.jestUseTsJest ? 'tsc' : config.jestCodeTransformer, clientPolyfillsEntry: getPolyfills(config), }; } diff --git a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts index ba7ce97a..bbf3d634 100644 --- a/packages/arui-scripts/src/configs/app-configs/get-defaults.ts +++ b/packages/arui-scripts/src/configs/app-configs/get-defaults.ts @@ -47,12 +47,12 @@ export function getDefaultAppConfig(): AppConfigs { // build tuning keepPropTypes: false, useTscLoader: false, - useSwcLoader: false, + codeLoader: 'babel', webpack4Compatibility: false, installServerSourceMaps: false, disableDevWebpackTypecheck: true, jestUseTsJest: false, - jestUseSwc: false, + jestCodeTransformer: 'babel', collectCoverage: process.env.NODE_ENV === 'cypress' || process.env.USE_ISTANBUL === 'enabled', // image processing diff --git a/packages/arui-scripts/src/configs/app-configs/types.ts b/packages/arui-scripts/src/configs/app-configs/types.ts index 58090055..65541fc9 100644 --- a/packages/arui-scripts/src/configs/app-configs/types.ts +++ b/packages/arui-scripts/src/configs/app-configs/types.ts @@ -42,12 +42,18 @@ export type AppConfigs = { * @deprecated использование ts-loader крайне не рекомендуется - он медленнее и не имеет преимуществ перед babel */ useTscLoader: boolean; - useSwcLoader: boolean; + codeLoader: 'babel' | 'tsc' | 'swc'; + /** + * @deprecated эта настройка будет удалена в будущих версиях скриптов + */ webpack4Compatibility: boolean; installServerSourceMaps: boolean; disableDevWebpackTypecheck: boolean; + /** + * @deprecated используйте настройку jestCodeTransformer + */ jestUseTsJest: boolean; - jestUseSwc: boolean; + jestCodeTransformer: 'babel' | 'tsc' | 'swc'; collectCoverage: boolean; // image processing diff --git a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts index 4d4b969c..91404817 100644 --- a/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts +++ b/packages/arui-scripts/src/configs/app-configs/warn-about-deprecations.ts @@ -9,11 +9,10 @@ export function warnAboutDeprecations(config: AppContextWithConfigs) { ); } - if (config.useSwcLoader && config.useTscLoader) { - console.warn('Одновременное использование опций `useSwcLoader` и `useTscLoader` не поддерживается, выберите что-то одно'); - } - - if (config.jestUseSwc && config.jestUseTsJest) { - console.warn('Одновременное использование опций `jestUseSwc` и `jestUseTsJest` не поддерживается, выберите что-то одно'); + if (config.webpack4Compatibility) { + console.warn( + 'Опция `webpack4Compatibility` будет удалена в будущих версиях arui-scripts.', + 'Обратитесь к issue в webpack https://github.com/webpack/webpack/issues/14580 для получения дополнительной информации', + ); } } diff --git a/packages/arui-scripts/src/configs/jest/settings.js b/packages/arui-scripts/src/configs/jest/settings.js index 77a577b1..e7ae6303 100644 --- a/packages/arui-scripts/src/configs/jest/settings.js +++ b/packages/arui-scripts/src/configs/jest/settings.js @@ -10,27 +10,6 @@ const { swcJestConfig } = require('../swc'); const configs = require('../app-configs').default; -let tsConfigPaths = {}; - -if (configs.tsconfig) { - const tsConfigText = fs.readFileSync(configs.tsconfig, 'utf8'); - const tsConfig = parseConfigFileTextToJson(configs.tsconfig, tsConfigText); - - tsConfigPaths = tsConfig.config.compilerOptions?.paths || {}; -} - -let tsxTransformer = require.resolve('./babel-transform'); -const jsTransformer = configs.jestUseSwc - ? [require.resolve('@swc/jest'), swcJestConfig] - : require.resolve('./babel-transform'); - -if (configs.jestUseSwc) { - tsxTransformer = [require.resolve('@swc/jest'), swcJestConfig]; -} -if (configs.jestUseTsJest) { - tsxTransformer = require.resolve('ts-jest'); -} - module.exports = { testRegex: 'src/.*(((/__test__/|/__tests__/).*)|(test|spec|tests)).(jsx?|tsx?)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], @@ -39,15 +18,15 @@ module.exports = { url: 'http://localhost', }, transform: { - '^.+\\.jsx?$': jsTransformer, - '^.+\\.mjs$': jsTransformer, - '^.+\\.tsx?$': tsxTransformer, + '^.+\\.jsx?$': getJsTransformer(), + '^.+\\.mjs$': getJsTransformer(), + '^.+\\.tsx?$': getTsTransformer(), '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': require.resolve('./file-transform'), }, moduleNameMapper: { // replace all css files with simple empty exports '\\.css$': require.resolve('./css-mock'), - ...pathsToModuleNameMapper(tsConfigPaths, { prefix: '/' }), + ...pathsToModuleNameMapper(getPathMapping(), { prefix: '/' }), }, snapshotSerializers: [require.resolve('jest-snapshot-serializer-class-name-to-string')], globals: { @@ -56,3 +35,34 @@ module.exports = { }, }, }; + +function getPathMapping() { + if (!configs.tsconfig) { + return {}; + } + + const tsConfigText = fs.readFileSync(configs.tsconfig, 'utf8'); + const tsConfig = parseConfigFileTextToJson(configs.tsconfig, tsConfigText); + + return tsConfig.config.compilerOptions?.paths || {}; +} + +function getTsTransformer() { + if (configs.jestCodeTransformer === 'tsc') { + return require.resolve('ts-jest'); + } + + if (configs.jestCodeTransformer === 'swc') { + return [require.resolve('@swc/jest'), swcJestConfig]; + } + + return require.resolve('./babel-transform') +} + +function getJsTransformer() { + if (configs.jestCodeTransformer === 'swc') { + return [require.resolve('@swc/jest'), swcJestConfig]; + } + + return require.resolve('./babel-transform'); +} diff --git a/packages/arui-scripts/src/configs/webpack.client.ts b/packages/arui-scripts/src/configs/webpack.client.ts index 0e1db494..56e5d9d3 100644 --- a/packages/arui-scripts/src/configs/webpack.client.ts +++ b/packages/arui-scripts/src/configs/webpack.client.ts @@ -259,113 +259,12 @@ export const createSingleClientWebpackConfig = ( // match the requirements. When no loader matches it will fall // back to the "file" loader at the end of the loader list. oneOf: [ - // Process JS with Babel. - { - test: configs.useTscLoader - ? /\.(js|jsx|mjs|cjs)$/ - : /\.(js|jsx|mjs|ts|tsx|cjs)$/, - include: configs.appSrc, - ...(configs.useSwcLoader - ? { - loader: require.resolve('swc-loader'), - options: { - cacheDirectory: mode === 'dev', - cacheCompression: false, - ...swcClientConfig, - jsc: { - ...swcClientConfig.jsc, - transform: { - ...swcClientConfig.jsc?.transform, - react: { - ...swcClientConfig.jsc?.transform?.react, - refresh: mode === 'dev', - }, - }, - }, - }, - } - : { - loader: require.resolve('babel-loader'), - options: { - ...babelConf, - cacheDirectory: mode === 'dev', - cacheCompression: false, - plugins: [ - ...babelConf.plugins, - mode === 'dev' - ? [ - require.resolve('react-refresh/babel'), - { skipEnvCheck: true }, - ] - : undefined, - ].filter(Boolean), - }, - } - ), - }, - configs.tsconfig && - configs.useTscLoader && { - test: /\.tsx?$/, - use: [ - { - loader: require.resolve('babel-loader'), - options: { - ...babelConf, - cacheDirectory: mode === 'dev', - cacheCompression: false, - plugins: - mode === 'dev' - ? [ - require.resolve('react-refresh/babel'), - { skipEnvCheck: true }, - ] - : undefined, - }, - }, - { - loader: require.resolve('ts-loader'), - options: { - getCustomTransformers: () => ({ - before: - mode === 'dev' ? [ReactRefreshTypeScript()] : [], - }), - onlyCompileBundledFiles: true, - transpileOnly: true, - happyPackMode: true, - configFile: configs.tsconfig, - }, - }, - ], - }, - // Process any JS outside of the app with Babel. - // Unlike the application JS, we only compile the standard ES features. - { - test: /\.(js|mjs)$/, - exclude: /@babel(?:\/|\\{1,2})runtime/, - resolve: { - fullySpecified: false, - }, - ...(configs.useSwcLoader - ? { - loader: require.resolve('swc-loader'), - options: { - cacheDirectory: mode === 'dev', - cacheCompression: false, - }, - } - : { - loader: require.resolve('babel-loader'), - options: { - ...babelDependencies, - babelrc: false, - configFile: false, - compact: false, - cacheDirectory: mode === 'dev', - cacheCompression: false, - }, - } - ), - }, + // Обработка основного кода приложения + getCodeLoader(mode), + // обработка ts кода если codeLoader = tsc + getTsLoaderIfEnabled(mode), + // Обработка внешнего для приложения кода (node_modules) + getExternalCodeLoader(mode), // process simple css files with postcss loader and css loader { test: /\.css$/, @@ -479,7 +378,7 @@ export const createSingleClientWebpackConfig = ( ), (mode === 'prod' || !configs.disableDevWebpackTypecheck) && configs.tsconfig !== null && - !configs.useTscLoader && + configs.codeLoader !== 'tsc' && new ForkTsCheckerWebpackPlugin(), // moment.js очень большая библиотека, которая включает в себя массу локализаций, которые мы не используем. // Поэтому мы их просто игнорируем, чтобы не включать в сборку. @@ -595,3 +494,124 @@ export const createClientWebpackConfig = (mode: 'dev' | 'prod') => { return [appWebpackConfig, ...modulesWebpackConfigs]; }; + +function getCodeLoader(mode: 'dev' | 'prod'): webpack.RuleSetRule { + if (configs.codeLoader === 'swc') { + return { + test: /\.(js|jsx|mjs|ts|tsx|cjs)$/, + include: configs.appSrc, + loader: require.resolve('swc-loader'), + options: { + cacheDirectory: mode === 'dev', + cacheCompression: false, + ...swcClientConfig, + jsc: { + ...swcClientConfig.jsc, + transform: { + ...swcClientConfig.jsc?.transform, + react: { + ...swcClientConfig.jsc?.transform?.react, + refresh: mode === 'dev', + }, + }, + }, + }, + }; + } + + return { + test: configs.codeLoader === 'tsc' + ? /\.(js|jsx|mjs|cjs)$/ + : /\.(js|jsx|mjs|ts|tsx|cjs)$/, + include: configs.appSrc, + loader: require.resolve('babel-loader'), + options: { + ...babelConf, + cacheDirectory: mode === 'dev', + cacheCompression: false, + plugins: [ + ...babelConf.plugins, + mode === 'dev' + ? [ + require.resolve('react-refresh/babel'), + { skipEnvCheck: true }, + ] + : undefined, + ].filter(Boolean), + }, + }; +} + +function getTsLoaderIfEnabled(mode: 'dev' | 'prod'): webpack.RuleSetRule | false { + if (configs.codeLoader !== 'tsc' || !configs.tsconfig) { + return false; + } + + return { + test: /\.tsx?$/, + use: [ + { + loader: require.resolve('babel-loader'), + options: { + ...babelConf, + cacheDirectory: mode === 'dev', + cacheCompression: false, + plugins: + mode === 'dev' + ? [ + require.resolve('react-refresh/babel'), + { skipEnvCheck: true }, + ] + : undefined, + }, + }, + { + loader: require.resolve('ts-loader'), + options: { + getCustomTransformers: () => ({ + before: + mode === 'dev' ? [ReactRefreshTypeScript()] : [], + }), + onlyCompileBundledFiles: true, + transpileOnly: true, + happyPackMode: true, + configFile: configs.tsconfig, + }, + }, + ], + } +} + +function getExternalCodeLoader(mode: 'dev' | 'prod'): webpack.RuleSetRule { + const baseLoaderConfig = { + test: /\.(js|mjs)$/, + exclude: /@babel(?:\/|\\{1,2})runtime/, + resolve: { + fullySpecified: false, + }, + }; + + if (configs.codeLoader === 'swc') { + return { + ...baseLoaderConfig, + loader: require.resolve('swc-loader'), + options: { + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, + }; + } + + return { + ...baseLoaderConfig, + loader: require.resolve('babel-loader'), + options: { + ...babelDependencies, + babelrc: false, + configFile: false, + compact: false, + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, + }; +} diff --git a/packages/arui-scripts/src/configs/webpack.server.ts b/packages/arui-scripts/src/configs/webpack.server.ts index 8f0a4be8..3fd34299 100644 --- a/packages/arui-scripts/src/configs/webpack.server.ts +++ b/packages/arui-scripts/src/configs/webpack.server.ts @@ -127,75 +127,12 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ rules: [ { oneOf: [ - // Process JS with Babel. - { - test: configs.useTscLoader ? /\.(js|jsx|mjs)$/ : /\.(js|jsx|mjs|ts|tsx)$/, - include: configs.appSrc, - ...(configs.useSwcLoader - ? { - loader: require.resolve('swc-loader'), - options: swcServerConfig, - } - : { - loader: require.resolve('babel-loader'), - options: { - ...babelConf, - // This is a feature of `babel-loader` for webpack (not Babel itself). - // It enables caching results in ./node_modules/.cache/babel-loader/ - // directory for faster rebuilds. - cacheDirectory: mode === 'dev', - }, - }), - }, - configs.tsconfig && - configs.useTscLoader && { - test: /\.tsx?$/, - use: [ - { - loader: require.resolve('babel-loader'), - options: { - // This is a feature of `babel-loader` for webpack (not Babel itself). - // It enables caching results in ./node_modules/.cache/babel-loader/ - // directory for faster rebuilds. - cacheDirectory: mode === 'dev', - ...babelConf, - }, - }, - { - loader: require.resolve('ts-loader'), - options: { - onlyCompileBundledFiles: true, - transpileOnly: true, - happyPackMode: true, - configFile: configs.tsconfig, - }, - }, - ], - }, - // Process any JS outside of the app with Babel. - // Unlike the application JS, we only compile the standard ES features. - { - test: /\.(js|mjs)$/, - exclude: /@babel(?:\/|\\{1,2})runtime/, - resolve: { - fullySpecified: false, - }, - ...(configs.useSwcLoader - ? { - loader: require.resolve('swc-loader'), - } - : { - loader: require.resolve('babel-loader'), - options: { - ...babelDependencies, - babelrc: false, - configFile: false, - compact: false, - cacheDirectory: mode === 'dev', - cacheCompression: false, - }, - }), - }, + // Обработка основного кода приложения + getCodeLoader(mode), + // обработка ts кода если codeLoader = tsc + getTsLoaderIfEnabled(mode), + // Обработка внешнего для приложения кода (node_modules) + getExternalCodeLoader(mode), // replace css imports with empty files { test: cssRegex, @@ -283,3 +220,90 @@ export const createServerConfig = (mode: 'dev' | 'prod'): Configuration => ({ hints: false, }, }); + +function getCodeLoader(mode: 'dev' | 'prod'): webpack.RuleSetRule { + if (configs.codeLoader === 'swc') { + return { + test: /\.(js|jsx|mjs|ts|tsx|cjs)$/, + include: configs.appSrc, + loader: require.resolve('swc-loader'), + options: swcServerConfig, + }; + } + + return { + test: configs.codeLoader === 'tsc' + ? /\.(js|jsx|mjs|cjs)$/ + : /\.(js|jsx|mjs|ts|tsx|cjs)$/, + include: configs.appSrc, + loader: require.resolve('babel-loader'), + options: { + ...babelConf, + // This is a feature of `babel-loader` for webpack (not Babel itself). + // It enables caching results in ./node_modules/.cache/babel-loader/ + // directory for faster rebuilds. + cacheDirectory: mode === 'dev', + }, + }; +} + +function getTsLoaderIfEnabled(mode: 'dev' | 'prod'): webpack.RuleSetRule | false { + if (configs.codeLoader !== 'tsc' || !configs.tsconfig) { + return false; + } + + return { + test: /\.tsx?$/, + use: [ + { + loader: require.resolve('babel-loader'), + options: { + // This is a feature of `babel-loader` for webpack (not Babel itself). + // It enables caching results in ./node_modules/.cache/babel-loader/ + // directory for faster rebuilds. + cacheDirectory: mode === 'dev', + ...babelConf, + }, + }, + { + loader: require.resolve('ts-loader'), + options: { + onlyCompileBundledFiles: true, + transpileOnly: true, + happyPackMode: true, + configFile: configs.tsconfig, + }, + }, + ], + }; +} + +function getExternalCodeLoader(mode: 'dev' | 'prod'): webpack.RuleSetRule { + const baseLoaderConfig = { + test: /\.(js|mjs)$/, + exclude: /@babel(?:\/|\\{1,2})runtime/, + resolve: { + fullySpecified: false, + }, + }; + + if (configs.codeLoader === 'swc') { + return { + ...baseLoaderConfig, + loader: require.resolve('swc-loader'), + }; + } + + return { + ...baseLoaderConfig, + loader: require.resolve('babel-loader'), + options: { + ...babelDependencies, + babelrc: false, + configFile: false, + compact: false, + cacheDirectory: mode === 'dev', + cacheCompression: false, + }, + }; +} diff --git a/packages/example-modules/arui-scripts.config.ts b/packages/example-modules/arui-scripts.config.ts index 38471268..60429c78 100644 --- a/packages/example-modules/arui-scripts.config.ts +++ b/packages/example-modules/arui-scripts.config.ts @@ -10,8 +10,8 @@ const aruiScriptsConfig: PackageSettings = { clientEntry: './src/client', componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, - useSwcLoader: true, - jestUseSwc: true, + codeLoader: 'swc', + jestCodeTransformer: 'swc', debug: true, compatModules: { shared: { diff --git a/packages/example/arui-scripts.config.ts b/packages/example/arui-scripts.config.ts index 3df0330b..39c18240 100644 --- a/packages/example/arui-scripts.config.ts +++ b/packages/example/arui-scripts.config.ts @@ -8,8 +8,8 @@ const aruiScriptsConfig: PackageSettings = { componentsTheme: '../../node_modules/@alfalab/core-components/themes/corp.css', keepCssVars: false, debug: true, - useSwcLoader: true, - jestUseSwc: true, + codeLoader: 'swc', + jestCodeTransformer: 'swc', compatModules: { shared: { 'react': 'react', diff --git a/yarn.lock b/yarn.lock index debbc428..c9a1c8fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4154,92 +4154,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-darwin-arm64@npm:1.6.13" +"@swc/core-darwin-arm64@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-darwin-arm64@npm:1.7.35" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-darwin-x64@npm:1.6.13" +"@swc/core-darwin-x64@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-darwin-x64@npm:1.7.35" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.13" +"@swc/core-linux-arm-gnueabihf@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.35" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-linux-arm64-gnu@npm:1.6.13" +"@swc/core-linux-arm64-gnu@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.35" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-linux-arm64-musl@npm:1.6.13" +"@swc/core-linux-arm64-musl@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.35" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-linux-x64-gnu@npm:1.6.13" +"@swc/core-linux-x64-gnu@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.35" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-linux-x64-musl@npm:1.6.13" +"@swc/core-linux-x64-musl@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-linux-x64-musl@npm:1.7.35" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-win32-arm64-msvc@npm:1.6.13" +"@swc/core-win32-arm64-msvc@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.35" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-win32-ia32-msvc@npm:1.6.13" +"@swc/core-win32-ia32-msvc@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.35" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.6.13": - version: 1.6.13 - resolution: "@swc/core-win32-x64-msvc@npm:1.6.13" +"@swc/core-win32-x64-msvc@npm:1.7.35": + version: 1.7.35 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.35" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:~1.6.13": - version: 1.6.13 - resolution: "@swc/core@npm:1.6.13" +"@swc/core@npm:^1.7.35": + version: 1.7.35 + resolution: "@swc/core@npm:1.7.35" dependencies: - "@swc/core-darwin-arm64": 1.6.13 - "@swc/core-darwin-x64": 1.6.13 - "@swc/core-linux-arm-gnueabihf": 1.6.13 - "@swc/core-linux-arm64-gnu": 1.6.13 - "@swc/core-linux-arm64-musl": 1.6.13 - "@swc/core-linux-x64-gnu": 1.6.13 - "@swc/core-linux-x64-musl": 1.6.13 - "@swc/core-win32-arm64-msvc": 1.6.13 - "@swc/core-win32-ia32-msvc": 1.6.13 - "@swc/core-win32-x64-msvc": 1.6.13 + "@swc/core-darwin-arm64": 1.7.35 + "@swc/core-darwin-x64": 1.7.35 + "@swc/core-linux-arm-gnueabihf": 1.7.35 + "@swc/core-linux-arm64-gnu": 1.7.35 + "@swc/core-linux-arm64-musl": 1.7.35 + "@swc/core-linux-x64-gnu": 1.7.35 + "@swc/core-linux-x64-musl": 1.7.35 + "@swc/core-win32-arm64-msvc": 1.7.35 + "@swc/core-win32-ia32-msvc": 1.7.35 + "@swc/core-win32-x64-msvc": 1.7.35 "@swc/counter": ^0.1.3 - "@swc/types": ^0.1.9 + "@swc/types": ^0.1.13 peerDependencies: "@swc/helpers": "*" dependenciesMeta: @@ -4266,7 +4266,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 4b2cddfac17e48ec5afc1942a6a39e9ea5af7fe15b4cebbc72f4569bffbea8ddf66ddf3055a931a6d79e713e3991a0ba9f0c764fc88175358084261dadffe277 + checksum: d3482664c500b55c2efbb3d171616451c6b8868dce1dab5c632c5156bc6f72938531ab898ad8e5b3067ac8a2f5702ae1a5aed1ff6d0abb93f6711d9665752e51 languageName: node linkType: hard @@ -4290,12 +4290,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.9": - version: 0.1.12 - resolution: "@swc/types@npm:0.1.12" +"@swc/types@npm:^0.1.13": + version: 0.1.13 + resolution: "@swc/types@npm:0.1.13" dependencies: "@swc/counter": ^0.1.3 - checksum: cf7f89e46f859864075d7965582baea9c5f98830f45b1046251568c9bdf1ca484b1bf37f6d3c32b7c82ecf8cd5df89d22f05268c391819c44e49911bb1a8e71a + checksum: 4d9ef0fba20e410bee38b20b60eeb284a1284c1cf6b5f84754b6f5e467e5e0621e2db67dc31e22c524a8d63f36d0a1d530126cd97752a85f140d91bf53553e01 languageName: node linkType: hard @@ -6397,7 +6397,7 @@ __metadata: "@babel/runtime": ^7.23.8 "@csstools/postcss-global-data": ^2.0.1 "@pmmmwh/react-refresh-webpack-plugin": 0.5.11 - "@swc/core": ~1.6.13 + "@swc/core": ^1.7.35 "@swc/jest": ^0.2.36 "@types/assets-webpack-plugin": 6.1.2 "@types/case-sensitive-paths-webpack-plugin": 2.1.6