@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 +42 -18
- package/dist/build.cjs.map +2 -2
- package/dist/build.d.ts +7 -3
- package/dist/build.mjs +41 -18
- package/dist/build.mjs.map +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.mjs.map +1 -1
- package/dist/logging/spinner.cjs.map +1 -1
- package/dist/logging/spinner.mjs.map +1 -1
- package/dist/types.d.ts +5 -1
- package/package.json +1 -1
- package/src/build.ts +56 -26
- package/src/index.ts +3 -0
- package/src/logging/spinner.ts +2 -0
- package/src/types.ts +5 -1
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
|
-
|
|
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
|
|
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
|
|
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(() =>
|
|
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
|
|
83
|
-
}, { buildFile, tasks, props, invoke:
|
|
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
|
|
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:
|
|
137
|
+
Object.defineProperty(compiled, buildMarker, { value: invoke });
|
|
130
138
|
return compiled;
|
|
131
139
|
}
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
165
|
+
hookAfter,
|
|
166
|
+
hookBefore
|
|
143
167
|
});
|
|
144
168
|
//# sourceMappingURL=build.cjs.map
|
package/dist/build.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/build.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAuB;AACvB,mBAAyB;AACzB,
|
|
5
|
-
"names": ["
|
|
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
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
|
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
|
|
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(() =>
|
|
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
|
|
58
|
-
}, { buildFile, tasks, props, invoke:
|
|
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
|
|
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:
|
|
111
|
+
Object.defineProperty(compiled, buildMarker, { value: invoke });
|
|
105
112
|
return compiled;
|
|
106
113
|
}
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
138
|
+
hookAfter,
|
|
139
|
+
hookBefore
|
|
117
140
|
};
|
|
118
141
|
//# sourceMappingURL=build.mjs.map
|
package/dist/build.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/build.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,KAAK,IAAI,IAAI,WAAW,
|
|
5
|
-
"names": ["
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["props", "tasks", "build", "promise", "invoke"]
|
|
6
6
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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;
|
|
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;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": ";AAQA,SAAS,aAAa;
|
|
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;
|
|
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": ";
|
|
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
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,
|
|
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(() =>
|
|
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
|
-
/**
|
|
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
|
|
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
|
-
|
|
187
|
-
|
|
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
|
-
|
|
199
|
-
|
|
202
|
+
type TaskNames<B extends Build> = keyof {
|
|
203
|
+
[ name in keyof B as B[name] extends Task ? name : never ] : any
|
|
204
|
+
}
|
|
200
205
|
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
205
|
-
|
|
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
|
package/src/logging/spinner.ts
CHANGED
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
|
/**
|