niucloud/uni-app/scripts/diy-component-scan.cjs
wangchen14709853322 6d9c8ff7f5 v2.0-beta-20260626
v2框架公测版测试流程请看v2.0-beta.md
2026-07-01 12:15:20 +08:00

93 lines
2.7 KiB
JavaScript

/**
* 扫描 app / addon 下 DIY 微页面组件,生成 componentName 映射
*/
const fs = require('fs')
const path = require('path')
const { ROOT, ADDON_DIR, listAddonKeys } = require('./addon-utils.cjs')
function kebabToPascal(folder) {
return folder
.split('-')
.map((s) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : ''))
.join('')
}
function scanDiyFolder(diyDir, filter) {
const out = []
if (!fs.existsSync(diyDir)) return out
for (const name of fs.readdirSync(diyDir)) {
if (filter && !filter(name)) continue
const compDir = path.join(diyDir, name)
if (!fs.statSync(compDir).isDirectory()) continue
if (fs.existsSync(path.join(compDir, 'index.vue'))) {
out.push(name)
}
}
return out.sort()
}
function scanAppDiyComponents() {
const diyDir = path.join(ROOT, 'src', 'app', 'components', 'diy')
return scanDiyFolder(diyDir, (name) => name !== 'group').map((folder) => {
const vueComponentName = kebabToPascal(folder)
return {
vueComponentName,
scope: 'app',
folder,
scrollBool: vueComponentName === 'CarouselSearch',
formRef: vueComponentName.startsWith('Form') && vueComponentName !== 'FormSubmit'
}
})
}
function scanAddonDiyEntries(addonKeys) {
const entries = []
for (const addonKey of addonKeys) {
const diyDir = path.join(ADDON_DIR, addonKey, 'components', 'diy')
for (const folder of scanDiyFolder(diyDir)) {
const vueComponentName = kebabToPascal(folder)
entries.push({
vueComponentName,
scope: 'addon',
addonKey,
folder,
scrollBool: true,
formRef: true
})
}
}
return entries
}
function scanAllDiyComponents(options = {}) {
const addonKeys = options.addonKeys || listAddonKeys()
const app = scanAppDiyComponents()
const addon = scanAddonDiyEntries(addonKeys)
const byName = new Map()
for (const entry of app) {
byName.set(entry.vueComponentName, entry)
}
for (const entry of addon) {
if (byName.has(entry.vueComponentName)) {
console.warn(
`[diy-component-scan] duplicate componentName "${entry.vueComponentName}" (addon/${entry.addonKey} overrides app)`
)
}
byName.set(entry.vueComponentName, entry)
}
return {
app,
addon,
all: [...byName.values()].sort((a, b) => a.vueComponentName.localeCompare(b.vueComponentName))
}
}
module.exports = {
kebabToPascal,
scanAppDiyComponents,
scanAddonDiyEntries,
scanAllDiyComponents
}