@cenk1cenk2/oclif-common 3.7.2 → 3.8.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/dist/index.js CHANGED
@@ -31,6 +31,7 @@ __export(src_exports, {
31
31
  Command: () => Command,
32
32
  ConfigCommand: () => ConfigCommand,
33
33
  ConfigService: () => ConfigService,
34
+ EnvironmentVariableParser: () => EnvironmentVariableParser,
34
35
  FileConstants: () => FileConstants,
35
36
  FileSystemService: () => FileSystemService,
36
37
  Flags: () => import_core.Flags,
@@ -59,6 +60,7 @@ __export(src_exports, {
59
60
  setCtxDefaults: () => setCtxDefaults,
60
61
  setup: () => setup,
61
62
  storeHook: () => storeHook,
63
+ uniqueFilter: () => uniqueFilter,
62
64
  updateNotifierHook: () => updateNotifierHook
63
65
  });
64
66
  module.exports = __toCommonJS(src_exports);
@@ -89,7 +91,7 @@ var import_listr22 = require("listr2");
89
91
 
90
92
  // src/utils/logger/logger.ts
91
93
  var import_listr2 = require("listr2");
92
- var import_os = require("os");
94
+ var import_os2 = require("os");
93
95
  var import_winston = __toESM(require("winston"));
94
96
 
95
97
  // src/utils/logger/logger.constants.ts
@@ -114,372 +116,131 @@ var LogFieldStatus = /* @__PURE__ */ ((LogFieldStatus2) => {
114
116
  return LogFieldStatus2;
115
117
  })(LogFieldStatus || {});
116
118
 
117
- // src/utils/color.ts
118
- var colorette = __toESM(require("colorette"));
119
- var color = colorette.createColors({ useColor: true });
119
+ // src/lib/config/config.service.ts
120
+ var import_object_path_immutable = __toESM(require("object-path-immutable"));
121
+ var import_path2 = require("path");
120
122
 
121
- // src/utils/logger/logger.ts
122
- var Logger = class {
123
- constructor(context, options) {
124
- this.context = context;
125
- this.options = options;
126
- const parsed = (process.env.LOG_LEVEL ?? options?.level ?? "INFO" /* INFO */).toUpperCase();
127
- const level = Object.values(LogLevels).includes(parsed) ? parsed : "INFO" /* INFO */;
128
- this.options = {
129
- useIcons: true,
130
- ...options,
131
- level
132
- };
133
- if (Logger.instance) {
134
- this.logger = Logger.instance;
135
- } else {
136
- this.logger = this.initiateLogger();
137
- Logger.instance = this.logger;
123
+ // src/lib/parser/env-parser.service.ts
124
+ var import_os = require("os");
125
+ var _EnvironmentVariableParser = class {
126
+ constructor() {
127
+ this.LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;
128
+ if (_EnvironmentVariableParser.instance) {
129
+ return _EnvironmentVariableParser.instance;
138
130
  }
131
+ _EnvironmentVariableParser.instance = this;
132
+ this.logger = new Logger(this.constructor.name);
133
+ this.logger.trace("Created a new instance.");
139
134
  }
140
- log(level, data, ...args) {
141
- return this.parseMessage(level, data, args);
142
- }
143
- direct(data, ...args) {
144
- return this.parseMessage("DIRECT" /* DIRECT */, data, args);
145
- }
146
- fatal(data, ...args) {
147
- return this.parseMessage("FATAL" /* FATAL */, data, args);
148
- }
149
- error(data, ...args) {
150
- return this.parseMessage("ERROR" /* ERROR */, data, args);
151
- }
152
- warn(data, ...args) {
153
- return this.parseMessage("WARN" /* WARN */, data, args);
154
- }
155
- info(data, ...args) {
156
- return this.parseMessage("INFO" /* INFO */, data, args);
157
- }
158
- debug(data, ...args) {
159
- return this.parseMessage("DEBUG" /* DEBUG */, data, args);
160
- }
161
- verbose(data, ...args) {
162
- return this.parseMessage("VERBOSE" /* VERBOSE */, data, args);
163
- }
164
- trace(data, ...args) {
165
- return this.parseMessage("TRACE" /* TRACE */, data, args);
166
- }
167
- run(data, ...args) {
168
- return this.parseMessage("INFO" /* INFO */, data, args, { status: "run" /* RUN */ });
169
- }
170
- end(data, ...args) {
171
- return this.parseMessage("INFO" /* INFO */, data, args, { status: "end" /* END */ });
172
- }
173
- stage(data, ...args) {
174
- return this.parseMessage("TRACE" /* TRACE */, data, args, { status: "stage" /* STAGE */ });
175
- }
176
- initiateLogger() {
177
- const logFormat = import_winston.format.printf(({ level, message, context, status }) => {
178
- let multiLineMessage;
179
- multiLineMessage = message.split(import_os.EOL);
180
- multiLineMessage = multiLineMessage.filter((msg) => msg.trim() !== "").filter(Boolean);
181
- multiLineMessage = multiLineMessage.map((msg) => {
182
- return this.logColoring({
183
- level,
184
- message: msg,
185
- context,
186
- status
187
- });
188
- });
189
- return multiLineMessage.join(import_os.EOL);
190
- });
191
- const logger = import_winston.default.createLogger({
192
- level: this.options.level,
193
- format: import_winston.format.combine(import_winston.format.splat(), import_winston.format.json({ space: 2 }), import_winston.format.prettyPrint(), logFormat),
194
- levels: Object.values(LogLevels).reduce((o, level, i) => {
135
+ parse(data) {
136
+ try {
137
+ return data.toString().split(import_os.EOL).reduce((o, line) => {
138
+ const match = this.LINE.exec(line);
139
+ const key = match[1];
140
+ const value = match[2] ?? "";
195
141
  return {
196
142
  ...o,
197
- [level]: i
143
+ [key]: value
198
144
  };
199
- }, {}),
200
- silent: this.options.level === "SILENT" /* SILENT */,
201
- transports: [
202
- new import_winston.transports.Console({
203
- stderrLevels: ["FATAL" /* FATAL */, "ERROR" /* ERROR */]
204
- })
205
- ]
206
- });
207
- logger.log("TRACE" /* TRACE */, "Initiated new logger with level: %s", this.options.level, { context: this.constructor.name });
208
- return logger;
145
+ }, {});
146
+ } catch (e) {
147
+ this.logger.trace("Error during parsing environment file: %s", e.message);
148
+ throw e;
149
+ }
209
150
  }
210
- parseMessage(level, data, args, format2) {
211
- this.logger.log(level, data.toString(), ...args ?? [], { context: this.context, ...format2 ?? {} });
151
+ stringify(data) {
152
+ return Object.entries(data).map(([k, v]) => `${k}=${v}`).join(import_os.EOL) + import_os.EOL;
212
153
  }
213
- logColoring({ level, message, context, status }) {
214
- let icon;
215
- let coloring = /* @__PURE__ */ __name((input) => {
216
- return input;
217
- }, "coloring");
218
- let msgColoring = /* @__PURE__ */ __name((input) => {
219
- return input;
220
- }, "msgColoring");
221
- switch (level) {
222
- case "DIRECT" /* DIRECT */:
223
- return message;
224
- case "FATAL" /* FATAL */:
225
- coloring = /* @__PURE__ */ __name((input) => color.red(input), "coloring");
226
- if (this.options?.useIcons) {
227
- icon = import_listr2.figures.checkboxOn;
228
- }
229
- break;
230
- case "ERROR" /* ERROR */:
231
- coloring = color.red;
232
- if (this.options?.useIcons) {
233
- icon = import_listr2.figures.cross;
234
- }
235
- break;
236
- case "WARN" /* WARN */:
237
- coloring = color.yellow;
238
- if (this.options?.useIcons) {
239
- icon = import_listr2.figures.warning;
240
- }
241
- break;
242
- case "INFO" /* INFO */:
243
- coloring = color.green;
244
- if (this.options?.useIcons) {
245
- icon = import_listr2.figures.pointerSmall;
246
- }
247
- break;
248
- case "VERBOSE" /* VERBOSE */:
249
- coloring = color.dim;
250
- if (this.options?.useIcons) {
251
- icon = "\u2607";
252
- }
253
- break;
254
- case "DEBUG" /* DEBUG */:
255
- coloring = color.cyan;
256
- msgColoring = color.dim;
257
- if (this.options?.useIcons) {
258
- icon = "\uF188";
259
- }
260
- break;
261
- case "TRACE" /* TRACE */:
262
- coloring = color.magenta;
263
- msgColoring = color.dim;
264
- if (this.options?.useIcons) {
265
- icon = "\u26B1";
266
- }
267
- break;
154
+ };
155
+ var EnvironmentVariableParser = _EnvironmentVariableParser;
156
+ __name(EnvironmentVariableParser, "EnvironmentVariableParser");
157
+ EnvironmentVariableParser.extensions = ["env"];
158
+
159
+ // src/lib/parser/json-parser.service.ts
160
+ var _JsonParser = class {
161
+ constructor() {
162
+ if (_JsonParser.instance) {
163
+ return _JsonParser.instance;
268
164
  }
269
- if (!icon) {
270
- icon = `[${level.at(0).toUpperCase()}]`;
165
+ _JsonParser.instance = this;
166
+ this.logger = new Logger(this.constructor.name);
167
+ this.logger.trace("Created a new instance.");
168
+ }
169
+ parse(data) {
170
+ try {
171
+ return JSON.parse(data.toString());
172
+ } catch (e) {
173
+ this.logger.trace("Error during parsing JSON file: %s", e.message);
174
+ throw e;
271
175
  }
272
- return `${coloring(icon)}${context ? " " + coloring(`[${context}]`) : ""}${status ? " " + coloring(`[${status}]`) : ""} ${msgColoring(message)}`;
176
+ }
177
+ stringify(data) {
178
+ return JSON.stringify(data, null, 2);
273
179
  }
274
180
  };
275
- __name(Logger, "Logger");
181
+ var JsonParser = _JsonParser;
182
+ __name(JsonParser, "JsonParser");
183
+ JsonParser.extensions = ["json"];
276
184
 
277
- // src/utils/logger/listr-logger.ts
278
- var ListrLogger = class extends import_listr22.Logger {
279
- constructor(context) {
280
- super();
281
- this.logger = new Logger(context);
185
+ // src/lib/parser/yaml-parser.service.ts
186
+ var import_yaml = require("yaml");
187
+ var _YamlParser = class {
188
+ constructor() {
189
+ if (_YamlParser.instance) {
190
+ return _YamlParser.instance;
191
+ }
192
+ _YamlParser.instance = this;
193
+ this.logger = new Logger(this.constructor.name);
194
+ this.logger.trace("Created a new instance.");
282
195
  }
283
- fail(message) {
284
- this.logger.error(message);
196
+ parse(data) {
197
+ try {
198
+ return (0, import_yaml.parse)(data.toString());
199
+ } catch (e) {
200
+ this.logger.trace("Error during parsing YAML file: %s", e.message);
201
+ throw e;
202
+ }
285
203
  }
286
- skip(message) {
287
- this.logger.warn(message, { status: "skip" });
204
+ stringify(data) {
205
+ return (0, import_yaml.stringify)(data, { prettyErrors: true });
288
206
  }
289
- success(message) {
290
- this.logger.info(message, { status: "end" });
207
+ };
208
+ var YamlParser = _YamlParser;
209
+ __name(YamlParser, "YamlParser");
210
+ YamlParser.extensions = ["yaml", "yml"];
211
+
212
+ // src/lib/fs/filesystem.service.ts
213
+ var import_fs_extra = __toESM(require("fs-extra"));
214
+ var import_path = require("path");
215
+ var FileSystemService = class {
216
+ constructor() {
217
+ if (FileSystemService.instance) {
218
+ return FileSystemService.instance;
219
+ } else {
220
+ FileSystemService.instance = this;
221
+ this.logger = new Logger(this.constructor.name);
222
+ this.logger.trace("Created a new instance.");
223
+ }
291
224
  }
292
- data(message) {
293
- this.logger.info(message);
225
+ exists(path) {
226
+ return import_fs_extra.default.existsSync(path);
294
227
  }
295
- start(message) {
296
- this.logger.info(message, { status: "run" });
228
+ stats(path) {
229
+ return import_fs_extra.default.statSync(path, { throwIfNoEntry: true });
297
230
  }
298
- title(message) {
299
- this.logger.info(message);
231
+ dirname(path) {
232
+ return (0, import_path.dirname)(path);
300
233
  }
301
- retry(message) {
302
- this.logger.warn(message, { status: "retry" });
234
+ extname(path) {
235
+ return (0, import_path.extname)(path);
303
236
  }
304
- rollback(message) {
305
- this.logger.error(message, { status: "rollback" });
306
- }
307
- };
308
- __name(ListrLogger, "ListrLogger");
309
-
310
- // src/utils/logger/pipe/pipe-process-to-listr.ts
311
- var import_through = __toESM(require("through"));
312
- function pipeProcessThroughListr(task, instance) {
313
- const logOut = (0, import_through.default)((chunk) => {
314
- task.output = chunk?.toString("utf-8").trim();
315
- });
316
- instance.stdout.pipe(logOut);
317
- instance.stderr.pipe(logOut);
318
- return instance;
319
- }
320
- __name(pipeProcessThroughListr, "pipeProcessThroughListr");
321
-
322
- // src/utils/logger/pipe/pipe-process-to-logger.ts
323
- var import_through2 = __toESM(require("through"));
324
- function pipeProcessToLogger(logger, instance, options) {
325
- options = {
326
- start: "INFO" /* INFO */,
327
- end: "INFO" /* INFO */,
328
- stdout: "INFO" /* INFO */,
329
- stderr: "WARN" /* WARN */,
330
- ...options
331
- };
332
- if (options.start) {
333
- logger.run(instance.spawnargs.join(" "), { level: options.start });
334
- }
335
- if (instance.stdout) {
336
- instance.stdout.pipe(
337
- (0, import_through2.default)((chunk) => {
338
- logger.log(options.stdout, chunk);
339
- })
340
- );
341
- }
342
- if (instance.stderr) {
343
- instance.stderr.pipe(
344
- (0, import_through2.default)((chunk) => {
345
- logger.log(options.stderr, chunk);
346
- })
347
- );
348
- }
349
- void instance.on("exit", (code, signal) => {
350
- const message = `Process ended with code ${code}${signal ? ` and signal ${signal}` : ""}.`;
351
- logger.debug(message);
352
- if (options.end) {
353
- logger.end(instance.spawnargs.join(" "), { level: options.end });
354
- }
355
- if (options?.callback) {
356
- options.callback();
357
- }
358
- });
359
- void instance.on("error", (error) => {
360
- logger.fatal(error.message);
361
- logger.debug(error.stack);
362
- if (options?.callback) {
363
- options.callback(error);
364
- }
365
- });
366
- return instance;
367
- }
368
- __name(pipeProcessToLogger, "pipeProcessToLogger");
369
-
370
- // src/constants/global-flags.constants.ts
371
- var CLI_FLAGS = {
372
- ["log-level"]: import_core.Flags.enum({
373
- default: "INFO" /* INFO */,
374
- env: "LOG_LEVEL",
375
- description: "Set the log level of the application.",
376
- options: [...Object.values(LogLevels), ...Object.values(LogLevels).map((level) => level.toLowerCase())],
377
- helpGroup: "CLI" /* CLI */,
378
- parse: async (input) => input?.toUpperCase()
379
- }),
380
- ci: import_core.Flags.boolean({
381
- default: false,
382
- env: "CI",
383
- description: "Instruct whether this is running the CI/CD configuration.",
384
- helpGroup: "CLI" /* CLI */
385
- }),
386
- json: import_core.Flags.boolean({
387
- default: false,
388
- env: "JSON",
389
- description: "Put the CLI to respond in JSON.",
390
- helpGroup: "CLI" /* CLI */
391
- })
392
- };
393
-
394
- // src/lib/config/config.service.ts
395
- var import_object_path_immutable = __toESM(require("object-path-immutable"));
396
- var import_path2 = require("path");
397
-
398
- // src/lib/parser/json-parser.service.ts
399
- var _JsonParser = class {
400
- constructor() {
401
- if (_JsonParser.instance) {
402
- return _JsonParser.instance;
403
- }
404
- _JsonParser.instance = this;
405
- this.logger = new Logger(this.constructor.name);
406
- this.logger.trace("Created a new instance.");
407
- }
408
- parse(data) {
409
- try {
410
- return JSON.parse(data.toString());
411
- } catch (e) {
412
- this.logger.trace("Error during parsing JSON file: %s", e.message);
413
- throw e;
414
- }
415
- }
416
- stringify(data) {
417
- return JSON.stringify(data, null, 2);
418
- }
419
- };
420
- var JsonParser = _JsonParser;
421
- __name(JsonParser, "JsonParser");
422
- JsonParser.extensions = ["json"];
423
-
424
- // src/lib/parser/yaml-parser.service.ts
425
- var import_yaml = require("yaml");
426
- var _YamlParser = class {
427
- constructor() {
428
- if (_YamlParser.instance) {
429
- return _YamlParser.instance;
430
- }
431
- _YamlParser.instance = this;
432
- this.logger = new Logger(this.constructor.name);
433
- this.logger.trace("Created a new instance.");
434
- }
435
- parse(data) {
436
- try {
437
- return (0, import_yaml.parse)(data.toString());
438
- } catch (e) {
439
- this.logger.trace("Error during parsing YAML file: %s", e.message);
440
- throw e;
441
- }
442
- }
443
- stringify(data) {
444
- return (0, import_yaml.stringify)(data, { prettyErrors: true });
445
- }
446
- };
447
- var YamlParser = _YamlParser;
448
- __name(YamlParser, "YamlParser");
449
- YamlParser.extensions = ["yaml", "yml"];
450
-
451
- // src/lib/fs/filesystem.service.ts
452
- var import_fs_extra = __toESM(require("fs-extra"));
453
- var import_path = require("path");
454
- var FileSystemService = class {
455
- constructor() {
456
- if (FileSystemService.instance) {
457
- return FileSystemService.instance;
458
- } else {
459
- FileSystemService.instance = this;
460
- this.logger = new Logger(this.constructor.name);
461
- this.logger.trace("Created a new instance.");
462
- }
463
- }
464
- exists(path) {
465
- return import_fs_extra.default.existsSync(path);
466
- }
467
- stats(path) {
468
- return import_fs_extra.default.statSync(path, { throwIfNoEntry: true });
469
- }
470
- dirname(path) {
471
- return (0, import_path.dirname)(path);
472
- }
473
- extname(path) {
474
- return (0, import_path.extname)(path);
475
- }
476
- async read(file) {
477
- try {
478
- const raw = await import_fs_extra.default.readFile(file, "utf-8");
479
- return raw;
480
- } catch (e) {
481
- throw new Error(`Error while reading file from "${file}": ${e.message}`);
482
- }
237
+ async read(file) {
238
+ try {
239
+ const raw = await import_fs_extra.default.readFile(file, "utf-8");
240
+ return raw;
241
+ } catch (e) {
242
+ throw new Error(`Error while reading file from "${file}": ${e.message}`);
243
+ }
483
244
  }
484
245
  readSync(file) {
485
246
  try {
@@ -579,7 +340,7 @@ __name(FileSystemService, "FileSystemService");
579
340
  // src/lib/parser/parser.service.ts
580
341
  var ParserService = class {
581
342
  constructor(parsers) {
582
- this.parsers = [YamlParser, JsonParser];
343
+ this.parsers = [YamlParser, JsonParser, EnvironmentVariableParser];
583
344
  if (ParserService.instance) {
584
345
  return ParserService.instance;
585
346
  } else {
@@ -593,8 +354,8 @@ var ParserService = class {
593
354
  }
594
355
  }
595
356
  getParser(file) {
596
- const ext = file.includes(".") ? this.fs.extname(file) : file;
597
- const Parser = this.parsers.find((parser) => parser.extensions.includes(ext.replace(/^\./, "")));
357
+ const ext = (file.includes(".") ? this.fs.extname(file) : file).replace(/^\./, "");
358
+ const Parser = this.parsers.find((parser) => parser.extensions.includes(ext));
598
359
  if (!Parser) {
599
360
  throw new Error(`Parser for the extension is not configured: ${ext}`);
600
361
  }
@@ -602,9 +363,17 @@ var ParserService = class {
602
363
  }
603
364
  setParsers(...parsers) {
604
365
  this.parsers = parsers;
366
+ this.logger.trace(
367
+ "Set parsers: %s",
368
+ this.parsers.map((p) => p.name)
369
+ );
605
370
  }
606
371
  addParsers(...parsers) {
607
372
  this.parsers.push(...parsers);
373
+ this.logger.trace(
374
+ "Added parser, current parsers: %s",
375
+ this.parsers.map((p) => p.name)
376
+ );
608
377
  }
609
378
  async read(file) {
610
379
  return this.parse(file, await this.fs.read(file));
@@ -613,16 +382,22 @@ var ParserService = class {
613
382
  return this.fs.write(file, await this.stringify(file, data));
614
383
  }
615
384
  parse(file, data) {
616
- const Parser = this.getParser(file);
617
- return Parser.parse(data);
385
+ const parser = this.getParser(file);
386
+ this.logger.trace("Parsing file: %s -> %s", file, parser.constructor.name);
387
+ return parser.parse(data);
618
388
  }
619
389
  stringify(file, data) {
620
- const Parser = this.getParser(file);
621
- return Parser.stringify(data);
390
+ const parser = this.getParser(file);
391
+ this.logger.trace("Stringifying file: %s -> %s", file, parser.constructor.name);
392
+ return parser.stringify(data);
622
393
  }
623
394
  };
624
395
  __name(ParserService, "ParserService");
625
396
 
397
+ // src/utils/color.ts
398
+ var colorette = __toESM(require("colorette"));
399
+ var color = colorette.createColors({ useColor: true });
400
+
626
401
  // src/utils/environment.ts
627
402
  function isVerbose(logLevel) {
628
403
  return logLevel === "VERBOSE" /* VERBOSE */;
@@ -646,14 +421,16 @@ var MergeStrategy = /* @__PURE__ */ ((MergeStrategy2) => {
646
421
 
647
422
  // src/utils/merge.ts
648
423
  var import_deepmerge = __toESM(require("deepmerge"));
649
- function merge(strategy, target, ...source) {
650
- return source.reduce((o, val) => {
651
- return (0, import_deepmerge.default)(o, val ?? {}, {
652
- arrayMerge: strategy === "EXTEND" /* EXTEND */ ? (destinationArray, sourceArray) => [...destinationArray, ...sourceArray] : (_, sourceArray) => sourceArray
653
- });
654
- }, target);
424
+ function merge(strategy, ...source) {
425
+ return import_deepmerge.default.all(source, {
426
+ arrayMerge: strategy === "EXTEND" /* EXTEND */ ? (dest, src) => [...dest, ...src].filter(uniqueFilter) : (_, src) => src
427
+ });
655
428
  }
656
429
  __name(merge, "merge");
430
+ function uniqueFilter(value, index, self) {
431
+ return self.indexOf(value) === index;
432
+ }
433
+ __name(uniqueFilter, "uniqueFilter");
657
434
 
658
435
  // src/utils/defaults.ts
659
436
  function setCtxDefaults(ctx, ...defaults) {
@@ -721,7 +498,7 @@ var ConfigService = class {
721
498
  if (configs.length === 0) {
722
499
  throw new Error("Nothing to merge, configuration files are empty.");
723
500
  }
724
- return merge(strategy, configs.some((config) => Array.isArray(config)) ? [] : {}, ...configs);
501
+ return merge(strategy, ...configs);
725
502
  }
726
503
  async env(definition, config) {
727
504
  const env = typeof definition === "string" ? await this.parser.read(definition) : definition;
@@ -823,8 +600,12 @@ var LockerService = class {
823
600
  this.root = root;
824
601
  this.toLock = [];
825
602
  this.toUnlock = [];
826
- this.logger = new Logger(context ?? this.constructor.name);
827
603
  this.fs = new FileSystemService();
604
+ this.logger = new Logger(context ?? this.constructor.name);
605
+ if (!this.parser) {
606
+ const parser2 = new ParserService();
607
+ this.parser = parser2.getParser(file);
608
+ }
828
609
  }
829
610
  hasLock() {
830
611
  return this.toLock.length > 0;
@@ -866,13 +647,13 @@ var LockerService = class {
866
647
  if (d?.merge) {
867
648
  let parsed;
868
649
  if (typeof d.data === "object") {
869
- parsed = merge(d.merge, import_object_path_immutable2.default.get(lock, path) || Array.isArray(d.data) ? [] : {}, d.data);
650
+ parsed = merge(d.merge, import_object_path_immutable2.default.get(lock, path, Array.isArray(d.data) ? [] : {}), d.data);
870
651
  } else {
871
652
  this.logger.warn('"%s" path with type "%s" is not mergeable.', path, typeof d.data);
872
653
  parsed = d.data;
873
654
  }
874
655
  lock = import_object_path_immutable2.default.set(lock, path, parsed);
875
- this.logger.verbose("Merge lock: %s -> %o", path, parsed);
656
+ this.logger.verbose("Merge lock: %s -> %o", path, d.data);
876
657
  } else {
877
658
  lock = import_object_path_immutable2.default.set(lock, path, d.data);
878
659
  this.logger.verbose("Override lock: %s -> %o", path, d.data);
@@ -891,161 +672,452 @@ var LockerService = class {
891
672
  if (d?.enabled === false) {
892
673
  return;
893
674
  }
894
- const path = this.buildPath(d);
895
- lock = import_object_path_immutable2.default.del(lock, path);
896
- this.logger.verbose("Unlocked: %s", path);
897
- });
898
- } else {
899
- lock = import_object_path_immutable2.default.del(lock, this.root);
900
- this.logger.verbose("Unlocked module: %s", this.root);
901
- }
902
- await this.write(lock);
903
- }
904
- async read() {
905
- return this.parser.parse(await this.fs.read(this.file));
906
- }
907
- async tryRead() {
908
- try {
909
- return this.parser.parse(await this.fs.read(this.file));
910
- } catch {
911
- this.logger.trace("Can not read lockfile: %s", this.file);
912
- }
913
- }
914
- async write(data) {
915
- return this.fs.write(this.file, this.parser.stringify(data));
916
- }
917
- buildPath(d) {
918
- if (d?.root !== true && this.root) {
919
- return [this.root, ...this.normalizePath(d.path)];
675
+ const path = this.buildPath(d);
676
+ lock = import_object_path_immutable2.default.del(lock, path);
677
+ this.logger.verbose("Unlocked: %s", path);
678
+ for (let i = path.length - 1; i >= 0; i--) {
679
+ const parentPath = path.slice(0, i);
680
+ const parent = import_object_path_immutable2.default.get(lock, parentPath);
681
+ if (!parent || Array.isArray(parent) && parent.length === 0 || typeof parent === "object" && Object.keys(parent).length === 0) {
682
+ this.logger.verbose("Unlocked parent: %s -> %s", path, parentPath);
683
+ lock = import_object_path_immutable2.default.del(lock, parentPath);
684
+ } else {
685
+ break;
686
+ }
687
+ }
688
+ });
689
+ } else {
690
+ lock = import_object_path_immutable2.default.del(lock, this.root);
691
+ this.logger.verbose("Unlocked module: %s", this.root);
692
+ }
693
+ await this.write(lock ?? {});
694
+ }
695
+ async read() {
696
+ return this.parser.parse(await this.fs.read(this.file));
697
+ }
698
+ async tryRead() {
699
+ try {
700
+ return this.parser.parse(await this.fs.read(this.file));
701
+ } catch {
702
+ this.logger.trace("Can not read lockfile: %s", this.file);
703
+ }
704
+ }
705
+ async write(data) {
706
+ if (!data || Array.isArray(data) && data.length === 0 || typeof data === "object" && Object.keys(data).length === 0) {
707
+ this.logger.trace("Trying to write empty lock file, deleting it instead: %s", this.file);
708
+ return this.fs.remove(this.file);
709
+ }
710
+ return this.fs.write(this.file, this.parser.stringify(data));
711
+ }
712
+ buildPath(d) {
713
+ if (d?.root !== true && this.root?.length) {
714
+ return [...this.root, ...this.normalizePath(d.path)];
715
+ }
716
+ return this.normalizePath(d.path);
717
+ }
718
+ normalizePath(path) {
719
+ if (Array.isArray(path)) {
720
+ return path.map((p) => p.toString());
721
+ } else if (typeof path === "string") {
722
+ return path.split(".");
723
+ }
724
+ return [];
725
+ }
726
+ };
727
+ __name(LockerService, "LockerService");
728
+
729
+ // src/lib/store/store.service.ts
730
+ var StoreService = class {
731
+ constructor() {
732
+ this.store = {};
733
+ if (StoreService.instance) {
734
+ return StoreService.instance;
735
+ } else {
736
+ StoreService.instance = this;
737
+ }
738
+ }
739
+ has(key) {
740
+ return !!this.store[key];
741
+ }
742
+ get(key) {
743
+ return this.store[key];
744
+ }
745
+ set(key, data) {
746
+ this.store[key] = data;
747
+ return data;
748
+ }
749
+ };
750
+ __name(StoreService, "StoreService");
751
+
752
+ // src/lib/validator/validator.service.ts
753
+ var import_class_transformer = require("class-transformer");
754
+ var import_class_validator = require("class-validator");
755
+ var ValidatorService = class {
756
+ constructor(options) {
757
+ this.options = options;
758
+ if (ValidatorService.instance) {
759
+ return ValidatorService.instance;
760
+ }
761
+ this.options = {
762
+ validator: {
763
+ skipMissingProperties: true,
764
+ whitelist: false,
765
+ always: true,
766
+ enableDebugMessages: true
767
+ },
768
+ transformer: { enableImplicitConversion: true },
769
+ ...options ?? {}
770
+ };
771
+ this.logger = new Logger(this.constructor.name);
772
+ ValidatorService.instance = this;
773
+ this.logger.trace("Created a new instance.");
774
+ }
775
+ async validate(classType, object, options) {
776
+ const classObject = (0, import_class_transformer.plainToClass)(classType, object, { ...this.options.transformer, ...options.transformer ?? {} });
777
+ const errors = await (0, import_class_validator.validate)(classObject, { ...this.options.validator, ...options.validator ?? {} });
778
+ if (errors.length) {
779
+ errors.forEach((error) => {
780
+ this.logValidationError(error);
781
+ });
782
+ throw new Error("Validation failed.");
783
+ }
784
+ return classObject;
785
+ }
786
+ validateSync(classType, object, options) {
787
+ const classObject = (0, import_class_transformer.plainToClass)(classType, object, { ...this.options.transformer, ...options.transformer ?? {} });
788
+ const errors = (0, import_class_validator.validateSync)(classObject, { ...this.options.validator, ...options.validator ?? {} });
789
+ if (errors.length) {
790
+ errors.forEach((error) => {
791
+ this.logValidationError(error);
792
+ });
793
+ throw new Error("Validation failed.");
794
+ }
795
+ return classObject;
796
+ }
797
+ logValidationError(err) {
798
+ this.logger.error('Field "%s" failed validation with value "%s": %s', err.property, err.value, Object.values(err.constraints).join(", "));
799
+ }
800
+ };
801
+ __name(ValidatorService, "ValidatorService");
802
+
803
+ // src/lib/setup.ts
804
+ function setup() {
805
+ const inspect = process.argv.indexOf("--inspect");
806
+ if (inspect !== -1) {
807
+ require("inspector").open();
808
+ process.argv.splice(inspect, 1);
809
+ }
810
+ const verbose = process.argv.indexOf("--verbose");
811
+ if (verbose !== -1) {
812
+ process.env.LOG_LEVEL = "verbose";
813
+ process.argv.splice(verbose, 1);
814
+ }
815
+ const debug = process.argv.indexOf("--debug");
816
+ if (debug !== -1) {
817
+ process.env.LOG_LEVEL = "debug";
818
+ process.argv.splice(debug, 1);
819
+ }
820
+ const trace = process.argv.indexOf("--trace");
821
+ if (trace !== -1) {
822
+ process.env.LOG_LEVEL = "trace";
823
+ process.argv.splice(trace, 1);
824
+ }
825
+ const silent = process.argv.indexOf("--silent");
826
+ if (silent !== -1) {
827
+ process.env.LOG_LEVEL = "silent";
828
+ process.argv.splice(silent, 1);
829
+ }
830
+ const sourceMaps = process.argv.indexOf("--source-map");
831
+ if (sourceMaps !== -1) {
832
+ require("source-map-support").install();
833
+ process.argv.splice(sourceMaps, 1);
834
+ }
835
+ }
836
+ __name(setup, "setup");
837
+
838
+ // src/utils/logger/logger.ts
839
+ var Logger = class {
840
+ constructor(context, options) {
841
+ this.context = context;
842
+ this.options = options;
843
+ const parsed = (process.env.LOG_LEVEL ?? options?.level ?? "INFO" /* INFO */).toUpperCase();
844
+ const level = Object.values(LogLevels).includes(parsed) ? parsed : "INFO" /* INFO */;
845
+ this.options = {
846
+ useIcons: true,
847
+ ...options,
848
+ level
849
+ };
850
+ if (Logger.instance) {
851
+ this.logger = Logger.instance;
852
+ } else if (context === ConfigService.name) {
853
+ this.logger = this.initiateLogger();
854
+ this.trace("Logger singleton initiated from context: %s", context);
855
+ Logger.instance = this.logger;
856
+ }
857
+ }
858
+ log(level, data, ...args) {
859
+ return this.parseMessage(level, data, args);
860
+ }
861
+ direct(data, ...args) {
862
+ return this.parseMessage("DIRECT" /* DIRECT */, data, args);
863
+ }
864
+ fatal(data, ...args) {
865
+ return this.parseMessage("FATAL" /* FATAL */, data, args);
866
+ }
867
+ error(data, ...args) {
868
+ return this.parseMessage("ERROR" /* ERROR */, data, args);
869
+ }
870
+ warn(data, ...args) {
871
+ return this.parseMessage("WARN" /* WARN */, data, args);
872
+ }
873
+ info(data, ...args) {
874
+ return this.parseMessage("INFO" /* INFO */, data, args);
875
+ }
876
+ debug(data, ...args) {
877
+ return this.parseMessage("DEBUG" /* DEBUG */, data, args);
878
+ }
879
+ verbose(data, ...args) {
880
+ return this.parseMessage("VERBOSE" /* VERBOSE */, data, args);
881
+ }
882
+ trace(data, ...args) {
883
+ return this.parseMessage("TRACE" /* TRACE */, data, args);
884
+ }
885
+ run(data, ...args) {
886
+ return this.parseMessage("INFO" /* INFO */, data, args, { status: "run" /* RUN */ });
887
+ }
888
+ end(data, ...args) {
889
+ return this.parseMessage("INFO" /* INFO */, data, args, { status: "end" /* END */ });
890
+ }
891
+ stage(data, ...args) {
892
+ return this.parseMessage("TRACE" /* TRACE */, data, args, { status: "stage" /* STAGE */ });
893
+ }
894
+ initiateLogger() {
895
+ const logFormat = import_winston.format.printf(({ level, message, context, status }) => {
896
+ let multiLineMessage;
897
+ multiLineMessage = message.split(import_os2.EOL);
898
+ multiLineMessage = multiLineMessage.filter((msg) => msg.trim() !== "").filter(Boolean);
899
+ multiLineMessage = multiLineMessage.map((msg) => {
900
+ return this.logColoring({
901
+ level,
902
+ message: msg,
903
+ context,
904
+ status
905
+ });
906
+ });
907
+ return multiLineMessage.join(import_os2.EOL);
908
+ });
909
+ const logger = import_winston.default.createLogger({
910
+ level: this.options.level,
911
+ format: import_winston.format.combine(import_winston.format.splat(), import_winston.format.json({ space: 2 }), import_winston.format.prettyPrint(), logFormat),
912
+ levels: Object.values(LogLevels).reduce((o, level, i) => {
913
+ return {
914
+ ...o,
915
+ [level]: i
916
+ };
917
+ }, {}),
918
+ silent: this.options.level === "SILENT" /* SILENT */,
919
+ transports: [
920
+ new import_winston.transports.Console({
921
+ stderrLevels: ["FATAL" /* FATAL */, "ERROR" /* ERROR */]
922
+ })
923
+ ]
924
+ });
925
+ logger.log("TRACE" /* TRACE */, "Initiated new logger with level: %s", this.options.level, { context: this.constructor.name });
926
+ return logger;
927
+ }
928
+ parseMessage(level, data, args, format2) {
929
+ if (!this.logger && !Logger.instance) {
930
+ return;
931
+ } else if (Logger.instance) {
932
+ this.logger = Logger.instance;
933
+ }
934
+ this.logger.log(level, data.toString(), ...args ?? [], { context: this.context, ...format2 ?? {} });
935
+ }
936
+ logColoring({ level, message, context, status }) {
937
+ let icon;
938
+ let coloring = /* @__PURE__ */ __name((input) => {
939
+ return input;
940
+ }, "coloring");
941
+ let msgColoring = /* @__PURE__ */ __name((input) => {
942
+ return input;
943
+ }, "msgColoring");
944
+ switch (level) {
945
+ case "DIRECT" /* DIRECT */:
946
+ return message;
947
+ case "FATAL" /* FATAL */:
948
+ coloring = /* @__PURE__ */ __name((input) => color.red(input), "coloring");
949
+ if (this.options?.useIcons) {
950
+ icon = import_listr2.figures.checkboxOn;
951
+ }
952
+ break;
953
+ case "ERROR" /* ERROR */:
954
+ coloring = color.red;
955
+ if (this.options?.useIcons) {
956
+ icon = import_listr2.figures.cross;
957
+ }
958
+ break;
959
+ case "WARN" /* WARN */:
960
+ coloring = color.yellow;
961
+ if (this.options?.useIcons) {
962
+ icon = import_listr2.figures.warning;
963
+ }
964
+ break;
965
+ case "INFO" /* INFO */:
966
+ coloring = color.green;
967
+ if (this.options?.useIcons) {
968
+ icon = import_listr2.figures.pointerSmall;
969
+ }
970
+ break;
971
+ case "VERBOSE" /* VERBOSE */:
972
+ coloring = color.dim;
973
+ if (this.options?.useIcons) {
974
+ icon = "\u2607";
975
+ }
976
+ break;
977
+ case "DEBUG" /* DEBUG */:
978
+ coloring = color.cyan;
979
+ msgColoring = color.dim;
980
+ if (this.options?.useIcons) {
981
+ icon = "\uF188";
982
+ }
983
+ break;
984
+ case "TRACE" /* TRACE */:
985
+ coloring = color.magenta;
986
+ msgColoring = color.dim;
987
+ if (this.options?.useIcons) {
988
+ icon = "\u26B1";
989
+ }
990
+ break;
920
991
  }
921
- return this.normalizePath(d.path);
922
- }
923
- normalizePath(path) {
924
- if (Array.isArray(path)) {
925
- return path;
926
- } else if (typeof path === "string") {
927
- return path.split(".");
992
+ if (!icon) {
993
+ icon = `[${level.at(0).toUpperCase()}]`;
928
994
  }
929
- return [];
995
+ return `${coloring(icon)}${context ? " " + coloring(`[${context}]`) : ""}${status ? " " + coloring(`[${status}]`) : ""} ${msgColoring(message)}`;
930
996
  }
931
997
  };
932
- __name(LockerService, "LockerService");
998
+ __name(Logger, "Logger");
933
999
 
934
- // src/lib/store/store.service.ts
935
- var StoreService = class {
936
- constructor() {
937
- this.store = {};
938
- if (StoreService.instance) {
939
- return StoreService.instance;
940
- } else {
941
- StoreService.instance = this;
942
- }
1000
+ // src/utils/logger/listr-logger.ts
1001
+ var ListrLogger = class extends import_listr22.Logger {
1002
+ constructor(context) {
1003
+ super();
1004
+ this.logger = new Logger(context);
943
1005
  }
944
- has(key) {
945
- return !!this.store[key];
1006
+ fail(message) {
1007
+ this.logger.error(message);
946
1008
  }
947
- get(key) {
948
- return this.store[key];
1009
+ skip(message) {
1010
+ this.logger.warn(message, { status: "skip" });
949
1011
  }
950
- set(key, data) {
951
- this.store[key] = data;
952
- return data;
1012
+ success(message) {
1013
+ this.logger.info(message, { status: "end" });
953
1014
  }
954
- };
955
- __name(StoreService, "StoreService");
956
-
957
- // src/lib/validator/validator.service.ts
958
- var import_class_transformer = require("class-transformer");
959
- var import_class_validator = require("class-validator");
960
- var ValidatorService = class {
961
- constructor(options) {
962
- this.options = options;
963
- if (ValidatorService.instance) {
964
- return ValidatorService.instance;
965
- }
966
- this.options = {
967
- validator: {
968
- skipMissingProperties: true,
969
- whitelist: false,
970
- always: true,
971
- enableDebugMessages: true
972
- },
973
- transformer: { enableImplicitConversion: true },
974
- ...options ?? {}
975
- };
976
- this.logger = new Logger(this.constructor.name);
977
- ValidatorService.instance = this;
978
- this.logger.trace("Created a new instance.");
1015
+ data(message) {
1016
+ this.logger.info(message);
979
1017
  }
980
- async validate(classType, object, options) {
981
- const classObject = (0, import_class_transformer.plainToClass)(classType, object, { ...this.options.transformer, ...options.transformer ?? {} });
982
- const errors = await (0, import_class_validator.validate)(classObject, { ...this.options.validator, ...options.validator ?? {} });
983
- if (errors.length) {
984
- errors.forEach((error) => {
985
- this.logValidationError(error);
986
- });
987
- throw new Error("Validation failed.");
988
- }
989
- return classObject;
1018
+ start(message) {
1019
+ this.logger.info(message, { status: "run" });
990
1020
  }
991
- validateSync(classType, object, options) {
992
- const classObject = (0, import_class_transformer.plainToClass)(classType, object, { ...this.options.transformer, ...options.transformer ?? {} });
993
- const errors = (0, import_class_validator.validateSync)(classObject, { ...this.options.validator, ...options.validator ?? {} });
994
- if (errors.length) {
995
- errors.forEach((error) => {
996
- this.logValidationError(error);
997
- });
998
- throw new Error("Validation failed.");
999
- }
1000
- return classObject;
1021
+ title(message) {
1022
+ this.logger.info(message);
1001
1023
  }
1002
- logValidationError(err) {
1003
- this.logger.error('Field "%s" failed validation with value "%s": %s', err.property, err.value, Object.values(err.constraints).join(", "));
1024
+ retry(message) {
1025
+ this.logger.warn(message, { status: "retry" });
1026
+ }
1027
+ rollback(message) {
1028
+ this.logger.error(message, { status: "rollback" });
1004
1029
  }
1005
1030
  };
1006
- __name(ValidatorService, "ValidatorService");
1031
+ __name(ListrLogger, "ListrLogger");
1007
1032
 
1008
- // src/lib/setup.ts
1009
- function setup() {
1010
- const inspect = process.argv.indexOf("--inspect");
1011
- if (inspect !== -1) {
1012
- require("inspector").open();
1013
- process.argv.splice(inspect, 1);
1014
- }
1015
- const verbose = process.argv.indexOf("--verbose");
1016
- if (verbose !== -1) {
1017
- process.env.LOG_LEVEL = "verbose";
1018
- process.argv.splice(verbose, 1);
1019
- }
1020
- const debug = process.argv.indexOf("--debug");
1021
- if (debug !== -1) {
1022
- process.env.LOG_LEVEL = "debug";
1023
- process.argv.splice(debug, 1);
1024
- }
1025
- const trace = process.argv.indexOf("--trace");
1026
- if (trace !== -1) {
1027
- process.env.LOG_LEVEL = "trace";
1028
- process.argv.splice(trace, 1);
1033
+ // src/utils/logger/pipe/pipe-process-to-listr.ts
1034
+ var import_through = __toESM(require("through"));
1035
+ function pipeProcessThroughListr(task, instance) {
1036
+ const logOut = (0, import_through.default)((chunk) => {
1037
+ task.output = chunk?.toString("utf-8").trim();
1038
+ });
1039
+ instance.stdout.pipe(logOut);
1040
+ instance.stderr.pipe(logOut);
1041
+ return instance;
1042
+ }
1043
+ __name(pipeProcessThroughListr, "pipeProcessThroughListr");
1044
+
1045
+ // src/utils/logger/pipe/pipe-process-to-logger.ts
1046
+ var import_through2 = __toESM(require("through"));
1047
+ function pipeProcessToLogger(logger, instance, options) {
1048
+ options = {
1049
+ start: "INFO" /* INFO */,
1050
+ end: "INFO" /* INFO */,
1051
+ stdout: "INFO" /* INFO */,
1052
+ stderr: "WARN" /* WARN */,
1053
+ ...options
1054
+ };
1055
+ if (options.start) {
1056
+ logger.run(instance.spawnargs.join(" "), { level: options.start });
1029
1057
  }
1030
- const silent = process.argv.indexOf("--silent");
1031
- if (silent !== -1) {
1032
- process.env.LOG_LEVEL = "silent";
1033
- process.argv.splice(silent, 1);
1058
+ if (instance.stdout) {
1059
+ instance.stdout.pipe(
1060
+ (0, import_through2.default)((chunk) => {
1061
+ logger.log(options.stdout, chunk);
1062
+ })
1063
+ );
1034
1064
  }
1035
- const sourceMaps = process.argv.indexOf("--source-map");
1036
- if (sourceMaps !== -1) {
1037
- require("source-map-support").install();
1038
- process.argv.splice(sourceMaps, 1);
1065
+ if (instance.stderr) {
1066
+ instance.stderr.pipe(
1067
+ (0, import_through2.default)((chunk) => {
1068
+ logger.log(options.stderr, chunk);
1069
+ })
1070
+ );
1039
1071
  }
1072
+ void instance.on("exit", (code, signal) => {
1073
+ const message = `Process ended with code ${code}${signal ? ` and signal ${signal}` : ""}.`;
1074
+ logger.debug(message);
1075
+ if (options.end) {
1076
+ logger.end(instance.spawnargs.join(" "), { level: options.end });
1077
+ }
1078
+ if (options?.callback) {
1079
+ options.callback();
1080
+ }
1081
+ });
1082
+ void instance.on("error", (error) => {
1083
+ logger.fatal(error.message);
1084
+ logger.debug(error.stack);
1085
+ if (options?.callback) {
1086
+ options.callback(error);
1087
+ }
1088
+ });
1089
+ return instance;
1040
1090
  }
1041
- __name(setup, "setup");
1091
+ __name(pipeProcessToLogger, "pipeProcessToLogger");
1092
+
1093
+ // src/constants/global-flags.constants.ts
1094
+ var CLI_FLAGS = {
1095
+ ["log-level"]: import_core.Flags.enum({
1096
+ default: "INFO" /* INFO */,
1097
+ env: "LOG_LEVEL",
1098
+ description: "Set the log level of the application.",
1099
+ options: [...Object.values(LogLevels), ...Object.values(LogLevels).map((level) => level.toLowerCase())],
1100
+ helpGroup: "CLI" /* CLI */,
1101
+ parse: async (input) => input?.toUpperCase()
1102
+ }),
1103
+ ci: import_core.Flags.boolean({
1104
+ default: false,
1105
+ env: "CI",
1106
+ description: "Instruct whether this is running the CI/CD configuration.",
1107
+ helpGroup: "CLI" /* CLI */
1108
+ }),
1109
+ json: import_core.Flags.boolean({
1110
+ default: false,
1111
+ env: "JSON",
1112
+ description: "Put the CLI to respond in JSON.",
1113
+ helpGroup: "CLI" /* CLI */
1114
+ })
1115
+ };
1042
1116
 
1043
1117
  // src/commands/base.command.ts
1044
1118
  var Command = class extends import_core3.Command {
1045
- constructor(argv, config) {
1046
- super(argv, config);
1047
- this.argv = argv;
1048
- this.config = config;
1119
+ constructor() {
1120
+ super(...arguments);
1049
1121
  this.flags = {};
1050
1122
  this.args = {};
1051
1123
  }
@@ -1069,10 +1141,9 @@ var Command = class extends import_core3.Command {
1069
1141
  delete process.env[this.config.scopedEnvVarKey("REDIRECTED")];
1070
1142
  await this.init();
1071
1143
  result = await this.run();
1072
- } catch (error) {
1073
- await this.catch(error);
1074
- } finally {
1075
1144
  await this.finally();
1145
+ } catch (error) {
1146
+ await this.catch(error, 127);
1076
1147
  }
1077
1148
  if (result && this.jsonEnabled()) {
1078
1149
  import_core2.CliUx.ux.styledJSON(this.toSuccessJson(result));
@@ -1088,19 +1159,17 @@ var Command = class extends import_core3.Command {
1088
1159
  }
1089
1160
  prompt(options) {
1090
1161
  return (0, import_listr23.createPrompt)(options, {
1091
- stdout: process.stdout,
1092
- cancelCallback: () => {
1093
- throw new Error("Cancelled prompt.");
1094
- }
1162
+ error: true,
1163
+ stdout: process.stdout
1095
1164
  });
1096
1165
  }
1097
1166
  setCtxDefaults(...defaults) {
1098
1167
  setCtxDefaults(this.tasks.options.ctx, ...defaults);
1099
- this.logger.trace("updated with defaults: %o", this.tasks.options.ctx, { status: "ctx" });
1168
+ this.logger.trace("Updated context with defaults: %o", this.tasks.options.ctx, { status: "ctx" });
1100
1169
  }
1101
1170
  setCtxAssign(...assigns) {
1102
1171
  setCtxAssign(this.tasks.options.ctx, ...assigns);
1103
- this.logger.trace("updated with assign: %o", this.tasks.options.ctx, { status: "ctx" });
1172
+ this.logger.trace("Updated context with assign: %o", this.tasks.options.ctx, { status: "ctx" });
1104
1173
  }
1105
1174
  async init() {
1106
1175
  await super.init();
@@ -1147,10 +1216,12 @@ var Command = class extends import_core3.Command {
1147
1216
  process.kill(process.pid, "SIGINT");
1148
1217
  });
1149
1218
  }
1150
- process.on("SIGINT", () => {
1219
+ const terminate = /* @__PURE__ */ __name(() => {
1151
1220
  this.logger.fatal("Caught terminate signal.", { status: "terminate" /* TERMINATE */ });
1152
1221
  process.exit(1);
1153
- });
1222
+ }, "terminate");
1223
+ process.on("SIGINT", terminate);
1224
+ process.on("SIGTERM", terminate);
1154
1225
  this.logger.stage("Running shouldRunBefore.");
1155
1226
  await this.shouldRunBefore();
1156
1227
  this.logger.stage("Finished shouldRunBefore.");
@@ -1164,10 +1235,12 @@ var Command = class extends import_core3.Command {
1164
1235
  this.logger.stage("Finished shouldRunAfter.");
1165
1236
  return { ctx };
1166
1237
  }
1167
- catch(e) {
1238
+ catch(e, exit) {
1168
1239
  this.logger.fatal(e.message);
1169
1240
  this.logger.debug(e.stack, { context: "crash" });
1170
- this.exit(127);
1241
+ if (exit > 0) {
1242
+ this.exit(exit);
1243
+ }
1171
1244
  return;
1172
1245
  }
1173
1246
  greet() {
@@ -1244,6 +1317,7 @@ var storeHook = /* @__PURE__ */ __name((cb) => async (opts) => {
1244
1317
  Command,
1245
1318
  ConfigCommand,
1246
1319
  ConfigService,
1320
+ EnvironmentVariableParser,
1247
1321
  FileConstants,
1248
1322
  FileSystemService,
1249
1323
  Flags,
@@ -1272,5 +1346,6 @@ var storeHook = /* @__PURE__ */ __name((cb) => async (opts) => {
1272
1346
  setCtxDefaults,
1273
1347
  setup,
1274
1348
  storeHook,
1349
+ uniqueFilter,
1275
1350
  updateNotifierHook
1276
1351
  });