build: babel -> swc

This commit is contained in:
EnixCoda 2026-01-18 11:22:54 +08:00
parent d149a4903d
commit 750f8e4462
7 changed files with 768 additions and 1661 deletions

20
.swcrc Normal file
View file

@ -0,0 +1,20 @@
{
"$schema": "https://swc.rs/schema.json",
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": false,
"dynamicImport": true
},
"transform": {
"react": {
"runtime": "automatic"
}
},
"target": "es2022"
},
"module": {
"type": "es6"
}
}

View file

@ -1,26 +0,0 @@
// `.babelrc` is not loaded by babel-loader for files under node_modules, but `babel.config.js` is
module.exports = {
env: {
test: {
plugins: ['babel-plugin-transform-es2015-modules-commonjs'],
},
},
presets: [
[
'@babel/preset-env',
{
modules: false,
targets: {
esmodules: true,
},
exclude: [
'@babel/plugin-transform-async-to-generator',
'@babel/plugin-proposal-object-rest-spread',
],
},
],
'@babel/preset-typescript',
'@babel/preset-react',
],
plugins: ['@babel/plugin-proposal-optional-chaining', '@babel/plugin-proposal-class-properties'],
}

View file

@ -1,9 +1,9 @@
import eslint from "@eslint/js"; import eslint from '@eslint/js'
import tseslint from "typescript-eslint"; import eslintConfigPrettier from 'eslint-config-prettier'
import react from "eslint-plugin-react"; import react from 'eslint-plugin-react'
import reactHooks from "eslint-plugin-react-hooks"; import reactHooks from 'eslint-plugin-react-hooks'
import eslintConfigPrettier from "eslint-config-prettier"; import globals from 'globals'
import globals from "globals"; import tseslint from 'typescript-eslint'
export default tseslint.config( export default tseslint.config(
eslint.configs.recommended, eslint.configs.recommended,
@ -11,31 +11,31 @@ export default tseslint.config(
eslintConfigPrettier, eslintConfigPrettier,
{ {
ignores: [ ignores: [
"dist*/", 'dist*/',
"node_modules/", 'node_modules/',
"Safari/", 'Safari/',
"vscode-icons/", 'vscode-icons/',
"server/", 'server/',
"**/*.d.ts", '**/*.d.ts',
"playwright-report/", 'playwright-report/',
"test-results/", 'test-results/',
], ],
}, },
{ {
files: ["**/*.ts", "**/*.tsx"], files: ['**/*.ts', '**/*.tsx'],
languageOptions: { languageOptions: {
ecmaVersion: "latest", ecmaVersion: 'latest',
sourceType: "module", sourceType: 'module',
globals: { globals: {
...globals.es2022, ...globals.es2022,
}, },
}, },
}, },
{ {
files: ["src/**/*.ts", "src/**/*.tsx"], files: ['src/**/*.ts', 'src/**/*.tsx'],
plugins: { plugins: {
react, react,
"react-hooks": reactHooks, 'react-hooks': reactHooks,
}, },
languageOptions: { languageOptions: {
globals: { globals: {
@ -44,17 +44,17 @@ export default tseslint.config(
}, },
settings: { settings: {
react: { react: {
version: "detect", version: 'detect',
}, },
}, },
rules: { rules: {
...react.configs.recommended.rules, ...react.configs.recommended.rules,
...reactHooks.configs.recommended.rules, ...reactHooks.configs.recommended.rules,
"react-hooks/rules-of-hooks": "off", // for IIFC 'react-hooks/rules-of-hooks': 'off', // for IIFC
}, },
}, },
{ {
files: ["e2e/**/*.ts"], files: ['e2e/**/*.ts'],
languageOptions: { languageOptions: {
globals: { globals: {
...globals.node, ...globals.node,
@ -62,11 +62,37 @@ export default tseslint.config(
}, },
}, },
{ {
files: ["scripts/**/*.js"], files: ['scripts/**/*.js'],
languageOptions: { languageOptions: {
globals: { globals: {
...globals.node, ...globals.node,
}, },
}, },
rules: {
'@typescript-eslint/no-require-imports': 'off',
},
}, },
); {
files: ['scripts/vscode-icons/**/*.js'],
languageOptions: {
globals: {
...globals.node,
...globals.browser,
},
},
rules: {
'@typescript-eslint/no-require-imports': 'off',
},
},
{
files: ['*.config.{js,ts,cjs,cts}', '*.{cjs,cts}'],
languageOptions: {
globals: {
...globals.node,
},
},
rules: {
'@typescript-eslint/no-require-imports': 'off',
},
},
)

View file

@ -142,7 +142,7 @@ module.exports = {
testMatch: ['**/?(*.)+(spec|test).ts?(x)'], testMatch: ['**/?(*.)+(spec|test).ts?(x)'],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
testPathIgnorePatterns: ['/node_modules/', '.d.ts$', '<rootDir>/vscode-icons/'], testPathIgnorePatterns: ['/node_modules/', '.d.ts$', '<rootDir>/vscode-icons/', '<rootDir>/e2e/'],
// The regexp pattern or array of patterns that Jest uses to detect test files // The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [], // testRegex: [],
@ -162,12 +162,27 @@ module.exports = {
// timers: "real", // timers: "real",
// A map from regular expressions to paths to transformers // A map from regular expressions to paths to transformers
// transform: null, transform: {
'^.+\\.(t|j)sx?$': [
'@swc/jest',
{
jsc: {
parser: {
syntax: 'typescript',
tsx: true,
},
transform: {
react: {
runtime: 'automatic',
},
},
},
},
],
},
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [ transformIgnorePatterns: ['/node_modules/(?!(webext-.*|superstruct)/)'],
// "/node_modules/"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined, // unmockedModulePathPatterns: undefined,

View file

@ -11,18 +11,18 @@
"node": ">=18" "node": ">=18"
}, },
"scripts": { "scripts": {
"dev": "VERSION=dev-v$(node scripts/get-version.js) NODE_OPTIONS=--openssl-legacy-provider webpack-dashboard -- webpack --watch", "dev": "VERSION=dev-v$(node scripts/get-version.js) webpack-dashboard -- webpack --watch",
"dev:all": "GITAKO_TARGET= yarn run dev", "dev:all": "GITAKO_TARGET= yarn run dev",
"debug-firefox": "web-ext run --source-dir=dist-firefox --keep-profile-changes --start-url https://github.com/EnixCoda/Gitako", "debug-firefox": "web-ext run --source-dir=dist-firefox --keep-profile-changes --start-url https://github.com/EnixCoda/Gitako",
"prepare": "husky install", "prepare": "husky install",
"postinstall": "patch-package", "postinstall": "patch-package",
"postversion": "sh scripts/post-version.sh", "postversion": "sh scripts/post-version.sh",
"build": "VERSION=v$(node scripts/get-version.js) NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=production webpack", "build": "VERSION=v$(node scripts/get-version.js) NODE_ENV=production webpack",
"build:all": "GITAKO_TARGET= yarn run build", "build:all": "GITAKO_TARGET= yarn run build",
"build:analyze": "ANALYZE= yarn run build", "build:analyze": "ANALYZE= yarn run build",
"test": "playwright test", "test": "playwright test",
"test:ui": "playwright test --ui", "test:ui": "playwright test --ui",
"test:unit": "NODE_ENV=test jest --config jest.config.js" "test:unit": "NODE_ENV=test jest --config jest.config.cjs"
}, },
"dependencies": { "dependencies": {
"@primer/css": "^20.4.3", "@primer/css": "^20.4.3",
@ -45,15 +45,10 @@
"webextension-polyfill": "^0.11.0" "webextension-polyfill": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.17.6",
"@babel/core": "^7.17.9",
"@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/preset-env": "^7.16.11",
"@babel/preset-react": "^7.16.7",
"@babel/preset-typescript": "^7.16.7",
"@playwright/test": "^1.40.0", "@playwright/test": "^1.40.0",
"@sentry/cli": "^1.64.2", "@sentry/cli": "^1.64.2",
"@swc/core": "^1.15.8",
"@swc/jest": "^0.2.39",
"@testing-library/react": "^13.3.0", "@testing-library/react": "^13.3.0",
"@types/dotenv": "^6", "@types/dotenv": "^6",
"@types/firefox-webext-browser": "^120.0.3", "@types/firefox-webext-browser": "^120.0.3",
@ -69,39 +64,38 @@
"@types/styled-components": "^5.1.25", "@types/styled-components": "^5.1.25",
"@typescript-eslint/eslint-plugin": "^8.28.0", "@typescript-eslint/eslint-plugin": "^8.28.0",
"@typescript-eslint/parser": "^8.28.0", "@typescript-eslint/parser": "^8.28.0",
"babel-loader": "^8.2.5",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "^4.0.0",
"copy-webpack-plugin": "^12.0.2", "copy-webpack-plugin": "^13.0.1",
"css-loader": "^2.1.0", "css-loader": "^7.1.2",
"dotenv": "^6.2.0", "dotenv": "^6.2.0",
"dotenv-webpack": "^8.1.0", "dotenv-webpack": "^8.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.0",
"eslint-config-prettier": "^10.1.0", "eslint-config-prettier": "^10.1.0",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"file-loader": "^3.0.1", "file-loader": "^6.2.0",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.1.0",
"globals": "^16.0.0", "globals": "^16.0.0",
"husky": "^8.0.1", "husky": "^8.0.1",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"json-loader": "^0.5.7", "json-loader": "^0.5.7",
"lint-staged": "^13.0.3", "lint-staged": "^13.0.3",
"mini-css-extract-plugin": "^2.9.0", "mini-css-extract-plugin": "^2.10.0",
"patch-package": "^8.0.0", "patch-package": "^8.0.0",
"prettier": "^3.8.0", "prettier": "^3.8.0",
"raw-loader": "^4.0.0", "raw-loader": "^4.0.0",
"sass": "^1.26.2", "sass": "^1.26.2",
"sass-loader": "^8.0.2", "sass-loader": "^16.0.6",
"swc-loader": "^0.2.7",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"typescript-eslint": "^8.53.0", "typescript-eslint": "^8.53.0",
"url-loader": "^1.1.2", "url-loader": "^4.1.1",
"web-ext": "^7.11.0", "web-ext": "^7.11.0",
"webpack": "^5.91.0", "webpack": "^5.104.1",
"webpack-bundle-analyzer": "^4.10.2", "webpack-bundle-analyzer": "^4.10.2",
"webpack-cli": "^5.1.4", "webpack-cli": "^6.0.1",
"webpack-dashboard": "^3.3.8" "webpack-dashboard": "^3.3.8"
}, },
"prettier": { "prettier": {

View file

@ -145,18 +145,23 @@ function createConfig({ envTarget }: { envTarget: Target }) {
rules: [ rules: [
{ {
test: /\.tsx?$/, test: /\.tsx?$/,
loader: 'babel-loader', loader: 'swc-loader',
include: [srcPath], include: [srcPath],
exclude: /node_modules/, exclude: /node_modules/,
sideEffects: false, sideEffects: false,
}, },
{ {
test: /\.[cm]?js$/, test: /\.[cm]?js$/,
loader: 'babel-loader', loader: 'swc-loader',
// Transpile as least files under node_modules // Transpile as least files under node_modules
include: /node_modules\/(webext-.*|superstruct)\/.*\.[cm]?js$/, include: /node_modules\/(webext-.*|superstruct)\/.*\.[cm]?js$/,
options: { options: {
cacheDirectory: true, jsc: {
parser: {
syntax: 'ecmascript',
},
target: 'es2022',
},
}, },
}, },
{ {

2237
yarn.lock

File diff suppressed because it is too large Load diff