diff --git a/packages/cli/bin/tmagic.js b/packages/cli/bin/tmagic.js index 0ec3a70b..01e31984 100755 --- a/packages/cli/bin/tmagic.js +++ b/packages/cli/bin/tmagic.js @@ -10,4 +10,9 @@ cli({ temp: '.tmagic', useTs: true, dynamicImport: false, + npmConfig: { + client: 'npm', + autoInstall: true, + keepPackageJsonClean: true, + }, }); diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 9b9d682e..07cde5e3 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -22,12 +22,16 @@ export const scripts = (defaultAppConfig: UserConfig) => { path.resolve(defaultAppConfig.temp, 'config.cjs'), ].find((item) => fs.pathExistsSync(item)); - const userConfig = await loadUserConfig(userConfigPath); + const { npmConfig = {}, ...userConfig } = await loadUserConfig(userConfigPath); // resolve the final app config to use const appConfig = { ...defaultAppConfig, ...userConfig, + npmConfig: { + ...(defaultAppConfig.npmConfig || {}), + ...npmConfig, + }, }; if (appConfig === null) { diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 1e4c0d58..d0fc8a35 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -38,6 +38,10 @@ export interface NpmConfig { registry?: string; /** pnpm | npm | yarn */ client?: 'npm' | 'yarn' | 'pnpm'; + /** 是否自动安装组件依赖,默认为true */ + autoInstall?: boolean; + /** 安装组件后,npm默认会将依赖写入package.json中,将该值设置为true,则不会写入,默认为true */ + keepPackageJsonClean?: boolean; } export interface ModuleMainFilePath { diff --git a/packages/cli/src/utils/prepareEntryFile.ts b/packages/cli/src/utils/prepareEntryFile.ts index 823c9690..7eb142ae 100644 --- a/packages/cli/src/utils/prepareEntryFile.ts +++ b/packages/cli/src/utils/prepareEntryFile.ts @@ -22,7 +22,13 @@ export const prepareEntryFile = async (app: App) => { } Object.keys(contentMap).forEach((file: string) => { - const fileName = `${file}.${useTs ? 'ts' : 'js'}`; + let fileName = `${file}.ts`; + if (useTs) { + app.writeTemp(fileName, contentMap[file]); + } else { + fileName = `${file}.js`; + app.writeTemp(`${file}.d.ts`, `const type: Record;\n\nexport default type;`); + } app.writeTemp(fileName, contentMap[file]); }); }; diff --git a/packages/cli/src/utils/resolveAppPackages.ts b/packages/cli/src/utils/resolveAppPackages.ts index 32294406..063240b2 100644 --- a/packages/cli/src/utils/resolveAppPackages.ts +++ b/packages/cli/src/utils/resolveAppPackages.ts @@ -82,7 +82,9 @@ export const resolveAppPackages = (app: App): ModuleMainFilePath => { dependencies[moduleName] = version; }; - app.options.packages.forEach((item) => { + const { packages = [], npmConfig = {} } = app.options; + + packages.forEach((item) => { if (typeof item === 'object') { Object.entries(item).forEach(([, packagePath]) => { getDependencies(packagePath); @@ -92,26 +94,26 @@ export const resolveAppPackages = (app: App): ModuleMainFilePath => { } }); - if (Object.keys(dependencies).length) { - const packageFile = path.join(app.options.source, 'package.json'); - const packageBakFile = path.join(app.options.source, 'package.json.bak'); - if (fs.existsSync(packageFile)) { - fs.copyFileSync(packageFile, packageBakFile); - } - - try { + if (npmConfig.autoInstall && Object.keys(dependencies).length) { + if (!npmConfig.keepPackageJsonClean) { npmInstall(dependencies, app.options.source, app.options.npmConfig); - } catch (e) { - error(e as string); - } + } else { + const packageFile = path.join(app.options.source, 'package.json'); + const packageBakFile = path.join(app.options.source, 'package.json.bak'); + if (fs.existsSync(packageFile)) { + fs.copyFileSync(packageFile, packageBakFile); + } - if (fs.existsSync(packageBakFile)) { - fs.unlinkSync(packageFile); - fs.renameSync(packageBakFile, packageFile); + npmInstall(dependencies, app.options.source, app.options.npmConfig); + + if (fs.existsSync(packageBakFile)) { + fs.unlinkSync(packageFile); + fs.renameSync(packageBakFile, packageFile); + } } } - app.options.packages.forEach((item) => { + packages.forEach((item) => { if (typeof item === 'object') { Object.entries(item).forEach(([key, packagePath]) => { setPackages(app.options.source, packagePath, key); @@ -131,26 +133,30 @@ export const resolveAppPackages = (app: App): ModuleMainFilePath => { }; const npmInstall = function (dependencies: Record, cwd: string, npmConfig: NpmConfig = {}) { - const { client = 'npm', registry = 'https://registry.npmjs.org/' } = npmConfig; - const install = { - npm: 'install', - yarn: 'add', - pnpm: 'add', - }[client]; + try { + const { client = 'npm', registry = 'https://registry.npmjs.org/' } = npmConfig; + const install = { + npm: 'install', + yarn: 'add', + pnpm: 'add', + }[client]; - const packages = Object.entries(dependencies) - .map(([name, version]) => `${name}@${version}`) - .join(' '); + const packages = Object.entries(dependencies) + .map(([name, version]) => `${name}@${version}`) + .join(' '); - const command = `${client} ${install} ${packages} --registry ${registry}`; + const command = `${client} ${install} ${packages} --registry ${registry}`; - execInfo(cwd); - execInfo(command); + execInfo(cwd); + execInfo(command); - execSync(command, { - stdio: 'inherit', - cwd, - }); + execSync(command, { + stdio: 'inherit', + cwd, + }); + } catch (e) { + error(e as string); + } }; /**