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