From 9f350541bf84a634499a9af53449015f34da26b5 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Wed, 27 Aug 2025 16:19:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(cli):=20=E6=94=AF=E6=8C=81tmagic.config.lo?= =?UTF-8?q?cal=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=E4=BC=9A?= =?UTF-8?q?=E4=B8=8Etmagic.config=E9=85=8D=E7=BD=AE=E5=90=88=E5=B9=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E7=94=A8=E4=BA=8E=E6=9C=AC=E5=9C=B0=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=97=B6=E7=9A=84=E4=B8=B4=E6=97=B6=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli/package.json | 1 + packages/cli/src/commands/index.ts | 33 ++++++++++++++------ packages/cli/src/utils/resolveAppPackages.ts | 16 ++++++++-- pnpm-lock.yaml | 17 ++++++++++ 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 597d1633..ddc77e20 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -30,6 +30,7 @@ "chokidar": "^3.6.0", "esbuild": "^0.21.5", "fs-extra": "^11.2.0", + "merge-options": "^3.0.4", "picocolors": "^1.1.1", "recast": "^0.23.11", "tslib": "^2.8.0" diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 00e87cfe..4b4d967b 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -1,6 +1,8 @@ import path from 'node:path'; import fs from 'fs-extra'; +// @ts-ignore +import mergeOptions from 'merge-options'; import App from '../Core'; import { UserConfig } from '../types'; @@ -22,18 +24,29 @@ export const scripts = (defaultAppConfig: UserConfig) => { path.resolve(defaultAppConfig.temp, 'config.cjs'), ].find((item) => fs.pathExistsSync(item)); - const { npmConfig = {}, ...userConfig } = await loadUserConfig(userConfigPath); + const localUserConfigPath = [ + path.resolve(defaultAppConfig.source, 'tmagic.config.local.ts'), + path.resolve(defaultAppConfig.source, 'tmagic.config.local.js'), + path.resolve(defaultAppConfig.source, 'tmagic.config.local.cjs'), + path.resolve(defaultAppConfig.temp, 'config.local.ts'), + path.resolve(defaultAppConfig.temp, 'config.local.js'), + path.resolve(defaultAppConfig.temp, 'config.local.cjs'), + ].find((item) => fs.pathExistsSync(item)); + + let userConfig = await loadUserConfig(userConfigPath); + + if (localUserConfigPath) { + const localUserConfig = await loadUserConfig(localUserConfigPath); + + if (localUserConfig.packages?.length) { + localUserConfig.packages = [...(userConfig.packages || []), ...localUserConfig.packages]; + } + + userConfig = mergeOptions(userConfig, localUserConfig); + } // resolve the final app config to use - const appConfig = { - ...defaultAppConfig, - ...userConfig, - npmConfig: { - ...(defaultAppConfig.npmConfig || {}), - ...npmConfig, - }, - }; - + const appConfig = mergeOptions(defaultAppConfig, userConfig); const app = new App(appConfig); // clean temp and cache diff --git a/packages/cli/src/utils/resolveAppPackages.ts b/packages/cli/src/utils/resolveAppPackages.ts index bc0ab99f..22555bee 100644 --- a/packages/cli/src/utils/resolveAppPackages.ts +++ b/packages/cli/src/utils/resolveAppPackages.ts @@ -601,10 +601,20 @@ const flattenPackagesConfig = (packages: (string | Record)[]) => const packagesConfig: ([string] | [string, string])[] = []; packages.forEach((item) => { if (typeof item === 'object') { - Object.entries(item).forEach(([key, packagePath]) => { - packagesConfig.push([packagePath, key]); - }); + for (const [key, packagePath] of Object.entries(item)) { + const index = packagesConfig.findIndex(([, k]) => { + return k === key; + }); + if (index > -1) { + packagesConfig[index] = [packagePath, key]; + } else { + packagesConfig.push([packagePath, key]); + } + } } else if (typeof item === 'string') { + if (packagesConfig.find(([k]) => k === item)) { + return; + } packagesConfig.push([item]); } }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fddb5b11..d63e9fa1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,6 +191,9 @@ importers: fs-extra: specifier: ^11.2.0 version: 11.3.0 + merge-options: + specifier: ^3.0.4 + version: 3.0.4 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -5196,6 +5199,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -5509,6 +5516,10 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -11509,6 +11520,8 @@ snapshots: is-obj@2.0.0: {} + is-plain-obj@2.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-reference@3.0.3: @@ -11842,6 +11855,10 @@ snapshots: meow@13.2.0: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + merge-stream@2.0.0: {} merge2@1.4.1: {}