@windrun-huaiin/dev-scripts 6.4.0 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/{chunk-NO5GUCCS.mjs → chunk-YZIQVKKT.mjs} +57 -3
- package/dist/chunk-YZIQVKKT.mjs.map +1 -0
- package/dist/cli.js +142 -0
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +90 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-NO5GUCCS.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -25,6 +25,60 @@ var DEFAULT_CONFIG = {
|
|
|
25
25
|
output: {
|
|
26
26
|
logDir: "logs",
|
|
27
27
|
verbose: false
|
|
28
|
+
},
|
|
29
|
+
architectureConfig: {
|
|
30
|
+
".": "\u9879\u76EE\u6839\u76EE\u5F55",
|
|
31
|
+
".env.local": "\u672C\u5730\u73AF\u5883\u53D8\u91CF\u914D\u7F6E",
|
|
32
|
+
".eslintrc.json": "ESLint \u4EE3\u7801\u89C4\u8303\u914D\u7F6E",
|
|
33
|
+
".gitignore": "Git\u5FFD\u7565\u6587\u4EF6\u914D\u7F6E",
|
|
34
|
+
".source": "Fuma\u6570\u636E\u6E90Build\u4EA7\u7269",
|
|
35
|
+
"CHANGELOG.md": "\u53D8\u66F4\u8BB0\u5F55",
|
|
36
|
+
"components.json": "\u7EC4\u4EF6\u4F9D\u8D56\u6E05\u5355",
|
|
37
|
+
"dev-scripts.config.json": "dev-scripts\u811A\u672C\u5DE5\u5177\u914D\u7F6E",
|
|
38
|
+
"LICENSE": "\u5F00\u6E90\u8BB8\u53EF\u8BC1",
|
|
39
|
+
"messages": "\u7FFB\u8BD1\u76EE\u5F55",
|
|
40
|
+
"next-env.d.ts": "Next.js\u73AF\u5883\u7C7B\u578B\u58F0\u660E",
|
|
41
|
+
"next.config.ts": "Next.js\u9879\u76EE\u914D\u7F6E",
|
|
42
|
+
"package.json": "\u9879\u76EE\u4F9D\u8D56\u4E0E\u811A\u672C",
|
|
43
|
+
"postcss.config.mjs": "PostCSS \u914D\u7F6E",
|
|
44
|
+
"source.config.ts": "Fuma\u6570\u636E\u6E90\u626B\u63CF\u914D\u7F6E",
|
|
45
|
+
"src": "\u6E90\u7801\u76EE\u5F55",
|
|
46
|
+
"tsconfig.json": "TypeScript\u914D\u7F6E",
|
|
47
|
+
"tsconfig.node.json": "Node.js\u76F8\u5173TypeScript \u914D\u7F6E",
|
|
48
|
+
"logs": "\u65E5\u5FD7\u8F93\u51FA\u76EE\u5F55",
|
|
49
|
+
"apps": "Monorepo\u591A\u5E94\u7528\u76EE\u5F55",
|
|
50
|
+
"packages": "\u5B50\u5DE5\u7A0B\u7EC4\u4EF6\u5E93\u76EE\u5F55",
|
|
51
|
+
"README.md": "\u9879\u76EE\u8BF4\u660E\u6587\u6863",
|
|
52
|
+
"app": "Next.js \u5E94\u7528\u4E3B\u5165\u53E3\u76EE\u5F55",
|
|
53
|
+
"components": "\u9875\u9762\u7EC4\u4EF6",
|
|
54
|
+
"lib": "\u5DE5\u5177\u5305",
|
|
55
|
+
"mdx": "FumaMDX\u6587\u6863",
|
|
56
|
+
"middleware.ts": "\u4E2D\u95F4\u4EF6\u5165\u53E3",
|
|
57
|
+
"i18n.ts": "\u591A\u8BED\u8A00\u914D\u7F6E",
|
|
58
|
+
"globals.css": "\u5168\u5C40\u6837\u5F0F",
|
|
59
|
+
"layout.config.tsx": "\u5E03\u5C40\u914D\u7F6E",
|
|
60
|
+
"layout.tsx": "\u5E03\u5C40",
|
|
61
|
+
"loading.tsx": "\u5168\u5C40\u52A0\u8F7D\u7EC4\u4EF6",
|
|
62
|
+
"hero.tsx": "\u9996\u9875\u5927\u5B57\u7EC4\u4EF6",
|
|
63
|
+
"mdx-components.tsx": "FumaMDX\u7EC4\u4EF6\u5E93(\u81EA\u5B9A\u4E49)",
|
|
64
|
+
"llm-content": "FumaMDX\u590D\u5236\u63A5\u53E3",
|
|
65
|
+
"[locale]": "Nextjs i18n\u8DEF\u7531\u76EE\u5F55",
|
|
66
|
+
"(clerk)": "Clerk\u8BA4\u8BC1",
|
|
67
|
+
"(home)": "\u9996\u9875",
|
|
68
|
+
"[...catchAll]": "\u5168\u5C40404\u9875\u9762",
|
|
69
|
+
"blog": "\u535A\u5BA2",
|
|
70
|
+
"docs": "\u6587\u6863",
|
|
71
|
+
"legal": "\u6CD5\u5F8B",
|
|
72
|
+
"api": "API\u63A5\u53E3",
|
|
73
|
+
"robots.ts": "robots.txt\u751F\u6210\u811A\u672C",
|
|
74
|
+
"sitemap.ts": "\u7F51\u7AD9\u5730\u56FE",
|
|
75
|
+
"appConfig.ts": "\u5E94\u7528\u5168\u5C40\u914D\u7F6E",
|
|
76
|
+
"site-config.ts": "\u7F51\u7AD9\u56FE\u6807\u914D\u7F6E",
|
|
77
|
+
"ioc.mdx": "\u6708\u5EA6/\u7EDF\u8BA1",
|
|
78
|
+
"meta.json": "FumaMDX\u5143\u6570\u636E",
|
|
79
|
+
"nextjs-architecture.mdx": "Next.js\u9879\u76EE\u7ED3\u6784",
|
|
80
|
+
".github": "GitHub \u914D\u7F6E\u76EE\u5F55",
|
|
81
|
+
"workflows": "CI/CD \u5DE5\u4F5C\u6D41\u914D\u7F6E"
|
|
28
82
|
}
|
|
29
83
|
};
|
|
30
84
|
|
|
@@ -926,6 +980,6 @@ async function generateMonthlyBlogSummary(config, articles, iocFile, iocSlug, lo
|
|
|
926
980
|
}
|
|
927
981
|
}
|
|
928
982
|
|
|
929
|
-
export { Logger, checkTranslations, cleanTranslations, generateBlogIndex, loadConfig, validateConfig };
|
|
930
|
-
//# sourceMappingURL=chunk-
|
|
931
|
-
//# sourceMappingURL=chunk-
|
|
983
|
+
export { DEFAULT_CONFIG, Logger, checkTranslations, cleanTranslations, generateBlogIndex, loadConfig, readJsonFile, validateConfig };
|
|
984
|
+
//# sourceMappingURL=chunk-YZIQVKKT.mjs.map
|
|
985
|
+
//# sourceMappingURL=chunk-YZIQVKKT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/index.ts","../src/utils/logger.ts","../src/utils/file-scanner.ts","../src/utils/translation-parser.ts","../src/commands/check-translations.ts","../src/commands/clean-translations.ts","../src/commands/generate-blog-index.ts"],"names":["match","writeFileSync","join","readFileSync"],"mappings":"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","file":"chunk-YZIQVKKT.mjs","sourcesContent":["export interface DevScriptsConfig {\n // i18n config\n i18n: {\n locales: string[]\n defaultLocale: string\n messageRoot: string\n }\n \n // scan config\n scan: {\n include: string[]\n exclude?: string[]\n baseDir?: string\n }\n \n // blog config\n blog?: {\n mdxDir: string\n outputFile?: string\n metaFile?: string\n iocSlug?: string\n prefix?: string\n }\n \n // output config\n output: {\n logDir: string\n verbose?: boolean\n }\n\n // architecture anotion config\n architectureConfig?: Record<string, string>\n}\n\nexport interface PackageJsonDevScripts {\n locales?: string[]\n defaultLocale?: string\n messageRoot?: string\n scanDirs?: string[]\n blogDir?: string\n logDir?: string\n}\n\nexport const DEFAULT_CONFIG: DevScriptsConfig = {\n i18n: {\n locales: ['en', 'zh'],\n defaultLocale: 'en',\n messageRoot: 'messages'\n },\n scan: {\n include: ['src/**/*.{tsx,ts,jsx,js}'],\n exclude: ['src/**/*.d.ts', 'src/**/*.test.ts', 'src/**/*.test.tsx', 'node_modules/**']\n },\n blog: {\n mdxDir: 'src/mdx/blog',\n outputFile: 'index.mdx',\n metaFile: 'meta.json',\n iocSlug: 'ioc',\n prefix: 'blog'\n },\n output: {\n logDir: 'logs',\n verbose: false\n },\n architectureConfig: {\n \".\": \"项目根目录\",\n \".env.local\": \"本地环境变量配置\",\n \".eslintrc.json\": \"ESLint 代码规范配置\",\n \".gitignore\": \"Git忽略文件配置\",\n \".source\": \"Fuma数据源Build产物\",\n \"CHANGELOG.md\": \"变更记录\",\n \"components.json\": \"组件依赖清单\",\n \"dev-scripts.config.json\": \"dev-scripts脚本工具配置\",\n \"LICENSE\": \"开源许可证\",\n \"messages\": \"翻译目录\",\n \"next-env.d.ts\": \"Next.js环境类型声明\",\n \"next.config.ts\": \"Next.js项目配置\",\n \"package.json\": \"项目依赖与脚本\",\n \"postcss.config.mjs\": \"PostCSS 配置\",\n \"source.config.ts\": \"Fuma数据源扫描配置\",\n \"src\": \"源码目录\",\n \"tsconfig.json\": \"TypeScript配置\",\n \"tsconfig.node.json\": \"Node.js相关TypeScript 配置\",\n \"logs\": \"日志输出目录\",\n \"apps\": \"Monorepo多应用目录\",\n \"packages\": \"子工程组件库目录\",\n \"README.md\": \"项目说明文档\",\n \"app\": \"Next.js 应用主入口目录\",\n \"components\": \"页面组件\",\n \"lib\": \"工具包\",\n \"mdx\": \"FumaMDX文档\",\n \"middleware.ts\": \"中间件入口\",\n \"i18n.ts\": \"多语言配置\",\n \"globals.css\": \"全局样式\",\n \"layout.config.tsx\": \"布局配置\",\n \"layout.tsx\": \"布局\",\n \"loading.tsx\": \"全局加载组件\",\n \"hero.tsx\": \"首页大字组件\",\n \"mdx-components.tsx\": \"FumaMDX组件库(自定义)\",\n \"llm-content\": \"FumaMDX复制接口\",\n \"[locale]\": \"Nextjs i18n路由目录\",\n \"(clerk)\": \"Clerk认证\",\n \"(home)\": \"首页\",\n \"[...catchAll]\": \"全局404页面\",\n \"blog\": \"博客\",\n \"docs\": \"文档\",\n \"legal\": \"法律\",\n \"api\": \"API接口\",\n \"robots.ts\": \"robots.txt生成脚本\",\n \"sitemap.ts\": \"网站地图\",\n \"appConfig.ts\": \"应用全局配置\",\n \"site-config.ts\": \"网站图标配置\",\n \"ioc.mdx\": \"月度/统计\",\n \"meta.json\": \"FumaMDX元数据\",\n \"nextjs-architecture.mdx\": \"Next.js项目结构\",\n \".github\": \"GitHub 配置目录\",\n \"workflows\": \"CI/CD 工作流配置\"\n }\n} ","import fs from 'fs'\nimport path from 'path'\nimport { DEFAULT_CONFIG, DevScriptsConfig, PackageJsonDevScripts } from '@dev-scripts/config/schema'\n\n/**\n * load config from package.json\n */\nfunction loadPackageJsonConfig(cwd: string): Partial<DevScriptsConfig> | null {\n try {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(packageJsonPath)) return null\n \n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))\n const devScripts: PackageJsonDevScripts = packageJson.devScripts\n \n // only return config if devScripts field actually exists\n if (!devScripts || Object.keys(devScripts).length === 0) {\n return null\n }\n \n // convert to standard config format\n const config: Partial<DevScriptsConfig> = {}\n \n if (devScripts.locales || devScripts.defaultLocale || devScripts.messageRoot) {\n config.i18n = {\n locales: devScripts.locales || DEFAULT_CONFIG.i18n.locales,\n defaultLocale: devScripts.defaultLocale || DEFAULT_CONFIG.i18n.defaultLocale,\n messageRoot: devScripts.messageRoot || DEFAULT_CONFIG.i18n.messageRoot\n }\n }\n \n if (devScripts.scanDirs) {\n config.scan = {\n include: devScripts.scanDirs,\n exclude: DEFAULT_CONFIG.scan.exclude\n }\n }\n \n if (devScripts.blogDir) {\n config.blog = {\n mdxDir: devScripts.blogDir,\n ...DEFAULT_CONFIG.blog\n }\n }\n \n if (devScripts.logDir) {\n config.output = {\n logDir: devScripts.logDir,\n verbose: DEFAULT_CONFIG.output.verbose\n }\n }\n \n return Object.keys(config).length > 0 ? config : null\n } catch (error) {\n console.warn(`Warning: Failed to load package.json config: ${error}`)\n return null\n }\n}\n\n/**\n * load config from dev-scripts.config.json file\n */\nfunction loadConfigFile(cwd: string): Partial<DevScriptsConfig> | null {\n try {\n const configPath = path.join(cwd, 'dev-scripts.config.json')\n if (!fs.existsSync(configPath)) {\n return null\n }\n \n return JSON.parse(fs.readFileSync(configPath, 'utf8'))\n } catch (error) {\n console.warn(`Warning: Failed to load dev-scripts.config.json: ${error}`)\n return null\n }\n}\n\n/**\n * deep merge config object\n */\nfunction mergeConfig(base: DevScriptsConfig, override: Partial<DevScriptsConfig>): DevScriptsConfig {\n const result = { ...base }\n \n for (const [key, value] of Object.entries(override)) {\n if (value !== undefined && value !== null) {\n if (typeof value === 'object' && !Array.isArray(value) && typeof result[key as keyof DevScriptsConfig] === 'object') {\n ;(result as any)[key] = { ...(result as any)[key], ...value }\n } else {\n ;(result as any)[key] = value\n }\n }\n }\n \n return result\n}\n\n/**\n * load full config\n */\nexport function loadConfig(cwd: string = typeof process !== 'undefined' ? process.cwd() : '.', override: Partial<DevScriptsConfig> = {}, verbose?: boolean): DevScriptsConfig {\n let config = { ...DEFAULT_CONFIG }\n const configSources: string[] = []\n \n // 1. load dev-scripts.config.json\n const fileConfig = loadConfigFile(cwd)\n if (fileConfig) {\n config = mergeConfig(config, fileConfig)\n configSources.push('dev-scripts.config.json')\n }\n \n // 2. load package.json config\n const packageConfig = loadPackageJsonConfig(cwd)\n if (packageConfig) {\n config = mergeConfig(config, packageConfig)\n configSources.push('package.json')\n }\n \n // 3. apply any override config\n config = mergeConfig(config, override)\n if (Object.keys(override).length > 0) {\n configSources.push('runtime override')\n }\n \n // 4. print config info in verbose mode\n const shouldPrintConfig = verbose !== undefined ? verbose : config.output.verbose\n if (shouldPrintConfig) {\n // temporarily set verbose for printing\n const configForPrint = { ...config }\n configForPrint.output = { ...config.output, verbose: true }\n printConfigInfo(configForPrint, configSources, cwd)\n }\n \n return config\n}\n\n/**\n * print config information in verbose mode\n */\nfunction printConfigInfo(config: DevScriptsConfig, sources: string[], cwd: string): void {\n console.log('\\n📋 Config Information:')\n console.log(` working directory: ${cwd}`)\n console.log(` config sources: ${sources.length > 0 ? sources.join(' + ') : 'default config'}`)\n \n console.log('\\n🌐 i18n:')\n console.log(` locales: [${config.i18n.locales.join(', ')}]`)\n console.log(` defaultLocale: ${config.i18n.defaultLocale}`)\n console.log(` messageRoot: ${config.i18n.messageRoot}`)\n \n console.log('\\n🔍 scan:')\n console.log(` include: [${config.scan.include.join(', ')}]`)\n if (config.scan.exclude && config.scan.exclude.length > 0) {\n console.log(` exclude: [${config.scan.exclude.join(', ')}]`)\n }\n if (config.scan.baseDir) {\n console.log(` baseDir: ${config.scan.baseDir}`)\n }\n \n if (config.blog) {\n console.log('\\n📝 blog:')\n console.log(` mdxDir: ${config.blog.mdxDir}`)\n console.log(` outputFile: ${config.blog.outputFile || 'index.mdx (default)'}`)\n console.log(` metaFile: ${config.blog.metaFile || 'meta.json (default)'}`)\n if (config.blog.iocSlug) {\n console.log(` iocSlug: ${config.blog.iocSlug}`)\n }\n if (config.blog.prefix) {\n console.log(` prefix: ${config.blog.prefix}`)\n }\n }\n \n console.log('\\n📤 output:')\n console.log(` logDir: ${config.output.logDir}`)\n console.log(` verbose: ${config.output.verbose}`)\n console.log('')\n}\n\n/**\n * validate config\n */\nexport function validateConfig(config: DevScriptsConfig): void {\n if (!config.i18n.locales || config.i18n.locales.length === 0) {\n throw new Error('at least one language is required')\n }\n \n if (!config.i18n.locales.includes(config.i18n.defaultLocale)) {\n throw new Error('default language must be in the supported language list')\n }\n \n if (config.scan.include.length === 0) {\n throw new Error('at least one scan path is required')\n }\n} ","import { writeFileSync, mkdirSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { DevScriptsConfig } from '@dev-scripts/config/schema'\n\nexport class Logger {\n private messages: string[] = []\n private config: DevScriptsConfig\n \n constructor(config: DevScriptsConfig) {\n this.config = config\n }\n \n log(message: string): void {\n if (this.config.output.verbose) {\n console.log(message)\n }\n this.messages.push(message)\n }\n \n error(message: string): void {\n console.error(message)\n this.messages.push('[ERROR] ' + message)\n }\n \n warn(message: string): void {\n console.warn(message)\n this.messages.push('[WARN] ' + message)\n }\n \n info(message: string): void {\n console.info(message)\n this.messages.push('[INFO] ' + message)\n }\n \n success(message: string): void {\n console.log(`✅ ${message}`)\n this.messages.push(`[SUCCESS] ${message}`)\n }\n \n /**\n * save log to file\n */\n saveToFile(filename: string, cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'): void {\n try {\n const logFilePath = join(cwd, this.config.output.logDir, filename)\n const logDir = dirname(logFilePath)\n \n // create log directory if it doesn't exist\n mkdirSync(logDir, { recursive: true })\n \n writeFileSync(logFilePath, this.messages.join('\\n'), 'utf8')\n console.log(`log saved to ${logFilePath}`)\n } catch (error) {\n console.error(`failed to save log file: ${error}`)\n }\n }\n \n /**\n * clear log messages\n */\n clear(): void {\n this.messages = []\n }\n \n /**\n * get all log messages\n */\n getMessages(): string[] {\n return [...this.messages]\n }\n} ","import fg from 'fast-glob'\nimport { readFileSync } from 'fs'\nimport { DevScriptsConfig } from '@dev-scripts/config/schema'\n\nexport interface ScanResult {\n filePath: string\n content: string\n}\n\n/**\n * scan matching files\n */\nexport async function scanFiles(config: DevScriptsConfig, cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'): Promise<ScanResult[]> {\n const files: string[] = await fg(config.scan.include, {\n ignore: config.scan.exclude || [],\n cwd,\n absolute: false\n })\n\n const results: ScanResult[] = []\n \n for (const file of files) {\n try {\n const content = readFileSync(file, 'utf8')\n results.push({\n filePath: file,\n content\n })\n } catch (error) {\n console.warn(`Warning: Failed to read file ${file}: ${error}`)\n }\n }\n\n return results\n}\n\n/**\n * read JSON file from given path\n */\nexport function readJsonFile<T = any>(filePath: string): T | null {\n try {\n const content = readFileSync(filePath, 'utf8')\n return JSON.parse(content)\n } catch (error) {\n return null\n }\n}\n\n/**\n * get translation file path\n */\nexport function getTranslationFilePath(locale: string, config: DevScriptsConfig, cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'): string {\n return `${cwd}/${config.i18n.messageRoot}/${locale}.json`\n}\n\n/**\n * load all translation files\n */\nexport function loadTranslations(config: DevScriptsConfig, cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'): Record<string, Record<string, any>> {\n const translations: Record<string, Record<string, any>> = {}\n \n for (const locale of config.i18n.locales) {\n const filePath = getTranslationFilePath(locale, config, cwd)\n const translation = readJsonFile(filePath)\n \n if (translation) {\n translations[locale] = translation\n } else {\n console.warn(`Warning: Failed to load translation file for locale: ${locale}`)\n translations[locale] = {}\n }\n }\n \n return translations\n} ","// translation info interface\nexport interface TranslationInfo {\n namespaces: Map<string, string> // variable name -> namespace\n keys: string[] // full translation key path\n}\n\n/**\n * extract translation keys and namespaces from file content\n */\nexport function extractTranslationsInfo(content: string, filePath: string): TranslationInfo {\n const result: TranslationInfo = {\n namespaces: new Map<string, string>(),\n keys: []\n }\n\n // match getTranslations({ locale, namespace: 'namespace' }) or getTranslations('namespace')\n const getTranslationsPattern = /getTranslations\\(\\s*(?:{[^}]*namespace:\\s*['\"]([^'\"]+)['\"][^}]*}|['\"]([^'\"]+)['\"])\\s*\\)/g\n let match: RegExpExecArray | null\n\n while ((match = getTranslationsPattern.exec(content)) !== null) {\n const namespace = match[1] || match[2]\n if (namespace) {\n // try to find assignment statement, like const t = await getTranslations(...)\n // find the nearest const declaration\n const linesBefore = content.substring(0, match.index).split('\\n');\n for (let i = linesBefore.length - 1; i >= Math.max(0, linesBefore.length - 5); i--) {\n const line = linesBefore[i];\n const constMatch = /const\\s+(\\w+)\\s*=/.exec(line);\n if (constMatch && !line.includes('useTranslations') && !line.includes('getTranslations')) {\n result.namespaces.set(constMatch[1], namespace);\n break;\n }\n }\n }\n }\n\n // match useTranslations('namespace')\n const useTranslationsPattern = /useTranslations\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g\n while ((match = useTranslationsPattern.exec(content)) !== null) {\n const namespace = match[1]\n\n // try to find assignment statement, like const t = useTranslations(...)\n // find the line containing useTranslations\n const currentLine = content.substring(0, match.index).split('\\n').pop() || '';\n const constMatch = /const\\s+(\\w+)\\s*=/.exec(currentLine);\n if (constMatch) {\n result.namespaces.set(constMatch[1], namespace);\n }\n }\n\n // match t('key') or t(\"key\"), and check if t is associated with known namespaces\n // modify the matching pattern of t function call\n const tPatterns = [\n // normal string key: t('key') or t(\"key\")\n /(\\w+)\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n // template string key: t(`tags.${id}`) or t(`section.${key}`)\n /(\\w+)\\(\\s*`([^`]+)`\\s*\\)/g,\n // variable key: t(item.key) or t(item.id)\n /(\\w+)\\(\\s*(\\w+)\\.(\\w+)\\s*\\)/g\n ];\n\n for (const pattern of tPatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const funcName = match[1];\n\n // if the function name is associated with known namespaces\n if (result.namespaces.has(funcName)) {\n const namespace = result.namespaces.get(funcName);\n if (!namespace) continue;\n\n if (pattern.source.includes('`')) {\n // handle template string\n const templateStr = match[2];\n // extract static part (the part before the variable)\n const staticPart = templateStr.split(/\\${(?:id|key)}/)[0].trim();\n if (staticPart && !staticPart.includes('/')) {\n // for tags.${id}这样的形式,记录整个 tags 命名空间\n const segments = staticPart.split('.');\n if (segments.length > 0) {\n // record the base path\n result.keys.push(`${namespace}.${segments[0]}`);\n // if it is multi-level, also record the full path\n if (segments.length > 1) {\n result.keys.push(`${namespace}.${segments.join('.')}`);\n }\n\n // special handling for tags namespace\n if (segments[0] === 'tags') {\n // add all known tag keys\n ['productUpdates', 'tutorials', 'makeMoney', 'roadOverSea', 'insights'].forEach(tag => {\n result.keys.push(`${namespace}.tags.${tag}`);\n });\n }\n }\n }\n } else if (pattern.source.includes('\\\\w+\\\\.\\\\w+')) {\n // handle variable key t(item.key)\n const varName = match[2];\n const propName = match[3];\n\n // find the possible value of the variable in the file content\n const varPattern = new RegExp(`${varName}\\\\s*=\\\\s*{[^}]*key:\\\\s*['\"]([^'\"]+)['\"]`);\n const varMatch = content.match(varPattern);\n\n if (varMatch) {\n // if the variable definition is found, add the actual key\n result.keys.push(`${namespace}.${varMatch[1]}`);\n } else {\n // if the specific definition is not found, try to infer from the context\n // check if it is used in an array or object of MenuItem type\n if (content.includes('MenuItem[]') || content.includes('MenuItem}')) {\n // add all possible menu keys\n ['journey'].forEach(menuKey => {\n result.keys.push(`${namespace}.${menuKey}`);\n });\n }\n }\n } else {\n // handle normal string key\n const key = match[2];\n if (!key.includes('/') && key !== '') {\n result.keys.push(`${namespace}.${key}`);\n }\n }\n }\n }\n }\n\n // match <FormattedMessage id=\"key\" />\n const formattedMessagePattern = /<FormattedMessage[^>]*id=['\"]([^'\"]+)['\"]/g\n while ((match = formattedMessagePattern.exec(content)) !== null) {\n const key = match[1]\n if (!key.includes('/') && key !== '') {\n // for FormattedMessage, we need to guess the namespace\n // usually we can find useTranslations call in the same file\n if (result.namespaces.size > 0) {\n const namespace = Array.from(result.namespaces.values())[0]\n result.keys.push(`${namespace}.${key}`)\n } else {\n // if the namespace is not found, try to infer from the file path\n const pathMatch = filePath.match(/\\[locale\\]\\/(?:\\([^)]+\\)\\/)?([^/]+)/)\n if (pathMatch && pathMatch[1]) {\n const possibleNamespace = pathMatch[1]\n result.keys.push(`${possibleNamespace}.${key}`)\n }\n }\n }\n }\n\n return result\n}\n\n/**\n * get all keys from an object (including nested keys)\n */\nexport function getAllKeys(obj: Record<string, any>, prefix: string = ''): string[] {\n let keys: string[] = []\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const newKey = prefix ? `${prefix}.${key}` : key\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n keys = [...keys, ...getAllKeys(obj[key], newKey)]\n } else {\n keys.push(newKey)\n }\n }\n }\n return keys\n}\n\n/**\n * check if the key exists in the translation file\n */\nexport function checkKeyExists(key: string, translations: Record<string, any>): boolean {\n const parts = key.split('.')\n let current: any = translations\n\n for (const part of parts) {\n if (current[part] === undefined) {\n return false\n }\n current = current[part]\n }\n\n return true\n}\n\n/**\n * check if the namespace exists in the translation file\n */\nexport function checkNamespaceExists(namespace: string, translations: Record<string, any>): boolean {\n return translations[namespace] !== undefined\n}\n\n/**\n * remove the specified key from the translation object\n */\nexport function removeKeyFromTranslations(key: string, translations: Record<string, any>): boolean {\n const parts = key.split('.')\n const lastPart = parts.pop()\n\n if (!lastPart) return false\n\n let current = translations\n\n // navigate to the parent object of the last level\n for (const part of parts) {\n if (current[part] === undefined || typeof current[part] !== 'object') {\n return false\n }\n current = current[part]\n }\n\n // delete the key\n if (current[lastPart] !== undefined) {\n delete current[lastPart]\n return true\n }\n\n return false\n}\n\n/**\n * clean empty objects (recursively)\n */\nexport function cleanEmptyObjects(obj: Record<string, any>): Record<string, any> {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n obj[key] = cleanEmptyObjects(obj[key])\n // if the object is empty, delete it\n if (Object.keys(obj[key]).length === 0) {\n delete obj[key]\n }\n }\n }\n }\n return obj\n} ","import { DevScriptsConfig } from '@dev-scripts/config/schema'\nimport { Logger } from '@dev-scripts/utils/logger'\nimport { scanFiles, loadTranslations } from '@dev-scripts/utils/file-scanner'\nimport { \n extractTranslationsInfo, \n getAllKeys, \n checkKeyExists, \n checkNamespaceExists \n} from '@dev-scripts/utils/translation-parser'\n\ninterface TranslationReport {\n [key: string]: string[]\n}\n\nexport async function checkTranslations(config: DevScriptsConfig, cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'): Promise<number> {\n const logger = new Logger(config)\n logger.warn('==============================')\n logger.warn(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n logger.warn('==============================')\n \n try {\n logger.log('start checking translations...')\n\n // scan all files\n const scanResults = await scanFiles(config, cwd)\n logger.log(`found ${scanResults.length} files to scan`)\n\n // load translation files\n const translations = loadTranslations(config, cwd)\n\n // collect used translation keys and namespaces\n const foundTranslationKeys: Set<string> = new Set()\n const foundNamespaces: Set<string> = new Set()\n\n // scan all files, extract translation information\n for (const { filePath, content } of scanResults) {\n try {\n const { namespaces, keys } = extractTranslationsInfo(content, filePath)\n\n if (keys.length > 0 || namespaces.size > 0) {\n logger.log(`found the following information in the file ${filePath}:`)\n\n if (namespaces.size > 0) {\n logger.log(` translation function mapping:`)\n namespaces.forEach((namespace, varName) => {\n logger.log(` - ${varName} => ${namespace}`)\n foundNamespaces.add(namespace)\n })\n }\n\n if (keys.length > 0) {\n logger.log(` translation keys:`)\n keys.forEach(key => {\n logger.log(` - ${key}`)\n foundTranslationKeys.add(key)\n })\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`error processing file ${filePath}: ${error.message}`)\n } else {\n logger.error(`error processing file ${filePath}: unknown error`)\n }\n }\n }\n\n logger.log(`\\nfound ${foundNamespaces.size} used namespaces in the code: ${Array.from(foundNamespaces).join(', ')}`)\n\n // check results\n const report: TranslationReport = {}\n\n // check if the namespace exists\n foundNamespaces.forEach(namespace => {\n config.i18n.locales.forEach(locale => {\n const missingNamespaceKey = `missingNamespacesIn${locale.toUpperCase()}`\n if (!checkNamespaceExists(namespace, translations[locale])) {\n report[missingNamespaceKey] = report[missingNamespaceKey] || []\n report[missingNamespaceKey].push(namespace)\n }\n })\n })\n\n // check if the translation key exists\n foundTranslationKeys.forEach(key => {\n config.i18n.locales.forEach(locale => {\n const missingKey = `missingIn${locale.toUpperCase()}`\n if (!checkKeyExists(key, translations[locale])) {\n report[missingKey] = report[missingKey] || []\n report[missingKey].push(key)\n }\n })\n })\n\n // check if the translation keys are consistent\n config.i18n.locales.forEach(locale => {\n const allKeys = getAllKeys(translations[locale])\n config.i18n.locales.forEach(otherLocale => {\n if (locale !== otherLocale) {\n const otherKeys = getAllKeys(translations[otherLocale])\n const onlyKeys = `${locale}OnlyKeys`\n report[onlyKeys] = allKeys.filter(key => !otherKeys.includes(key))\n }\n })\n })\n\n // generate report\n logger.log('\\n=== translation check report ===\\n')\n\n // first report missing namespaces, which is usually the most serious problem\n config.i18n.locales.forEach(locale => {\n const missingNamespaceKey = `missingNamespacesIn${locale.toUpperCase()}`\n if (report[missingNamespaceKey]?.length > 0) {\n logger.log(`🚨 missing namespaces in the ${locale} translation file:`)\n report[missingNamespaceKey].forEach(namespace => logger.log(` - ${namespace}`))\n } else {\n logger.success(`${locale} translation file has all used namespaces`)\n }\n })\n\n // then report missing translation keys\n config.i18n.locales.forEach(locale => {\n const missingKey = `missingIn${locale.toUpperCase()}`\n if (report[missingKey]?.length > 0) {\n logger.log(`\\n🔴 missing keys in the ${locale} translation file:`)\n report[missingKey].forEach(key => logger.log(` - ${key}`))\n } else {\n logger.success(`${locale} translation file has all used keys`)\n }\n })\n\n // finally report inconsistent keys\n config.i18n.locales.forEach(locale => {\n const onlyKeys = `${locale}OnlyKeys`\n if (report[onlyKeys]?.length > 0) {\n logger.log(`\\n⚠️ keys only exist in the ${locale} translation file:`)\n report[onlyKeys].forEach(key => logger.log(` - ${key}`))\n }\n })\n\n logger.log('\\n=== report end ===\\n')\n logger.log(\"⚠️⚠️⚠️script depends on regular matching, for multiple translation namespaces in a single file, use naming to distinguish: t1 | t2 | t3 | ... ⚠️⚠️⚠️\")\n\n // save log file\n logger.saveToFile('check.log', cwd)\n\n // if there are any problems, return non-zero status code\n return Object.values(report).some(keys => keys.length > 0) ? 1 : 0\n\n } catch (error) { \n logger.error(`error checking translations: ${error}`)\n return 1\n }\n} ","import { DevScriptsConfig } from '@dev-scripts/config/schema'\nimport { getTranslationFilePath, loadTranslations, scanFiles } from '@dev-scripts/utils/file-scanner'\nimport { Logger } from '@dev-scripts/utils/logger'\nimport {\n cleanEmptyObjects,\n extractTranslationsInfo,\n getAllKeys,\n removeKeyFromTranslations\n} from '@dev-scripts/utils/translation-parser'\nimport { writeFileSync } from 'fs'\n\ninterface CleanReport {\n [key: string]: string[]\n}\n\nexport async function cleanTranslations(\n config: DevScriptsConfig, \n shouldRemove: boolean = false,\n cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'\n): Promise<number> {\n const logger = new Logger(config)\n const logFileName = shouldRemove ? 'remove.log' : 'clean.log'\n \n logger.warn('==============================')\n logger.warn(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n logger.warn('==============================')\n \n try {\n logger.log('start checking unused translation keys...')\n\n // scan all files\n const scanResults = await scanFiles(config, cwd)\n logger.log(`找到 ${scanResults.length} 个文件需要扫描`)\n\n // load translation files\n const translations = loadTranslations(config, cwd)\n\n // collect used translation keys and namespaces\n const foundTranslationKeys: Set<string> = new Set()\n const foundNamespaces: Set<string> = new Set()\n\n // scan all files, collect used translation keys and namespaces\n for (const { filePath, content } of scanResults) {\n try {\n const { namespaces, keys } = extractTranslationsInfo(content, filePath)\n\n if (keys.length > 0 || namespaces.size > 0) {\n logger.log(`found the following information in the file ${filePath}:`)\n\n if (namespaces.size > 0) {\n logger.log(` translation function mapping:`)\n namespaces.forEach((namespace, varName) => {\n logger.log(` - ${varName} => ${namespace}`)\n foundNamespaces.add(namespace)\n })\n }\n\n if (keys.length > 0) {\n logger.log(` translation keys:`)\n keys.forEach(key => {\n logger.log(` - ${key}`)\n foundTranslationKeys.add(key)\n })\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`error processing file ${filePath}: ${error.message}`)\n } else {\n logger.error(`error processing file ${filePath}: unknown error`)\n }\n }\n }\n\n logger.log(`\\nfound ${foundTranslationKeys.size} used translation keys in the code`)\n logger.log(`found ${foundNamespaces.size} used namespaces in the code: ${Array.from(foundNamespaces).join(', ')}`)\n\n // check unused keys in each language file\n const unusedKeys: Record<string, string[]> = {}\n const removedKeys: Record<string, string[]> = {}\n const unusedNamespaces: Record<string, string[]> = {}\n\n config.i18n.locales.forEach(locale => {\n unusedKeys[locale] = []\n removedKeys[locale] = []\n unusedNamespaces[locale] = []\n\n // get all keys in the translation file\n const allTranslationKeys = getAllKeys(translations[locale])\n\n // get all namespaces (top-level keys) in the translation file\n const allNamespaces = Object.keys(translations[locale] || {})\n\n // find unused namespaces\n allNamespaces.forEach(namespace => {\n if (!foundNamespaces.has(namespace)) {\n unusedNamespaces[locale].push(namespace)\n }\n })\n\n // find unused keys\n allTranslationKeys.forEach(key => {\n if (!foundTranslationKeys.has(key)) {\n unusedKeys[locale].push(key)\n }\n })\n\n logger.log(`\\nfound ${unusedKeys[locale].length} unused keys in the ${locale} translation file`)\n logger.log(`found ${unusedNamespaces[locale].length} unused namespaces in the ${locale} translation file`)\n })\n\n if (shouldRemove) {\n logger.log('\\nstart deleting unused translation keys...')\n\n // delete unused keys in each language file\n config.i18n.locales.forEach(locale => {\n const translationsCopy = { ...translations[locale] }\n\n unusedKeys[locale].forEach(key => {\n if (removeKeyFromTranslations(key, translationsCopy)) {\n removedKeys[locale].push(key)\n }\n })\n\n // delete unused namespaces\n unusedNamespaces[locale].forEach(namespace => {\n if (translationsCopy[namespace] !== undefined) {\n delete translationsCopy[namespace]\n logger.log(`deleted unused namespace ${namespace} from the ${locale} translation file`)\n }\n })\n\n // clean empty objects\n const cleanedTranslations = cleanEmptyObjects(translationsCopy)\n\n // save updated translation file\n const filePath = getTranslationFilePath(locale, config, cwd)\n writeFileSync(filePath, JSON.stringify(cleanedTranslations, null, 2), 'utf8')\n\n logger.log(`deleted ${removedKeys[locale].length} unused keys from the ${locale} translation file`)\n })\n } else {\n logger.log('\\nTo delete unused keys, please run the script with the --remove parameter')\n }\n\n // generate report\n logger.log('\\n=== unused translation keys report ===\\n')\n\n config.i18n.locales.forEach(locale => {\n if (unusedNamespaces[locale].length > 0) {\n logger.log(`🔍 unused namespaces in the ${locale} translation file:`)\n unusedNamespaces[locale].forEach(namespace => logger.log(` - ${namespace}`))\n } else {\n logger.success(`${locale} translation file has no unused namespaces`)\n }\n\n if (unusedKeys[locale].length > 0) {\n logger.log(`\\n🔍 unused keys in the ${locale} translation file:`)\n unusedKeys[locale].forEach(key => logger.log(` - ${key}`))\n } else {\n logger.success(`${locale} translation file has no unused keys`)\n }\n\n if (shouldRemove && removedKeys[locale].length > 0) {\n logger.log(`\\n🗑️ deleted keys from the ${locale} translation file:`)\n removedKeys[locale].forEach(key => logger.log(` - ${key}`))\n }\n })\n\n logger.log('\\n=== report end ===\\n')\n logger.log(\"⚠️⚠️⚠️script depends on regular matching, for multiple translation namespaces in a single file, use naming to distinguish: t1 | t2 | t3 | ... ⚠️⚠️⚠️\")\n\n // save log file\n logger.saveToFile(logFileName, cwd)\n\n // if there are any unused keys or namespaces, return non-zero status code\n return (Object.values(unusedKeys).some(keys => keys.length > 0) ||\n Object.values(unusedNamespaces).some(namespaces => namespaces.length > 0)) ? 1 : 0\n\n } catch (error) {\n logger.error(`error cleaning translations: ${error}`)\n return 1\n }\n} ","import { readFileSync, writeFileSync, readdirSync } from 'fs'\nimport { join } from 'path'\nimport { DevScriptsConfig } from '@dev-scripts/config/schema'\nimport { Logger } from '@dev-scripts/utils/logger'\nimport { readJsonFile } from '@dev-scripts/utils/file-scanner'\n\ninterface Frontmatter {\n title?: string\n description?: string\n icon?: string\n date?: string\n}\n\ninterface ProcessedArticle {\n slug: string\n title: string\n description?: string\n frontmatterIcon?: string\n date?: string\n}\n\ninterface MetaJson {\n pages: string[]\n}\n\nfunction parseFrontmatter(fileContent: string): Frontmatter {\n const frontmatter: Frontmatter = {}\n const match = fileContent.match(/^---([\\s\\S]*?)---/)\n if (match && match[1]) {\n const lines = match[1].trim().split('\\n')\n for (const line of lines) {\n const [key, ...valueParts] = line.split(':')\n if (key && valueParts.length > 0) {\n const value = valueParts.join(':').trim()\n if (key.trim() === 'title') frontmatter.title = value\n if (key.trim() === 'description') frontmatter.description = value\n if (key.trim() === 'icon') frontmatter.icon = value\n if (key.trim() === 'date') frontmatter.date = value\n }\n }\n }\n return frontmatter\n}\n\nfunction getIconComponentString(iconName?: string): string | undefined {\n if (!iconName) return undefined\n return `<${iconName} />`\n}\n\nfunction getCurrentDateString(): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction updateFrontmatterDate(frontmatter: string): string {\n const currentDate = getCurrentDateString()\n \n // Check if date field exists\n if (frontmatter.includes('date:')) {\n // Replace existing date\n return frontmatter.replace(/date:\\s*[^\\n]*/, `date: ${currentDate}`)\n } else {\n // Add date field before the closing ---\n return frontmatter.replace(/---$/, `date: ${currentDate}\\n---`)\n }\n}\n\nfunction getBlogPrefix(config: DevScriptsConfig): string {\n if (config.blog?.prefix === undefined || config.blog?.prefix === null) {\n return 'blog';\n } else if (typeof config.blog?.prefix === 'string' && config.blog?.prefix.trim() === '') {\n return '';\n } else {\n return String(config.blog.prefix).trim();\n }\n}\n\nasync function getAllBlogArticles(blogDir: string, cwd: string, logger: Logger): Promise<ProcessedArticle[]> {\n const articles: ProcessedArticle[] = []\n const blogPath = join(cwd, blogDir)\n \n try {\n const files = readdirSync(blogPath)\n for (const file of files) {\n if (file.endsWith('.mdx') && file !== 'index.mdx') {\n const slug = file.replace(/\\.mdx$/, '')\n const filePath = join(blogPath, file)\n try {\n const content = readFileSync(filePath, 'utf-8')\n const fm = parseFrontmatter(content)\n\n if (!fm.title) {\n logger.warn(`Article \"${file}\" is missing a title in its frontmatter. Skipping.`)\n continue\n }\n\n articles.push({\n slug,\n title: fm.title,\n description: fm.description,\n frontmatterIcon: fm.icon,\n date: fm.date,\n })\n } catch (readError) {\n logger.warn(`Could not read or parse frontmatter for \"${file}\": ${readError}`)\n }\n }\n }\n } catch (dirError) {\n logger.error(`Could not read blog directory: ${dirError}`)\n return []\n }\n return articles\n}\n\nexport async function generateBlogIndex(\n config: DevScriptsConfig,\n cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'\n): Promise<number> {\n const logger = new Logger(config)\n logger.warn('==============================')\n logger.warn(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n logger.warn('==============================')\n try {\n if (!config.blog) {\n logger.error('Blog configuration is missing. Please configure blog settings.')\n return 1\n }\n\n logger.log('Starting to generate blog index...')\n\n const blogPath = join(cwd, config.blog.mdxDir)\n const indexFile = join(blogPath, config.blog.outputFile || 'index.mdx')\n const metaFile = join(blogPath, config.blog.metaFile || 'meta.json')\n const iocFile = join(blogPath, `${config.blog.iocSlug || 'ioc'}.mdx`)\n const iocSlug = config.blog.iocSlug || 'ioc'\n const blogPrefix = getBlogPrefix(config)\n\n let meta: MetaJson = { pages: [] }\n const metaContent = readJsonFile<MetaJson>(metaFile)\n if (metaContent) {\n meta = metaContent\n } else {\n logger.warn(`Could not read or parse ${metaFile}. No articles will be marked as featured.`)\n }\n \n // ioc related processing\n const featuredSlugs = meta.pages\n .map(p => p.endsWith('.mdx') ? p.slice(0, -4) : p)\n .filter(slug => slug !== 'index' && slug !== '...' && slug !== iocSlug && slug !== `!${iocSlug}`)\n logger.log(`Featured slugs (meta-config): ${featuredSlugs.join(', ')}`)\n\n const allArticles = await getAllBlogArticles(config.blog.mdxDir, cwd, logger)\n logger.log(`Found ${allArticles.length} all articles.`)\n\n // ioc article processing separately\n const iocArticle = allArticles.find(a => a.slug === iocSlug)\n\n const filteredArticles = allArticles.filter(a => a.slug !== iocSlug)\n\n if (filteredArticles.length === 0 && featuredSlugs.length === 0) {\n logger.warn(\"No articles found or featured. The generated index might be empty or minimal.\")\n }\n\n const featuredArticles: ProcessedArticle[] = []\n const pastArticles: ProcessedArticle[] = []\n\n filteredArticles.forEach(article => {\n if (featuredSlugs.includes(article.slug)) {\n featuredArticles.push(article)\n } else {\n pastArticles.push(article)\n }\n })\n\n // Sort articles by date in descending order (newest first)\n const sortByDateDesc = (a: ProcessedArticle, b: ProcessedArticle) => {\n if (a.date && b.date) {\n return b.date.localeCompare(a.date) // Newest first\n }\n if (a.date) return -1 // Articles with date come before those without\n if (b.date) return 1 // Articles with date come before those without\n return 0 // Keep original order if both lack dates\n }\n\n featuredArticles.sort(sortByDateDesc)\n pastArticles.sort(sortByDateDesc)\n\n logger.log(`Found ${featuredArticles.length} featured articles (sorted by date).`)\n logger.log(`Found ${pastArticles.length} past articles (sorted by date).`)\n\n // Preserve existing frontmatter or use a default\n let currentFileFrontmatter = '---\\ntitle: Blog\\ndescription: Articles and thoughts about various topics.\\nicon: Rss\\n---'\n try {\n const currentIndexContent = readFileSync(indexFile, 'utf-8')\n const frontmatterMatch = currentIndexContent.match(/^---([\\s\\S]*?)---/)\n if (frontmatterMatch && frontmatterMatch[0]) {\n currentFileFrontmatter = frontmatterMatch[0]\n logger.log('Preserving existing frontmatter from index.mdx')\n }\n } catch (error) {\n logger.warn('Could not read existing index.mdx or parse its frontmatter. Using default frontmatter.')\n }\n\n // Update date field in frontmatter\n currentFileFrontmatter = updateFrontmatterDate(currentFileFrontmatter)\n\n let mdxContent = `${currentFileFrontmatter}\\n\\n`\n\n const createCard = (article: ProcessedArticle): string => {\n const iconString = getIconComponentString(article.frontmatterIcon)\n const iconProp = iconString ? `icon={${iconString}}` : ''\n \n // Escape only double quotes in title for JSX attribute\n const escapedTitle = (article.title || '').replace(/\"/g, '"')\n\n // Content of the card - should be raw, as it might be MDX\n const cardContent = article.date || article.description || '' \n \n // Ensure there's a space before href if iconProp is present and not empty\n const finalIconProp = iconProp ? `${iconProp} ` : ''\n // refer path is /locale/blog, this is blog root dir, so here is blog/X, then you'll get /locale/blog/X\n const href = blogPrefix ? `${blogPrefix}/${article.slug}` : `${article.slug}`\n return ` <ZiaCard ${finalIconProp} href=\"${href}\" title=\"${escapedTitle}\">\\n ${cardContent}\\n </ZiaCard>\\n`\n }\n\n if (featuredArticles.length > 0) {\n mdxContent += `## Feature List\\n\\n<Cards>\\n`\n featuredArticles.forEach(article => { mdxContent += createCard(article) })\n mdxContent += `</Cards>\\n\\n`\n }\n\n if (pastArticles.length > 0) {\n mdxContent += `## Past List\\n\\n<Cards>\\n`\n pastArticles.forEach(article => { mdxContent += createCard(article) })\n mdxContent += `</Cards>\\n`\n }\n\n // add Monthly Summary block separately\n if (iocArticle) {\n mdxContent += `\\n## Monthly Summary\\n\\n<Cards>\\n`\n const iocHref = blogPrefix ? `${blogPrefix}/${iocSlug}` : `${iocSlug}`\n mdxContent += ` <ZiaCard href=\"${iocHref}\" title=\"Overview\">\\n ${getCurrentDateString()}\\n </ZiaCard>\\n`\n mdxContent += `</Cards>\\n`\n }\n\n if (featuredArticles.length === 0 && pastArticles.length === 0 && !iocArticle) {\n mdxContent += \"No blog posts found yet. Stay tuned!\\n\"\n }\n\n writeFileSync(indexFile, mdxContent)\n logger.success(`Successfully generated ${indexFile}`)\n\n // generate monthly statistics\n await generateMonthlyBlogSummary(config, allArticles, iocFile, iocSlug, logger)\n\n logger.log('Blog index generation completed successfully!')\n logger.saveToFile('generate-blog.log', cwd)\n\n return 0\n\n } catch (error) {\n logger.error(`Error generating blog index: ${error}`)\n return 1\n }\n}\n\n/**\n * generate blog monthly statistics details\n */\nasync function generateMonthlyBlogSummary(\n config: DevScriptsConfig,\n articles: ProcessedArticle[],\n iocFile: string,\n iocSlug: string,\n logger: Logger\n): Promise<void> {\n try {\n // filter out articles without date and slug is ioc\n const articlesWithDate = articles.filter(a => a.date && a.slug !== iocSlug)\n\n // group by month\n const monthMap: Record<string, {date: string, title: string, slug: string}[]> = {}\n for (const art of articlesWithDate) {\n // only take the first 7 digits yyyy-mm\n const month = art.date!.slice(0, 7)\n if (!monthMap[month]) monthMap[month] = []\n monthMap[month].push({ date: art.date!, title: art.title, slug: art.slug })\n }\n\n // sort months in descending order\n const sortedMonths = Object.keys(monthMap).sort((a, b) => b.localeCompare(a))\n\n // sort articles by date in descending order\n for (const month of sortedMonths) {\n monthMap[month].sort((a, b) => b.date.localeCompare(a.date))\n }\n\n // read ioc.mdx original frontmatter\n let frontmatter = ''\n try {\n const content = readFileSync(iocFile, 'utf-8')\n const match = content.match(/^---([\\s\\S]*?)---/)\n if (match && match[0]) frontmatter = match[0]\n } catch {\n // File doesn't exist, use default\n }\n\n // if there is no frontmatter, use the default\n if (!frontmatter) {\n frontmatter = '---\\ntitle: Monthly Summary\\ndescription: Index and Summary\\n---'\n }\n\n // update date field in frontmatter\n frontmatter = updateFrontmatterDate(frontmatter)\n\n // generate content\n let mdx = `${frontmatter}\\n\\n\\n## Overview\\n<Files>\\n`\n if (sortedMonths.length === 0) {\n mdx += ' <ZiaFile name=\"Comming Soon\" className=\"opacity-50\" disabled/>\\n'\n } else {\n for (const month of sortedMonths) {\n // Folder name format YYYY-MM(article count)\n const count = monthMap[month].length\n const folderTitle = `${month}(${count})`\n // default open the latest month\n const defaultOpen = month === sortedMonths[0] ? ' defaultOpen' : ''\n mdx += ` <ZiaFolder name=\"${folderTitle}\"${defaultOpen}>\\n`\n for (const art of monthMap[month]) {\n // File name=\"YYYY-MM-DD(Title)\" format\n const day = art.date.slice(0, 10)\n // refer path is /locale/blog/ioc, so here is ./X, then you'll get /locale/blog/X\n const href = art.slug ? `./${art.slug}` : '';\n mdx += ` <ZiaFile name=\"${day}(${art.title})\" href=\"${href}\" />\\n`\n }\n mdx += ` </ZiaFolder>\\n`\n }\n }\n mdx += '</Files>\\n\\n'\n\n writeFileSync(iocFile, mdx)\n logger.success(`Successfully generated Monthly Blog Summary: ${iocFile}`)\n } catch (error) {\n logger.error(`Error generating monthly blog summary: ${error}`)\n }\n} "]}
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ var commander = require('commander');
|
|
|
5
5
|
var fs = require('fs');
|
|
6
6
|
var path = require('path');
|
|
7
7
|
var fg = require('fast-glob');
|
|
8
|
+
var child_process = require('child_process');
|
|
8
9
|
|
|
9
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
11
|
|
|
@@ -33,6 +34,60 @@ var DEFAULT_CONFIG = {
|
|
|
33
34
|
output: {
|
|
34
35
|
logDir: "logs",
|
|
35
36
|
verbose: false
|
|
37
|
+
},
|
|
38
|
+
architectureConfig: {
|
|
39
|
+
".": "\u9879\u76EE\u6839\u76EE\u5F55",
|
|
40
|
+
".env.local": "\u672C\u5730\u73AF\u5883\u53D8\u91CF\u914D\u7F6E",
|
|
41
|
+
".eslintrc.json": "ESLint \u4EE3\u7801\u89C4\u8303\u914D\u7F6E",
|
|
42
|
+
".gitignore": "Git\u5FFD\u7565\u6587\u4EF6\u914D\u7F6E",
|
|
43
|
+
".source": "Fuma\u6570\u636E\u6E90Build\u4EA7\u7269",
|
|
44
|
+
"CHANGELOG.md": "\u53D8\u66F4\u8BB0\u5F55",
|
|
45
|
+
"components.json": "\u7EC4\u4EF6\u4F9D\u8D56\u6E05\u5355",
|
|
46
|
+
"dev-scripts.config.json": "dev-scripts\u811A\u672C\u5DE5\u5177\u914D\u7F6E",
|
|
47
|
+
"LICENSE": "\u5F00\u6E90\u8BB8\u53EF\u8BC1",
|
|
48
|
+
"messages": "\u7FFB\u8BD1\u76EE\u5F55",
|
|
49
|
+
"next-env.d.ts": "Next.js\u73AF\u5883\u7C7B\u578B\u58F0\u660E",
|
|
50
|
+
"next.config.ts": "Next.js\u9879\u76EE\u914D\u7F6E",
|
|
51
|
+
"package.json": "\u9879\u76EE\u4F9D\u8D56\u4E0E\u811A\u672C",
|
|
52
|
+
"postcss.config.mjs": "PostCSS \u914D\u7F6E",
|
|
53
|
+
"source.config.ts": "Fuma\u6570\u636E\u6E90\u626B\u63CF\u914D\u7F6E",
|
|
54
|
+
"src": "\u6E90\u7801\u76EE\u5F55",
|
|
55
|
+
"tsconfig.json": "TypeScript\u914D\u7F6E",
|
|
56
|
+
"tsconfig.node.json": "Node.js\u76F8\u5173TypeScript \u914D\u7F6E",
|
|
57
|
+
"logs": "\u65E5\u5FD7\u8F93\u51FA\u76EE\u5F55",
|
|
58
|
+
"apps": "Monorepo\u591A\u5E94\u7528\u76EE\u5F55",
|
|
59
|
+
"packages": "\u5B50\u5DE5\u7A0B\u7EC4\u4EF6\u5E93\u76EE\u5F55",
|
|
60
|
+
"README.md": "\u9879\u76EE\u8BF4\u660E\u6587\u6863",
|
|
61
|
+
"app": "Next.js \u5E94\u7528\u4E3B\u5165\u53E3\u76EE\u5F55",
|
|
62
|
+
"components": "\u9875\u9762\u7EC4\u4EF6",
|
|
63
|
+
"lib": "\u5DE5\u5177\u5305",
|
|
64
|
+
"mdx": "FumaMDX\u6587\u6863",
|
|
65
|
+
"middleware.ts": "\u4E2D\u95F4\u4EF6\u5165\u53E3",
|
|
66
|
+
"i18n.ts": "\u591A\u8BED\u8A00\u914D\u7F6E",
|
|
67
|
+
"globals.css": "\u5168\u5C40\u6837\u5F0F",
|
|
68
|
+
"layout.config.tsx": "\u5E03\u5C40\u914D\u7F6E",
|
|
69
|
+
"layout.tsx": "\u5E03\u5C40",
|
|
70
|
+
"loading.tsx": "\u5168\u5C40\u52A0\u8F7D\u7EC4\u4EF6",
|
|
71
|
+
"hero.tsx": "\u9996\u9875\u5927\u5B57\u7EC4\u4EF6",
|
|
72
|
+
"mdx-components.tsx": "FumaMDX\u7EC4\u4EF6\u5E93(\u81EA\u5B9A\u4E49)",
|
|
73
|
+
"llm-content": "FumaMDX\u590D\u5236\u63A5\u53E3",
|
|
74
|
+
"[locale]": "Nextjs i18n\u8DEF\u7531\u76EE\u5F55",
|
|
75
|
+
"(clerk)": "Clerk\u8BA4\u8BC1",
|
|
76
|
+
"(home)": "\u9996\u9875",
|
|
77
|
+
"[...catchAll]": "\u5168\u5C40404\u9875\u9762",
|
|
78
|
+
"blog": "\u535A\u5BA2",
|
|
79
|
+
"docs": "\u6587\u6863",
|
|
80
|
+
"legal": "\u6CD5\u5F8B",
|
|
81
|
+
"api": "API\u63A5\u53E3",
|
|
82
|
+
"robots.ts": "robots.txt\u751F\u6210\u811A\u672C",
|
|
83
|
+
"sitemap.ts": "\u7F51\u7AD9\u5730\u56FE",
|
|
84
|
+
"appConfig.ts": "\u5E94\u7528\u5168\u5C40\u914D\u7F6E",
|
|
85
|
+
"site-config.ts": "\u7F51\u7AD9\u56FE\u6807\u914D\u7F6E",
|
|
86
|
+
"ioc.mdx": "\u6708\u5EA6/\u7EDF\u8BA1",
|
|
87
|
+
"meta.json": "FumaMDX\u5143\u6570\u636E",
|
|
88
|
+
"nextjs-architecture.mdx": "Next.js\u9879\u76EE\u7ED3\u6784",
|
|
89
|
+
".github": "GitHub \u914D\u7F6E\u76EE\u5F55",
|
|
90
|
+
"workflows": "CI/CD \u5DE5\u4F5C\u6D41\u914D\u7F6E"
|
|
36
91
|
}
|
|
37
92
|
};
|
|
38
93
|
|
|
@@ -1067,6 +1122,75 @@ async function easyChangeset(cwd2 = typeof process !== "undefined" ? process.cwd
|
|
|
1067
1122
|
return 1;
|
|
1068
1123
|
}
|
|
1069
1124
|
}
|
|
1125
|
+
function getCurrentDateString2() {
|
|
1126
|
+
const now = /* @__PURE__ */ new Date();
|
|
1127
|
+
const year = now.getFullYear();
|
|
1128
|
+
const month = String(now.getMonth() + 1).padStart(2, "0");
|
|
1129
|
+
const day = String(now.getDate()).padStart(2, "0");
|
|
1130
|
+
return `${year}-${month}-${day}`;
|
|
1131
|
+
}
|
|
1132
|
+
async function generateNextjsArchitecture(config, cwd2 = typeof process !== "undefined" ? process.cwd() : ".") {
|
|
1133
|
+
const logger = new Logger(config);
|
|
1134
|
+
try {
|
|
1135
|
+
let renderTree2 = function(nodes, depth = 0, parentPath = "") {
|
|
1136
|
+
let mdx2 = "";
|
|
1137
|
+
for (const node of nodes) {
|
|
1138
|
+
const nodePath = parentPath ? `${parentPath}/${node.name}` : node.name;
|
|
1139
|
+
const anotion = architectureConfig[node.name] || "";
|
|
1140
|
+
const displayName = depth === 0 && node.name === "." ? "ROOT" : node.name;
|
|
1141
|
+
if (node.type === "directory") {
|
|
1142
|
+
mdx2 += `${" ".repeat(depth)}<ZiaFolder name="${displayName}" anotion="${anotion}" defaultOpen>
|
|
1143
|
+
`;
|
|
1144
|
+
if (node.contents && node.contents.length > 0) {
|
|
1145
|
+
mdx2 += renderTree2(node.contents, depth + 1, nodePath);
|
|
1146
|
+
}
|
|
1147
|
+
mdx2 += `${" ".repeat(depth)}</ZiaFolder>
|
|
1148
|
+
`;
|
|
1149
|
+
} else if (node.type === "file") {
|
|
1150
|
+
mdx2 += `${" ".repeat(depth)}<ZiaFile name="${node.name}" anotion="${anotion}" href="" />
|
|
1151
|
+
`;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
return mdx2;
|
|
1155
|
+
};
|
|
1156
|
+
var renderTree = renderTree2;
|
|
1157
|
+
const logsDir = path.join(cwd2, config.output?.logDir || "logs");
|
|
1158
|
+
const blogDir = path.join(cwd2, config.blog?.mdxDir || "src/mdx/blog");
|
|
1159
|
+
if (!fs.existsSync(logsDir)) fs.mkdirSync(logsDir, { recursive: true });
|
|
1160
|
+
if (!fs.existsSync(blogDir)) fs.mkdirSync(blogDir, { recursive: true });
|
|
1161
|
+
const treeJsonPath = path.join(logsDir, "project_tree.json");
|
|
1162
|
+
logger.log(`Running tree command to generate ${treeJsonPath}`);
|
|
1163
|
+
child_process.execSync(`tree -a -J -I '.next|node_modules|logs|dist|pnpm-lock.yaml|turbo|.turbo|public|.cursor|.DS_Store' > ${treeJsonPath}`);
|
|
1164
|
+
const tree = readJsonFile(treeJsonPath);
|
|
1165
|
+
if (!tree) {
|
|
1166
|
+
logger.error("Failed to read tree JSON result!");
|
|
1167
|
+
return 1;
|
|
1168
|
+
}
|
|
1169
|
+
const userConfig = config.architectureConfig || {};
|
|
1170
|
+
const architectureConfig = { ...DEFAULT_CONFIG.architectureConfig || {}, ...userConfig };
|
|
1171
|
+
const frontmatter = `---
|
|
1172
|
+
title: About Project Structure
|
|
1173
|
+
description: Show all source code directories and files
|
|
1174
|
+
icon: GitMerge
|
|
1175
|
+
date: ${getCurrentDateString2()}
|
|
1176
|
+
---
|
|
1177
|
+
|
|
1178
|
+
## Quick Started
|
|
1179
|
+
|
|
1180
|
+
`;
|
|
1181
|
+
const filesContent = renderTree2(tree);
|
|
1182
|
+
const indentedFilesContent = filesContent.split("\n").map((line) => line ? " " + line : "").join("\n");
|
|
1183
|
+
const mdx = frontmatter + "<Files>\n" + indentedFilesContent + "</Files>\n";
|
|
1184
|
+
const outputMdxPath = path.join(blogDir, "nextjs-architecture.mdx");
|
|
1185
|
+
fs.writeFileSync(outputMdxPath, mdx);
|
|
1186
|
+
logger.success(`Successfully generated ${outputMdxPath}`);
|
|
1187
|
+
logger.saveToFile("generate-nextjs-architecture.log", cwd2);
|
|
1188
|
+
return 0;
|
|
1189
|
+
} catch (error) {
|
|
1190
|
+
logger.error(`Error generating nextjs architecture mdx: ${error}`);
|
|
1191
|
+
return 1;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1070
1194
|
|
|
1071
1195
|
// src/cli.ts
|
|
1072
1196
|
var cwd = typeof process !== "undefined" ? process.cwd() : ".";
|
|
@@ -1156,6 +1280,24 @@ commander.program.command("easy-changeset").description("copy .changeset/d8-temp
|
|
|
1156
1280
|
}
|
|
1157
1281
|
}
|
|
1158
1282
|
});
|
|
1283
|
+
commander.program.command("generate-nextjs-architecture").description("generate nextjs-architecture.mdx for project structure").option("-v, --verbose", "show detailed logs", false).action(async (options) => {
|
|
1284
|
+
try {
|
|
1285
|
+
const config = loadConfig(cwd, {}, options.verbose);
|
|
1286
|
+
if (options.verbose) {
|
|
1287
|
+
config.output.verbose = true;
|
|
1288
|
+
}
|
|
1289
|
+
validateConfig(config);
|
|
1290
|
+
const exitCode = await generateNextjsArchitecture(config, cwd);
|
|
1291
|
+
if (typeof process !== "undefined") {
|
|
1292
|
+
process.exit(exitCode);
|
|
1293
|
+
}
|
|
1294
|
+
} catch (error) {
|
|
1295
|
+
console.error("Error:", error);
|
|
1296
|
+
if (typeof process !== "undefined") {
|
|
1297
|
+
process.exit(1);
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
});
|
|
1159
1301
|
if (typeof process !== "undefined") {
|
|
1160
1302
|
commander.program.parse(process.argv);
|
|
1161
1303
|
}
|