@windrun-huaiin/dev-scripts 6.4.1 → 6.5.1

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/dist/cli.mjs CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { loadConfig, validateConfig, checkTranslations, cleanTranslations, generateBlogIndex, Logger } from './chunk-NO5GUCCS.mjs';
2
+ import { loadConfig, validateConfig, checkTranslations, cleanTranslations, generateBlogIndex, Logger, DEFAULT_CONFIG, readJsonFile } from './chunk-YZIQVKKT.mjs';
3
3
  import { program } from 'commander';
4
- import { existsSync, unlinkSync, rmSync, readFileSync, writeFileSync, statSync, readdirSync } from 'fs';
4
+ import { existsSync, unlinkSync, rmSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync } from 'fs';
5
5
  import { resolve, join } from 'path';
6
+ import { execSync } from 'child_process';
6
7
 
7
8
  var MONOREPO_CLEAN_TARGETS = [
8
9
  { pattern: "node_modules", description: "Root directory dependencies" },
@@ -138,6 +139,75 @@ async function easyChangeset(cwd2 = typeof process !== "undefined" ? process.cwd
138
139
  return 1;
139
140
  }
140
141
  }
142
+ function getCurrentDateString() {
143
+ const now = /* @__PURE__ */ new Date();
144
+ const year = now.getFullYear();
145
+ const month = String(now.getMonth() + 1).padStart(2, "0");
146
+ const day = String(now.getDate()).padStart(2, "0");
147
+ return `${year}-${month}-${day}`;
148
+ }
149
+ async function generateNextjsArchitecture(config, cwd2 = typeof process !== "undefined" ? process.cwd() : ".") {
150
+ const logger = new Logger(config);
151
+ try {
152
+ let renderTree2 = function(nodes, depth = 0, parentPath = "") {
153
+ let mdx2 = "";
154
+ for (const node of nodes) {
155
+ const nodePath = parentPath ? `${parentPath}/${node.name}` : node.name;
156
+ const anotion = architectureConfig[node.name] || "";
157
+ const displayName = depth === 0 && node.name === "." ? "ROOT" : node.name;
158
+ if (node.type === "directory") {
159
+ mdx2 += `${" ".repeat(depth)}<ZiaFolder name="${displayName}" anotion="${anotion}" defaultOpen>
160
+ `;
161
+ if (node.contents && node.contents.length > 0) {
162
+ mdx2 += renderTree2(node.contents, depth + 1, nodePath);
163
+ }
164
+ mdx2 += `${" ".repeat(depth)}</ZiaFolder>
165
+ `;
166
+ } else if (node.type === "file") {
167
+ mdx2 += `${" ".repeat(depth)}<ZiaFile name="${node.name}" anotion="${anotion}" href="" />
168
+ `;
169
+ }
170
+ }
171
+ return mdx2;
172
+ };
173
+ var renderTree = renderTree2;
174
+ const logsDir = join(cwd2, config.output?.logDir || "logs");
175
+ const blogDir = join(cwd2, config.blog?.mdxDir || "src/mdx/blog");
176
+ if (!existsSync(logsDir)) mkdirSync(logsDir, { recursive: true });
177
+ if (!existsSync(blogDir)) mkdirSync(blogDir, { recursive: true });
178
+ const treeJsonPath = join(logsDir, "project_tree.json");
179
+ logger.log(`Running tree command to generate ${treeJsonPath}`);
180
+ execSync(`tree -a -J -I '.next|node_modules|logs|dist|pnpm-lock.yaml|turbo|.turbo|public|.cursor|.DS_Store|.git' > ${treeJsonPath}`);
181
+ const tree = readJsonFile(treeJsonPath);
182
+ if (!tree) {
183
+ logger.error("Failed to read tree JSON result!");
184
+ return 1;
185
+ }
186
+ const userConfig = config.architectureConfig || {};
187
+ const architectureConfig = { ...DEFAULT_CONFIG.architectureConfig || {}, ...userConfig };
188
+ const frontmatter = `---
189
+ title: About Project Structure
190
+ description: Show all source code directories and files
191
+ icon: GitMerge
192
+ date: ${getCurrentDateString()}
193
+ ---
194
+
195
+ ## Quick Started
196
+
197
+ `;
198
+ const filesContent = renderTree2(tree);
199
+ const indentedFilesContent = filesContent.split("\n").map((line) => line ? " " + line : "").join("\n");
200
+ const mdx = frontmatter + "<Files>\n" + indentedFilesContent + "</Files>\n";
201
+ const outputMdxPath = join(blogDir, "nextjs-architecture.mdx");
202
+ writeFileSync(outputMdxPath, mdx);
203
+ logger.success(`Successfully generated ${outputMdxPath}`);
204
+ logger.saveToFile("generate-nextjs-architecture.log", cwd2);
205
+ return 0;
206
+ } catch (error) {
207
+ logger.error(`Error generating nextjs architecture mdx: ${error}`);
208
+ return 1;
209
+ }
210
+ }
141
211
 
142
212
  // src/cli.ts
143
213
  var cwd = typeof process !== "undefined" ? process.cwd() : ".";
@@ -227,6 +297,24 @@ program.command("easy-changeset").description("copy .changeset/d8-template.mdx t
227
297
  }
228
298
  }
229
299
  });
300
+ program.command("generate-nextjs-architecture").description("generate nextjs-architecture.mdx for project structure").option("-v, --verbose", "show detailed logs", false).action(async (options) => {
301
+ try {
302
+ const config = loadConfig(cwd, {}, options.verbose);
303
+ if (options.verbose) {
304
+ config.output.verbose = true;
305
+ }
306
+ validateConfig(config);
307
+ const exitCode = await generateNextjsArchitecture(config, cwd);
308
+ if (typeof process !== "undefined") {
309
+ process.exit(exitCode);
310
+ }
311
+ } catch (error) {
312
+ console.error("Error:", error);
313
+ if (typeof process !== "undefined") {
314
+ process.exit(1);
315
+ }
316
+ }
317
+ });
230
318
  if (typeof process !== "undefined") {
231
319
  program.parse(process.argv);
232
320
  }
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/deep-clean.ts","../src/commands/easy-changeset.ts","../src/cli.ts"],"names":["cwd","join","existsSync"],"mappings":"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","file":"cli.mjs","sourcesContent":["import { existsSync, statSync, rmSync, readdirSync, unlinkSync } from 'fs'\nimport { join, resolve } from 'path'\nimport { DevScriptsConfig } from '@dev-scripts/config/schema'\nimport { Logger } from '@dev-scripts/utils/logger'\n\ninterface CleanTarget {\n pattern: string\n description: string\n isFile?: boolean\n}\n\nconst MONOREPO_CLEAN_TARGETS: CleanTarget[] = [\n { pattern: 'node_modules', description: 'Root directory dependencies' },\n { pattern: 'packages/*/node_modules', description: 'Package dependencies' },\n { pattern: 'apps/*/node_modules', description: 'Application dependencies' },\n { pattern: 'apps/*/.next', description: 'Next.js cache' },\n { pattern: 'packages/*/dist', description: 'Package build artifacts' },\n { pattern: 'apps/*/dist', description: 'Application build artifacts' },\n { pattern: '.turbo', description: 'Root directory Turbo cache' },\n { pattern: 'packages/*/.turbo', description: 'Package Turbo cache' },\n { pattern: 'apps/*/.turbo', description: 'Application Turbo cache' },\n { pattern: 'pnpm-lock.yaml', description: 'pnpm lock file', isFile: true }\n]\n\nconst SINGLE_CLEAN_TARGETS: CleanTarget[] = [\n { pattern: 'node_modules', description: 'Root directory dependencies' },\n { pattern: '.next', description: 'Next.js cache' },\n { pattern: 'pnpm-lock.yaml', description: 'pnpm lock file', isFile: true }\n]\n\nfunction globDirsOrFiles(pattern: string, cwd: string, isFile?: boolean): string[] {\n if (!pattern.includes('*')) {\n const abs = resolve(cwd, pattern)\n if (isFile) {\n return existsSync(abs) ? [abs] : []\n }\n return existsSync(abs) && statSync(abs).isDirectory() ? [abs] : []\n }\n const [base, rest] = pattern.split('/*')\n const absBase = resolve(cwd, base)\n if (!existsSync(absBase) || !statSync(absBase).isDirectory()) return []\n const subdirs = readdirSync(absBase)\n return subdirs.map(d => join(absBase, d, rest.replace(/^[\\/]/, '')))\n .filter(p => existsSync(p) && (isFile ? true : statSync(p).isDirectory()))\n}\n\nexport async function deepClean(\n config: DevScriptsConfig,\n yes: boolean = false,\n cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'\n): Promise<number> {\n const logger = new Logger(config)\n // Environment check, DO NOT EXECUTE IN PRODUCTION ENVIRONMENT\n if (process.env.NODE_ENV === 'production') {\n logger.error('❌ Production environment prohibits deep clean operations')\n logger.log(' If you need to clean, please set: NODE_ENV=development')\n logger.saveToFile('deep-clean.log', cwd)\n return 1\n }\n\n logger.warn('==============================')\n logger.warn(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n logger.warn('==============================')\n\n // Auto detect project type\n const isMonorepo = existsSync(resolve(cwd, 'pnpm-workspace.yaml'))\n const cleanTargets: CleanTarget[] = isMonorepo ? MONOREPO_CLEAN_TARGETS : SINGLE_CLEAN_TARGETS\n\n let totalToDelete: string[] = []\n let groupDeleteMap: Record<string, string[]> = {}\n\n for (const target of cleanTargets) {\n const found = globDirsOrFiles(target.pattern, cwd, target.isFile)\n groupDeleteMap[target.description] = found\n if (found.length === 0) {\n logger.info(`💯 ${target.description}: No need to clean`)\n } else {\n logger.log(`\\n[${target.description}]`)\n found.forEach(p => logger.warn(`👙 [Preview] ${p}`))\n totalToDelete.push(...found)\n }\n }\n\n if (totalToDelete.length === 0) {\n logger.success('No directories or files to clean.')\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n }\n\n if (!yes) {\n logger.log('\\nIf you need to actually delete, please add --yes parameter.')\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n }\n\n // Execute deletion, grouped print\n let deleted = 0\n for (const target of cleanTargets) {\n const items = groupDeleteMap[target.description] || []\n if (items.length > 0) {\n logger.log(`\\n[${target.description}]`)\n for (const p of items) {\n try {\n if (target.isFile) {\n unlinkSync(p)\n if (!existsSync(p)) {\n logger.success(`🍻 Deleted: ${p}`)\n deleted++\n } else {\n logger.error(`❌ Delete failed: ${p} (file still exists)`)\n }\n } else {\n rmSync(p, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 })\n if (!existsSync(p)) {\n logger.success(`🍻 Deleted: ${p}`)\n deleted++\n } else {\n logger.error(`❌ Delete failed: ${p} (directory still exists)`)\n }\n }\n } catch (e: any) {\n logger.error(`❌ Delete failed: ${p} (${e.message})`)\n }\n }\n }\n }\n logger.log(`\\n🍺 Total cleaned: ${deleted} directories or files.`)\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n} ","import { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nexport async function easyChangeset(cwd: string = typeof process !== 'undefined' ? process.cwd() : '.') {\n // Environment check, DO NOT EXECUTE IN PRODUCTION ENVIRONMENT\n if (process.env.NODE_ENV === 'production') {\n console.log('❌ Production environment prohibits deep clean operations')\n console.log(' If you need to clean, please set: NODE_ENV=development')\n return 1\n }\n\n console.log('==============================')\n console.log(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n console.log('==============================')\n \n const changesetDir = join(cwd, '.changeset')\n const mdxFile = join(changesetDir, 'd8-template.mdx')\n const mdFile = join(changesetDir, 'd8-template.md')\n\n if (!existsSync(changesetDir)) {\n console.log('❌ No .changeset directory found, skipping.')\n return 1\n }\n if (!existsSync(mdxFile)) {\n console.log('❌ No .changeset/d8-template.mdx file found, skipping.')\n return 1\n }\n try {\n const content = readFileSync(mdxFile, 'utf-8')\n writeFileSync(mdFile, content, 'utf-8')\n console.log('✅ Copied d8-template.mdx content to d8-template.md')\n return 0\n } catch (e: any) {\n console.log('❌ Copy failed:', e.message)\n return 1\n }\n} ","#!/usr/bin/env node\n\nimport { program } from 'commander'\nimport { loadConfig, validateConfig } from '@dev-scripts/config'\nimport { checkTranslations } from '@dev-scripts/commands/check-translations'\nimport { cleanTranslations } from '@dev-scripts/commands/clean-translations'\nimport { generateBlogIndex } from '@dev-scripts/commands/generate-blog-index'\nimport { deepClean } from '@dev-scripts/commands/deep-clean'\nimport { easyChangeset } from '@dev-scripts/commands/easy-changeset'\n\n// get current working directory, ensure it works in Node.js environment\nconst cwd = typeof process !== 'undefined' ? process.cwd() : '.'\n\nprogram\n .name('dev-scripts')\n .description('development scripts for multi-language projects')\n .version('5.0.0')\n\nprogram\n .command('check-translations')\n .description('check the completeness and consistency of translation files')\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await checkTranslations(config, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('clean-translations')\n .description('clean unused translation keys')\n .option('-v, --verbose', 'show detailed logs', false)\n .option('--remove', 'actually delete unused keys (default only show)', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await cleanTranslations(config, options.remove, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('generate-blog-index')\n .description('generate blog index file')\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await generateBlogIndex(config, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('deep-clean')\n .description('clean all node_modules, dist, .next, .turbo and related caches in monorepo')\n .option('--yes', 'actually delete matched directories (default only preview)', false)\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n if (options.verbose) {\n config.output.verbose = true\n }\n validateConfig(config)\n const exitCode = await deepClean(config, options.yes, cwd)\n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('easy-changeset')\n .description('copy .changeset/d8-template.mdx to .changeset/d8-template.md if both exist')\n .action(async () => {\n try {\n const exitCode = await easyChangeset(cwd)\n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\n// parse command line arguments\nif (typeof process !== 'undefined') {\n program.parse(process.argv)\n} "]}
1
+ {"version":3,"sources":["../src/commands/deep-clean.ts","../src/commands/easy-changeset.ts","../src/commands/generate-nextjs-architecture.ts","../src/cli.ts"],"names":["cwd","join","existsSync","renderTree","mdx","writeFileSync"],"mappings":"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","file":"cli.mjs","sourcesContent":["import { existsSync, statSync, rmSync, readdirSync, unlinkSync } from 'fs'\nimport { join, resolve } from 'path'\nimport { DevScriptsConfig } from '@dev-scripts/config/schema'\nimport { Logger } from '@dev-scripts/utils/logger'\n\ninterface CleanTarget {\n pattern: string\n description: string\n isFile?: boolean\n}\n\nconst MONOREPO_CLEAN_TARGETS: CleanTarget[] = [\n { pattern: 'node_modules', description: 'Root directory dependencies' },\n { pattern: 'packages/*/node_modules', description: 'Package dependencies' },\n { pattern: 'apps/*/node_modules', description: 'Application dependencies' },\n { pattern: 'apps/*/.next', description: 'Next.js cache' },\n { pattern: 'packages/*/dist', description: 'Package build artifacts' },\n { pattern: 'apps/*/dist', description: 'Application build artifacts' },\n { pattern: '.turbo', description: 'Root directory Turbo cache' },\n { pattern: 'packages/*/.turbo', description: 'Package Turbo cache' },\n { pattern: 'apps/*/.turbo', description: 'Application Turbo cache' },\n { pattern: 'pnpm-lock.yaml', description: 'pnpm lock file', isFile: true }\n]\n\nconst SINGLE_CLEAN_TARGETS: CleanTarget[] = [\n { pattern: 'node_modules', description: 'Root directory dependencies' },\n { pattern: '.next', description: 'Next.js cache' },\n { pattern: 'pnpm-lock.yaml', description: 'pnpm lock file', isFile: true }\n]\n\nfunction globDirsOrFiles(pattern: string, cwd: string, isFile?: boolean): string[] {\n if (!pattern.includes('*')) {\n const abs = resolve(cwd, pattern)\n if (isFile) {\n return existsSync(abs) ? [abs] : []\n }\n return existsSync(abs) && statSync(abs).isDirectory() ? [abs] : []\n }\n const [base, rest] = pattern.split('/*')\n const absBase = resolve(cwd, base)\n if (!existsSync(absBase) || !statSync(absBase).isDirectory()) return []\n const subdirs = readdirSync(absBase)\n return subdirs.map(d => join(absBase, d, rest.replace(/^[\\/]/, '')))\n .filter(p => existsSync(p) && (isFile ? true : statSync(p).isDirectory()))\n}\n\nexport async function deepClean(\n config: DevScriptsConfig,\n yes: boolean = false,\n cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'\n): Promise<number> {\n const logger = new Logger(config)\n // Environment check, DO NOT EXECUTE IN PRODUCTION ENVIRONMENT\n if (process.env.NODE_ENV === 'production') {\n logger.error('❌ Production environment prohibits deep clean operations')\n logger.log(' If you need to clean, please set: NODE_ENV=development')\n logger.saveToFile('deep-clean.log', cwd)\n return 1\n }\n\n logger.warn('==============================')\n logger.warn(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n logger.warn('==============================')\n\n // Auto detect project type\n const isMonorepo = existsSync(resolve(cwd, 'pnpm-workspace.yaml'))\n const cleanTargets: CleanTarget[] = isMonorepo ? MONOREPO_CLEAN_TARGETS : SINGLE_CLEAN_TARGETS\n\n let totalToDelete: string[] = []\n let groupDeleteMap: Record<string, string[]> = {}\n\n for (const target of cleanTargets) {\n const found = globDirsOrFiles(target.pattern, cwd, target.isFile)\n groupDeleteMap[target.description] = found\n if (found.length === 0) {\n logger.info(`💯 ${target.description}: No need to clean`)\n } else {\n logger.log(`\\n[${target.description}]`)\n found.forEach(p => logger.warn(`👙 [Preview] ${p}`))\n totalToDelete.push(...found)\n }\n }\n\n if (totalToDelete.length === 0) {\n logger.success('No directories or files to clean.')\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n }\n\n if (!yes) {\n logger.log('\\nIf you need to actually delete, please add --yes parameter.')\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n }\n\n // Execute deletion, grouped print\n let deleted = 0\n for (const target of cleanTargets) {\n const items = groupDeleteMap[target.description] || []\n if (items.length > 0) {\n logger.log(`\\n[${target.description}]`)\n for (const p of items) {\n try {\n if (target.isFile) {\n unlinkSync(p)\n if (!existsSync(p)) {\n logger.success(`🍻 Deleted: ${p}`)\n deleted++\n } else {\n logger.error(`❌ Delete failed: ${p} (file still exists)`)\n }\n } else {\n rmSync(p, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 })\n if (!existsSync(p)) {\n logger.success(`🍻 Deleted: ${p}`)\n deleted++\n } else {\n logger.error(`❌ Delete failed: ${p} (directory still exists)`)\n }\n }\n } catch (e: any) {\n logger.error(`❌ Delete failed: ${p} (${e.message})`)\n }\n }\n }\n }\n logger.log(`\\n🍺 Total cleaned: ${deleted} directories or files.`)\n logger.saveToFile('deep-clean.log', cwd)\n return 0\n} ","import { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nexport async function easyChangeset(cwd: string = typeof process !== 'undefined' ? process.cwd() : '.') {\n // Environment check, DO NOT EXECUTE IN PRODUCTION ENVIRONMENT\n if (process.env.NODE_ENV === 'production') {\n console.log('❌ Production environment prohibits deep clean operations')\n console.log(' If you need to clean, please set: NODE_ENV=development')\n return 1\n }\n\n console.log('==============================')\n console.log(`‼️ Current working directory: ⭕ ${cwd} ⭕`)\n console.log('==============================')\n \n const changesetDir = join(cwd, '.changeset')\n const mdxFile = join(changesetDir, 'd8-template.mdx')\n const mdFile = join(changesetDir, 'd8-template.md')\n\n if (!existsSync(changesetDir)) {\n console.log('❌ No .changeset directory found, skipping.')\n return 1\n }\n if (!existsSync(mdxFile)) {\n console.log('❌ No .changeset/d8-template.mdx file found, skipping.')\n return 1\n }\n try {\n const content = readFileSync(mdxFile, 'utf-8')\n writeFileSync(mdFile, content, 'utf-8')\n console.log('✅ Copied d8-template.mdx content to d8-template.md')\n return 0\n } catch (e: any) {\n console.log('❌ Copy failed:', e.message)\n return 1\n }\n} ","import { DevScriptsConfig, DEFAULT_CONFIG } from '@dev-scripts/config/schema'\nimport { readJsonFile } from '@dev-scripts/utils/file-scanner'\nimport { Logger } from '@dev-scripts/utils/logger'\nimport { execSync } from 'child_process'\nimport { existsSync, mkdirSync, writeFileSync } from 'fs'\nimport { join } from 'path'\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\nexport async function generateNextjsArchitecture(\n config: DevScriptsConfig,\n cwd: string = typeof process !== 'undefined' ? process.cwd() : '.'\n): Promise<number> {\n const logger = new Logger(config)\n try {\n // get logs directory and blog directory\n const logsDir = join(cwd, config.output?.logDir || 'logs')\n const blogDir = join(cwd, config.blog?.mdxDir || 'src/mdx/blog')\n if (!existsSync(logsDir)) mkdirSync(logsDir, { recursive: true })\n if (!existsSync(blogDir)) mkdirSync(blogDir, { recursive: true })\n\n // generate tree result to logs directory\n const treeJsonPath = join(logsDir, 'project_tree.json')\n logger.log(`Running tree command to generate ${treeJsonPath}`)\n execSync(`tree -a -J -I '.next|node_modules|logs|dist|pnpm-lock.yaml|turbo|.turbo|public|.cursor|.DS_Store|.git' > ${treeJsonPath}`)\n\n // read tree result\n const tree = readJsonFile<any[]>(treeJsonPath)\n if (!tree) {\n logger.error('Failed to read tree JSON result!')\n return 1\n }\n // Merge config and user first\n const userConfig = config.architectureConfig || {}\n const architectureConfig = { ...(DEFAULT_CONFIG.architectureConfig || {}), ...userConfig }\n\n function renderTree(nodes: any[], depth = 0, parentPath: string = ''): string {\n let mdx = ''\n for (const node of nodes) {\n const nodePath = parentPath ? `${parentPath}/${node.name}` : node.name\n const anotion = architectureConfig[node.name] || ''\n // scan root directory name='ROOT'\n const displayName = (depth === 0 && node.name === '.') ? 'ROOT' : node.name\n if (node.type === 'directory') {\n mdx += `${' '.repeat(depth)}<ZiaFolder name=\"${displayName}\" anotion=\"${anotion}\" defaultOpen>\\n`\n if (node.contents && node.contents.length > 0) {\n mdx += renderTree(node.contents, depth + 1, nodePath)\n }\n mdx += `${' '.repeat(depth)}</ZiaFolder>\\n`\n } else if (node.type === 'file') {\n mdx += `${' '.repeat(depth)}<ZiaFile name=\"${node.name}\" anotion=\"${anotion}\" href=\"\" />\\n`\n }\n }\n return mdx\n }\n\n // generate frontmatter\n const frontmatter = `---\\ntitle: About Project Structure\\ndescription: Show all source code directories and files\\nicon: GitMerge\\ndate: ${getCurrentDateString()}\\n---\\n\\n## Quick Started\\n\\n`\n // generate mdx content\n const filesContent = renderTree(tree)\n const indentedFilesContent = filesContent.split('\\n').map(line => line ? ' ' + line : '').join('\\n')\n const mdx = frontmatter + '<Files>\\n' + indentedFilesContent + '</Files>\\n'\n // output to blog directory\n const outputMdxPath = join(blogDir, 'nextjs-architecture.mdx')\n writeFileSync(outputMdxPath, mdx)\n logger.success(`Successfully generated ${outputMdxPath}`)\n logger.saveToFile('generate-nextjs-architecture.log', cwd)\n return 0\n } catch (error) {\n logger.error(`Error generating nextjs architecture mdx: ${error}`)\n return 1\n }\n} ","#!/usr/bin/env node\n\nimport { program } from 'commander'\nimport { loadConfig, validateConfig } from '@dev-scripts/config'\nimport { checkTranslations } from '@dev-scripts/commands/check-translations'\nimport { cleanTranslations } from '@dev-scripts/commands/clean-translations'\nimport { generateBlogIndex } from '@dev-scripts/commands/generate-blog-index'\nimport { deepClean } from '@dev-scripts/commands/deep-clean'\nimport { easyChangeset } from '@dev-scripts/commands/easy-changeset'\nimport { generateNextjsArchitecture } from '@dev-scripts/commands/generate-nextjs-architecture'\n\n// get current working directory, ensure it works in Node.js environment\nconst cwd = typeof process !== 'undefined' ? process.cwd() : '.'\n\nprogram\n .name('dev-scripts')\n .description('development scripts for multi-language projects')\n .version('5.0.0')\n\nprogram\n .command('check-translations')\n .description('check the completeness and consistency of translation files')\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await checkTranslations(config, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('clean-translations')\n .description('clean unused translation keys')\n .option('-v, --verbose', 'show detailed logs', false)\n .option('--remove', 'actually delete unused keys (default only show)', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await cleanTranslations(config, options.remove, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('generate-blog-index')\n .description('generate blog index file')\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n \n // apply verbose option after loading\n if (options.verbose) {\n config.output.verbose = true\n }\n \n validateConfig(config)\n \n const exitCode = await generateBlogIndex(config, cwd)\n \n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('deep-clean')\n .description('clean all node_modules, dist, .next, .turbo and related caches in monorepo')\n .option('--yes', 'actually delete matched directories (default only preview)', false)\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n if (options.verbose) {\n config.output.verbose = true\n }\n validateConfig(config)\n const exitCode = await deepClean(config, options.yes, cwd)\n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('easy-changeset')\n .description('copy .changeset/d8-template.mdx to .changeset/d8-template.md if both exist')\n .action(async () => {\n try {\n const exitCode = await easyChangeset(cwd)\n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\nprogram\n .command('generate-nextjs-architecture')\n .description('generate nextjs-architecture.mdx for project structure')\n .option('-v, --verbose', 'show detailed logs', false)\n .action(async (options) => {\n try {\n const config = loadConfig(cwd, {}, options.verbose)\n if (options.verbose) {\n config.output.verbose = true\n }\n validateConfig(config)\n const exitCode = await generateNextjsArchitecture(config, cwd)\n if (typeof process !== 'undefined') {\n process.exit(exitCode)\n }\n } catch (error) {\n console.error('Error:', error)\n if (typeof process !== 'undefined') {\n process.exit(1)\n }\n }\n })\n\n// parse command line arguments\nif (typeof process !== 'undefined') {\n program.parse(process.argv)\n} "]}
package/dist/index.d.mts CHANGED
@@ -20,6 +20,7 @@ interface DevScriptsConfig {
20
20
  logDir: string;
21
21
  verbose?: boolean;
22
22
  };
23
+ architectureConfig?: Record<string, string>;
23
24
  }
24
25
  interface PackageJsonDevScripts {
25
26
  locales?: string[];
package/dist/index.d.ts CHANGED
@@ -20,6 +20,7 @@ interface DevScriptsConfig {
20
20
  logDir: string;
21
21
  verbose?: boolean;
22
22
  };
23
+ architectureConfig?: Record<string, string>;
23
24
  }
24
25
  interface PackageJsonDevScripts {
25
26
  locales?: string[];
package/dist/index.js CHANGED
@@ -794,6 +794,60 @@ var DEFAULT_CONFIG = {
794
794
  output: {
795
795
  logDir: "logs",
796
796
  verbose: false
797
+ },
798
+ architectureConfig: {
799
+ ".": "\u9879\u76EE\u6839\u76EE\u5F55",
800
+ ".env.local": "\u672C\u5730\u73AF\u5883\u53D8\u91CF\u914D\u7F6E",
801
+ ".eslintrc.json": "ESLint \u4EE3\u7801\u89C4\u8303\u914D\u7F6E",
802
+ ".gitignore": "Git\u5FFD\u7565\u6587\u4EF6\u914D\u7F6E",
803
+ ".source": "Fuma\u6570\u636E\u6E90Build\u4EA7\u7269",
804
+ "CHANGELOG.md": "\u53D8\u66F4\u8BB0\u5F55",
805
+ "components.json": "\u7EC4\u4EF6\u4F9D\u8D56\u6E05\u5355",
806
+ "dev-scripts.config.json": "dev-scripts\u811A\u672C\u5DE5\u5177\u914D\u7F6E",
807
+ "LICENSE": "\u5F00\u6E90\u8BB8\u53EF\u8BC1",
808
+ "messages": "\u7FFB\u8BD1\u76EE\u5F55",
809
+ "next-env.d.ts": "Next.js\u73AF\u5883\u7C7B\u578B\u58F0\u660E",
810
+ "next.config.ts": "Next.js\u9879\u76EE\u914D\u7F6E",
811
+ "package.json": "\u9879\u76EE\u4F9D\u8D56\u4E0E\u811A\u672C",
812
+ "postcss.config.mjs": "PostCSS \u914D\u7F6E",
813
+ "source.config.ts": "Fuma\u6570\u636E\u6E90\u626B\u63CF\u914D\u7F6E",
814
+ "src": "\u6E90\u7801\u76EE\u5F55",
815
+ "tsconfig.json": "TypeScript\u914D\u7F6E",
816
+ "tsconfig.node.json": "Node.js\u76F8\u5173TypeScript \u914D\u7F6E",
817
+ "logs": "\u65E5\u5FD7\u8F93\u51FA\u76EE\u5F55",
818
+ "apps": "Monorepo\u591A\u5E94\u7528\u76EE\u5F55",
819
+ "packages": "\u5B50\u5DE5\u7A0B\u7EC4\u4EF6\u5E93\u76EE\u5F55",
820
+ "README.md": "\u9879\u76EE\u8BF4\u660E\u6587\u6863",
821
+ "app": "Next.js \u5E94\u7528\u4E3B\u5165\u53E3\u76EE\u5F55",
822
+ "components": "\u9875\u9762\u7EC4\u4EF6",
823
+ "lib": "\u5DE5\u5177\u5305",
824
+ "mdx": "FumaMDX\u6587\u6863",
825
+ "middleware.ts": "\u4E2D\u95F4\u4EF6\u5165\u53E3",
826
+ "i18n.ts": "\u591A\u8BED\u8A00\u914D\u7F6E",
827
+ "globals.css": "\u5168\u5C40\u6837\u5F0F",
828
+ "layout.config.tsx": "\u5E03\u5C40\u914D\u7F6E",
829
+ "layout.tsx": "\u5E03\u5C40",
830
+ "loading.tsx": "\u5168\u5C40\u52A0\u8F7D\u7EC4\u4EF6",
831
+ "hero.tsx": "\u9996\u9875\u5927\u5B57\u7EC4\u4EF6",
832
+ "mdx-components.tsx": "FumaMDX\u7EC4\u4EF6\u5E93(\u81EA\u5B9A\u4E49)",
833
+ "llm-content": "FumaMDX\u590D\u5236\u63A5\u53E3",
834
+ "[locale]": "Nextjs i18n\u8DEF\u7531\u76EE\u5F55",
835
+ "(clerk)": "Clerk\u8BA4\u8BC1",
836
+ "(home)": "\u9996\u9875",
837
+ "[...catchAll]": "\u5168\u5C40404\u9875\u9762",
838
+ "blog": "\u535A\u5BA2",
839
+ "docs": "\u6587\u6863",
840
+ "legal": "\u6CD5\u5F8B",
841
+ "api": "API\u63A5\u53E3",
842
+ "robots.ts": "robots.txt\u751F\u6210\u811A\u672C",
843
+ "sitemap.ts": "\u7F51\u7AD9\u5730\u56FE",
844
+ "appConfig.ts": "\u5E94\u7528\u5168\u5C40\u914D\u7F6E",
845
+ "site-config.ts": "\u7F51\u7AD9\u56FE\u6807\u914D\u7F6E",
846
+ "ioc.mdx": "\u6708\u5EA6/\u7EDF\u8BA1",
847
+ "meta.json": "FumaMDX\u5143\u6570\u636E",
848
+ "nextjs-architecture.mdx": "Next.js\u9879\u76EE\u7ED3\u6784",
849
+ ".github": "GitHub \u914D\u7F6E\u76EE\u5F55",
850
+ "workflows": "CI/CD \u5DE5\u4F5C\u6D41\u914D\u7F6E"
797
851
  }
798
852
  };
799
853