@plugjs/plug 0.2.0 → 0.2.1

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/build.cjs CHANGED
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var build_exports = {};
22
22
  __export(build_exports, {
23
23
  build: () => build,
24
- invoke: () => invoke
24
+ hookAfter: () => hookAfter,
25
+ hookBefore: () => hookBefore
25
26
  });
26
27
  module.exports = __toCommonJS(build_exports);
27
28
  var import_asserts = require("./asserts.cjs");
@@ -29,13 +30,12 @@ var import_async = require("./async.cjs");
29
30
  var import_logging = require("./logging.cjs");
30
31
  var import_pipe = require("./pipe.cjs");
31
32
  var import_caller = require("./utils/caller.cjs");
32
- var import_options = require("./utils/options.cjs");
33
33
  var taskMarker = Symbol.for("plugjs:isTask");
34
34
  function isTask(something) {
35
35
  return something[taskMarker] === true;
36
36
  }
37
37
  function makeTask(buildFile, tasks, props, _def, _name) {
38
- function invoke2(state, taskName) {
38
+ async function invoke(state, taskName) {
39
39
  (0, import_asserts.assert)(!state.stack.includes(task), `Recursion detected calling ${(0, import_logging.$t)(taskName)}`);
40
40
  const cached = state.cache.get(task);
41
41
  if (cached)
@@ -44,13 +44,13 @@ function makeTask(buildFile, tasks, props, _def, _name) {
44
44
  const tasks2 = Object.assign({}, task.tasks, state.tasks);
45
45
  const stack = [...state.stack, task];
46
46
  const cache = state.cache;
47
+ state = { stack, cache, tasks: tasks2, props: props2 };
47
48
  const context = new import_pipe.Context(task.buildFile, taskName);
48
49
  const build2 = new Proxy({}, {
49
50
  get(_, name) {
50
51
  if (name in tasks2) {
51
52
  return () => {
52
- const state2 = { stack, cache, tasks: tasks2, props: props2 };
53
- const promise2 = tasks2[name].invoke(state2, name);
53
+ const promise2 = tasks2[name].invoke(state, name);
54
54
  return new import_pipe.PipeImpl(context, promise2);
55
55
  };
56
56
  } else if (name in props2) {
@@ -58,17 +58,25 @@ function makeTask(buildFile, tasks, props, _def, _name) {
58
58
  }
59
59
  }
60
60
  });
61
+ for (const before of task.before)
62
+ await before.invoke(state, before.name);
61
63
  context.log.info("Running...");
62
64
  const now = Date.now();
63
65
  const promise = (0, import_async.runAsync)(context, taskName, async () => {
64
66
  return await _def.call(build2) || void 0;
65
- }).then((result) => {
67
+ }).then(async (result) => {
66
68
  const level = taskName.startsWith("_") ? "info" : "notice";
67
69
  context.log[level](`Success ${(0, import_logging.$ms)(Date.now() - now)}`);
68
70
  return result;
69
71
  }).catch((error) => {
70
72
  throw context.log.fail(`Failure ${(0, import_logging.$ms)(Date.now() - now)}`, error);
71
- }).finally(() => import_pipe.ContextPromises.wait(context));
73
+ }).finally(async () => {
74
+ await import_pipe.ContextPromises.wait(context);
75
+ }).then(async (result) => {
76
+ for (const after of task.after)
77
+ await after.invoke(state, after.name);
78
+ return result;
79
+ });
72
80
  cache.set(task, promise);
73
81
  return promise;
74
82
  }
@@ -79,8 +87,8 @@ function makeTask(buildFile, tasks, props, _def, _name) {
79
87
  props: Object.assign({}, props, overrideProps),
80
88
  tasks
81
89
  };
82
- return invoke2(state, _name);
83
- }, { buildFile, tasks, props, invoke: invoke2 });
90
+ return invoke(state, _name);
91
+ }, { buildFile, tasks, props, invoke, before: [], after: [] });
84
92
  Object.defineProperty(task, taskMarker, { value: true });
85
93
  Object.defineProperty(task, "name", { value: _name });
86
94
  return task;
@@ -104,7 +112,7 @@ function build(def) {
104
112
  if (len > import_logging.logOptions.taskLength)
105
113
  import_logging.logOptions.taskLength = len;
106
114
  }
107
- const invoke2 = async function invoke3(taskNames, overrideProps = {}) {
115
+ const invoke = async function invoke2(taskNames, overrideProps = {}) {
108
116
  const logger = (0, import_logging.getLogger)();
109
117
  const state = {
110
118
  cache: /* @__PURE__ */ new Map(),
@@ -126,19 +134,35 @@ function build(def) {
126
134
  }
127
135
  };
128
136
  const compiled = Object.assign({}, props, tasks);
129
- Object.defineProperty(compiled, buildMarker, { value: invoke2 });
137
+ Object.defineProperty(compiled, buildMarker, { value: invoke });
130
138
  return compiled;
131
139
  }
132
- async function invoke(build2, ...args) {
133
- const { params: tasks, options: props } = (0, import_options.parseOptions)(args, {});
134
- const invoke2 = build2[buildMarker];
135
- if (typeof invoke2 !== "function")
136
- import_logging.log.fail("Unknown build type");
137
- return await invoke2(tasks, props);
140
+ function hookBefore(build2, taskName, hooks) {
141
+ const task = build2[taskName];
142
+ (0, import_asserts.assert)(isTask(task), `Task "${(0, import_logging.$t)(taskName)}" not found in build`);
143
+ for (const hook of hooks) {
144
+ const beforeHook = build2[hook];
145
+ (0, import_asserts.assert)(isTask(beforeHook), `Task "${(0, import_logging.$t)(hook)}" to hook before "${(0, import_logging.$t)(taskName)}" not found in build`);
146
+ if (task.before.includes(beforeHook))
147
+ continue;
148
+ task.before.push(beforeHook);
149
+ }
150
+ }
151
+ function hookAfter(build2, taskName, hooks) {
152
+ const task = build2[taskName];
153
+ (0, import_asserts.assert)(isTask(task), `Task "${(0, import_logging.$t)(taskName)}" not found in build`);
154
+ for (const hook of hooks) {
155
+ const afterHook = build2[hook];
156
+ (0, import_asserts.assert)(isTask(afterHook), `Task "${(0, import_logging.$t)(hook)}" to hook after "${(0, import_logging.$t)(taskName)}" not found in build`);
157
+ if (task.after.includes(afterHook))
158
+ continue;
159
+ task.after.push(afterHook);
160
+ }
138
161
  }
139
162
  // Annotate the CommonJS export names for ESM import in node:
140
163
  0 && (module.exports = {
141
164
  build,
142
- invoke
165
+ hookAfter,
166
+ hookBefore
143
167
  });
144
168
  //# sourceMappingURL=build.cjs.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/build.ts"],
4
- "mappings": "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",
5
- "names": ["invoke", "props", "tasks", "build", "state", "promise"]
4
+ "mappings": "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",
5
+ "names": ["props", "tasks", "build", "promise", "invoke"]
6
6
  }
package/dist/build.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- import type { Build, BuildDef, ThisBuild } from './types';
1
+ import type { Build, BuildDef, Task, ThisBuild } from './types';
2
2
  /** Compile a {@link BuildDef | build definition} into a {@link Build} */
3
3
  export declare function build<D extends BuildDef, B extends ThisBuild<D>>(def: D & ThisType<B>): Build<D>;
4
- /** Serially invoke tasks in a {@link Build} optionally overriding properties */
5
- export declare function invoke(build: Build, ...args: [...taskNames: [string, ...string[]]] | [...taskNames: [string, ...string[]], options: Record<string, string | undefined>]): Promise<void>;
4
+ type TaskNames<B extends Build> = keyof {
5
+ [name in keyof B as B[name] extends Task ? name : never]: any;
6
+ };
7
+ export declare function hookBefore<B extends Build, T extends keyof B>(build: B, taskName: string & T & TaskNames<B>, hooks: (string & Exclude<TaskNames<B>, T>)[]): void;
8
+ export declare function hookAfter<B extends Build, T extends keyof B>(build: B, taskName: string & T & TaskNames<B>, hooks: (string & Exclude<TaskNames<B>, T>)[]): void;
9
+ export {};
package/dist/build.mjs CHANGED
@@ -1,16 +1,15 @@
1
1
  // build.ts
2
2
  import { assert } from "./asserts.mjs";
3
3
  import { runAsync } from "./async.mjs";
4
- import { $ms, $p, $t, getLogger, log, logOptions } from "./logging.mjs";
4
+ import { $ms, $p, $t, getLogger, logOptions } from "./logging.mjs";
5
5
  import { Context, ContextPromises, PipeImpl } from "./pipe.mjs";
6
6
  import { findCaller } from "./utils/caller.mjs";
7
- import { parseOptions } from "./utils/options.mjs";
8
7
  var taskMarker = Symbol.for("plugjs:isTask");
9
8
  function isTask(something) {
10
9
  return something[taskMarker] === true;
11
10
  }
12
11
  function makeTask(buildFile, tasks, props, _def, _name) {
13
- function invoke2(state, taskName) {
12
+ async function invoke(state, taskName) {
14
13
  assert(!state.stack.includes(task), `Recursion detected calling ${$t(taskName)}`);
15
14
  const cached = state.cache.get(task);
16
15
  if (cached)
@@ -19,13 +18,13 @@ function makeTask(buildFile, tasks, props, _def, _name) {
19
18
  const tasks2 = Object.assign({}, task.tasks, state.tasks);
20
19
  const stack = [...state.stack, task];
21
20
  const cache = state.cache;
21
+ state = { stack, cache, tasks: tasks2, props: props2 };
22
22
  const context = new Context(task.buildFile, taskName);
23
23
  const build2 = new Proxy({}, {
24
24
  get(_, name) {
25
25
  if (name in tasks2) {
26
26
  return () => {
27
- const state2 = { stack, cache, tasks: tasks2, props: props2 };
28
- const promise2 = tasks2[name].invoke(state2, name);
27
+ const promise2 = tasks2[name].invoke(state, name);
29
28
  return new PipeImpl(context, promise2);
30
29
  };
31
30
  } else if (name in props2) {
@@ -33,17 +32,25 @@ function makeTask(buildFile, tasks, props, _def, _name) {
33
32
  }
34
33
  }
35
34
  });
35
+ for (const before of task.before)
36
+ await before.invoke(state, before.name);
36
37
  context.log.info("Running...");
37
38
  const now = Date.now();
38
39
  const promise = runAsync(context, taskName, async () => {
39
40
  return await _def.call(build2) || void 0;
40
- }).then((result) => {
41
+ }).then(async (result) => {
41
42
  const level = taskName.startsWith("_") ? "info" : "notice";
42
43
  context.log[level](`Success ${$ms(Date.now() - now)}`);
43
44
  return result;
44
45
  }).catch((error) => {
45
46
  throw context.log.fail(`Failure ${$ms(Date.now() - now)}`, error);
46
- }).finally(() => ContextPromises.wait(context));
47
+ }).finally(async () => {
48
+ await ContextPromises.wait(context);
49
+ }).then(async (result) => {
50
+ for (const after of task.after)
51
+ await after.invoke(state, after.name);
52
+ return result;
53
+ });
47
54
  cache.set(task, promise);
48
55
  return promise;
49
56
  }
@@ -54,8 +61,8 @@ function makeTask(buildFile, tasks, props, _def, _name) {
54
61
  props: Object.assign({}, props, overrideProps),
55
62
  tasks
56
63
  };
57
- return invoke2(state, _name);
58
- }, { buildFile, tasks, props, invoke: invoke2 });
64
+ return invoke(state, _name);
65
+ }, { buildFile, tasks, props, invoke, before: [], after: [] });
59
66
  Object.defineProperty(task, taskMarker, { value: true });
60
67
  Object.defineProperty(task, "name", { value: _name });
61
68
  return task;
@@ -79,7 +86,7 @@ function build(def) {
79
86
  if (len > logOptions.taskLength)
80
87
  logOptions.taskLength = len;
81
88
  }
82
- const invoke2 = async function invoke3(taskNames, overrideProps = {}) {
89
+ const invoke = async function invoke2(taskNames, overrideProps = {}) {
83
90
  const logger = getLogger();
84
91
  const state = {
85
92
  cache: /* @__PURE__ */ new Map(),
@@ -101,18 +108,34 @@ function build(def) {
101
108
  }
102
109
  };
103
110
  const compiled = Object.assign({}, props, tasks);
104
- Object.defineProperty(compiled, buildMarker, { value: invoke2 });
111
+ Object.defineProperty(compiled, buildMarker, { value: invoke });
105
112
  return compiled;
106
113
  }
107
- async function invoke(build2, ...args) {
108
- const { params: tasks, options: props } = parseOptions(args, {});
109
- const invoke2 = build2[buildMarker];
110
- if (typeof invoke2 !== "function")
111
- log.fail("Unknown build type");
112
- return await invoke2(tasks, props);
114
+ function hookBefore(build2, taskName, hooks) {
115
+ const task = build2[taskName];
116
+ assert(isTask(task), `Task "${$t(taskName)}" not found in build`);
117
+ for (const hook of hooks) {
118
+ const beforeHook = build2[hook];
119
+ assert(isTask(beforeHook), `Task "${$t(hook)}" to hook before "${$t(taskName)}" not found in build`);
120
+ if (task.before.includes(beforeHook))
121
+ continue;
122
+ task.before.push(beforeHook);
123
+ }
124
+ }
125
+ function hookAfter(build2, taskName, hooks) {
126
+ const task = build2[taskName];
127
+ assert(isTask(task), `Task "${$t(taskName)}" not found in build`);
128
+ for (const hook of hooks) {
129
+ const afterHook = build2[hook];
130
+ assert(isTask(afterHook), `Task "${$t(hook)}" to hook after "${$t(taskName)}" not found in build`);
131
+ if (task.after.includes(afterHook))
132
+ continue;
133
+ task.after.push(afterHook);
134
+ }
113
135
  }
114
136
  export {
115
137
  build,
116
- invoke
138
+ hookAfter,
139
+ hookBefore
117
140
  };
118
141
  //# sourceMappingURL=build.mjs.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/build.ts"],
4
- "mappings": "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",
5
- "names": ["invoke", "props", "tasks", "build", "state", "promise"]
4
+ "mappings": "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",
5
+ "names": ["props", "tasks", "build", "promise", "invoke"]
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,mBAAsB;AAkBtB,cAAyB;AACzB,YAAuB;AACvB,WAAsB;AACtB,SAAoB;AACpB,cAAyB;AACzB,YAAuB;AACvB,WAAsB;AACtB,YAAuB;AAGvB,qBAAuF;AACvF,qBAA2C;AAG3C,wBAAc,wBAxCd;AAyCA,wBAAc,0BAzCd;AA0CA,wBAAc,wBA1Cd;AA2CA,wBAAc,wBA3Cd;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,mBAAsB;AAqBtB,cAAyB;AACzB,YAAuB;AACvB,WAAsB;AACtB,SAAoB;AACpB,cAAyB;AACzB,YAAuB;AACvB,WAAsB;AACtB,YAAuB;AAGvB,qBAAuF;AACvF,qBAA2C;AAG3C,wBAAc,wBA3Cd;AA4CA,wBAAc,0BA5Cd;AA6CA,wBAAc,wBA7Cd;AA8CA,wBAAc,wBA9Cd;",
5
5
  "names": []
6
6
  }
package/dist/index.d.ts CHANGED
@@ -7,6 +7,9 @@ export type { Plug, PlugFunction } from './pipe';
7
7
  /**
8
8
  * The {@link Pipe} interface defines a processing pipeline where multiple
9
9
  * {@link Plug}s can transform lists of {@link Files}.
10
+ *
11
+ * This is exported _here_, in the main module export file so that plugs can
12
+ * add definitions by simply referring the module.
10
13
  */
11
14
  export interface Pipe extends Promise<Files> {
12
15
  plug(plug: Plug<Files>): Pipe;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": ";AAQA,SAAS,aAAa;AAkBtB,YAAY,aAAa;AACzB,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY,aAAa;AACzB,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,WAAW;AAGvB,SAAS,KAAK,KAAK,IAAI,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,YAAY;AACvF,SAAS,QAAQ,MAAM,oBAAoB;AAG3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "mappings": ";AAQA,SAAS,aAAa;AAqBtB,YAAY,aAAa;AACzB,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY,aAAa;AACzB,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,WAAW;AAGvB,SAAS,KAAK,KAAK,IAAI,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,YAAY;AACvF,SAAS,QAAQ,MAAM,oBAAoB;AAG3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
5
5
  "names": []
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/logging/spinner.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6B;AAC7B,oBAA+B;AAC/B,qBAA2B;AAKpB,IAAM,aAAa;AAK1B,IAAI,UAAU,0BAAW;AACzB,IAAI,UAAU,0BAAW;AACzB,IAAI,WAAW,0BAAW;AAC1B,IAAI,cAAc,0BAAW;AAC7B,0BAAW,GAAG,WAAW,CAAC,EAAE,QAAQ,QAAQ,SAAS,WAAW,MAAM;AACpE,YAAU;AACV,YAAU;AACV,aAAW;AACX,gBAAc;AACd,eAAa;AACf,CAAC;AAKD,IAAM,SAAS;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AACf;AAGA,IAAI,YAAY;AAEhB,IAAI;AAGJ,SAAS,OAAa;AACpB,MAAI,CAAE;AAAS,WAAO,cAAc,SAAS;AAC7C,MAAI,CAAE;AAAU,WAAO,cAAc,SAAS;AAE9C,QAAM,YAAQ,2BAAa;AAC3B,MAAI,CAAE,MAAM;AAAQ;AAEpB,QAAM,MAAM,GAAG,SAAS,aAAa,GAAG;AACxC,QAAM,QAAQ,MAAM,IAAI,CAACA,cAAS,kBAAGA,KAAI,CAAC,EAAE,SAAK,oBAAK,IAAI,CAAC;AAE3D,QAAM,OAAO,MAAM,SAAS,IAAI,UAAU;AAE1C,cAAa,EAAG,YAAa,OAAO;AAEpC,UAAQ,MAAM,GAAG,aAAa,OAAO,OAAO,SAAS,cAAc,MAAM,UAAU,aAAS,oBAAK,KAAK,GAAG;AAC3G;AAGO,SAAS,eAAqB;AACnC,MAAI;AAAW,kBAAc,SAAS;AACtC,MAAI,WAAW;AAAU,gBAAY,YAAY,MAAM,GAAG,EAAE,MAAM;AACpE;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA6B;AAC7B,oBAA+B;AAC/B,qBAA2B;AAKpB,IAAM,aAAa;AAK1B,IAAI,UAAU,0BAAW;AACzB,IAAI,UAAU,0BAAW;AACzB,IAAI,WAAW,0BAAW;AAC1B,IAAI,cAAc,0BAAW;AAC7B,0BAAW,GAAG,WAAW,CAAC,EAAE,QAAQ,QAAQ,SAAS,WAAW,MAAM;AACpE,YAAU;AACV,YAAU;AACV,aAAW;AACX,gBAAc;AACd,eAAa;AACf,CAAC;AAKD,IAAM,SAAS;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AAAA,MACb,oBAAK,QAAQ;AAAA;AACf;AAGA,IAAI,YAAY;AAEhB,IAAI;AAGJ,SAAS,OAAa;AACpB,MAAI,CAAE;AAAS,WAAO,cAAc,SAAS;AAC7C,MAAI,CAAE;AAAU,WAAO,cAAc,SAAS;AAE9C,QAAM,YAAQ,2BAAa;AAC3B,MAAI,CAAE,MAAM;AAAQ;AAEpB,QAAM,MAAM,GAAG,SAAS,aAAa,GAAG;AACxC,QAAM,QAAQ,MAAM,IAAI,CAACA,cAAS,kBAAGA,KAAI,CAAC,EAAE,SAAK,oBAAK,IAAI,CAAC;AAE3D,QAAM,OAAO,MAAM,SAAS,IAAI,UAAU;AAE1C,cAAa,EAAG,YAAa,OAAO;AAEpC,UAAQ,MAAM,GAAG,aAAa,OAAO,OAAO,SAAS,cAAc,MAAM,UAAU,aAAS,oBAAK,KAAK,GAAG;AAC3G;AAGO,SAAS,eAAqB;AACnC,MAAI;AAAW,kBAAc,SAAS;AACtC,MAAI,WAAW;AAAU,gBAAY,YAAY,MAAM,GAAG,EAAE,MAAM;AACpE;",
5
5
  "names": ["task"]
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/logging/spinner.ts"],
4
- "mappings": ";AAAA,SAAS,oBAAoB;AAC7B,SAAS,MAAM,MAAM,UAAU;AAC/B,SAAS,kBAAkB;AAKpB,IAAM,aAAa;AAK1B,IAAI,UAAU,WAAW;AACzB,IAAI,UAAU,WAAW;AACzB,IAAI,WAAW,WAAW;AAC1B,IAAI,cAAc,WAAW;AAC7B,WAAW,GAAG,WAAW,CAAC,EAAE,QAAQ,QAAQ,SAAS,WAAW,MAAM;AACpE,YAAU;AACV,YAAU;AACV,aAAW;AACX,gBAAc;AACd,eAAa;AACf,CAAC;AAKD,IAAM,SAAS;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AACf;AAGA,IAAI,YAAY;AAEhB,IAAI;AAGJ,SAAS,OAAa;AACpB,MAAI,CAAE;AAAS,WAAO,cAAc,SAAS;AAC7C,MAAI,CAAE;AAAU,WAAO,cAAc,SAAS;AAE9C,QAAM,QAAQ,aAAa;AAC3B,MAAI,CAAE,MAAM;AAAQ;AAEpB,QAAM,MAAM,GAAG,SAAS,aAAa,GAAG;AACxC,QAAM,QAAQ,MAAM,IAAI,CAACA,UAAS,GAAGA,KAAI,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAE3D,QAAM,OAAO,MAAM,SAAS,IAAI,UAAU;AAE1C,cAAa,EAAG,YAAa,OAAO;AAEpC,UAAQ,MAAM,GAAG,aAAa,OAAO,OAAO,SAAS,cAAc,MAAM,UAAU,SAAS,KAAK,KAAK,GAAG;AAC3G;AAGO,SAAS,eAAqB;AACnC,MAAI;AAAW,kBAAc,SAAS;AACtC,MAAI,WAAW;AAAU,gBAAY,YAAY,MAAM,GAAG,EAAE,MAAM;AACpE;",
4
+ "mappings": ";AAEA,SAAS,oBAAoB;AAC7B,SAAS,MAAM,MAAM,UAAU;AAC/B,SAAS,kBAAkB;AAKpB,IAAM,aAAa;AAK1B,IAAI,UAAU,WAAW;AACzB,IAAI,UAAU,WAAW;AACzB,IAAI,WAAW,WAAW;AAC1B,IAAI,cAAc,WAAW;AAC7B,WAAW,GAAG,WAAW,CAAC,EAAE,QAAQ,QAAQ,SAAS,WAAW,MAAM;AACpE,YAAU;AACV,YAAU;AACV,aAAW;AACX,gBAAc;AACd,eAAa;AACf,CAAC;AAKD,IAAM,SAAS;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AAAA,EACb,KAAK,QAAQ;AAAA;AACf;AAGA,IAAI,YAAY;AAEhB,IAAI;AAGJ,SAAS,OAAa;AACpB,MAAI,CAAE;AAAS,WAAO,cAAc,SAAS;AAC7C,MAAI,CAAE;AAAU,WAAO,cAAc,SAAS;AAE9C,QAAM,QAAQ,aAAa;AAC3B,MAAI,CAAE,MAAM;AAAQ;AAEpB,QAAM,MAAM,GAAG,SAAS,aAAa,GAAG;AACxC,QAAM,QAAQ,MAAM,IAAI,CAACA,UAAS,GAAGA,KAAI,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAE3D,QAAM,OAAO,MAAM,SAAS,IAAI,UAAU;AAE1C,cAAa,EAAG,YAAa,OAAO;AAEpC,UAAQ,MAAM,GAAG,aAAa,OAAO,OAAO,SAAS,cAAc,MAAM,UAAU,SAAS,KAAK,KAAK,GAAG;AAC3G;AAGO,SAAS,eAAqB;AACnC,MAAI;AAAW,kBAAc,SAAS;AACtC,MAAI,WAAW;AAAU,gBAAY,YAAY,MAAM,GAAG,EAAE,MAAM;AACpE;",
5
5
  "names": ["task"]
6
6
  }
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Files } from './files';
2
- import type { AbsolutePath } from './paths';
3
2
  import type { Pipe } from './index';
3
+ import type { AbsolutePath } from './paths';
4
4
  /**
5
5
  * A type describing the ultimate result of a {@link Plug}, {@link Pipe} or
6
6
  * {@link Task}, that is either a {@link Files} instance or `undefined`.
@@ -36,6 +36,10 @@ export interface Task<T extends Result = Result, P extends Props = Record<string
36
36
  readonly buildFile: AbsolutePath;
37
37
  /** Invoke a task from in the context of a {@link Build} */
38
38
  invoke(state: State, taskName: string): Promise<T>;
39
+ /** Other {@link Task}s hooked _before_ this one */
40
+ readonly before: Task[];
41
+ /** Other {@link Task}s hooked _after_ this one */
42
+ readonly after: Task[];
39
43
  }
40
44
  /**
41
45
  * The {@link TaskResult} type identifies _what_ can be returned by a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plugjs/plug",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "commonjs",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
package/src/build.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  import { assert } from './asserts'
2
2
  import { runAsync } from './async'
3
- import { $ms, $p, $t, getLogger, log, logOptions } from './logging'
3
+ import { $ms, $p, $t, getLogger, logOptions } from './logging'
4
4
  import { Context, ContextPromises, PipeImpl } from './pipe'
5
5
  import { findCaller } from './utils/caller'
6
- import { parseOptions } from './utils/options'
7
6
 
8
7
  import type { Pipe } from './index'
9
8
  import type { AbsolutePath } from './paths'
@@ -40,7 +39,7 @@ function makeTask(
40
39
  _name: string,
41
40
  ): Task {
42
41
  /* Invoke the task, checking call stack, caches, and merging builds */
43
- function invoke(state: State, taskName: string): Promise<Result> {
42
+ async function invoke(state: State, taskName: string): Promise<Result> {
44
43
  assert(! state.stack.includes(task), `Recursion detected calling ${$t(taskName)}`)
45
44
 
46
45
  /* Check cache */
@@ -52,6 +51,7 @@ function makeTask(
52
51
  const tasks: Record<string, Task> = Object.assign({}, task.tasks, state.tasks)
53
52
  const stack = [ ...state.stack, task ]
54
53
  const cache = state.cache
54
+ state = { stack, cache, tasks, props }
55
55
 
56
56
  /* Create run context and build */
57
57
  const context = new Context(task.buildFile, taskName)
@@ -62,7 +62,6 @@ function makeTask(
62
62
  // Tasks first, props might come also from environment
63
63
  if (name in tasks) {
64
64
  return (): Pipe => {
65
- const state = { stack, cache, tasks, props }
66
65
  const promise = tasks[name]!.invoke(state, name)
67
66
  return new PipeImpl(context, promise)
68
67
  }
@@ -72,6 +71,9 @@ function makeTask(
72
71
  },
73
72
  })
74
73
 
74
+ /* Run all tasks hooked _before_ this one */
75
+ for (const before of task.before) await before.invoke(state, before.name)
76
+
75
77
  /* Some logging */
76
78
  context.log.info('Running...')
77
79
  const now = Date.now()
@@ -79,13 +81,18 @@ function makeTask(
79
81
  /* Run asynchronously in an asynchronous context */
80
82
  const promise = runAsync(context, taskName, async () => {
81
83
  return await _def.call(build) || undefined
82
- }).then((result) => {
84
+ }).then(async (result) => {
83
85
  const level = taskName.startsWith('_') ? 'info' : 'notice'
84
86
  context.log[level](`Success ${$ms(Date.now() - now)}`)
85
87
  return result
86
88
  }).catch((error) => {
87
89
  throw context.log.fail(`Failure ${$ms(Date.now() - now)}`, error)
88
- }).finally(() => ContextPromises.wait(context))
90
+ }).finally(async () => {
91
+ await ContextPromises.wait(context)
92
+ }).then(async (result) => {
93
+ for (const after of task.after) await after.invoke(state, after.name)
94
+ return result
95
+ })
89
96
 
90
97
  /* Cache the resulting promise and return it */
91
98
  cache.set(task, promise)
@@ -101,7 +108,7 @@ function makeTask(
101
108
  tasks: tasks,
102
109
  }
103
110
  return invoke(state, _name)
104
- }, { buildFile, tasks, props, invoke })
111
+ }, { buildFile, tasks, props, invoke, before: [], after: [] })
105
112
 
106
113
  /* Assign the task's marker and name and return it */
107
114
  Object.defineProperty(task, taskMarker, { value: true })
@@ -113,7 +120,12 @@ function makeTask(
113
120
  * BUILD COMPILER *
114
121
  * ========================================================================== */
115
122
 
116
- /** Symbol indicating that an object is a {@link Build} */
123
+ /**
124
+ * Symbol indicating that an object is a {@link Build}.
125
+ *
126
+ * In a compiled {@link Build} this symbol will be associated with a function
127
+ * taking an array of strings (task names) and record of props to override
128
+ */
117
129
  const buildMarker = Symbol.for('plugjs:isBuild')
118
130
 
119
131
  /** Compile a {@link BuildDef | build definition} into a {@link Build} */
@@ -143,7 +155,7 @@ export function build<
143
155
  }
144
156
 
145
157
  /* Create the "call" function for this build */
146
- const invoke: InvokeBuild = async function invoke(
158
+ const invoke = async function invoke(
147
159
  taskNames: string[],
148
160
  overrideProps: Record<string, string | undefined> = {},
149
161
  ): Promise<void> {
@@ -183,24 +195,42 @@ export function build<
183
195
  return compiled
184
196
  }
185
197
 
186
- /** Internal type describing the build invocation function */
187
- type InvokeBuild = (tasks: string[], props?: Record<string, string | undefined>) => Promise<void>
188
-
189
- /** Serially invoke tasks in a {@link Build} optionally overriding properties */
190
- export async function invoke(
191
- build: Build,
192
- ...args:
193
- | [ ...taskNames: [ string, ...string[] ] ]
194
- | [ ...taskNames: [ string, ...string[] ], options: Record<string, string | undefined> ]
195
- ): Promise<void> {
196
- const { params: tasks, options: props } = parseOptions(args, {})
198
+ /* ========================================================================== *
199
+ * HOOKS *
200
+ * ========================================================================== */
197
201
 
198
- /* Get the calling function from the sneaked-in property in build */
199
- const invoke: InvokeBuild = (build as any)[buildMarker]
202
+ type TaskNames<B extends Build> = keyof {
203
+ [ name in keyof B as B[name] extends Task ? name : never ] : any
204
+ }
200
205
 
201
- /* Triple check that we actually _have_ a function (no asserts here, log!) */
202
- if (typeof invoke !== 'function') log.fail('Unknown build type')
206
+ export function hookBefore<B extends Build, T extends keyof B>(
207
+ build: B,
208
+ taskName: string & T & TaskNames<B>,
209
+ hooks: (string & Exclude<TaskNames<B>, T>)[],
210
+ ): void {
211
+ const task = build[taskName]
212
+ assert(isTask(task), `Task "${$t(taskName)}" not found in build`)
213
+
214
+ for (const hook of hooks) {
215
+ const beforeHook = build[hook]
216
+ assert(isTask(beforeHook), `Task "${$t(hook)}" to hook before "${$t(taskName)}" not found in build`)
217
+ if (task.before.includes(beforeHook)) continue
218
+ task.before.push(beforeHook)
219
+ }
220
+ }
203
221
 
204
- /* Call everyhin that needs to be called */
205
- return await invoke(tasks, props)
222
+ export function hookAfter<B extends Build, T extends keyof B>(
223
+ build: B,
224
+ taskName: string & T & TaskNames<B>,
225
+ hooks: (string & Exclude<TaskNames<B>, T>)[],
226
+ ): void {
227
+ const task = build[taskName]
228
+ assert(isTask(task), `Task "${$t(taskName)}" not found in build`)
229
+
230
+ for (const hook of hooks) {
231
+ const afterHook = build[hook]
232
+ assert(isTask(afterHook), `Task "${$t(hook)}" to hook after "${$t(taskName)}" not found in build`)
233
+ if (task.after.includes(afterHook)) continue
234
+ task.after.push(afterHook)
235
+ }
206
236
  }
package/src/index.ts CHANGED
@@ -13,6 +13,9 @@ export type { Plug, PlugFunction } from './pipe'
13
13
  /**
14
14
  * The {@link Pipe} interface defines a processing pipeline where multiple
15
15
  * {@link Plug}s can transform lists of {@link Files}.
16
+ *
17
+ * This is exported _here_, in the main module export file so that plugs can
18
+ * add definitions by simply referring the module.
16
19
  */
17
20
  export interface Pipe extends Promise<Files> {
18
21
  plug(plug: Plug<Files>): Pipe
@@ -1,3 +1,5 @@
1
+ /* coverage ignore file */
2
+
1
3
  import { runningTasks } from '../async'
2
4
  import { $cyn, $gry, $t } from './colors'
3
5
  import { logOptions } from './options'
package/src/types.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Files } from './files'
2
- import type { AbsolutePath } from './paths'
3
2
  import type { Pipe } from './index'
3
+ import type { AbsolutePath } from './paths'
4
4
 
5
5
  /**
6
6
  * A type describing the ultimate result of a {@link Plug}, {@link Pipe} or
@@ -47,6 +47,10 @@ export interface Task<T extends Result = Result, P extends Props = Record<string
47
47
  readonly buildFile: AbsolutePath,
48
48
  /** Invoke a task from in the context of a {@link Build} */
49
49
  invoke(state: State, taskName: string): Promise<T>
50
+ /** Other {@link Task}s hooked _before_ this one */
51
+ readonly before: Task[]
52
+ /** Other {@link Task}s hooked _after_ this one */
53
+ readonly after: Task[]
50
54
  }
51
55
 
52
56
  /**