@plugjs/plug 0.3.5 → 0.4.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.
Files changed (77) hide show
  1. package/dist/asserts.cjs +9 -11
  2. package/dist/asserts.cjs.map +1 -1
  3. package/dist/asserts.d.ts +1 -2
  4. package/dist/asserts.mjs +8 -9
  5. package/dist/asserts.mjs.map +1 -1
  6. package/dist/build.cjs +29 -5
  7. package/dist/build.cjs.map +1 -1
  8. package/dist/build.d.ts +4 -0
  9. package/dist/build.mjs +27 -5
  10. package/dist/build.mjs.map +1 -1
  11. package/dist/cli.d.mts +12 -0
  12. package/dist/cli.mjs +266 -0
  13. package/dist/cli.mjs.map +6 -0
  14. package/dist/fork.cjs +30 -12
  15. package/dist/fork.cjs.map +1 -1
  16. package/dist/fork.d.ts +10 -0
  17. package/dist/fork.mjs +31 -13
  18. package/dist/fork.mjs.map +1 -1
  19. package/dist/helpers.cjs +30 -10
  20. package/dist/helpers.cjs.map +2 -2
  21. package/dist/helpers.d.ts +12 -0
  22. package/dist/helpers.mjs +35 -11
  23. package/dist/helpers.mjs.map +2 -2
  24. package/dist/index.cjs +5 -0
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.mjs +4 -1
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/logging/emit.cjs +4 -4
  30. package/dist/logging/emit.cjs.map +1 -1
  31. package/dist/logging/emit.mjs +4 -4
  32. package/dist/logging/emit.mjs.map +1 -1
  33. package/dist/logging/logger.cjs +43 -2
  34. package/dist/logging/logger.cjs.map +1 -1
  35. package/dist/logging/logger.d.ts +36 -3
  36. package/dist/logging/logger.mjs +43 -3
  37. package/dist/logging/logger.mjs.map +1 -1
  38. package/dist/logging/options.cjs +5 -2
  39. package/dist/logging/options.cjs.map +1 -1
  40. package/dist/logging/options.mjs +5 -2
  41. package/dist/logging/options.mjs.map +1 -1
  42. package/dist/logging.cjs +14 -3
  43. package/dist/logging.cjs.map +1 -1
  44. package/dist/logging.d.ts +2 -0
  45. package/dist/logging.mjs +13 -3
  46. package/dist/logging.mjs.map +1 -1
  47. package/dist/plugs/build.cjs +66 -0
  48. package/dist/plugs/build.cjs.map +6 -0
  49. package/dist/plugs/build.d.ts +13 -0
  50. package/dist/plugs/build.mjs +40 -0
  51. package/dist/plugs/build.mjs.map +6 -0
  52. package/dist/types.d.ts +2 -0
  53. package/dist/utils/exec.cjs +5 -12
  54. package/dist/utils/exec.cjs.map +2 -2
  55. package/dist/utils/exec.d.ts +0 -2
  56. package/dist/utils/exec.mjs +6 -13
  57. package/dist/utils/exec.mjs.map +1 -1
  58. package/package.json +7 -9
  59. package/src/asserts.ts +9 -11
  60. package/src/build.ts +33 -4
  61. package/{extra/plug.mts → src/cli.mts} +115 -141
  62. package/src/fork.ts +42 -16
  63. package/src/helpers.ts +53 -1
  64. package/src/index.ts +2 -1
  65. package/src/logging/emit.ts +4 -4
  66. package/src/logging/logger.ts +60 -7
  67. package/src/logging/options.ts +5 -1
  68. package/src/logging.ts +20 -5
  69. package/src/plugs/build.ts +58 -0
  70. package/src/types.ts +2 -0
  71. package/src/utils/exec.ts +6 -20
  72. package/cli/plug.mjs +0 -1385
  73. package/cli/ts-loader.mjs +0 -275
  74. package/cli/tsrun.mjs +0 -1204
  75. package/extra/ts-loader.mts +0 -546
  76. package/extra/tsrun.mts +0 -127
  77. package/extra/utils.ts +0 -150
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/plugs/build.ts"],
4
+ "mappings": ";AAAA,SAAS,UAAU;AACnB,SAAS,mBAAqC;AAC9C,SAAS,uBAAuB;AAOzB,IAAM,mBAAN,MAA6C;AAAA,EAClD,YACqB,QACA,QACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EAEH,MAAM,KAAK,OAAc,SAAiC;AACxD,UAAM,QAAQ,KAAK,OAAO,WAAW,IAAI,CAAE,SAAU,IAAI,KAAK;AAE9D,eAAW,QAAQ,MAAM,cAAc,GAAG;AAExC,UAAI,aAAa,MAAM,OAAO;AAC9B,aAAO,YAAY;AACjB,YAAI,QAAQ,UAAU;AAAG;AACzB,qBAAa,WAAW;AAAA,MAC1B;AAGA,UAAI,CAAE,QAAQ,UAAU,GAAG;AACzB,gBAAQ,IAAI,KAAK,QAAQ,GAAG,IAAI,iCAAiC;AAAA,MACnE,OAAO;AACL,cAAM,WAAW,WAAW,EAAE,OAAO,KAAK,MAAM;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAM,cAAc,OAAO,IAAI,gBAAgB;AAG/C,SAAS,QAAQ,OAKf;AACA,SAAO,SAAS,OAAO,MAAM,WAAW,MAAM;AAChD;AAEO,IAAM,WAAN,cAAuB,YAAY;AAAA,EACxC,YACI,OACA,OACA,SACF;AACA,UAAM,gBAAgB,eAAS,GAAG,CAAE,OAAO,OAAO,OAAQ,GAAG,iBAAiB,IAAI;AAAA,EACpF;AACF;",
5
+ "names": []
6
+ }
package/dist/types.d.ts CHANGED
@@ -20,6 +20,8 @@ export interface State {
20
20
  readonly tasks: Tasks;
21
21
  /** All _properties_ available in this {@link State} */
22
22
  readonly props: Props;
23
+ /** All _tasks_ that have failed in this {@link State} */
24
+ readonly fails: Set<Task>;
23
25
  }
24
26
  /**
25
27
  * The {@link Task} interface normalizes a task definition, associating it with
@@ -33,9 +33,9 @@ __export(exec_exports, {
33
33
  execChild: () => execChild
34
34
  });
35
35
  module.exports = __toCommonJS(exec_exports);
36
+ var import_node_child_process = require("node:child_process");
36
37
  var import_node_path = __toESM(require("node:path"), 1);
37
38
  var import_node_readline = __toESM(require("node:readline"), 1);
38
- var import_node_child_process = require("node:child_process");
39
39
  var import_asserts = require("../asserts.cjs");
40
40
  var import_logging = require("../logging.cjs");
41
41
  var import_paths = require("../paths.cjs");
@@ -43,8 +43,6 @@ async function execChild(cmd, args, options = {}, context) {
43
43
  const {
44
44
  env = {},
45
45
  // default empty environment
46
- fork = false,
47
- // by default do not fork
48
46
  shell = false,
49
47
  // by default do not use a shell
50
48
  cwd = void 0,
@@ -55,7 +53,6 @@ async function execChild(cmd, args, options = {}, context) {
55
53
  } = options;
56
54
  const childCwd = cwd ? context.resolve(cwd) : (0, import_paths.getCurrentWorkingDirectory)();
57
55
  (0, import_asserts.assert)((0, import_paths.resolveDirectory)(childCwd), `Current working directory ${(0, import_logging.$p)(childCwd)} does not exist`);
58
- (0, import_asserts.assert)(!(fork && shell), 'Options "fork" and "shell" can not coexist');
59
56
  const childPaths = [];
60
57
  const baseNodePath = context.resolve("@node_modules", ".bin");
61
58
  if ((0, import_paths.resolveDirectory)(baseNodePath))
@@ -67,20 +64,19 @@ async function execChild(cmd, args, options = {}, context) {
67
64
  if (extraPath)
68
65
  childPaths.push(extraPath);
69
66
  const PATH = childPaths.join(import_node_path.default.delimiter);
70
- const logForkEnv = import_logging.logOptions.forkEnv(context.taskName, 4);
71
- const childEnv = { ...process.env, ...env, ...logForkEnv, PATH };
67
+ const childEnv = { ...process.env, ...env, PATH };
72
68
  if (coverageDir)
73
69
  childEnv.NODE_V8_COVERAGE = context.resolve(coverageDir);
74
70
  const childOptions = {
75
71
  ...extraOptions,
76
- stdio: ["ignore", "pipe", "pipe", "ipc", "pipe"],
72
+ stdio: ["ignore", "pipe", "pipe"],
77
73
  cwd: childCwd,
78
74
  env: childEnv,
79
75
  shell
80
76
  };
81
- context.log.info(fork ? "Forking" : "Executing", [cmd, ...args]);
77
+ context.log.info("Executing", [cmd, ...args]);
82
78
  context.log.debug("Child process options", childOptions);
83
- const child = fork ? (0, import_node_child_process.fork)(cmd, args, childOptions) : (0, import_node_child_process.spawn)(cmd, args, childOptions);
79
+ const child = (0, import_node_child_process.spawn)(cmd, args, childOptions);
84
80
  try {
85
81
  context.log.info("Child process PID", child.pid);
86
82
  if (child.stdout) {
@@ -91,9 +87,6 @@ async function execChild(cmd, args, options = {}, context) {
91
87
  const err = import_node_readline.default.createInterface(child.stderr);
92
88
  err.on("line", (line) => context.log.warn(line || "\xA0"));
93
89
  }
94
- if (child.stdio[4]) {
95
- child.stdio[4].on("data", (data) => import_logging.logOptions.output.write(data));
96
- }
97
90
  } catch (error) {
98
91
  child.kill();
99
92
  throw error;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/exec.ts"],
4
- "mappings": "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",
5
- "names": ["path", "forkProcess", "spawnProcess", "readline"]
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAsB;AACtB,uBAAiB;AACjB,2BAAqB;AAErB,qBAAqC;AACrC,qBAAmB;AACnB,mBAA6D;AAkB7D,eAAsB,UAClB,KACA,MACA,UAA4B,CAAC,GAC7B,SACa;AACf,QAAM;AAAA,IACJ,MAAM,CAAC;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN;AAAA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,WAAW,MAAM,QAAQ,QAAQ,GAAG,QAAI,yCAA2B;AACzE,iCAAO,+BAAiB,QAAQ,GAAG,iCAA6B,mBAAG,QAAQ,kBAAkB;AAG7F,QAAM,aAA6B,CAAC;AAGpC,QAAM,eAAe,QAAQ,QAAQ,iBAAiB,MAAM;AAC5D,UAAI,+BAAiB,YAAY;AAAG,eAAW,KAAK,YAAY;AAGhE,QAAM,gBAAgB,QAAQ,QAAQ,kBAAkB,MAAM;AAC9D,UAAI,+BAAiB,aAAa;AAAG,eAAW,KAAK,aAAa;AAGlE,QAAM,YAAY,IAAI,QAAQ,QAAQ,IAAI;AAC1C,MAAI;AAAW,eAAW,KAAK,SAAS;AAGxC,QAAM,OAAO,WAAW,KAAK,iBAAAA,QAAK,SAAS;AAC3C,QAAM,WAAmC,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,KAAK;AAGxE,MAAI;AAAa,aAAS,mBAAmB,QAAQ,QAAQ,WAAW;AAGxE,QAAM,eAA6B;AAAA,IACjC,GAAG;AAAA,IACH,OAAO,CAAE,UAAU,QAAQ,MAAO;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF;AAGA,UAAQ,IAAI,KAAK,aAAa,CAAE,KAAK,GAAG,IAAK,CAAC;AAC9C,UAAQ,IAAI,MAAM,yBAAyB,YAAY;AAEvD,QAAM,YAAQ,iCAAM,KAAK,MAAM,YAAY;AAE3C,MAAI;AACF,YAAQ,IAAI,KAAK,qBAAqB,MAAM,GAAG;AAG/C,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,qBAAAC,QAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,OAAO,QAAQ,MAAQ,CAAC;AAAA,IAC/D;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,qBAAAA,QAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,KAAK,QAAO,MAAQ,CAAC;AAAA,IAC5D;AAAA,EACF,SAAS,OAAP;AAEA,UAAM,KAAK;AACX,UAAM;AAAA,EACR;AAGA,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,GAAG,SAAS,CAAC,UAAU,OAAO,KAAK,CAAC;AAC1C,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,UAAI,SAAS;AAAG,eAAO,QAAQ;AAC/B,UAAI;AAAQ,eAAO,OAAO,4BAAa,YAAY,oCAAoC,QAAQ,CAAC;AAChG,UAAI;AAAM,eAAO,OAAO,4BAAa,YAAY,kCAAkC,MAAM,CAAC;AAC1F,aAAO,4BAAa,YAAY,4CAA4C,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AACH;",
5
+ "names": ["path", "readline"]
6
6
  }
@@ -5,8 +5,6 @@ export interface ExecChildOptions {
5
5
  coverageDir?: string;
6
6
  /** Extra environment variables, or overrides for existing ones */
7
7
  env?: Record<string, any>;
8
- /** Whether to _fork_ the process (argument is a javascript file) or not */
9
- fork?: boolean;
10
8
  /** Whether to run the command in a shell (optionally name the shell) */
11
9
  shell?: string | boolean;
12
10
  /** The current working directory of the process to execute. */
@@ -1,16 +1,14 @@
1
1
  // utils/exec.ts
2
+ import { spawn } from "node:child_process";
2
3
  import path from "node:path";
3
4
  import readline from "node:readline";
4
- import { fork as forkProcess, spawn as spawnProcess } from "node:child_process";
5
5
  import { assert, BuildFailure } from "../asserts.mjs";
6
- import { $p, logOptions } from "../logging.mjs";
6
+ import { $p } from "../logging.mjs";
7
7
  import { getCurrentWorkingDirectory, resolveDirectory } from "../paths.mjs";
8
8
  async function execChild(cmd, args, options = {}, context) {
9
9
  const {
10
10
  env = {},
11
11
  // default empty environment
12
- fork = false,
13
- // by default do not fork
14
12
  shell = false,
15
13
  // by default do not use a shell
16
14
  cwd = void 0,
@@ -21,7 +19,6 @@ async function execChild(cmd, args, options = {}, context) {
21
19
  } = options;
22
20
  const childCwd = cwd ? context.resolve(cwd) : getCurrentWorkingDirectory();
23
21
  assert(resolveDirectory(childCwd), `Current working directory ${$p(childCwd)} does not exist`);
24
- assert(!(fork && shell), 'Options "fork" and "shell" can not coexist');
25
22
  const childPaths = [];
26
23
  const baseNodePath = context.resolve("@node_modules", ".bin");
27
24
  if (resolveDirectory(baseNodePath))
@@ -33,20 +30,19 @@ async function execChild(cmd, args, options = {}, context) {
33
30
  if (extraPath)
34
31
  childPaths.push(extraPath);
35
32
  const PATH = childPaths.join(path.delimiter);
36
- const logForkEnv = logOptions.forkEnv(context.taskName, 4);
37
- const childEnv = { ...process.env, ...env, ...logForkEnv, PATH };
33
+ const childEnv = { ...process.env, ...env, PATH };
38
34
  if (coverageDir)
39
35
  childEnv.NODE_V8_COVERAGE = context.resolve(coverageDir);
40
36
  const childOptions = {
41
37
  ...extraOptions,
42
- stdio: ["ignore", "pipe", "pipe", "ipc", "pipe"],
38
+ stdio: ["ignore", "pipe", "pipe"],
43
39
  cwd: childCwd,
44
40
  env: childEnv,
45
41
  shell
46
42
  };
47
- context.log.info(fork ? "Forking" : "Executing", [cmd, ...args]);
43
+ context.log.info("Executing", [cmd, ...args]);
48
44
  context.log.debug("Child process options", childOptions);
49
- const child = fork ? forkProcess(cmd, args, childOptions) : spawnProcess(cmd, args, childOptions);
45
+ const child = spawn(cmd, args, childOptions);
50
46
  try {
51
47
  context.log.info("Child process PID", child.pid);
52
48
  if (child.stdout) {
@@ -57,9 +53,6 @@ async function execChild(cmd, args, options = {}, context) {
57
53
  const err = readline.createInterface(child.stderr);
58
54
  err.on("line", (line) => context.log.warn(line || "\xA0"));
59
55
  }
60
- if (child.stdio[4]) {
61
- child.stdio[4].on("data", (data) => logOptions.output.write(data));
62
- }
63
56
  } catch (error) {
64
57
  child.kill();
65
58
  throw error;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/exec.ts"],
4
- "mappings": ";AAAA,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,SAAS,QAAQ,aAAa,SAAS,oBAAoB;AAE3D,SAAS,QAAQ,oBAAoB;AACrC,SAAS,IAAI,kBAAkB;AAC/B,SAAS,4BAA4B,wBAAwB;AAoB7D,eAAsB,UAClB,KACA,MACA,UAA4B,CAAC,GAC7B,SACa;AACf,QAAM;AAAA,IACJ,MAAM,CAAC;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN;AAAA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,WAAW,MAAM,QAAQ,QAAQ,GAAG,IAAI,2BAA2B;AACzE,SAAO,iBAAiB,QAAQ,GAAG,6BAA6B,GAAG,QAAQ,kBAAkB;AAG7F,SAAO,EAAE,QAAQ,QAAQ,4CAA4C;AAGrE,QAAM,aAA6B,CAAC;AAGpC,QAAM,eAAe,QAAQ,QAAQ,iBAAiB,MAAM;AAC5D,MAAI,iBAAiB,YAAY;AAAG,eAAW,KAAK,YAAY;AAGhE,QAAM,gBAAgB,QAAQ,QAAQ,kBAAkB,MAAM;AAC9D,MAAI,iBAAiB,aAAa;AAAG,eAAW,KAAK,aAAa;AAGlE,QAAM,YAAY,IAAI,QAAQ,QAAQ,IAAI;AAC1C,MAAI;AAAW,eAAW,KAAK,SAAS;AAGxC,QAAM,OAAO,WAAW,KAAK,KAAK,SAAS;AAC3C,QAAM,aAAa,WAAW,QAAQ,QAAQ,UAAU,CAAC;AACzD,QAAM,WAAmC,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,GAAG,YAAY,KAAK;AAGvF,MAAI;AAAa,aAAS,mBAAmB,QAAQ,QAAQ,WAAW;AAGxE,QAAM,eAA6B;AAAA,IACjC,GAAG;AAAA,IACH,OAAO,CAAE,UAAU,QAAQ,QAAQ,OAAO,MAAO;AAAA,IACjD,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF;AAGA,UAAQ,IAAI,KAAK,OAAO,YAAY,aAAa,CAAE,KAAK,GAAG,IAAK,CAAC;AACjE,UAAQ,IAAI,MAAM,yBAAyB,YAAY;AAEvD,QAAM,QAAQ,OACZ,YAAY,KAAK,MAAM,YAAY,IACnC,aAAa,KAAK,MAAM,YAAY;AAEtC,MAAI;AACF,YAAQ,IAAI,KAAK,qBAAqB,MAAM,GAAG;AAG/C,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,SAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,OAAO,QAAQ,MAAQ,CAAC;AAAA,IAC/D;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,SAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,KAAK,QAAO,MAAQ,CAAC;AAAA,IAC5D;AAGA,QAAI,MAAM,MAAM,CAAC,GAAG;AAClB,YAAM,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,WAAW,OAAO,MAAM,IAAI,CAAC;AAAA,IACnE;AAAA,EACF,SAAS,OAAP;AAEA,UAAM,KAAK;AACX,UAAM;AAAA,EACR;AAGA,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,GAAG,SAAS,CAAC,UAAU,OAAO,KAAK,CAAC;AAC1C,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,UAAI,SAAS;AAAG,eAAO,QAAQ;AAC/B,UAAI;AAAQ,eAAO,OAAO,aAAa,YAAY,oCAAoC,QAAQ,CAAC;AAChG,UAAI;AAAM,eAAO,OAAO,aAAa,YAAY,kCAAkC,MAAM,CAAC;AAC1F,aAAO,aAAa,YAAY,4CAA4C,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "mappings": ";AAAA,SAAS,aAAa;AACtB,OAAO,UAAU;AACjB,OAAO,cAAc;AAErB,SAAS,QAAQ,oBAAoB;AACrC,SAAS,UAAU;AACnB,SAAS,4BAA4B,wBAAwB;AAkB7D,eAAsB,UAClB,KACA,MACA,UAA4B,CAAC,GAC7B,SACa;AACf,QAAM;AAAA,IACJ,MAAM,CAAC;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN;AAAA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,WAAW,MAAM,QAAQ,QAAQ,GAAG,IAAI,2BAA2B;AACzE,SAAO,iBAAiB,QAAQ,GAAG,6BAA6B,GAAG,QAAQ,kBAAkB;AAG7F,QAAM,aAA6B,CAAC;AAGpC,QAAM,eAAe,QAAQ,QAAQ,iBAAiB,MAAM;AAC5D,MAAI,iBAAiB,YAAY;AAAG,eAAW,KAAK,YAAY;AAGhE,QAAM,gBAAgB,QAAQ,QAAQ,kBAAkB,MAAM;AAC9D,MAAI,iBAAiB,aAAa;AAAG,eAAW,KAAK,aAAa;AAGlE,QAAM,YAAY,IAAI,QAAQ,QAAQ,IAAI;AAC1C,MAAI;AAAW,eAAW,KAAK,SAAS;AAGxC,QAAM,OAAO,WAAW,KAAK,KAAK,SAAS;AAC3C,QAAM,WAAmC,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,KAAK;AAGxE,MAAI;AAAa,aAAS,mBAAmB,QAAQ,QAAQ,WAAW;AAGxE,QAAM,eAA6B;AAAA,IACjC,GAAG;AAAA,IACH,OAAO,CAAE,UAAU,QAAQ,MAAO;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF;AAGA,UAAQ,IAAI,KAAK,aAAa,CAAE,KAAK,GAAG,IAAK,CAAC;AAC9C,UAAQ,IAAI,MAAM,yBAAyB,YAAY;AAEvD,QAAM,QAAQ,MAAM,KAAK,MAAM,YAAY;AAE3C,MAAI;AACF,YAAQ,IAAI,KAAK,qBAAqB,MAAM,GAAG;AAG/C,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,SAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,OAAO,QAAQ,MAAQ,CAAC;AAAA,IAC/D;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,MAAM,SAAS,gBAAgB,MAAM,MAAM;AACjD,UAAI,GAAG,QAAQ,CAAC,SAAS,QAAQ,IAAI,KAAK,QAAO,MAAQ,CAAC;AAAA,IAC5D;AAAA,EACF,SAAS,OAAP;AAEA,UAAM,KAAK;AACX,UAAM;AAAA,EACR;AAGA,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,GAAG,SAAS,CAAC,UAAU,OAAO,KAAK,CAAC;AAC1C,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,UAAI,SAAS;AAAG,eAAO,QAAQ;AAC/B,UAAI;AAAQ,eAAO,OAAO,aAAa,YAAY,oCAAoC,QAAQ,CAAC;AAChG,UAAI;AAAM,eAAO,OAAO,aAAa,YAAY,kCAAkC,MAAM,CAAC;AAC1F,aAAO,aAAa,YAAY,4CAA4C,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AACH;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@plugjs/plug",
3
- "version": "0.3.5",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "plug": "./dist/cli.mjs"
10
+ },
8
11
  "exports": {
9
12
  ".": {
10
13
  "require": {
@@ -97,21 +100,16 @@
97
100
  }
98
101
  }
99
102
  },
100
- "bin": {
101
- "plug": "./cli/plug.mjs",
102
- "tsrun": "./cli/tsrun.mjs"
103
- },
104
103
  "author": "Juit Developers <developers@juit.com>",
105
104
  "license": "Apache-2.0",
106
105
  "dependencies": {
106
+ "@plugjs/tsrun": "^0.4.0",
107
107
  "@types/node": "<19",
108
- "esbuild": "^0.17.16",
108
+ "esbuild": "^0.17.17",
109
109
  "picomatch": "^2.3.1"
110
110
  },
111
111
  "devDependencies": {
112
- "@types/picomatch": "^2.3.0",
113
- "@types/yargs-parser": "^21.0.0",
114
- "yargs-parser": "^21.1.1"
112
+ "@types/picomatch": "^2.3.0"
115
113
  },
116
114
  "files": [
117
115
  "*.md",
package/src/asserts.ts CHANGED
@@ -7,11 +7,6 @@ import { githubAnnotation } from './logging/github'
7
7
  /** A symbol marking {@link BuildFailure} instances */
8
8
  const buildFailure = Symbol.for('plugjs:buildFailure')
9
9
 
10
- /** Check if the specified argument is a {@link BuildFailure} */
11
- export function isBuildFailure(arg: any): arg is BuildFailure {
12
- return arg && arg[buildFailure] === buildFailure
13
- }
14
-
15
10
  /** A {@link BuildFailure} represents an error _already logged_ in our build. */
16
11
  export class BuildFailure extends Error {
17
12
  readonly errors?: readonly any[] | undefined
@@ -28,12 +23,6 @@ export class BuildFailure extends Error {
28
23
  /* Basic error setup: stack and errors */
29
24
  Error.captureStackTrace(this, BuildFailure)
30
25
  if (errors.length) this.errors = Object.freeze([ ...errors ])
31
-
32
- /* Other properties: marker and name */
33
- Object.defineProperties(this, {
34
- [buildFailure]: { value: buildFailure },
35
- 'name': { value: 'BuildFailure' },
36
- })
37
26
  }
38
27
 
39
28
  static fail(): BuildFailure {
@@ -47,6 +36,15 @@ export class BuildFailure extends Error {
47
36
  static withErrors(errors: any[]): BuildFailure {
48
37
  return new BuildFailure(undefined, errors)
49
38
  }
39
+
40
+ static [Symbol.hasInstance](instance: any): boolean {
41
+ return instance && instance[buildFailure] === buildFailure
42
+ }
43
+
44
+ static {
45
+ (this.prototype as any)[buildFailure] = buildFailure
46
+ this.prototype.name = this.name
47
+ }
50
48
  }
51
49
 
52
50
  /** Await and assert that all specified promises were fulfilled */
package/src/build.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { assert } from './asserts'
2
2
  import { runAsync } from './async'
3
- import { $ms, $p, $t, getLogger, logOptions } from './logging'
3
+ import { $gry, $ms, $p, $t, getLogger, logOptions } from './logging'
4
4
  import { Context, ContextPromises, PipeImpl } from './pipe'
5
5
  import { findCaller } from './utils/caller'
6
6
 
@@ -51,7 +51,8 @@ function makeTask(
51
51
  const tasks: Record<string, Task> = Object.assign({}, task.tasks, state.tasks)
52
52
  const stack = [ ...state.stack, task ]
53
53
  const cache = state.cache
54
- state = { stack, cache, tasks, props }
54
+ const fails = state.fails
55
+ state = { stack, cache, fails, tasks, props }
55
56
 
56
57
  /* Create run context and build */
57
58
  const context = new Context(task.buildFile, taskName)
@@ -86,6 +87,7 @@ function makeTask(
86
87
  context.log[level](`Success ${$ms(Date.now() - now)}`)
87
88
  return result
88
89
  }).catch((error) => {
90
+ fails.add(task)
89
91
  throw context.log.fail(`Failure ${$ms(Date.now() - now)}`, error)
90
92
  }).finally(async () => {
91
93
  await ContextPromises.wait(context)
@@ -105,6 +107,7 @@ function makeTask(
105
107
  cache: new Map<Task, Promise<Result>>(),
106
108
  stack: [] as Task[],
107
109
  props: Object.assign({}, props, overrideProps),
110
+ fails: new Set<Task>,
108
111
  tasks: tasks,
109
112
  }
110
113
  return invoke(state, _name)
@@ -163,8 +166,9 @@ export function build<
163
166
  const logger = getLogger()
164
167
  const state = {
165
168
  cache: new Map<Task, Promise<Result>>(),
166
- stack: [] as Task[],
167
169
  props: Object.assign({}, props, overrideProps),
170
+ fails: new Set<Task>(),
171
+ stack: [] as Task[],
168
172
  tasks: tasks,
169
173
  }
170
174
 
@@ -181,12 +185,18 @@ export function build<
181
185
  }
182
186
  logger.notice(`Build successful ${$ms(Date.now() - now)}`)
183
187
  } catch (error) {
188
+ if (state.fails.size) {
189
+ logger.error('')
190
+ logger.error(state.fails.size, state.fails.size === 1 ? 'task' : 'tasks', 'failed:')
191
+ state.fails.forEach((task) => logger.error($gry('*'), $t(task.name)))
192
+ logger.error('')
193
+ }
184
194
  throw logger.fail(`Build failed ${$ms(Date.now() - now)}`, error)
185
195
  }
186
196
  }
187
197
 
188
198
  /* Create our build, the collection of all props and tasks */
189
- const compiled = Object.assign({}, props, tasks) as Build<D>
199
+ const compiled = Object.assign(Object.create(null), props, tasks) as Build<D>
190
200
 
191
201
  /* Sneak our "call" function in the build, for the CLI and "call" below */
192
202
  Object.defineProperty(compiled, buildMarker, { value: invoke })
@@ -195,6 +205,25 @@ export function build<
195
205
  return compiled
196
206
  }
197
207
 
208
+ /** Check if the specified build is actually a {@link Build} */
209
+ export function isBuild(build: any): build is Build<Record<string, any>> {
210
+ return build && typeof build[buildMarker] === 'function'
211
+ }
212
+
213
+ /** Invoke a number of tasks in a {@link Build} */
214
+ export function invokeTasks(
215
+ build: Build,
216
+ tasks: string[],
217
+ props?: Record<string, string>,
218
+ ): Promise<void> {
219
+ if (build && (typeof build === 'object') &&
220
+ (buildMarker in build) && (typeof build[buildMarker] === 'function')) {
221
+ return build[buildMarker](tasks, props)
222
+ } else {
223
+ throw new TypeError('Invalid build instance')
224
+ }
225
+ }
226
+
198
227
  /* ========================================================================== *
199
228
  * HOOKS *
200
229
  * ========================================================================== */