i18-fe-automator-beta 2.0.3 → 2.0.5

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.
@@ -2333,6 +2333,73 @@ async function getColumn(moduleArr = [], dynamicsArr = [], parentRule) {
2333
2333
 
2334
2334
  // import packageJson from "../package.json" assert { type: "json" };
2335
2335
  const { version } = getPackageJson();
2336
+
2337
+ // 获取git修改的文件以及暂存区的文件(包含未跟踪的新文件)
2338
+ function getGitChangedFiles() {
2339
+ const cwd = process.cwd();
2340
+ try {
2341
+ const repoRoot = process$1.execSync("git rev-parse --show-toplevel", {
2342
+ cwd,
2343
+ encoding: "utf-8",
2344
+ }).trim();
2345
+ // 1. git status --porcelain 获取已跟踪文件的变更(已暂存staged + 未暂存unstaged)
2346
+ // 注意: 不能用 git diff --name-only HEAD, 它不会包含未跟踪(untracked)的新文件
2347
+ const statusOutput = process$1.execSync("git status --porcelain", {
2348
+ cwd: repoRoot,
2349
+ encoding: "utf-8",
2350
+ });
2351
+ const trackedFiles = statusOutput
2352
+ .split("\n")
2353
+ .map((line) => line.replace(/\r$/, ""))
2354
+ .filter(Boolean)
2355
+ .map((line) => {
2356
+ // 输出格式: XY filename, X=暂存区状态, Y=工作区状态
2357
+ const status = line.slice(0, 2);
2358
+ let filePath = line.slice(3);
2359
+ // 重命名(R)/复制(C): "old -> new", 取新文件名
2360
+ if (status[0] === "R" || status[0] === "C") {
2361
+ const idx = filePath.indexOf(" -> ");
2362
+ if (idx > -1) filePath = filePath.slice(idx + 4);
2363
+ }
2364
+ // 含特殊字符的文件名git会加引号, 去除引号
2365
+ if (filePath.startsWith('"') && filePath.endsWith('"')) {
2366
+ filePath = filePath.slice(1, -1);
2367
+ }
2368
+ return { status, filePath };
2369
+ })
2370
+ // 排除删除的文件 (D 在暂存区或工作区)
2371
+ .filter(({ status }) => !status.includes("D"))
2372
+ // 未跟踪文件(??)用 git ls-files 单独处理(因为可能只显示目录,不展开)
2373
+ .filter(({ status }) => status !== "??")
2374
+ .map(({ filePath }) => filePath);
2375
+
2376
+ // 2. git ls-files --others --exclude-standard 获取未跟踪的新文件
2377
+ // 相比 git status --porcelain, 它会自动展开目录, 列出具体文件
2378
+ const untrackedOutput = process$1.execSync(
2379
+ "git ls-files --others --exclude-standard",
2380
+ { cwd: repoRoot, encoding: "utf-8" }
2381
+ );
2382
+ const untrackedFiles = untrackedOutput
2383
+ .split("\n")
2384
+ .map((f) => f.trim())
2385
+ .filter(Boolean);
2386
+
2387
+ // 合并去重
2388
+ const allFiles = Array.from(
2389
+ new Set([...trackedFiles, ...untrackedFiles])
2390
+ )
2391
+ // 只保留lint支持的文件类型
2392
+ .filter((f) => /\.(js|jsx|vue|ts|tsx)$/.test(f))
2393
+ // git输出的路径相对于仓库根目录, 转为绝对路径
2394
+ .map((f) => path.join(repoRoot, f))
2395
+ // 过滤掉不存在的文件
2396
+ .filter((f) => fs.existsSync(f));
2397
+ return allFiles;
2398
+ } catch (error) {
2399
+ console.log(chalk.red("获取git修改文件失败,请确保在git仓库中运行"));
2400
+ return [];
2401
+ }
2402
+ }
2336
2403
  // const spinner = ora();
2337
2404
  commander.program.version(version);
2338
2405
  commander.program.option("-i, --input <type>", "翻译空key");
@@ -2391,8 +2458,26 @@ if (sass) {
2391
2458
  syncSassConfig();
2392
2459
  } else if (upload) {
2393
2460
  upload$1();
2394
- } else if (lint) {
2395
- lint$1(lint, fix);
2461
+ } else if (lint !== undefined) {
2462
+ // 必须传入路径
2463
+ if (!lint || !lint.trim()) {
2464
+ console.log(
2465
+ chalk.red("请传入要检测的路径, 或使用 -lint git 检测git修改的文件")
2466
+ );
2467
+ process.exit(1);
2468
+ }
2469
+ let lintPatterns = lint.trim();
2470
+ // 如果路径写死为 git, 则用git检测修改的文件以及暂存区的文件作为路径
2471
+ if (lintPatterns === "git") {
2472
+ lintPatterns = getGitChangedFiles();
2473
+ if (!lintPatterns.length) {
2474
+ console.log(chalk.green("没有检测到git修改的文件"));
2475
+ process.exit(0);
2476
+ }
2477
+ console.log(chalk.green(`检测到${lintPatterns.length}个git修改文件:`));
2478
+ lintPatterns.forEach((f) => console.log(chalk.gray(` ${f}`)));
2479
+ }
2480
+ lint$1(lintPatterns, fix);
2396
2481
  } else if (lintc) {
2397
2482
  inquirer.prompt(rules).then(async ({ rule }) => {
2398
2483
  const parentRule = rule;
@@ -20,7 +20,7 @@ import { createRequire } from 'node:module';
20
20
  import tsParser from '@typescript-eslint/parser';
21
21
  import stripAnsi from 'strip-ansi';
22
22
  import 'shelljs';
23
- import process$1 from 'child_process';
23
+ import process$1, { execSync } from 'child_process';
24
24
  import _ from 'lodash';
25
25
  import 'nanoid';
26
26
  import request$1 from 'request-promise';
@@ -2311,6 +2311,73 @@ async function getColumn(moduleArr = [], dynamicsArr = [], parentRule) {
2311
2311
 
2312
2312
  // import packageJson from "../package.json" assert { type: "json" };
2313
2313
  const { version } = getPackageJson();
2314
+
2315
+ // 获取git修改的文件以及暂存区的文件(包含未跟踪的新文件)
2316
+ function getGitChangedFiles() {
2317
+ const cwd = process.cwd();
2318
+ try {
2319
+ const repoRoot = execSync("git rev-parse --show-toplevel", {
2320
+ cwd,
2321
+ encoding: "utf-8",
2322
+ }).trim();
2323
+ // 1. git status --porcelain 获取已跟踪文件的变更(已暂存staged + 未暂存unstaged)
2324
+ // 注意: 不能用 git diff --name-only HEAD, 它不会包含未跟踪(untracked)的新文件
2325
+ const statusOutput = execSync("git status --porcelain", {
2326
+ cwd: repoRoot,
2327
+ encoding: "utf-8",
2328
+ });
2329
+ const trackedFiles = statusOutput
2330
+ .split("\n")
2331
+ .map((line) => line.replace(/\r$/, ""))
2332
+ .filter(Boolean)
2333
+ .map((line) => {
2334
+ // 输出格式: XY filename, X=暂存区状态, Y=工作区状态
2335
+ const status = line.slice(0, 2);
2336
+ let filePath = line.slice(3);
2337
+ // 重命名(R)/复制(C): "old -> new", 取新文件名
2338
+ if (status[0] === "R" || status[0] === "C") {
2339
+ const idx = filePath.indexOf(" -> ");
2340
+ if (idx > -1) filePath = filePath.slice(idx + 4);
2341
+ }
2342
+ // 含特殊字符的文件名git会加引号, 去除引号
2343
+ if (filePath.startsWith('"') && filePath.endsWith('"')) {
2344
+ filePath = filePath.slice(1, -1);
2345
+ }
2346
+ return { status, filePath };
2347
+ })
2348
+ // 排除删除的文件 (D 在暂存区或工作区)
2349
+ .filter(({ status }) => !status.includes("D"))
2350
+ // 未跟踪文件(??)用 git ls-files 单独处理(因为可能只显示目录,不展开)
2351
+ .filter(({ status }) => status !== "??")
2352
+ .map(({ filePath }) => filePath);
2353
+
2354
+ // 2. git ls-files --others --exclude-standard 获取未跟踪的新文件
2355
+ // 相比 git status --porcelain, 它会自动展开目录, 列出具体文件
2356
+ const untrackedOutput = execSync(
2357
+ "git ls-files --others --exclude-standard",
2358
+ { cwd: repoRoot, encoding: "utf-8" }
2359
+ );
2360
+ const untrackedFiles = untrackedOutput
2361
+ .split("\n")
2362
+ .map((f) => f.trim())
2363
+ .filter(Boolean);
2364
+
2365
+ // 合并去重
2366
+ const allFiles = Array.from(
2367
+ new Set([...trackedFiles, ...untrackedFiles])
2368
+ )
2369
+ // 只保留lint支持的文件类型
2370
+ .filter((f) => /\.(js|jsx|vue|ts|tsx)$/.test(f))
2371
+ // git输出的路径相对于仓库根目录, 转为绝对路径
2372
+ .map((f) => path.join(repoRoot, f))
2373
+ // 过滤掉不存在的文件
2374
+ .filter((f) => fs.existsSync(f));
2375
+ return allFiles;
2376
+ } catch (error) {
2377
+ console.log(chalk.red("获取git修改文件失败,请确保在git仓库中运行"));
2378
+ return [];
2379
+ }
2380
+ }
2314
2381
  // const spinner = ora();
2315
2382
  program.version(version);
2316
2383
  program.option("-i, --input <type>", "翻译空key");
@@ -2369,8 +2436,26 @@ if (sass) {
2369
2436
  syncSassConfig();
2370
2437
  } else if (upload) {
2371
2438
  upload$1();
2372
- } else if (lint) {
2373
- lint$1(lint, fix);
2439
+ } else if (lint !== undefined) {
2440
+ // 必须传入路径
2441
+ if (!lint || !lint.trim()) {
2442
+ console.log(
2443
+ chalk.red("请传入要检测的路径, 或使用 -lint git 检测git修改的文件")
2444
+ );
2445
+ process.exit(1);
2446
+ }
2447
+ let lintPatterns = lint.trim();
2448
+ // 如果路径写死为 git, 则用git检测修改的文件以及暂存区的文件作为路径
2449
+ if (lintPatterns === "git") {
2450
+ lintPatterns = getGitChangedFiles();
2451
+ if (!lintPatterns.length) {
2452
+ console.log(chalk.green("没有检测到git修改的文件"));
2453
+ process.exit(0);
2454
+ }
2455
+ console.log(chalk.green(`检测到${lintPatterns.length}个git修改文件:`));
2456
+ lintPatterns.forEach((f) => console.log(chalk.gray(` ${f}`)));
2457
+ }
2458
+ lint$1(lintPatterns, fix);
2374
2459
  } else if (lintc) {
2375
2460
  inquirer.prompt(rules).then(async ({ rule }) => {
2376
2461
  const parentRule = rule;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18-fe-automator-beta",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "i18-fe-automator-beta内测版本,只用于key: ''替换、检测中文规则等",
5
5
  "type": "module",
6
6
  "bin": {