arcadible 0.1.35 → 0.1.36

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/package.json CHANGED
@@ -75,5 +75,5 @@
75
75
  "scripts": {
76
76
  "test": "node --test \"test/**/*.test.js\""
77
77
  },
78
- "version": "0.1.35"
78
+ "version": "0.1.36"
79
79
  }
@@ -33,6 +33,16 @@ const RESERVED = [`${HANDLE}.json`, MEDIA];
33
33
 
34
34
  // [function]
35
35
 
36
+ // whether `build` runs anything: a command that isn't blank, as `arc build`
37
+ // trims and drops blank ones (action/build/tool.js).
38
+ const hasBuild = function (build) {
39
+ return [build]
40
+ .flat()
41
+ .some((cmd) => typeof cmd === "string" && cmd.trim() !== "");
42
+ };
43
+
44
+ // [function]
45
+
36
46
  const zBuild = function () {
37
47
  // const field = "build";
38
48
  return z.union([z.string(), z.array(z.string())]);
@@ -70,7 +80,7 @@ const zDeployDir = function (root, { build }) {
70
80
  ),
71
81
  )
72
82
  .refine(
73
- (file) => build || existsCheck(root, file),
83
+ (file) => hasBuild(build) || existsCheck(root, file),
74
84
  message(
75
85
  field,
76
86
  [
package/src/util/argv.js CHANGED
@@ -55,20 +55,29 @@ const cwd = function (args) {
55
55
 
56
56
  // [function]
57
57
 
58
+ // whether `argv` passes --json, before the command parses its options.
59
+ const json = function (argv) {
60
+ return parse(normalize(hideBin(argv)), {
61
+ alias: { json: ["j"] },
62
+ boolean: ["json"],
63
+ }).json;
64
+ };
65
+
66
+ // [function]
67
+
58
68
  // yargs' failure handler for a command with --json: an argument error is
59
69
  // one JSON document when --json was passed (OUTPUT.md), and yargs' own help
60
70
  // and message otherwise.
61
71
  const fail = function (argv) {
62
- const json = parse(normalize(hideBin(argv)), {
63
- alias: { json: ["j"] },
64
- boolean: ["json"],
65
- }).json;
72
+ const asJson = json(argv);
66
73
  return (message, ex, cli) => {
67
74
  if (ex) {
68
75
  throw ex;
69
76
  }
70
- if (json) {
71
- abort("", new ArcError(cfgcode.ARGUMENT_INVALID, message), { json });
77
+ if (asJson) {
78
+ abort("", new ArcError(cfgcode.ARGUMENT_INVALID, message), {
79
+ json: asJson,
80
+ });
72
81
  }
73
82
  cli.showHelp("error");
74
83
  console.error(`\n${message}`);
@@ -78,4 +87,4 @@ const fail = function (argv) {
78
87
 
79
88
  // [export]
80
89
 
81
- module.exports = { CWD, cwd, fail, normalize };
90
+ module.exports = { CWD, cwd, fail, json, normalize };
package/src/util/rc.js CHANGED
@@ -13,9 +13,15 @@ const ini = require("ini");
13
13
  // [import]
14
14
 
15
15
  const args = require("./argv");
16
+ const cfgcode = require("../config/code");
17
+ const error = require("./error");
18
+ const output = require("./output");
19
+ const phrase = require("../phrase");
16
20
 
17
21
  // [use]
18
22
 
23
+ const abort = output.abort;
24
+ const ArcError = error.ArcError;
19
25
  const cwd = args.cwd;
20
26
  const dirname = path.dirname;
21
27
  const existsSync = fs.existsSync; // eslint-disable-line no-sync
@@ -60,7 +66,6 @@ const files = function (cmd, argv) {
60
66
  ? []
61
67
  : [join("/etc", cmd, "config"), join("/etc", `${cmd}rc`)]),
62
68
  join(home, ".config", cmd, "config"),
63
- join(home, ".config", cmd),
64
69
  join(home, `.${cmd}`, "config"),
65
70
  join(home, `.${cmd}rc`),
66
71
  nearest(cmd),
@@ -70,7 +75,8 @@ const files = function (cmd, argv) {
70
75
 
71
76
  // [function]
72
77
 
73
- // a file's sections, INI or JSON, or nothing when it can't be read.
78
+ // a file's sections, INI or JSON, or nothing when it can't be read. JSON
79
+ // that doesn't parse is `parse_failed`, naming the file.
74
80
  const read = function (file) {
75
81
  let str = null;
76
82
  try {
@@ -78,18 +84,37 @@ const read = function (file) {
78
84
  } catch (ex) {
79
85
  return {};
80
86
  }
81
- return /^\s*\{/u.test(str) ? JSON.parse(str) : ini.parse(str);
87
+ if (!/^\s*\{/u.test(str)) {
88
+ return ini.parse(str);
89
+ }
90
+ try {
91
+ return JSON.parse(str);
92
+ } catch (ex) {
93
+ throw new ArcError(
94
+ cfgcode.PARSE_FAILED,
95
+ phrase.unableToParse(file, ex.message),
96
+ { cause: ex },
97
+ );
98
+ }
82
99
  };
83
100
 
84
101
  // [function]
85
102
 
86
103
  // a command's section of .<cmd>rc, merged from the files `rc` reads. Unlike
87
- // `rc`, environment variables and `--config` aren't read.
104
+ // `rc`, environment variables and `--config` aren't read. Options are read as
105
+ // the command loads, so a file that doesn't parse aborts the command here,
106
+ // as `<Command> aborted.`.
88
107
  const findRc = function (cmd, subcmd, argv) {
89
- return [...new Set(files(cmd, argv))].reduce(
90
- (found, file) => ({ ...found, ...read(file)[subcmd] }),
91
- {},
92
- );
108
+ try {
109
+ return [...new Set(files(cmd, argv))].reduce(
110
+ (found, file) => ({ ...found, ...read(file)[subcmd] }),
111
+ {},
112
+ );
113
+ } catch (ex) {
114
+ return abort(`${subcmd[0].toUpperCase()}${subcmd.slice(1)} aborted.`, ex, {
115
+ json: args.json(argv),
116
+ });
117
+ }
93
118
  };
94
119
 
95
120
  // [export]