From 10b6bb7dcec122f89ad0499bc912a0a1ead6be66 Mon Sep 17 00:00:00 2001 From: GuanMo <13216698987@163.com> Date: Sat, 22 Mar 2025 13:42:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=BD=E5=8A=A0=20npmrc=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E7=94=9F=E6=88=90=20=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E7=BB=84=E4=BB=B6schema=20=E7=9A=84=20npm.npmrc=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=A1=E6=81=AF=E7=94=9F=E6=88=90=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=88=B0=20npmrc=20=E6=96=87=E4=BB=B6=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E6=BB=A1=E8=B6=B3=E7=A7=81=E6=9C=89=E7=BB=84=E4=BB=B6=E5=BA=93?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=8A=A8=E9=95=9C=E5=83=8F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generator/generateApp.js | 8 +- .../src/plugins/genNpmrcPlugin.js | 77 +++++++++++++++++++ packages/vue-generator/src/plugins/index.js | 1 + 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 packages/vue-generator/src/plugins/genNpmrcPlugin.js diff --git a/packages/vue-generator/src/generator/generateApp.js b/packages/vue-generator/src/generator/generateApp.js index e4b360190c..17632bac16 100644 --- a/packages/vue-generator/src/generator/generateApp.js +++ b/packages/vue-generator/src/generator/generateApp.js @@ -10,7 +10,8 @@ import { formatCodePlugin, parseSchemaPlugin, genGlobalState, - appendElePlusStylePlugin + appendElePlusStylePlugin, + genNpmrcPlugin } from '../plugins' import CodeGenerator from './codeGenerator' @@ -32,7 +33,8 @@ export function generateApp(config = {}) { router: genRouterPlugin(config.pluginConfig?.router || {}), utils: genUtilsPlugin(config.pluginConfig?.utils || {}), formatCode: formatCodePlugin(config.pluginConfig?.formatCode || {}), - parseSchema: parseSchemaPlugin(config.pluginConfig?.parseSchema || {}) + parseSchema: parseSchemaPlugin(config.pluginConfig?.parseSchema || {}), + npmrc: genNpmrcPlugin(config.pluginConfig?.npmrc || {}) } const { customPlugins = {} } = config @@ -47,6 +49,7 @@ export function generateApp(config = {}) { utils, formatCode, parseSchema, + npmrc, globalState, transformStart = [], transform = [], @@ -58,6 +61,7 @@ export function generateApp(config = {}) { page: page || defaultPlugins.page, dataSource: dataSource || defaultPlugins.dataSource, dependencies: dependencies || defaultPlugins.dependencies, + npmrc: npmrc || defaultPlugins.npmrc, i18n: i18n || defaultPlugins.i18n, router: router || defaultPlugins.router, utils: utils || defaultPlugins.utils, diff --git a/packages/vue-generator/src/plugins/genNpmrcPlugin.js b/packages/vue-generator/src/plugins/genNpmrcPlugin.js new file mode 100644 index 0000000000..65c3ad59a7 --- /dev/null +++ b/packages/vue-generator/src/plugins/genNpmrcPlugin.js @@ -0,0 +1,77 @@ +import { mergeOptions } from '../utils/mergeOptions' +import { parseImport } from '@/generator/vue/sfc/parseImport' + +const defaultOption = { + fileName: '.npmrc', + path: '.' +} + +const getComponentsSet = (schema) => { + const { pageSchema = [], blockSchema = [] } = schema + let allComponents = [] + + pageSchema.forEach((pageItem) => { + allComponents = allComponents.concat(parseImport(pageItem.children || [])?.components || []) + }) + + blockSchema.forEach((blockItem) => { + allComponents = allComponents.concat(parseImport(blockItem.children || [])?.components || []) + }) + + return new Set(allComponents) +} + +const parseSchema = (schema) => { + const { utils = [], componentsMap = [], packages = [] } = schema + const resNpmMirror = new Set() + const componentsSet = getComponentsSet(schema) + + for (const { package: packageName, npmrc, componentName } of componentsMap) { + if (packageName && !resNpmMirror.has(packageName) && componentsSet.has(componentName)) { + resNpmMirror.add(npmrc) + } + } + + packages.forEach((item) => { + const { package: packageName, npmrc } = item + + if (packageName && !resNpmMirror.has(packageName)) { + resNpmMirror.add(npmrc) + } + }) + + for (const { + type, + content: { package: packageName, npmrc } + } of utils) { + if (type !== 'npm' || resNpmMirror.has(packageName)) { + continue + } + + resNpmMirror.add(npmrc) + } + + return resNpmMirror +} + +function genNpmrcPlugin(options = {}) { + const realOptions = mergeOptions(defaultOption, options) + + const { path, fileName } = realOptions + + return { + name: 'tinyEngine-generateCode-plugin-npmrc', + description: 'transform dependencies to npmrc', + /** + * 分析依赖,写入 npmrc + * @param {import('@opentiny/tiny-engine-dsl-vue').IAppSchema} schema + * @returns + */ + run(schema) { + const npmMirrorList = parseSchema(schema) + this.addFile({ fileType: 'npmrc', fileName, path, fileContent: Array.from(npmMirrorList).join('\n') }, true) + } + } +} + +export default genNpmrcPlugin diff --git a/packages/vue-generator/src/plugins/index.js b/packages/vue-generator/src/plugins/index.js index cfdfeab5a4..fb004808ca 100644 --- a/packages/vue-generator/src/plugins/index.js +++ b/packages/vue-generator/src/plugins/index.js @@ -10,3 +10,4 @@ export { default as formatCodePlugin } from './formatCodePlugin' export { default as genGlobalState } from './genGlobalState' export { default as parseSchemaPlugin } from './parseSchemaPlugin' export { default as appendElePlusStylePlugin } from './appendElePlusStylePlugin' +export { default as genNpmrcPlugin } from './genNpmrcPlugin' \ No newline at end of file