niucloud/admin/scripts/addon-utils.cjs
wangchen14709853322 3e71008192 v2.0-beta-20260626
v2框架公测版测试流程请看v2.0-beta.md
2026-06-26 17:56:38 +08:00

70 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 插件构建公共工具
* - 扫描 src/addon 下目录、视图、语言包
* - 供 generate-addon-entry / build-all / assemble 等脚本复用
*/
const fs = require('fs')
const path = require('path')
/** 项目根目录admin/ */
const ROOT = path.resolve(__dirname, '..')
/** 插件源码根目录 */
const ADDON_DIR = path.join(ROOT, 'src', 'addon')
/** 列出 src/addon 下所有插件 key目录名 */
function listAddonKeys() {
if (!fs.existsSync(ADDON_DIR)) return []
return fs.readdirSync(ADDON_DIR, { withFileTypes: true })
.filter((d) => d.isDirectory())
.map((d) => d.name)
.sort()
}
/** 递归遍历目录,收集满足 filter 的文件相对路径 */
function walkFiles(dir, filter, base = dir) {
const out = []
if (!fs.existsSync(dir)) return out
for (const name of fs.readdirSync(dir)) {
const full = path.join(dir, name)
const stat = fs.statSync(full)
if (stat.isDirectory()) {
out.push(...walkFiles(full, filter, base))
} else if (filter(full)) {
out.push(path.relative(base, full).replace(/\\/g, '/'))
}
}
return out
}
/**
* 扫描插件 views 目录,返回视图路径列表(不含 .vue
* 例order/list、goods/category
*/
function scanAddonViews(key) {
const viewsDir = path.join(ADDON_DIR, key, 'views')
return walkFiles(viewsDir, (f) => f.endsWith('.vue'), viewsDir)
.map((p) => p.replace(/\.vue$/, ''))
}
/**
* 扫描插件 lang 目录
* @returns {Record<string, string[]>} locale -> json 文件名(不含 .json
* 例:{ 'zh-cn': ['common', 'order.list'], 'en': ['common'] }
*/
function scanAddonLang(key) {
const langDir = path.join(ADDON_DIR, key, 'lang')
const out = {}
if (!fs.existsSync(langDir)) return out
for (const locale of fs.readdirSync(langDir)) {
const localeDir = path.join(langDir, locale)
if (!fs.statSync(localeDir).isDirectory()) continue
out[locale] = fs.readdirSync(localeDir)
.filter((f) => f.endsWith('.json'))
.map((f) => f.replace(/\.json$/, ''))
.sort()
}
return out
}
module.exports = { ROOT, ADDON_DIR, listAddonKeys, walkFiles, scanAddonViews, scanAddonLang }