From 0d668c692b64852f7cf701d6175d5d9793e92696 Mon Sep 17 00:00:00 2001 From: Ian Macalinao Date: Thu, 16 Jun 2022 12:31:32 -0500 Subject: [PATCH] build: use TypeScript project references for faster builds (#631) * switch to composite tsconfig * use project references to speed up typechecking, linting, and tests * fix types etc * switch to jest preset --- .eslintrc.cjs | 8 +++++--- jest.config.mjs | 7 +------ package.json | 2 ++ packages/anchor-contrib/tsconfig.json | 3 ++- packages/chai-solana/tsconfig.json | 3 ++- packages/eslint-config-react/tsconfig.json | 2 ++ packages/eslint-config/src/eslint-config.cts | 2 ++ packages/eslint-config/tsconfig.json | 2 ++ packages/option-utils/tsconfig.json | 3 ++- packages/solana-contrib/tsconfig.cjs.json | 10 +++++----- packages/solana-contrib/tsconfig.json | 3 ++- packages/stableswap-sdk/.eslintignore | 2 -- packages/stableswap-sdk/tsconfig.json | 3 ++- packages/token-utils/tsconfig.json | 3 ++- packages/tsconfig/tsconfig.cjs.json | 1 + packages/tsconfig/tsconfig.module.json | 3 ++- packages/tsconfig/tsconfig.module.react.json | 1 + packages/tsconfig/tsconfig.mono.json | 8 ++++++++ packages/tsconfig/tsconfig.react.json | 1 + packages/tuple-utils/tsconfig.json | 3 ++- packages/use-solana/tsconfig.json | 2 ++ packages/wallet-adapter-icons/tsconfig.json | 2 ++ tsconfig.json | 19 +++++++++++++++++-- yarn.lock | 6 ++++-- 24 files changed, 71 insertions(+), 28 deletions(-) delete mode 100644 packages/stableswap-sdk/.eslintignore create mode 100644 packages/tsconfig/tsconfig.mono.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 215ab431c..33add76c9 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,19 +2,21 @@ "use strict"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore require("@rushstack/eslint-patch/modern-module-resolution"); -/** @type import('eslint').Linter.Config */ +/** @type import('@typescript-eslint/utils').TSESLint.Linter.Config */ module.exports = { env: { browser: true, node: true, jest: true, }, - ignorePatterns: ["*.js", "*.cjs"], settings: { react: { version: "18" } }, extends: ["@saberhq/eslint-config-react"], parserOptions: { - project: "tsconfig.json", + project: ["tsconfig.json", "./**/tsconfig*.json"], + EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true, }, }; diff --git a/jest.config.mjs b/jest.config.mjs index 36c865b60..3ebca12fd 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -2,15 +2,10 @@ /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ export default { - preset: "ts-jest", - testEnvironment: "node", - extensionsToTreatAsEsm: [".ts"], + preset: "ts-jest/presets/default-esm", globals: { "ts-jest": { useESM: true, - tsconfig: { - types: ["node", "jest"], - }, }, }, moduleNameMapper: { diff --git a/package.json b/package.json index f052d222f..5ce90159b 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@rushstack/eslint-patch": "^1.1.3", "@saberhq/eslint-config": "workspace:*", "@saberhq/eslint-config-react": "workspace:*", + "@saberhq/tsconfig": "workspace:*", "@saberhq/use-solana": "workspace:*", "@size-limit/file": "^7.0.8", "@size-limit/webpack": "^7.0.8", @@ -34,6 +35,7 @@ "@types/react": "^18.0.13", "@types/source-map-support": "^0.5.4", "@types/w3c-web-usb": "^1.0.6", + "@typescript-eslint/utils": "^5.28.0", "@yarnpkg/doctor": "^3.1.3", "bn.js": "^5.2.1", "buffer": "^6.0.3", diff --git a/packages/anchor-contrib/tsconfig.json b/packages/anchor-contrib/tsconfig.json index 92a4c1e6e..6435516f9 100644 --- a/packages/anchor-contrib/tsconfig.json +++ b/packages/anchor-contrib/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"] diff --git a/packages/chai-solana/tsconfig.json b/packages/chai-solana/tsconfig.json index 92a4c1e6e..6435516f9 100644 --- a/packages/chai-solana/tsconfig.json +++ b/packages/chai-solana/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"] diff --git a/packages/eslint-config-react/tsconfig.json b/packages/eslint-config-react/tsconfig.json index 65f98a4d6..7e450cc84 100644 --- a/packages/eslint-config-react/tsconfig.json +++ b/packages/eslint-config-react/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "@saberhq/tsconfig/tsconfig.cjs.json", "compilerOptions": { + "rootDir": "src/", + "composite": true, "outDir": "dist/cjs/", "types": ["node"] }, diff --git a/packages/eslint-config/src/eslint-config.cts b/packages/eslint-config/src/eslint-config.cts index 4582cb076..7a44829f6 100644 --- a/packages/eslint-config/src/eslint-config.cts +++ b/packages/eslint-config/src/eslint-config.cts @@ -1,3 +1,5 @@ +import "@typescript-eslint/eslint-plugin"; + import type { Linter } from "eslint"; const config: Linter.Config = { diff --git a/packages/eslint-config/tsconfig.json b/packages/eslint-config/tsconfig.json index 65f98a4d6..7e450cc84 100644 --- a/packages/eslint-config/tsconfig.json +++ b/packages/eslint-config/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "@saberhq/tsconfig/tsconfig.cjs.json", "compilerOptions": { + "rootDir": "src/", + "composite": true, "outDir": "dist/cjs/", "types": ["node"] }, diff --git a/packages/option-utils/tsconfig.json b/packages/option-utils/tsconfig.json index 92a4c1e6e..6435516f9 100644 --- a/packages/option-utils/tsconfig.json +++ b/packages/option-utils/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"] diff --git a/packages/solana-contrib/tsconfig.cjs.json b/packages/solana-contrib/tsconfig.cjs.json index 39b8c86ae..af9993cfc 100644 --- a/packages/solana-contrib/tsconfig.cjs.json +++ b/packages/solana-contrib/tsconfig.cjs.json @@ -1,8 +1,8 @@ { - "extends": "./tsconfig.json", + "extends": "@saberhq/tsconfig/tsconfig.cjs.json", "compilerOptions": { - "module": "CommonJS", - "moduleResolution": "node", - "outDir": "dist/cjs/" - } + "outDir": "dist/cjs/", + "lib": ["ES2021.Promise", "ES2019"] + }, + "include": ["src/"] } diff --git a/packages/solana-contrib/tsconfig.json b/packages/solana-contrib/tsconfig.json index 3edf45c5b..74ed5b6e5 100644 --- a/packages/solana-contrib/tsconfig.json +++ b/packages/solana-contrib/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/", "lib": ["ES2021.Promise", "ES2019"] }, diff --git a/packages/stableswap-sdk/.eslintignore b/packages/stableswap-sdk/.eslintignore deleted file mode 100644 index 706f8603a..000000000 --- a/packages/stableswap-sdk/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -jest.config.ts -babel.config.js diff --git a/packages/stableswap-sdk/tsconfig.json b/packages/stableswap-sdk/tsconfig.json index 06998a2d1..088f7a6c2 100644 --- a/packages/stableswap-sdk/tsconfig.json +++ b/packages/stableswap-sdk/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"], diff --git a/packages/token-utils/tsconfig.json b/packages/token-utils/tsconfig.json index 92a4c1e6e..6435516f9 100644 --- a/packages/token-utils/tsconfig.json +++ b/packages/token-utils/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"] diff --git a/packages/tsconfig/tsconfig.cjs.json b/packages/tsconfig/tsconfig.cjs.json index 13eb2542c..347baf836 100644 --- a/packages/tsconfig/tsconfig.cjs.json +++ b/packages/tsconfig/tsconfig.cjs.json @@ -1,4 +1,5 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.lib.json", "display": "Saber CommonJS TSConfig", "compilerOptions": { diff --git a/packages/tsconfig/tsconfig.module.json b/packages/tsconfig/tsconfig.module.json index a8e98c940..39795d435 100644 --- a/packages/tsconfig/tsconfig.module.json +++ b/packages/tsconfig/tsconfig.module.json @@ -1,7 +1,8 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.lib.json", "display": "Saber Node16 TSConfig (recommended)", "compilerOptions": { - "moduleResolution": "node16" + "moduleResolution": "Node16" } } diff --git a/packages/tsconfig/tsconfig.module.react.json b/packages/tsconfig/tsconfig.module.react.json index e956a953c..f179b621a 100644 --- a/packages/tsconfig/tsconfig.module.react.json +++ b/packages/tsconfig/tsconfig.module.react.json @@ -1,4 +1,5 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.react.json", "display": "Saber Node16 React TSConfig (recommended)", "compilerOptions": { diff --git a/packages/tsconfig/tsconfig.mono.json b/packages/tsconfig/tsconfig.mono.json new file mode 100644 index 000000000..16a1a065f --- /dev/null +++ b/packages/tsconfig/tsconfig.mono.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.module.json", + "display": "Saber Node16 TSConfig for monorepos (recommended)", + "compilerOptions": { + "composite": true + } +} diff --git a/packages/tsconfig/tsconfig.react.json b/packages/tsconfig/tsconfig.react.json index 55e3265d9..9809722ad 100644 --- a/packages/tsconfig/tsconfig.react.json +++ b/packages/tsconfig/tsconfig.react.json @@ -1,4 +1,5 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.lib.json", "display": "Saber Emotion TSConfig", "compilerOptions": { diff --git a/packages/tuple-utils/tsconfig.json b/packages/tuple-utils/tsconfig.json index 92a4c1e6e..6435516f9 100644 --- a/packages/tuple-utils/tsconfig.json +++ b/packages/tuple-utils/tsconfig.json @@ -1,6 +1,7 @@ { - "extends": "@saberhq/tsconfig/tsconfig.module.json", + "extends": "@saberhq/tsconfig/tsconfig.mono.json", "compilerOptions": { + "rootDir": "src/", "outDir": "dist/esm/" }, "include": ["src/"] diff --git a/packages/use-solana/tsconfig.json b/packages/use-solana/tsconfig.json index d7188a156..10eaf3c4b 100644 --- a/packages/use-solana/tsconfig.json +++ b/packages/use-solana/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "@saberhq/tsconfig/tsconfig.react.json", "compilerOptions": { + "rootDir": "src/", + "composite": true, "jsxImportSource": "react", "lib": ["ES2015", "DOM"], "outDir": "dist/esm/", diff --git a/packages/wallet-adapter-icons/tsconfig.json b/packages/wallet-adapter-icons/tsconfig.json index e32bf8be3..9f0d454a7 100644 --- a/packages/wallet-adapter-icons/tsconfig.json +++ b/packages/wallet-adapter-icons/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "@saberhq/tsconfig/tsconfig.module.react.json", "compilerOptions": { + "rootDir": "src/", + "composite": true, "jsxImportSource": "react", "outDir": "dist/esm/", "skipLibCheck": false, diff --git a/tsconfig.json b/tsconfig.json index dc18deb4f..82ec36d0b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,24 @@ { - "extends": "./packages/tsconfig/tsconfig.react.json", + "extends": "@saberhq/tsconfig/tsconfig.react.json", "compilerOptions": { + "allowJs": true, "noEmit": true, "jsxImportSource": "react", "types": ["jest"] }, - "include": ["packages/", "jest.config.mjs"] + "files": ["jest.config.mjs", ".eslintrc.cjs"], + "include": ["./**/*.test.ts"], + "references": [ + { "path": "packages/anchor-contrib/" }, + { "path": "packages/chai-solana/" }, + { "path": "packages/eslint-config/" }, + { "path": "packages/eslint-config-react/" }, + { "path": "packages/option-utils/" }, + { "path": "packages/solana-contrib/" }, + { "path": "packages/stableswap-sdk/" }, + { "path": "packages/token-utils/" }, + { "path": "packages/tuple-utils/" }, + { "path": "packages/use-solana/" }, + { "path": "packages/wallet-adapter-icons/" } + ] } diff --git a/yarn.lock b/yarn.lock index ed1eb50bc..194c69b46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2329,6 +2329,7 @@ __metadata: "@rushstack/eslint-patch": ^1.1.3 "@saberhq/eslint-config": "workspace:*" "@saberhq/eslint-config-react": "workspace:*" + "@saberhq/tsconfig": "workspace:*" "@saberhq/use-solana": "workspace:*" "@size-limit/file": ^7.0.8 "@size-limit/webpack": ^7.0.8 @@ -2343,6 +2344,7 @@ __metadata: "@types/react": ^18.0.13 "@types/source-map-support": ^0.5.4 "@types/w3c-web-usb": ^1.0.6 + "@typescript-eslint/utils": ^5.28.0 "@yarnpkg/doctor": ^3.1.3 bn.js: ^5.2.1 buffer: ^6.0.3 @@ -2435,7 +2437,7 @@ __metadata: languageName: unknown linkType: soft -"@saberhq/tsconfig@workspace:^, @saberhq/tsconfig@workspace:packages/tsconfig": +"@saberhq/tsconfig@workspace:*, @saberhq/tsconfig@workspace:^, @saberhq/tsconfig@workspace:packages/tsconfig": version: 0.0.0-use.local resolution: "@saberhq/tsconfig@workspace:packages/tsconfig" languageName: unknown @@ -3499,7 +3501,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.28.0": +"@typescript-eslint/utils@npm:5.28.0, @typescript-eslint/utils@npm:^5.28.0": version: 5.28.0 resolution: "@typescript-eslint/utils@npm:5.28.0" dependencies: