lingo.dev 0.101.0 → 0.102.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/build/cli.mjs CHANGED
@@ -4542,9 +4542,7 @@ function reorderKeys(data, originalInput) {
4542
4542
  const dataKeys = new Set(Object.keys(data));
4543
4543
  for (const key of originalKeys) {
4544
4544
  if (dataKeys.has(key)) {
4545
- if (data[key]) {
4546
- orderedData[key] = reorderKeys(data[key], originalInput[key]);
4547
- }
4545
+ orderedData[key] = reorderKeys(data[key], originalInput[key]);
4548
4546
  dataKeys.delete(key);
4549
4547
  }
4550
4548
  }
@@ -8344,6 +8342,135 @@ function processRenamedKeys(delta, targetData) {
8344
8342
  }).fromPairs().value();
8345
8343
  }
8346
8344
 
8345
+ // src/cli/cmd/run/watch.ts
8346
+ import * as chokidar from "chokidar";
8347
+ import chalk13 from "chalk";
8348
+ async function watch2(ctx) {
8349
+ const debounceDelay = ctx.flags.debounce || 5e3;
8350
+ console.log(chalk13.hex(colors.orange)("[Watch Mode]"));
8351
+ console.log(
8352
+ `\u{1F440} Watching for changes... (Press ${chalk13.yellow("Ctrl+C")} to stop)`
8353
+ );
8354
+ console.log(chalk13.dim(` Debounce delay: ${debounceDelay}ms`));
8355
+ console.log("");
8356
+ const state = {
8357
+ isRunning: false,
8358
+ pendingChanges: /* @__PURE__ */ new Set()
8359
+ };
8360
+ const watchPatterns = await getWatchPatterns(ctx);
8361
+ if (watchPatterns.length === 0) {
8362
+ console.log(chalk13.yellow("\u26A0\uFE0F No source files found to watch"));
8363
+ return;
8364
+ }
8365
+ console.log(chalk13.dim(`Watching ${watchPatterns.length} file pattern(s):`));
8366
+ watchPatterns.forEach((pattern) => {
8367
+ console.log(chalk13.dim(` \u2022 ${pattern}`));
8368
+ });
8369
+ console.log("");
8370
+ const watcher = chokidar.watch(watchPatterns, {
8371
+ ignoreInitial: true,
8372
+ persistent: true,
8373
+ awaitWriteFinish: {
8374
+ stabilityThreshold: 500,
8375
+ pollInterval: 100
8376
+ }
8377
+ });
8378
+ watcher.on("change", (path17) => {
8379
+ handleFileChange(path17, state, ctx);
8380
+ });
8381
+ watcher.on("add", (path17) => {
8382
+ handleFileChange(path17, state, ctx);
8383
+ });
8384
+ watcher.on("unlink", (path17) => {
8385
+ handleFileChange(path17, state, ctx);
8386
+ });
8387
+ watcher.on("error", (error) => {
8388
+ console.error(
8389
+ chalk13.red(
8390
+ `Watch error: ${error instanceof Error ? error.message : String(error)}`
8391
+ )
8392
+ );
8393
+ });
8394
+ process.on("SIGINT", () => {
8395
+ console.log(chalk13.yellow("\n\n\u{1F6D1} Stopping watch mode..."));
8396
+ watcher.close();
8397
+ process.exit(0);
8398
+ });
8399
+ await new Promise(() => {
8400
+ });
8401
+ }
8402
+ async function getWatchPatterns(ctx) {
8403
+ if (!ctx.config) return [];
8404
+ const buckets = getBuckets(ctx.config);
8405
+ const patterns = [];
8406
+ for (const bucket of buckets) {
8407
+ if (ctx.flags.bucket && !ctx.flags.bucket.includes(bucket.type)) {
8408
+ continue;
8409
+ }
8410
+ for (const bucketPath of bucket.paths) {
8411
+ if (ctx.flags.file) {
8412
+ if (!ctx.flags.file.some((f) => bucketPath.pathPattern.includes(f))) {
8413
+ continue;
8414
+ }
8415
+ }
8416
+ const sourceLocale = ctx.flags.sourceLocale || ctx.config.locale.source;
8417
+ const sourcePattern = bucketPath.pathPattern.replace(
8418
+ "[locale]",
8419
+ sourceLocale
8420
+ );
8421
+ patterns.push(sourcePattern);
8422
+ }
8423
+ }
8424
+ return patterns;
8425
+ }
8426
+ function handleFileChange(filePath, state, ctx) {
8427
+ const debounceDelay = ctx.flags.debounce || 5e3;
8428
+ state.pendingChanges.add(filePath);
8429
+ console.log(chalk13.dim(`\u{1F4DD} File changed: ${filePath}`));
8430
+ if (state.debounceTimer) {
8431
+ clearTimeout(state.debounceTimer);
8432
+ }
8433
+ state.debounceTimer = setTimeout(async () => {
8434
+ if (state.isRunning) {
8435
+ console.log(
8436
+ chalk13.yellow("\u23F3 Translation already in progress, skipping...")
8437
+ );
8438
+ return;
8439
+ }
8440
+ await triggerRetranslation(state, ctx);
8441
+ }, debounceDelay);
8442
+ }
8443
+ async function triggerRetranslation(state, ctx) {
8444
+ if (state.isRunning) return;
8445
+ state.isRunning = true;
8446
+ try {
8447
+ const changedFiles = Array.from(state.pendingChanges);
8448
+ state.pendingChanges.clear();
8449
+ console.log(chalk13.hex(colors.green)("\n\u{1F504} Triggering retranslation..."));
8450
+ console.log(chalk13.dim(`Changed files: ${changedFiles.join(", ")}`));
8451
+ console.log("");
8452
+ const runCtx = {
8453
+ ...ctx,
8454
+ tasks: [],
8455
+ results: /* @__PURE__ */ new Map()
8456
+ };
8457
+ await plan(runCtx);
8458
+ if (runCtx.tasks.length === 0) {
8459
+ console.log(chalk13.dim("\u2728 No translation tasks needed"));
8460
+ } else {
8461
+ await execute(runCtx);
8462
+ await renderSummary(runCtx.results);
8463
+ }
8464
+ console.log(chalk13.hex(colors.green)("\u2705 Retranslation completed"));
8465
+ console.log(chalk13.dim("\u{1F440} Continuing to watch for changes...\n"));
8466
+ } catch (error) {
8467
+ console.error(chalk13.red(`\u274C Retranslation failed: ${error.message}`));
8468
+ console.log(chalk13.dim("\u{1F440} Continuing to watch for changes...\n"));
8469
+ } finally {
8470
+ state.isRunning = false;
8471
+ }
8472
+ }
8473
+
8347
8474
  // src/cli/cmd/run/_types.ts
8348
8475
  import {
8349
8476
  bucketTypeSchema as bucketTypeSchema3
@@ -8362,7 +8489,10 @@ var flagsSchema2 = z2.object({
8362
8489
  concurrency: z2.number().positive().default(10),
8363
8490
  debug: z2.boolean().default(false),
8364
8491
  sourceLocale: z2.string().optional(),
8365
- targetLocale: z2.array(z2.string()).optional()
8492
+ targetLocale: z2.array(z2.string()).optional(),
8493
+ watch: z2.boolean().default(false),
8494
+ debounce: z2.number().positive().default(5e3)
8495
+ // 5 seconds default
8366
8496
  });
8367
8497
 
8368
8498
  // src/cli/cmd/run/_utils.ts
@@ -8413,6 +8543,13 @@ var run_default = new Command16().command("run").description("Run Lingo.dev loca
8413
8543
  "--concurrency <concurrency>",
8414
8544
  "Number of concurrent tasks to run",
8415
8545
  (val) => parseInt(val)
8546
+ ).option(
8547
+ "--watch",
8548
+ "Watch source files for changes and automatically retranslate"
8549
+ ).option(
8550
+ "--debounce <milliseconds>",
8551
+ "Debounce delay in milliseconds for watch mode (default: 5000ms)",
8552
+ (val) => parseInt(val)
8416
8553
  ).action(async (args) => {
8417
8554
  let authId = null;
8418
8555
  try {
@@ -8442,6 +8579,9 @@ var run_default = new Command16().command("run").description("Run Lingo.dev loca
8442
8579
  await renderSpacer();
8443
8580
  await renderSummary(ctx.results);
8444
8581
  await renderSpacer();
8582
+ if (ctx.flags.watch) {
8583
+ await watch2(ctx);
8584
+ }
8445
8585
  trackEvent(authId, "cmd.run.success", {
8446
8586
  config: ctx.config,
8447
8587
  flags: ctx.flags
@@ -9183,7 +9323,7 @@ import {
9183
9323
  import { Command as Command18 } from "interactive-commander";
9184
9324
  import Z11 from "zod";
9185
9325
  import Ora10 from "ora";
9186
- import chalk13 from "chalk";
9326
+ import chalk14 from "chalk";
9187
9327
  import Table from "cli-table3";
9188
9328
  var status_default = new Command18().command("status").description("Show the status of the localization process").helpOption("-h, --help", "Show help").option(
9189
9329
  "--locale <locale>",
@@ -9358,7 +9498,7 @@ var status_default = new Command18().command("status").description("Show the sta
9358
9498
  (totalWordCount.get(_targetLocale) || 0) + sourceWordCount
9359
9499
  );
9360
9500
  bucketOra.succeed(
9361
- `[${sourceLocale} -> ${targetLocale}] ${chalk13.red(
9501
+ `[${sourceLocale} -> ${targetLocale}] ${chalk14.red(
9362
9502
  `0% complete`
9363
9503
  )} (0/${sourceKeys.length} keys) - file not found`
9364
9504
  );
@@ -9403,30 +9543,30 @@ var status_default = new Command18().command("status").description("Show the sta
9403
9543
  const completionPercent = (completeKeys.length / totalKeysInFile * 100).toFixed(1);
9404
9544
  if (missingKeys.length === 0 && updatedKeys.length === 0) {
9405
9545
  bucketOra.succeed(
9406
- `[${sourceLocale} -> ${targetLocale}] ${chalk13.green(
9546
+ `[${sourceLocale} -> ${targetLocale}] ${chalk14.green(
9407
9547
  `100% complete`
9408
9548
  )} (${completeKeys.length}/${totalKeysInFile} keys)`
9409
9549
  );
9410
9550
  } else {
9411
- const message = `[${sourceLocale} -> ${targetLocale}] ${parseFloat(completionPercent) > 50 ? chalk13.yellow(`${completionPercent}% complete`) : chalk13.red(`${completionPercent}% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`;
9551
+ const message = `[${sourceLocale} -> ${targetLocale}] ${parseFloat(completionPercent) > 50 ? chalk14.yellow(`${completionPercent}% complete`) : chalk14.red(`${completionPercent}% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`;
9412
9552
  bucketOra.succeed(message);
9413
9553
  if (flags.verbose) {
9414
9554
  if (missingKeys.length > 0) {
9415
9555
  console.log(
9416
- ` ${chalk13.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`
9556
+ ` ${chalk14.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`
9417
9557
  );
9418
9558
  console.log(
9419
- ` ${chalk13.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`
9559
+ ` ${chalk14.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`
9420
9560
  );
9421
9561
  console.log(
9422
- ` ${chalk13.dim(
9562
+ ` ${chalk14.dim(
9423
9563
  `Example missing: ${missingKeys.slice(0, 2).join(", ")}${missingKeys.length > 2 ? "..." : ""}`
9424
9564
  )}`
9425
9565
  );
9426
9566
  }
9427
9567
  if (updatedKeys.length > 0) {
9428
9568
  console.log(
9429
- ` ${chalk13.yellow(`Updated:`)} ${updatedKeys.length} keys that changed in source`
9569
+ ` ${chalk14.yellow(`Updated:`)} ${updatedKeys.length} keys that changed in source`
9430
9570
  );
9431
9571
  }
9432
9572
  }
@@ -9445,22 +9585,22 @@ var status_default = new Command18().command("status").description("Show the sta
9445
9585
  );
9446
9586
  const totalCompletedKeys = totalSourceKeyCount - totalKeysNeedingTranslation / targetLocales.length;
9447
9587
  console.log();
9448
- ora.succeed(chalk13.green(`Localization status completed.`));
9449
- console.log(chalk13.bold.cyan(`
9588
+ ora.succeed(chalk14.green(`Localization status completed.`));
9589
+ console.log(chalk14.bold.cyan(`
9450
9590
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557`));
9451
- console.log(chalk13.bold.cyan(`\u2551 LOCALIZATION STATUS REPORT \u2551`));
9452
- console.log(chalk13.bold.cyan(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D`));
9453
- console.log(chalk13.bold(`
9591
+ console.log(chalk14.bold.cyan(`\u2551 LOCALIZATION STATUS REPORT \u2551`));
9592
+ console.log(chalk14.bold.cyan(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D`));
9593
+ console.log(chalk14.bold(`
9454
9594
  \u{1F4DD} SOURCE CONTENT:`));
9455
9595
  console.log(
9456
- `\u2022 Source language: ${chalk13.green(i18nConfig.locale.source)}`
9596
+ `\u2022 Source language: ${chalk14.green(i18nConfig.locale.source)}`
9457
9597
  );
9458
9598
  console.log(
9459
- `\u2022 Source keys: ${chalk13.yellow(
9599
+ `\u2022 Source keys: ${chalk14.yellow(
9460
9600
  totalSourceKeyCount.toString()
9461
9601
  )} keys across all files`
9462
9602
  );
9463
- console.log(chalk13.bold(`
9603
+ console.log(chalk14.bold(`
9464
9604
  \u{1F310} LANGUAGE BY LANGUAGE BREAKDOWN:`));
9465
9605
  const table = new Table({
9466
9606
  head: [
@@ -9490,19 +9630,19 @@ var status_default = new Command18().command("status").description("Show the sta
9490
9630
  let statusColor;
9491
9631
  if (stats.missing === totalSourceKeyCount) {
9492
9632
  statusText = "\u{1F534} Not started";
9493
- statusColor = chalk13.red;
9633
+ statusColor = chalk14.red;
9494
9634
  } else if (stats.missing === 0 && stats.updated === 0) {
9495
9635
  statusText = "\u2705 Complete";
9496
- statusColor = chalk13.green;
9636
+ statusColor = chalk14.green;
9497
9637
  } else if (parseFloat(percentComplete) > 80) {
9498
9638
  statusText = "\u{1F7E1} Almost done";
9499
- statusColor = chalk13.yellow;
9639
+ statusColor = chalk14.yellow;
9500
9640
  } else if (parseFloat(percentComplete) > 0) {
9501
9641
  statusText = "\u{1F7E0} In progress";
9502
- statusColor = chalk13.yellow;
9642
+ statusColor = chalk14.yellow;
9503
9643
  } else {
9504
9644
  statusText = "\u{1F534} Not started";
9505
- statusColor = chalk13.red;
9645
+ statusColor = chalk14.red;
9506
9646
  }
9507
9647
  const words = totalWordCount.get(locale) || 0;
9508
9648
  totalWordsToTranslate += words;
@@ -9510,17 +9650,17 @@ var status_default = new Command18().command("status").description("Show the sta
9510
9650
  locale,
9511
9651
  statusColor(statusText),
9512
9652
  `${stats.complete}/${totalSourceKeyCount} (${percentComplete}%)`,
9513
- stats.missing > 0 ? chalk13.red(stats.missing.toString()) : "0",
9514
- stats.updated > 0 ? chalk13.yellow(stats.updated.toString()) : "0",
9515
- totalNeeded > 0 ? chalk13.magenta(totalNeeded.toString()) : "0",
9653
+ stats.missing > 0 ? chalk14.red(stats.missing.toString()) : "0",
9654
+ stats.updated > 0 ? chalk14.yellow(stats.updated.toString()) : "0",
9655
+ totalNeeded > 0 ? chalk14.magenta(totalNeeded.toString()) : "0",
9516
9656
  words > 0 ? `~${words.toLocaleString()}` : "0"
9517
9657
  ]);
9518
9658
  }
9519
9659
  console.log(table.toString());
9520
- console.log(chalk13.bold(`
9660
+ console.log(chalk14.bold(`
9521
9661
  \u{1F4CA} USAGE ESTIMATE:`));
9522
9662
  console.log(
9523
- `\u2022 WORDS TO BE CONSUMED: ~${chalk13.yellow.bold(
9663
+ `\u2022 WORDS TO BE CONSUMED: ~${chalk14.yellow.bold(
9524
9664
  totalWordsToTranslate.toLocaleString()
9525
9665
  )} words across all languages`
9526
9666
  );
@@ -9538,11 +9678,11 @@ var status_default = new Command18().command("status").description("Show the sta
9538
9678
  }
9539
9679
  }
9540
9680
  if (flags.confirm && Object.keys(fileStats).length > 0) {
9541
- console.log(chalk13.bold(`
9681
+ console.log(chalk14.bold(`
9542
9682
  \u{1F4D1} BREAKDOWN BY FILE:`));
9543
9683
  Object.entries(fileStats).sort((a, b) => b[1].wordCount - a[1].wordCount).forEach(([path17, stats]) => {
9544
9684
  if (stats.sourceKeys === 0) return;
9545
- console.log(chalk13.bold(`
9685
+ console.log(chalk14.bold(`
9546
9686
  \u2022 ${path17}:`));
9547
9687
  console.log(
9548
9688
  ` ${stats.sourceKeys} source keys, ~${stats.wordCount.toLocaleString()} source words`
@@ -9562,13 +9702,13 @@ var status_default = new Command18().command("status").description("Show the sta
9562
9702
  const total = stats.sourceKeys;
9563
9703
  const completion = (complete / total * 100).toFixed(1);
9564
9704
  let status = "\u2705 Complete";
9565
- let statusColor = chalk13.green;
9705
+ let statusColor = chalk14.green;
9566
9706
  if (langStats.missing === total) {
9567
9707
  status = "\u274C Not started";
9568
- statusColor = chalk13.red;
9708
+ statusColor = chalk14.red;
9569
9709
  } else if (langStats.missing > 0 || langStats.updated > 0) {
9570
9710
  status = `\u26A0\uFE0F ${completion}% complete`;
9571
- statusColor = chalk13.yellow;
9711
+ statusColor = chalk14.yellow;
9572
9712
  }
9573
9713
  let details = "";
9574
9714
  if (langStats.missing > 0 || langStats.updated > 0) {
@@ -9592,16 +9732,16 @@ var status_default = new Command18().command("status").description("Show the sta
9592
9732
  const missingLanguages = targetLocales.filter(
9593
9733
  (locale) => languageStats[locale].complete === 0
9594
9734
  );
9595
- console.log(chalk13.bold.green(`
9735
+ console.log(chalk14.bold.green(`
9596
9736
  \u{1F4A1} OPTIMIZATION TIPS:`));
9597
9737
  if (missingLanguages.length > 0) {
9598
9738
  console.log(
9599
- `\u2022 ${chalk13.yellow(missingLanguages.join(", "))} ${missingLanguages.length === 1 ? "has" : "have"} no translations yet`
9739
+ `\u2022 ${chalk14.yellow(missingLanguages.join(", "))} ${missingLanguages.length === 1 ? "has" : "have"} no translations yet`
9600
9740
  );
9601
9741
  }
9602
9742
  if (completeLanguages.length > 0) {
9603
9743
  console.log(
9604
- `\u2022 ${chalk13.green(completeLanguages.join(", "))} ${completeLanguages.length === 1 ? "is" : "are"} completely translated`
9744
+ `\u2022 ${chalk14.green(completeLanguages.join(", "))} ${completeLanguages.length === 1 ? "is" : "are"} completely translated`
9605
9745
  );
9606
9746
  }
9607
9747
  if (targetLocales.length > 1) {
@@ -9684,7 +9824,7 @@ function validateParams2(i18nConfig, flags) {
9684
9824
  import { Command as Command19 } from "interactive-commander";
9685
9825
  import * as cp from "node:child_process";
9686
9826
  import figlet2 from "figlet";
9687
- import chalk14 from "chalk";
9827
+ import chalk15 from "chalk";
9688
9828
  import { vice as vice2 } from "gradient-string";
9689
9829
  var colors2 = {
9690
9830
  orange: "#ff6600",
@@ -9698,7 +9838,7 @@ var may_the_fourth_default = new Command19().command("may-the-fourth").descripti
9698
9838
  await renderClear2();
9699
9839
  await renderBanner2();
9700
9840
  await renderSpacer2();
9701
- console.log(chalk14.hex(colors2.yellow)("Loading the Star Wars movie..."));
9841
+ console.log(chalk15.hex(colors2.yellow)("Loading the Star Wars movie..."));
9702
9842
  await renderSpacer2();
9703
9843
  await new Promise((resolve, reject) => {
9704
9844
  const ssh = cp.spawn("ssh", ["starwarstel.net"], {
@@ -9717,12 +9857,12 @@ var may_the_fourth_default = new Command19().command("may-the-fourth").descripti
9717
9857
  });
9718
9858
  await renderSpacer2();
9719
9859
  console.log(
9720
- `${chalk14.hex(colors2.green)("We hope you enjoyed it! :)")} ${chalk14.hex(
9860
+ `${chalk15.hex(colors2.green)("We hope you enjoyed it! :)")} ${chalk15.hex(
9721
9861
  colors2.blue
9722
9862
  )("May the Fourth be with you! \u{1F680}")}`
9723
9863
  );
9724
9864
  await renderSpacer2();
9725
- console.log(chalk14.dim(`---`));
9865
+ console.log(chalk15.dim(`---`));
9726
9866
  await renderSpacer2();
9727
9867
  await renderHero2();
9728
9868
  });
@@ -9745,21 +9885,21 @@ async function renderBanner2() {
9745
9885
  }
9746
9886
  async function renderHero2() {
9747
9887
  console.log(
9748
- `\u26A1\uFE0F ${chalk14.hex(colors2.green)(
9888
+ `\u26A1\uFE0F ${chalk15.hex(colors2.green)(
9749
9889
  "Lingo.dev"
9750
9890
  )} - open-source, AI-powered i18n CLI for web & mobile localization.`
9751
9891
  );
9752
9892
  console.log(" ");
9753
9893
  console.log(
9754
- chalk14.hex(colors2.blue)("\u2B50 GitHub Repo: https://lingo.dev/go/gh")
9894
+ chalk15.hex(colors2.blue)("\u2B50 GitHub Repo: https://lingo.dev/go/gh")
9755
9895
  );
9756
- console.log(chalk14.hex(colors2.blue)("\u{1F4AC} 24/7 Support: hi@lingo.dev"));
9896
+ console.log(chalk15.hex(colors2.blue)("\u{1F4AC} 24/7 Support: hi@lingo.dev"));
9757
9897
  }
9758
9898
 
9759
9899
  // package.json
9760
9900
  var package_default = {
9761
9901
  name: "lingo.dev",
9762
- version: "0.101.0",
9902
+ version: "0.102.0",
9763
9903
  description: "Lingo.dev CLI",
9764
9904
  private: false,
9765
9905
  publishConfig: {
@@ -9894,6 +10034,7 @@ var package_default = {
9894
10034
  ai: "^4.3.15",
9895
10035
  bitbucket: "^2.12.0",
9896
10036
  chalk: "^5.4.1",
10037
+ chokidar: "^4.0.3",
9897
10038
  "cli-progress": "^3.12.0",
9898
10039
  "cli-table3": "^0.6.5",
9899
10040
  cors: "^2.8.5",
@@ -9962,6 +10103,7 @@ var package_default = {
9962
10103
  },
9963
10104
  devDependencies: {
9964
10105
  "@types/babel__generator": "^7.27.0",
10106
+ "@types/chokidar": "^2.1.7",
9965
10107
  "@types/cli-progress": "^3.11.6",
9966
10108
  "@types/cors": "^2.8.17",
9967
10109
  "@types/diff": "^7.0.0",