@mirascript/cli 0.1.90 → 0.1.92

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/index.js CHANGED
@@ -299,81 +299,129 @@ command.description("执行 MiraScript 脚本,默认命令").option(
299
299
 
300
300
  // src/commands/format.ts
301
301
  import fs from "node:fs/promises";
302
- import { program as program2 } from "@commander-js/extra-typings";
302
+ import { text as readText } from "node:stream/consumers";
303
+ import { InvalidArgumentError as InvalidArgumentError2, program as program2 } from "@commander-js/extra-typings";
303
304
  import { loadModule } from "@mirascript/bindings/wasm";
304
- var templateConfig = null;
305
- var scriptConfig = null;
306
- async function getConfig(templateMode) {
307
- const mod = await loadModule();
308
- if (templateMode) {
309
- if (!templateConfig) {
310
- templateConfig = new mod.wasm.CompileConfig();
311
- templateConfig.input_mode = mod.wasm.InputMode.Template;
312
- templateConfig.trivia = true;
313
- templateConfig.diagnostic_position_encoding = mod.wasm.DiagnosticPositionEncoding.Utf8;
305
+ import { formatDiagnosticMessage, parseDiagnostics } from "@mirascript/mirascript/subtle";
306
+ var DEFAULT_LINE_WIDTH = 80;
307
+ var DEFAULT_TAB_SIZE = 2;
308
+ function positiveInteger(name) {
309
+ return (value) => {
310
+ const parsed = Number(value);
311
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
312
+ throw new InvalidArgumentError2(`${name} 必须是正整数`);
314
313
  }
315
- return templateConfig;
316
- } else {
317
- if (!scriptConfig) {
318
- scriptConfig = new mod.wasm.CompileConfig();
319
- scriptConfig.input_mode = mod.wasm.InputMode.Script;
320
- scriptConfig.trivia = true;
321
- scriptConfig.diagnostic_position_encoding = mod.wasm.DiagnosticPositionEncoding.Utf8;
322
- }
323
- return scriptConfig;
314
+ return parsed;
315
+ };
316
+ }
317
+ function applyEdits(source, edits) {
318
+ let output = source;
319
+ for (const edit of edits.toSorted((left, right) => right.start - left.start)) {
320
+ output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
324
321
  }
322
+ return output;
325
323
  }
326
- async function format2(input, templateMode) {
327
- if (!input) return "";
328
- const mod = await loadModule();
329
- const compiler = new mod.wasm.MonacoCompiler(input, await getConfig(templateMode));
330
- try {
331
- if (!compiler.parse()) return void 0;
332
- const formatted = compiler.format();
333
- if (!formatted) return void 0;
334
- return formatted;
335
- } finally {
336
- compiler.free();
324
+ async function format2(input, templateMode, options2) {
325
+ const module = await loadModule();
326
+ const result = module.formatSync(
327
+ input,
328
+ {
329
+ input_mode: templateMode ? "Template" : "Script",
330
+ trivia: true,
331
+ // MiraScript 配置枚举的公开序列化值固定为 Utf8。
332
+ // eslint-disable-next-line unicorn/text-encoding-identifier-case
333
+ diagnostic_position_encoding: "Utf8"
334
+ },
335
+ {
336
+ tabSize: options2.tabSize,
337
+ insertSpaces: !options2.useTabs,
338
+ printWidth: options2.lineWidth
339
+ }
340
+ );
341
+ const parsed = parseDiagnostics(input, result.diagnostics);
342
+ if (parsed.errors.length > 0) {
343
+ for (const diagnostic of parsed.errors) {
344
+ console.error(formatDiagnosticMessage(diagnostic.code));
345
+ }
346
+ return void 0;
337
347
  }
348
+ return applyEdits(input, result.edits);
338
349
  }
339
350
  var command2 = program2.command("format");
340
- command2.description("格式化 MiraScript 脚本").option("-w, --write", "直接修改文件").option("-t, --template", "对无法推断类型的文件使用模板模式").argument("<script...>", '要格式化的脚本文件路径或 glob,输入 "-" 表示从标准输入读取').action(async (script, opt) => {
341
- if (script.length === 0) {
342
- command2.help({ error: true });
351
+ command2.description("格式化 MiraScript 脚本").option("-w, --write", "直接修改文件").option("-c, --check", "检查文件是否已经格式化").option("-t, --template", "使用模板模式;文件默认根据 .miratpl 扩展名推断").option("--no-template", "强制使用脚本模式").option("--line-width <columns>", "最大行宽", positiveInteger("最大行宽"), DEFAULT_LINE_WIDTH).option("--tab-size <columns>", "缩进宽度", positiveInteger("缩进宽度"), DEFAULT_TAB_SIZE).option("--use-tabs", "使用制表符缩进").argument("<script...>", '要格式化的脚本文件路径或 glob,输入 "-" 表示从标准输入读取').action(async (patterns, options2) => {
352
+ if (options2.write && options2.check) {
353
+ console.error("--write --check 不能同时使用");
354
+ process.exitCode = 2;
355
+ return;
343
356
  }
344
- if (script.length === 1 && script[0] === "-") {
345
- let input = "";
346
- for await (const chunk of process.stdin) {
347
- input += chunk;
357
+ const formatterOptions = {
358
+ lineWidth: options2.lineWidth,
359
+ tabSize: options2.tabSize,
360
+ useTabs: !!options2.useTabs
361
+ };
362
+ if (patterns.length === 1 && patterns[0] === "-") {
363
+ if (options2.write || options2.check) {
364
+ console.error("标准输入不能与 --write 或 --check 一起使用");
365
+ process.exitCode = 2;
366
+ return;
348
367
  }
349
- const output = await format2(input, !!opt.template);
368
+ const input = await readText(process.stdin);
369
+ const output = await format2(input, options2.template === true, formatterOptions);
350
370
  if (output == null) {
351
371
  console.error("格式化失败");
352
- process.exit(1);
372
+ process.exitCode = 1;
373
+ return;
353
374
  }
354
375
  process.stdout.write(output);
355
376
  return;
356
377
  }
357
- for await (const file of fs.glob(script)) {
358
- const input = await fs.readFile(file, "utf8");
359
- const output = await format2(input, !!opt.template);
360
- if (opt.write) {
378
+ if (patterns.includes("-")) {
379
+ console.error("标准输入不能与文件路径混用");
380
+ process.exitCode = 2;
381
+ return;
382
+ }
383
+ const files = /* @__PURE__ */ new Set();
384
+ for await (const file of fs.glob(patterns)) files.add(file);
385
+ const sortedFiles = [...files].toSorted();
386
+ if (sortedFiles.length === 0) {
387
+ console.error("没有匹配到任何脚本文件");
388
+ process.exitCode = 2;
389
+ return;
390
+ }
391
+ let failed = false;
392
+ for (const [index, file] of sortedFiles.entries()) {
393
+ try {
394
+ const input = await fs.readFile(file, "utf8");
395
+ const template = options2.template ?? file.toLowerCase().endsWith(".miratpl");
396
+ const output = await format2(input, template, formatterOptions);
361
397
  if (output == null) {
362
398
  console.error(`格式化失败: ${file}`);
399
+ failed = true;
363
400
  continue;
364
401
  }
365
- if (output === input) {
366
- console.warn(`文件未更改: ${file}`);
367
- continue;
402
+ if (options2.check) {
403
+ if (output !== input) {
404
+ console.error(`需要格式化: ${file}`);
405
+ failed = true;
406
+ }
407
+ } else if (options2.write) {
408
+ if (output !== input) {
409
+ await fs.writeFile(file, output, "utf8");
410
+ console.error(`已格式化: ${file}`);
411
+ }
412
+ } else if (sortedFiles.length === 1) {
413
+ process.stdout.write(output);
414
+ } else {
415
+ if (index > 0) process.stdout.write("\n");
416
+ process.stdout.write(`// File: ${file}
417
+ ${output}`);
368
418
  }
369
- await fs.writeFile(file, output, "utf8");
370
- console.warn(`已格式化文件: ${file}`);
371
- } else {
372
- process.stdout.write(`// File: ${file}
373
- `);
374
- process.stdout.write((output ?? input) + "\n");
419
+ } catch (error) {
420
+ console.error(`无法处理文件 ${file}: ${error instanceof Error ? error.message : String(error)}`);
421
+ failed = true;
375
422
  }
376
423
  }
424
+ if (failed) process.exitCode = 1;
377
425
  });
378
426
 
379
427
  // src/commands/repl.ts
@@ -540,7 +588,8 @@ var binName = Object.keys(pkg.bin)[0];
540
588
  if (binName) {
541
589
  p = program5.name(binName);
542
590
  }
543
- var index_default = p.version(pkg.version).description(pkg.description);
591
+ p.version(pkg.version).description(pkg.description);
592
+ var index_default = p;
544
593
  export {
545
594
  index_default as default
546
595
  };
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/commands/run.ts", "../src/utils/execute.ts", "../src/utils/print.ts", "../src/utils/color.ts", "../src/utils/repl.ts", "../src/commands/format.ts", "../src/commands/repl.ts", "../src/commands/man/index.ts", "../src/commands/man/lib.ts", "../src/commands/man/table.ts"],
4
- "mappings": "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",
5
- "names": ["program", "styles", "supportsColor", "text", "options", "format", "supportsColor", "styles", "compile", "CompileError", "createVmContext", "CompileError", "createVmContext", "script", "compile", "result", "p", "template", "program", "format", "command", "program", "program", "program", "lib", "styles", "lib", "styles", "styles", "path", "lib", "styles", "name", "command", "program", "lib", "program"]
4
+ "mappings": ";AAAA,SAAS,WAAAA,gBAAe;AACxB,OAAO,SAAS,gBAAgB,KAAK,EAAE,MAAM,OAAO;;;ACApD,SAAS,UAAU,YAAY;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AACrB,SAAS,sBAAsB,eAAe;AAC9C,SAAS,aAAa,wBAAsC;;;ACJ5D,OAAOC,aAAY;AACnB,OAAOC,oBAAmB;AAC1B,SAAS,SAAS,cAAc,uBAAqC;AACrE,SAAS,WAAW;;;ACJpB,OAAO,YAAY;AAEnB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACG;;;ACRP,OAAO,mBAAmB;AACnB,IAAM,UAAU,CAAC,cAAc;AAG/B,SAAS,OAAOC,OAAc,OAAwB;AACzD,MAAI,SAAS,CAAC,SAAS;AACnB,WAAO,MAAM,OAAOA,QAAO,MAAM;AAAA,EACrC,OAAO;AACH,WAAOA;AAAA,EACX;AACJ;AAEO,SAAS,MAAMA,OAAc,OAAsB;AACtD,UAAQ,OAAO,MAAM,OAAOA,OAAM,KAAK,CAAC;AAC5C;;;ADHA,IAAM,UAAqC;AAAA,EACvC,UAAU;AAAA,EACV,cAAc,UAAU,SAAY,MAAM,OAAO,aAAa,GAAG,OAAO,IAAI;AAAA,EAC5E,kBAAkB,UAAU,SAAY,CAAC,MAAM,OAAO,iBAAiB,CAAC,GAAG,OAAO,IAAI;AAAA,EACtF,iBAAiB,UAAU,SAAY,CAAC,MAAM,OAAO,gBAAgB,CAAC,GAAG,OAAO,MAAM;AAAA,EACtF,sBAAsB,UAChB,SACA,CAAC,GAAG,SAAS;AACT,UAAM,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI;AAC3C,QAAI,MAAM;AACN,aAAO,OAAO,MAAM,OAAO;AAAA,IAC/B,OAAO;AACH,aAAO,IAAI,OAAO,MAAM;AAAA,IAC5B;AAAA,EACJ;AAAA,EACN,uBAAuB,UAAU,SAAY,CAAC,MAAM,OAAO,GAAG,OAAO,IAAI;AAAA,EACzE,mBAAmB,UAAU,SAAY,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG,OAAO,WAAW;AAAA,EACpF,mBAAmB,CAAC,MAAM,OAAO,WAAW,UAAU,CAAC,GAAG,OAAO,IAAI;AAAA,EACrE,iBAAiB,CAAC,GAAG,OAAOC,aAAY;AACpC,WACI,OAAO,WAAW,UAAU,CAAC,GAAG,OAAO,OAAO,IAC9C,MACAA,SAAQ,gBAAgB,EAAE,OAAmB,OAAOA,QAAO;AAAA,EAEnE;AACJ;AAGO,SAAS,MAAM,OAAc,QAAQ,GAAW;AACnD,MAAI,UAAU,QAAW;AACrB,WAAO,OAAO,eAAe,OAAO,IAAI;AAAA,EAC5C;AACA,SAAO,UAAU,OAAO,EAAE,GAAG,SAAS,UAAU,MAAM,CAAC;AAC3D;;;ADtCA,IAAM,EAAE,OAAO,YAAY,IAAI;AAE/B,MAAM,aAAa,YAAY,aAAa,CAAC,KAAKC,YAAW;AACzD,MAAI,CAACA,WAAU,OAAO,OAAO,UAAU;AACnC,WAAO;AAAA,EACX;AACA,MAAIA,YAAW,QAAQA,YAAW,QAAQ,CAACA,SAAQ;AAC/C,WAAO,MAAM,GAAG;AAAA,EACpB;AACA,SAAO;AACX;AAGA,eAAsB,QAClB,QACA,UACA,WACA,UACa;AACb,MAAI;AACA,UAAM,IAAI,MAAM,QAAQ,QAAQ,EAAE,YAAY,WAAW,aAAa,UAAU,WAAW,MAAM,SAAS,CAAC;AAC3G,UAAM,IAAI,EAAE,gBAAgB,SAAS,CAAC;AACtC,QAAI,UAAU;AACV,cAAQ,IAAI,CAAC;AAAA,IACjB,OAAO;AACH,cAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,IACxB;AAAA,EACJ,SAAS,IAAI;AACT,QAAI;AACJ,QAAI,cAAc,cAAc;AAC5B,gBAAU,GAAG;AAAA,IACjB,OAAO;AACH,gBAAW,GAAa,SAAU,GAAa,WAAW,OAAO,EAAE;AAAA,IACvE;AACA,QAAIC,eAAc,QAAQ;AACtB,cAAQ,MAAMC,QAAO,IAAI,OAAO,UAAUA,QAAO,IAAI,KAAK;AAAA,IAC9D,OAAO;AACH,cAAQ,MAAM,OAAO;AAAA,IACzB;AACA,YAAQ,WAAW;AAAA,EACvB;AACJ;;;AGhDA,SAAS,OAAO,mBAAmB;AACnC,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B;AAAA,EACI,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,mBAAAC;AAAA,OAIG;AACP,SAAS,gBAAgB,iBAAiB;AAK1C,SAAS,sBAAsB,OAAuB;AAClD,MAAI,EAAE,iBAAiBC,eAAe,OAAM;AAC5C,MACI,MAAM,QAAQ,SAAS,eAAe,eAAe,iBAAiB,CAAC,KACvE,MAAM,QAAQ,SAAS,eAAe,eAAe,mBAAmB,CAAC,KACzE,MAAM,QAAQ,SAAS,eAAe,eAAe,iBAAiB,CAAC,KACvE,MAAM,QAAQ,SAAS,eAAe,eAAe,yBAAyB,CAAC,KAC/E,MAAM,QAAQ,SAAS,eAAe,eAAe,kBAAkB,CAAC,KACxE,MAAM,QAAQ,SAAS,eAAe,eAAe,eAAe,CAAC,KACrE,MAAM,QAAQ,SAAS,eAAe,eAAe,kBAAkB,CAAC,KACxE,MAAM,QAAQ,SAAS,eAAe,eAAe,gBAAgB,CAAC,GACxE;AACE,UAAM,IAAI,YAAY,KAAK;AAAA,EAC/B;AACA,QAAM;AACV;AAEA,IAAM,cAAc,IAAI;AAAA,EACpB,OAAO,qCAAqC,UAAU,eAAe,MAAM;AAAA,EAC3E;AACJ;AACA,IAAM,aAAa,IAAI,OAAO,OAAO,iBAAiB,UAAU,eAAe,MAAM,UAAU,GAAG;AAGlG,eAAsB,YAA2B;AAC7C,MAAI,aAAsB;AAC1B,QAAM,UAAU,oBAAI,IAAqB;AACzC,QAAM,YAAYC;AAAA,IACd,CAAC,QAAQ;AACL,UAAI,QAAQ,IAAI,GAAG,GAAG;AAClB,eAAO,QAAQ,IAAI,GAAG;AAAA,MAC1B;AACA,UAAI,QAAQ,KAAK;AACb,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX;AAAA,IACA,MAAM;AACF,YAAM,OAAO,CAAC,GAAG,QAAQ,KAAK,CAAC;AAC/B,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACX;AAAA,EACJ;AACA,QAAM,YAAY,OAAO,KAAa,aAAqC;AACvE,UAAM,MAAwB,EAAE,YAAY,UAAU,UAAU,QAAQ,MAAM,WAAW,KAAK;AAC9F,QAAI;AACA,YAAM,OAAO,IAAI,WAAW,WAAW,IAAI;AAC3C,YAAM,OAAO,YAAY,KAAK,IAAI;AAClC,UAAI,MAAM;AACN,cAAM,UAAU,KAAK,CAAC;AACtB,cAAMC,UAAS,MAAMC,SAAQ,GAAG,IAAI,WAAW,OAAO,KAAK,GAAG;AAC9D,cAAMC,UAASF,QAAO,SAAS;AAC/B,gBAAQ,IAAI,SAASE,OAAM;AAC3B,eAAOA;AAAA,MACX;AACA,YAAM,MAAM,WAAW,KAAK,IAAI;AAChC,UAAI,KAAK;AACL,cAAM,UAAU,IAAI,CAAC;AACrB,cAAMF,UAAS,MAAMC,SAAQ,GAAG,IAAI,WAAW,OAAO,KAAK,GAAG;AAC9D,cAAMC,UAASF,QAAO,SAAS;AAC/B,gBAAQ,IAAI,SAASE,OAAM;AAC3B,eAAOA;AAAA,MACX;AAEA,YAAM,SAAS,MAAMD,SAAQ,MAAM,GAAG;AACtC,YAAM,SAAS,OAAO,SAAS;AAC/B,mBAAa;AACb,aAAO;AAAA,IACX,SAAS,KAAK;AACV,4BAAsB,GAAG;AAAA,IAC7B;AAAA,EACJ;AACA,QAAM,OAAO,MAAM;AAAA,IACf,WAAW,CAAC;AAAA,IACZ,WAAW;AAAA,IACX,MAAM,YAAY,OAAO,KAAa,GAAY,aAAqB,UAAU,KAAK,QAAQ,CAAC;AAAA,IAC/F,WAAW,CAAC,SAAiB;AACzB,YAAM,YAAY,KAAK,MAAM,QAAQ,EAAE,IAAI,KAAK;AAChD,aAAO,CAAC,UAAU,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,CAAC,GAAG,SAAS;AAAA,IAC9E;AAAA,IACA,QAAQ,CAAC,UAAyB;AAC9B,UAAI,UAAU,QAAW;AACrB,eAAO;AAAA,MACX;AACA,UAAI,cAAc,KAAK,GAAG;AACtB,eAAO,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,MAC1C;AACA,aAAO,MAAM,KAAK;AAAA,IACtB;AAAA,EACJ,CAAC;AACD,OAAK,aAAa;AAAA,IACd,UAAU,KAAK,QAAQ,QAAQ,GAAG,0BAA0B;AAAA,IAC5D,yBAAyB;AAAA,IACzB,qBAAqB,CAAC,QAAQ;AAAA,IAE9B;AAAA,EACJ,CAAC;AACD,OAAK,GAAG,SAAS,MAAM;AACnB,YAAQ,MAAM;AACd,iBAAa;AAAA,EACjB,CAAC;AACD,QAAM,KAAK,MAAM,MAAM;AAC3B;;;AJhHA,IAAM,kBAAkB;AAGxB,eAAe,gBAAgB,QAAkC;AAC7D,MAAI;AACA,UAAM,IAAI,MAAM,KAAK,MAAM;AAC3B,QAAI,CAAC,EAAE,OAAO,GAAG;AACb,cAAQ,MAAM,aAAa,MAAM,EAAE;AACnC,cAAQ,WAAW;AACnB,aAAO;AAAA,IACX;AAAA,EACJ,SAAS,IAAI;AACT,QAAK,GAA6B,SAAS,UAAU;AACjD,cAAQ,MAAM,YAAY,MAAM,EAAE;AAClC,cAAQ,WAAW;AAAA,IACvB,WAAY,GAA6B,SAAS,UAAU;AACxD,cAAQ,MAAM,SAAU,GAA6B,OAAO,EAAE;AAC9D,cAAQ,WAAW;AAAA,IACvB,OAAO;AACH,cAAQ,MAAM,aAAc,GAA6B,OAAO,EAAE;AAClE,cAAQ,WAAW;AAAA,IACvB;AACA,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,IAAM,UAAU,QAAQ,QAAQ,OAAO,EAAE,WAAW,KAAK,CAAC;AAC1D,QACK,YAAY,uBAAuB,EACnC;AAAA,EACG;AAAA,EACA;AAAA,EACA,CAAC,GAAGE,OAAM;AACN,IAAAA,KAAI,EAAE,GAAGA,GAAE;AACX,UAAM,IAAI,EAAE,QAAQ,GAAG;AACvB,QAAI,IAAI,GAAG;AACP,MAAAA,GAAE,CAAC,IAAI;AAAA,IACX,OAAO;AACH,YAAM,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK;AAC/B,YAAM,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK;AAClC,UAAI;AACA,cAAM,KAAK,YAAY,WAAW,KAAK,IAAI,EAAE;AAC7C,QAAAA,GAAE,GAAG,IAAI,MAAM;AAAA,MACnB,QAAQ;AACJ,QAAAA,GAAE,GAAG,IAAI;AAAA,MACb;AAAA,IACJ;AACA,WAAOA;AAAA,EACX;AAAA,EACA,CAAC;AACL,EACC,OAAO,kBAAkB,QAAQ,EACjC;AAAA,EACG;AAAA,EACA;AAAA,EACA,CAAC,MAAM;AACH,UAAM,KAAK,OAAO,WAAW,CAAC;AAC9B,QAAI,OAAO,MAAM,EAAE,KAAK,KAAK,GAAG;AAC5B,YAAM,IAAI,qBAAqB,aAAa;AAAA,IAChD;AACA,WAAO;AAAA,EACX;AAAA,EACA;AACJ,EACC,OAAO,iBAAiB,QAAQ,EAChC,OAAO,uBAAuB,QAAQ,EACtC,SAAS,YAAY,yBAAyB,EAC9C,OAAO,OAAO,QAAQ,QAAQ;AAC3B,MAAI,UAAU,QAAQ,IAAI,QAAQ,MAAM;AACpC,UAAM,UAAU;AAChB;AAAA,EACJ;AACA,mBAAiB,IAAI,WAAW,OAAO,iBAAiB;AACxD,MAAI,IAAI,QAAQ,MAAM;AAClB,QAAI,UAAU,MAAM;AAChB,cAAQ,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,IAChC;AACA,UAAMC,YAAW,CAAC,CAAC,IAAI;AACvB,UAAM,QAAQ,IAAI,MAAMA,WAAU,IAAI,UAAUA,YAAW,iBAAiB,WAAW;AACvF;AAAA,EACJ;AACA,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,aAAW;AACX,MAAI,WAAW,KAAK;AAChB,cAAU,MAAM,KAAK,QAAQ,KAAK;AAClC,eAAW,CAAC,CAAC,IAAI;AACjB,UAAM;AAAA,EACV,OAAO;AACH,QAAI,CAAE,MAAM,gBAAgB,MAAM,GAAI;AAClC;AAAA,IACJ;AACA,cAAU,MAAM,SAAS,QAAQ,MAAM;AACvC,eAAW,IAAI,YAAY,OAAO,SAAS,UAAU;AACrD,UAAM,cAAc,MAAM,EAAE;AAAA,EAChC;AACA,QAAM,QAAQ,SAAS,UAAU,IAAI,UAAU,GAAG;AACtD,CAAC;;;AK3GL,OAAO,QAAQ;AACf,SAAS,QAAQ,gBAAgB;AACjC,SAAS,wBAAAC,uBAAsB,WAAAC,gBAAe;AAC9C,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB,wBAAwB;AAE1D,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAUzB,SAAS,gBAAgB,MAAyC;AAC9D,SAAO,CAAC,UAAU;AACd,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAC9C,YAAM,IAAID,sBAAqB,GAAG,IAAI,SAAS;AAAA,IACnD;AACA,WAAO;AAAA,EACX;AACJ;AAGA,SAAS,WAAW,QAAgB,OAA4E;AAC5G,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,SAAS,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC1E,aAAS,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI,KAAK,OAAO,OAAO,MAAM,KAAK,GAAG;AAAA,EAC5E;AACA,SAAO;AACX;AAGA,eAAeE,QAAO,OAAe,cAAuBC,UAAwD;AAChH,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,SAAS,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,MACI,YAAY,eAAe,aAAa;AAAA,MACxC,QAAQ;AAAA;AAAA;AAAA,MAGR,8BAA8B;AAAA,IAClC;AAAA,IACA;AAAA,MACI,SAASA,SAAQ;AAAA,MACjB,cAAc,CAACA,SAAQ;AAAA,MACvB,YAAYA,SAAQ;AAAA,IACxB;AAAA,EACJ;AACA,QAAM,SAAS,iBAAiB,OAAO,OAAO,WAAW;AACzD,MAAI,OAAO,OAAO,SAAS,GAAG;AAC1B,eAAW,cAAc,OAAO,QAAQ;AACpC,cAAQ,MAAM,wBAAwB,WAAW,IAAI,CAAC;AAAA,IAC1D;AACA,WAAO;AAAA,EACX;AACA,SAAO,WAAW,OAAO,OAAO,KAAK;AACzC;AAEA,IAAMC,WAAUH,SAAQ,QAAQ,QAAQ;AACxCG,SACK,YAAY,mBAAmB,EAC/B,OAAO,eAAe,QAAQ,EAC9B,OAAO,eAAe,aAAa,EACnC,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,iBAAiB,UAAU,EAClC,OAAO,0BAA0B,QAAQ,gBAAgB,MAAM,GAAG,kBAAkB,EACpF,OAAO,wBAAwB,QAAQ,gBAAgB,MAAM,GAAG,gBAAgB,EAChF,OAAO,cAAc,SAAS,EAC9B,SAAS,eAAe,oCAAoC,EAC5D,OAAO,OAAO,UAAUD,aAAY;AACjC,MAAIA,SAAQ,SAASA,SAAQ,OAAO;AAChC,YAAQ,MAAM,0BAA0B;AACxC,YAAQ,WAAW;AACnB;AAAA,EACJ;AACA,QAAM,mBAAqC;AAAA,IACvC,WAAWA,SAAQ;AAAA,IACnB,SAASA,SAAQ;AAAA,IACjB,SAAS,CAAC,CAACA,SAAQ;AAAA,EACvB;AACA,MAAI,SAAS,WAAW,KAAK,SAAS,CAAC,MAAM,KAAK;AAC9C,QAAIA,SAAQ,SAASA,SAAQ,OAAO;AAChC,cAAQ,MAAM,gCAAgC;AAC9C,cAAQ,WAAW;AACnB;AAAA,IACJ;AACA,UAAM,QAAQ,MAAM,SAAS,QAAQ,KAAK;AAC1C,UAAM,SAAS,MAAMD,QAAO,OAAOC,SAAQ,aAAa,MAAM,gBAAgB;AAC9E,QAAI,UAAU,MAAM;AAChB,cAAQ,MAAM,OAAO;AACrB,cAAQ,WAAW;AACnB;AAAA,IACJ;AACA,YAAQ,OAAO,MAAM,MAAM;AAC3B;AAAA,EACJ;AACA,MAAI,SAAS,SAAS,GAAG,GAAG;AACxB,YAAQ,MAAM,eAAe;AAC7B,YAAQ,WAAW;AACnB;AAAA,EACJ;AAEA,QAAM,QAAQ,oBAAI,IAAY;AAC9B,mBAAiB,QAAQ,GAAG,KAAK,QAAQ,EAAG,OAAM,IAAI,IAAI;AAC1D,QAAM,cAAc,CAAC,GAAG,KAAK,EAAE,SAAS;AACxC,MAAI,YAAY,WAAW,GAAG;AAC1B,YAAQ,MAAM,aAAa;AAC3B,YAAQ,WAAW;AACnB;AAAA,EACJ;AAEA,MAAI,SAAS;AACb,aAAW,CAAC,OAAO,IAAI,KAAK,YAAY,QAAQ,GAAG;AAC/C,QAAI;AACA,YAAM,QAAQ,MAAM,GAAG,SAAS,MAAM,MAAM;AAC5C,YAAM,WAAWA,SAAQ,YAAY,KAAK,YAAY,EAAE,SAAS,UAAU;AAC3E,YAAM,SAAS,MAAMD,QAAO,OAAO,UAAU,gBAAgB;AAC7D,UAAI,UAAU,MAAM;AAChB,gBAAQ,MAAM,UAAU,IAAI,EAAE;AAC9B,iBAAS;AACT;AAAA,MACJ;AACA,UAAIC,SAAQ,OAAO;AACf,YAAI,WAAW,OAAO;AAClB,kBAAQ,MAAM,UAAU,IAAI,EAAE;AAC9B,mBAAS;AAAA,QACb;AAAA,MACJ,WAAWA,SAAQ,OAAO;AACtB,YAAI,WAAW,OAAO;AAClB,gBAAM,GAAG,UAAU,MAAM,QAAQ,MAAM;AACvC,kBAAQ,MAAM,SAAS,IAAI,EAAE;AAAA,QACjC;AAAA,MACJ,WAAW,YAAY,WAAW,GAAG;AACjC,gBAAQ,OAAO,MAAM,MAAM;AAAA,MAC/B,OAAO;AACH,YAAI,QAAQ,EAAG,SAAQ,OAAO,MAAM,IAAI;AACxC,gBAAQ,OAAO,MAAM,YAAY,IAAI;AAAA,EAAK,MAAM,EAAE;AAAA,MACtD;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,UAAU,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AACzF,eAAS;AAAA,IACb;AAAA,EACJ;AACA,MAAI,OAAQ,SAAQ,WAAW;AACnC,CAAC;;;ACvJL,SAAS,WAAAE,gBAAe;AAGxBC,SACK,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAChB,QAAM,UAAU;AACpB,CAAC;;;ACPL,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAAC,YAAW;AACpB,SAAS,UAAU,iBAAiB;;;ACHpC,OAAOC,aAAY;AAGnB,SAAS,OAAAC,YAAW;;;ACHpB,OAAOC,aAAY;AAIZ,SAAS,WACZ,KACA,OACA,YAA+C,QAC3C;AACJ,MAAI,OAAO;AACP,UAAM,QAAQ,MAAMC,QAAO,IAAI;AAAA,EACnC;AAEA,QAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK;AACnC,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAE1D,aAAW,OAAO,MAAM;AACpB,UAAM,QAAQ,IAAI,GAAG;AACrB,QAAI,UAAU,OAAW;AAEzB,UAAM,YAAY,UAAU,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;AACrD,UAAM,MAAMA,QAAO,GAAG;AACtB,UAAM,KAAKA,QAAO,WAAW;AAC7B,UAAM,IAAI,OAAO,eAAe,IAAI,MAAM,GAAGA,QAAO,GAAG;AACvD,UAAM,OAAO,YAAY,IAAI;AAAA,EACjC;AACJ;;;ADnBA,SAAS,YAAYC,OAAiC;AAClD,QAAM,WAAWA,MACZ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AACnC,MAAI,SAAS,CAAC,MAAM,OAAO;AACvB,WAAO,SAAS,MAAM,CAAC;AAAA,EAC3B;AACA,SAAO;AACX;AAGA,SAAS,YAAYA,OAAqE;AACtF,MAAI,QAAgBC;AACpB,aAAW,OAAOD,OAAM;AACpB,QAAI,UAAU,OAAW,QAAO;AAChC,YAAQ,MAAM,IAAI,KAAK,CAAuB;AAAA,EAClD;AACA,SAAO;AACX;AAGA,SAAS,QAAQ,IAAkB;AAC/B,QAAM,IAAIE,QAAO,UAAU;AAC/B;AAGA,SAAS,aAAa,SAAuB;AACzC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAW,QAAQ,OAAO;AACtB,UAAM,OAAOA,QAAO,GAAG;AACvB,UAAM,MAAMA,QAAO,IAAI;AACvB,UAAM,IAAI;AAAA,EACd;AACJ;AAGO,SAAS,SAAS,MAAuB;AAC5C,QAAMF,QAAO,YAAY,IAAI;AAC7B,QAAM,QAAQ,YAAYA,KAAI;AAC9B,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,WAAW,OAAO;AAClB,QAAI,MAAM,SAAS;AACf,mBAAa,MAAM,OAAO;AAAA,IAC9B;AACA,YAAQ,KAAK;AACb,UAAM,GAAG;AACT,UAAMA,MAAK,KAAK,GAAG,GAAGE,QAAO,UAAU;AACvC,UAAM,KAAK;AACX,UAAM,MAAM,MAAM,KAAK,CAAC;AACxB,UAAM,KAAK;AAAA,EACf,WAAW,aAAa,OAAO;AAC3B,QAAI,MAAM,SAAS;AACf,mBAAa,MAAM,OAAO;AAAA,IAC9B;AACA,UAAM,SAAS,MAAM,SAAS,OAAO,QAAQ,MAAM,MAAM,IAAI;AAC7D,eAAW,CAACC,OAAM,KAAK,KAAK,UAAU,CAAC,GAAG;AACtC,UAAI,CAAC,MAAM,YAAa;AACxB,YAAM,UAAU,KAAKA,KAAI,QAAQ,MAAM,WAAW;AAClD,mBAAa,OAAO;AAAA,IACxB;AACA,QAAI,MAAM,SAAS,aAAa;AAC5B,mBAAa,SAAS,MAAM,QAAQ,WAAW,EAAE;AAAA,IACrD;AACA,YAAQ,IAAI;AACZ,UAAM,GAAG;AACT,UAAMH,MAAK,KAAK,GAAG,GAAGE,QAAO,YAAY;AACzC,UAAM,GAAG;AACT,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI;AAAA,IACd,OAAO;AACH,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,cAAM,CAACC,OAAM,KAAK,IAAI,OAAO,CAAC;AAC9B,YAAI,IAAI,GAAG;AACP,gBAAM,IAAI;AAAA,QACd;AACA,cAAM,OAAOA,OAAMD,QAAO,MAAM,GAAGA,QAAO,UAAU;AACpD,cAAM,IAAI;AACV,cAAM,MAAM,MAAMA,QAAO,WAAW;AAAA,MACxC;AAAA,IACJ;AACA,UAAM,GAAG;AACT,QAAI,MAAM,SAAS;AACf,YAAM,MAAM;AACZ,YAAM,MAAM,QAAQ,MAAMA,QAAO,WAAW;AAAA,IAChD;AACA,UAAM,KAAK;AACX,QAAI,MAAM,UAAU,QAAQ;AACxB,iBAAW,WAAW,MAAM,UAAU;AAClC,qBAAa,OAAO;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,YAAQ,KAAK;AACb,UAAM,GAAG;AACT,UAAMF,MAAK,KAAK,GAAG,GAAGE,QAAO,UAAU;AACvC,UAAM,MAAM;AACZ,eAAW,OAA8C,IAAI,CAAC,MAAM,EAAE,OAAO;AAC7E,UAAM,KAAK;AAAA,EACf;AACA,SAAO;AACX;;;ADtGA,IAAME,WAAUC,SAAQ,QAAQ,KAAK;AACrCD,SACK,YAAY,mBAAmB,EAC/B;AAAA,EACG;AAAA,EACA;AACJ,EACC,OAAO,CAAC,UAAU;AACf,MAAI,SAAS,UAAU;AACnB,UAAM,OAAO,SAAS,KAA8B;AACpD,YAAQ,IAAI,IAAI;AAAA,EACpB,WAAW,SAAS,WAAW;AAC3B,UAAM,OAAO,UAAU,KAA+B;AACtD,YAAQ,IAAI,IAAI;AAAA,EACpB,WAAW,SAAS,KAAK,GAAG;AACxB;AAAA,EACJ,WAAW,UAAU,YAAY;AAC7B,eAAW,UAAU,iBAAiB;AAAA,EAC1C,WAAW,UAAU,aAAa;AAC9B,eAAW,WAAW,iBAAiB;AAAA,EAC3C,WAAW,UAAU,aAAa;AAC9B,eAAWE,MAAK,mBAAmB,CAAC,GAAG,MAAM;AACzC,UAAI,aAAa,GAAG;AAChB,eAAO,EAAE,WAAW;AAAA,MACxB;AACA,aAAO,MAAM,CAAC;AAAA,IAClB,CAAC;AAAA,EACL,OAAO;AACH,IAAAF,SAAQ,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAChC;AACJ,CAAC;;;AR7BL,IAAI,IAAIG;AACR,IAAM,UAAU,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC;AACtC,IAAI,SAAS;AACT,MAAIA,SAAQ,KAAK,OAAO;AAC5B;AACA,EAAE,QAAQ,IAAI,OAAO,EAAE,YAAY,IAAI,WAAW;AAElD,IAAO,gBAAQ;",
5
+ "names": ["program", "styles", "supportsColor", "text", "options", "format", "supportsColor", "styles", "compile", "CompileError", "createVmContext", "CompileError", "createVmContext", "script", "compile", "result", "p", "template", "InvalidArgumentError", "program", "format", "options", "command", "program", "program", "program", "lib", "styles", "lib", "styles", "styles", "path", "lib", "styles", "name", "command", "program", "lib", "program"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirascript/cli",
3
- "version": "0.1.90",
3
+ "version": "0.1.92",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
6
  "description": "Cli for MiraScript, an expression based scripting language.",
@@ -35,19 +35,22 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@commander-js/extra-typings": "^15.0.0",
38
- "@mirascript/bindings": "~0.1.90",
39
- "@mirascript/mirascript": "~0.1.90",
40
- "@mirascript/help": "~0.1.90",
38
+ "@mirascript/bindings": "~0.1.92",
39
+ "@mirascript/help": "~0.1.92",
40
+ "@mirascript/mirascript": "~0.1.92",
41
41
  "ansi-styles": "^7.0.0",
42
42
  "commander": "^15.0.0",
43
43
  "supports-color": "^11.0.0"
44
44
  },
45
45
  "devDependencies": {
46
- "type-fest": "^5.8.0"
46
+ "ava": "^8.0.1",
47
+ "c8": "^12.0.0",
48
+ "type-fest": "^5.9.0"
47
49
  },
48
50
  "scripts": {
49
51
  "watch": "pnpm build --watch",
50
52
  "build": "pnpm clean && pnpm tsc && node ./esbuild.config.js",
51
- "clean": "rimraf dist"
53
+ "clean": "rimraf dist",
54
+ "test": "c8 ava"
52
55
  }
53
56
  }
@@ -1,90 +1,152 @@
1
1
  /* eslint-disable no-console */
2
2
  import fs from 'node:fs/promises';
3
- import { program } from '@commander-js/extra-typings';
4
- import { loadModule, type BcModule } from '@mirascript/bindings/wasm';
3
+ import { text as readText } from 'node:stream/consumers';
4
+ import { InvalidArgumentError, program } from '@commander-js/extra-typings';
5
+ import { loadModule } from '@mirascript/bindings/wasm';
6
+ import { formatDiagnosticMessage, parseDiagnostics } from '@mirascript/mirascript/subtle';
5
7
 
6
- let templateConfig: BcModule.wasm.CompileConfig | null = null;
7
- let scriptConfig: BcModule.wasm.CompileConfig | null = null;
8
+ const DEFAULT_LINE_WIDTH = 80;
9
+ const DEFAULT_TAB_SIZE = 2;
8
10
 
9
- /** 获取配置 */
10
- async function getConfig(templateMode: boolean): Promise<BcModule.wasm.CompileConfig> {
11
- const mod = await loadModule();
12
- if (templateMode) {
13
- if (!templateConfig) {
14
- templateConfig = new mod.wasm.CompileConfig();
15
- templateConfig.input_mode = mod.wasm.InputMode.Template;
16
- templateConfig.trivia = true;
17
- templateConfig.diagnostic_position_encoding = mod.wasm.DiagnosticPositionEncoding.Utf8;
18
- }
19
- return templateConfig;
20
- } else {
21
- if (!scriptConfig) {
22
- scriptConfig = new mod.wasm.CompileConfig();
23
- scriptConfig.input_mode = mod.wasm.InputMode.Script;
24
- scriptConfig.trivia = true;
25
- scriptConfig.diagnostic_position_encoding = mod.wasm.DiagnosticPositionEncoding.Utf8;
11
+ /** CLI 格式化参数。 */
12
+ type FormatterOptions = {
13
+ readonly lineWidth: number;
14
+ readonly tabSize: number;
15
+ readonly useTabs: boolean;
16
+ };
17
+
18
+ /** 创建正整数参数解析器。 */
19
+ function positiveInteger(name: string): (value: string) => number {
20
+ return (value) => {
21
+ const parsed = Number(value);
22
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
23
+ throw new InvalidArgumentError(`${name} 必须是正整数`);
26
24
  }
27
- return scriptConfig;
28
- }
25
+ return parsed;
26
+ };
29
27
  }
30
28
 
31
- /** 格式化 */
32
- async function format(input: string, templateMode: boolean): Promise<string | undefined> {
33
- if (!input) return '';
29
+ /** 按倒序应用 UTF-16 偏移编辑。 */
30
+ function applyEdits(source: string, edits: ReadonlyArray<{ start: number; end: number; text: string }>): string {
31
+ let output = source;
32
+ for (const edit of edits.toSorted((left, right) => right.start - left.start)) {
33
+ output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
34
+ }
35
+ return output;
36
+ }
34
37
 
35
- const mod = await loadModule();
36
- const compiler = new mod.wasm.MonacoCompiler(input, await getConfig(templateMode));
37
- try {
38
- if (!compiler.parse()) return undefined;
39
- const formatted = compiler.format();
40
- if (!formatted) return undefined;
41
- return formatted;
42
- } finally {
43
- compiler.free();
38
+ /** 使用统一 binding 格式化一份源码。 */
39
+ async function format(input: string, templateMode: boolean, options: FormatterOptions): Promise<string | undefined> {
40
+ const module = await loadModule();
41
+ const result = module.formatSync(
42
+ input,
43
+ {
44
+ input_mode: templateMode ? 'Template' : 'Script',
45
+ trivia: true,
46
+ // MiraScript 配置枚举的公开序列化值固定为 Utf8。
47
+ // eslint-disable-next-line unicorn/text-encoding-identifier-case
48
+ diagnostic_position_encoding: 'Utf8',
49
+ },
50
+ {
51
+ tabSize: options.tabSize,
52
+ insertSpaces: !options.useTabs,
53
+ printWidth: options.lineWidth,
54
+ },
55
+ );
56
+ const parsed = parseDiagnostics(input, result.diagnostics);
57
+ if (parsed.errors.length > 0) {
58
+ for (const diagnostic of parsed.errors) {
59
+ console.error(formatDiagnosticMessage(diagnostic.code));
60
+ }
61
+ return undefined;
44
62
  }
63
+ return applyEdits(input, result.edits);
45
64
  }
46
65
 
47
66
  const command = program.command('format');
48
67
  command
49
68
  .description('格式化 MiraScript 脚本')
50
69
  .option('-w, --write', '直接修改文件')
51
- .option('-t, --template', '对无法推断类型的文件使用模板模式')
70
+ .option('-c, --check', '检查文件是否已经格式化')
71
+ .option('-t, --template', '使用模板模式;文件默认根据 .miratpl 扩展名推断')
72
+ .option('--no-template', '强制使用脚本模式')
73
+ .option('--line-width <columns>', '最大行宽', positiveInteger('最大行宽'), DEFAULT_LINE_WIDTH)
74
+ .option('--tab-size <columns>', '缩进宽度', positiveInteger('缩进宽度'), DEFAULT_TAB_SIZE)
75
+ .option('--use-tabs', '使用制表符缩进')
52
76
  .argument('<script...>', '要格式化的脚本文件路径或 glob,输入 "-" 表示从标准输入读取')
53
- .action(async (script, opt) => {
54
- if (script.length === 0) {
55
- command.help({ error: true });
77
+ .action(async (patterns, options) => {
78
+ if (options.write && options.check) {
79
+ console.error('--write --check 不能同时使用');
80
+ process.exitCode = 2;
81
+ return;
56
82
  }
57
- if (script.length === 1 && script[0] === '-') {
58
- // 从标准输入读取
59
- let input = '';
60
- for await (const chunk of process.stdin) {
61
- input += chunk;
83
+ const formatterOptions: FormatterOptions = {
84
+ lineWidth: options.lineWidth,
85
+ tabSize: options.tabSize,
86
+ useTabs: !!options.useTabs,
87
+ };
88
+ if (patterns.length === 1 && patterns[0] === '-') {
89
+ if (options.write || options.check) {
90
+ console.error('标准输入不能与 --write 或 --check 一起使用');
91
+ process.exitCode = 2;
92
+ return;
62
93
  }
63
- const output = await format(input, !!opt.template);
94
+ const input = await readText(process.stdin);
95
+ const output = await format(input, options.template === true, formatterOptions);
64
96
  if (output == null) {
65
97
  console.error('格式化失败');
66
- process.exit(1);
98
+ process.exitCode = 1;
99
+ return;
67
100
  }
68
101
  process.stdout.write(output);
69
102
  return;
70
103
  }
71
- for await (const file of fs.glob(script)) {
72
- const input = await fs.readFile(file, 'utf8');
73
- const output = await format(input, !!opt.template);
74
- if (opt.write) {
104
+ if (patterns.includes('-')) {
105
+ console.error('标准输入不能与文件路径混用');
106
+ process.exitCode = 2;
107
+ return;
108
+ }
109
+
110
+ const files = new Set<string>();
111
+ for await (const file of fs.glob(patterns)) files.add(file);
112
+ const sortedFiles = [...files].toSorted();
113
+ if (sortedFiles.length === 0) {
114
+ console.error('没有匹配到任何脚本文件');
115
+ process.exitCode = 2;
116
+ return;
117
+ }
118
+
119
+ let failed = false;
120
+ for (const [index, file] of sortedFiles.entries()) {
121
+ try {
122
+ const input = await fs.readFile(file, 'utf8');
123
+ const template = options.template ?? file.toLowerCase().endsWith('.miratpl');
124
+ const output = await format(input, template, formatterOptions);
75
125
  if (output == null) {
76
126
  console.error(`格式化失败: ${file}`);
127
+ failed = true;
77
128
  continue;
78
129
  }
79
- if (output === input) {
80
- console.warn(`文件未更改: ${file}`);
81
- continue;
130
+ if (options.check) {
131
+ if (output !== input) {
132
+ console.error(`需要格式化: ${file}`);
133
+ failed = true;
134
+ }
135
+ } else if (options.write) {
136
+ if (output !== input) {
137
+ await fs.writeFile(file, output, 'utf8');
138
+ console.error(`已格式化: ${file}`);
139
+ }
140
+ } else if (sortedFiles.length === 1) {
141
+ process.stdout.write(output);
142
+ } else {
143
+ if (index > 0) process.stdout.write('\n');
144
+ process.stdout.write(`// File: ${file}\n${output}`);
82
145
  }
83
- await fs.writeFile(file, output, 'utf8');
84
- console.warn(`已格式化文件: ${file}`);
85
- } else {
86
- process.stdout.write(`// File: ${file}\n`);
87
- process.stdout.write((output ?? input) + '\n');
146
+ } catch (error) {
147
+ console.error(`无法处理文件 ${file}: ${error instanceof Error ? error.message : String(error)}`);
148
+ failed = true;
88
149
  }
89
150
  }
151
+ if (failed) process.exitCode = 1;
90
152
  });
package/src/index.ts CHANGED
@@ -11,4 +11,6 @@ const binName = Object.keys(pkg.bin)[0];
11
11
  if (binName) {
12
12
  p = program.name(binName);
13
13
  }
14
- export default p.version(pkg.version).description(pkg.description);
14
+ p.version(pkg.version).description(pkg.description);
15
+
16
+ export default p;
@@ -0,0 +1,87 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import test from 'ava';
6
+
7
+ const packageDir = path.dirname(import.meta.dirname);
8
+ const cli = path.join(packageDir, 'cli.js');
9
+
10
+ interface RunResult {
11
+ readonly code: number | null;
12
+ readonly stdout: string;
13
+ readonly stderr: string;
14
+ }
15
+
16
+ /** 在独立进程中运行 CLI,以覆盖真实参数解析、标准流和退出码。 */
17
+ function run(args: readonly string[], input = ''): Promise<RunResult> {
18
+ return new Promise((resolve, reject) => {
19
+ const child = spawn(process.execPath, [cli, ...args], { cwd: packageDir });
20
+ let stdout = '';
21
+ let stderr = '';
22
+ child.stdout.setEncoding('utf8').on('data', (chunk: string) => (stdout += chunk));
23
+ child.stderr.setEncoding('utf8').on('data', (chunk: string) => (stderr += chunk));
24
+ child.on('error', reject);
25
+ child.on('close', (code) => resolve({ code, stdout, stderr }));
26
+ child.stdin.end(input);
27
+ });
28
+ }
29
+
30
+ test('formats stdin with width options and reports syntax errors', async (t) => {
31
+ const formatted = await run(['format', '--line-width', '12', '-'], 'let x=[1,2,3,4];');
32
+ t.is(formatted.code, 0);
33
+ t.regex(formatted.stdout, /let x = \[\n {2}1,/);
34
+
35
+ const invalid = await run(['format', '-'], 'let x=[1,2,;');
36
+ t.is(invalid.code, 1);
37
+ t.regex(invalid.stderr, /格式化失败/);
38
+
39
+ const empty = await run(['format', '-']);
40
+ t.is(empty.code, 0);
41
+ t.is(empty.stdout, '\n');
42
+
43
+ const singleLine = await run(['format', '-'], ' \n \n[1,2]\n \n');
44
+ t.is(singleLine.code, 0);
45
+ t.is(singleLine.stdout, '[1, 2]');
46
+ });
47
+
48
+ test('check and write use deterministic exit codes', async (t) => {
49
+ const directory = await mkdtemp(path.join(tmpdir(), 'mirascript-format-'));
50
+ const file = path.join(directory, 'input.mira');
51
+ try {
52
+ await writeFile(file, 'let x=[1,2,3,4];', 'utf8');
53
+ t.is((await run(['format', '--check', file])).code, 1);
54
+ t.is((await run(['format', '--write', file])).code, 0);
55
+ t.is((await run(['format', '--check', file])).code, 0);
56
+ t.is(await readFile(file, 'utf8'), 'let x = [1, 2, 3, 4];');
57
+ } finally {
58
+ await rm(directory, { recursive: true, force: true });
59
+ }
60
+ });
61
+
62
+ test('rejects invalid argument combinations and unmatched globs', async (t) => {
63
+ t.is((await run(['format', '--write', '--check', 'missing.mira'])).code, 2);
64
+ t.is((await run(['format', 'definitely-not-present-*.mira'])).code, 2);
65
+ t.is((await run(['format', '--check', '-'])).code, 2);
66
+ });
67
+
68
+ test('infers template mode from the file extension and permits an explicit override', async (t) => {
69
+ const directory = await mkdtemp(path.join(tmpdir(), 'mirascript-format-template-'));
70
+ const file = path.join(directory, 'input.miratpl');
71
+ try {
72
+ await writeFile(file, 'Hello, $("World")!', 'utf8');
73
+ const inferred = await run(['format', file]);
74
+ t.is(inferred.code, 0);
75
+ t.is(inferred.stdout, 'Hello, $("World")!');
76
+
77
+ t.is((await run(['format', '--write', file])).code, 0);
78
+ t.is(await readFile(file, 'utf8'), 'Hello, $("World")!');
79
+ t.is((await run(['format', '--check', file])).code, 0);
80
+
81
+ const overridden = await run(['format', '--no-template', file]);
82
+ t.is(overridden.code, 1);
83
+ t.regex(overridden.stderr, /格式化失败/);
84
+ } finally {
85
+ await rm(directory, { recursive: true, force: true });
86
+ }
87
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../../tsconfig.scripts.json"
3
+ }