@bluelibs/runner 3.2.0 → 3.3.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 (62) hide show
  1. package/README.md +482 -34
  2. package/dist/cli/extract-docs.d.ts +2 -0
  3. package/dist/cli/extract-docs.js +88 -0
  4. package/dist/cli/extract-docs.js.map +1 -0
  5. package/dist/define.d.ts +21 -1
  6. package/dist/define.js +71 -0
  7. package/dist/define.js.map +1 -1
  8. package/dist/defs.d.ts +163 -4
  9. package/dist/defs.js +30 -0
  10. package/dist/defs.js.map +1 -1
  11. package/dist/docs/introspect.d.ts +7 -0
  12. package/dist/docs/introspect.js +199 -0
  13. package/dist/docs/introspect.js.map +1 -0
  14. package/dist/docs/markdown.d.ts +2 -0
  15. package/dist/docs/markdown.js +148 -0
  16. package/dist/docs/markdown.js.map +1 -0
  17. package/dist/docs/model.d.ts +62 -0
  18. package/dist/docs/model.js +33 -0
  19. package/dist/docs/model.js.map +1 -0
  20. package/dist/express/docsRouter.d.ts +12 -0
  21. package/dist/express/docsRouter.js +54 -0
  22. package/dist/express/docsRouter.js.map +1 -0
  23. package/dist/globals/globalMiddleware.d.ts +1 -0
  24. package/dist/globals/globalMiddleware.js +2 -0
  25. package/dist/globals/globalMiddleware.js.map +1 -1
  26. package/dist/globals/middleware/timeout.middleware.d.ts +8 -0
  27. package/dist/globals/middleware/timeout.middleware.js +35 -0
  28. package/dist/globals/middleware/timeout.middleware.js.map +1 -0
  29. package/dist/index.d.ts +4 -2
  30. package/dist/index.js +5 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/models/DependencyProcessor.js +2 -2
  33. package/dist/models/DependencyProcessor.js.map +1 -1
  34. package/dist/models/Store.d.ts +1 -1
  35. package/dist/models/StoreConstants.d.ts +1 -1
  36. package/dist/models/StoreConstants.js +2 -1
  37. package/dist/models/StoreConstants.js.map +1 -1
  38. package/dist/models/TaskRunner.d.ts +2 -3
  39. package/dist/models/TaskRunner.js +1 -2
  40. package/dist/models/TaskRunner.js.map +1 -1
  41. package/dist/testing.d.ts +24 -0
  42. package/dist/testing.js +41 -0
  43. package/dist/testing.js.map +1 -0
  44. package/package.json +4 -4
  45. package/src/__tests__/benchmark/task-benchmark.test.ts +132 -0
  46. package/src/__tests__/createTestResource.test.ts +139 -0
  47. package/src/__tests__/globals/timeout.middleware.test.ts +88 -0
  48. package/src/__tests__/models/Semaphore.test.ts +1 -1
  49. package/src/__tests__/override.test.ts +104 -0
  50. package/src/__tests__/run.overrides.test.ts +50 -21
  51. package/src/__tests__/run.test.ts +19 -0
  52. package/src/__tests__/tags.test.ts +396 -0
  53. package/src/__tests__/typesafety.test.ts +109 -1
  54. package/src/define.ts +97 -0
  55. package/src/defs.ts +168 -8
  56. package/src/globals/globalMiddleware.ts +2 -0
  57. package/src/globals/middleware/timeout.middleware.ts +46 -0
  58. package/src/index.ts +6 -0
  59. package/src/models/DependencyProcessor.ts +2 -10
  60. package/src/models/StoreConstants.ts +2 -1
  61. package/src/models/TaskRunner.ts +1 -3
  62. package/src/testing.ts +66 -0
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.introspectResource = introspectResource;
4
+ const EventManager_1 = require("../models/EventManager");
5
+ const Logger_1 = require("../models/Logger");
6
+ const Store_1 = require("../models/Store");
7
+ const defs_1 = require("../defs");
8
+ const model_1 = require("./model");
9
+ async function introspectResource(root, config = {}, options = {}) {
10
+ const includeGlobals = options.includeGlobals ?? false;
11
+ // Build a Store but do not compute dependencies or initialize root.
12
+ const eventManager = new EventManager_1.EventManager();
13
+ const logger = new Logger_1.Logger(eventManager);
14
+ const store = new Store_1.Store(eventManager, logger);
15
+ // Only registration phase, with overrides processed, but no init.
16
+ store.initializeStore(root, config);
17
+ store.processOverrides();
18
+ const nodes = [];
19
+ const edges = [];
20
+ // Helpers
21
+ const shouldInclude = (id) => {
22
+ const str = (0, model_1.normalizeId)(id);
23
+ if (includeGlobals)
24
+ return true;
25
+ return !str.startsWith("globals.");
26
+ };
27
+ // Resources
28
+ for (const res of store.resources.values()) {
29
+ if (!shouldInclude(res.resource.id))
30
+ continue;
31
+ nodes.push({
32
+ ...(0, model_1.buildBaseNode)("resource", res.resource.id, res.resource[defs_1.symbols.filePath], res.resource.meta),
33
+ });
34
+ const regItems = Array.isArray(res.resource.register)
35
+ ? res.resource.register
36
+ : [];
37
+ for (const item of regItems) {
38
+ const targetId = item.id || item?.resource?.id;
39
+ if (!targetId || !shouldInclude(targetId))
40
+ continue;
41
+ edges.push({
42
+ type: "registers",
43
+ from: (0, model_1.normalizeId)(res.resource.id),
44
+ to: (0, model_1.normalizeId)(targetId),
45
+ });
46
+ }
47
+ // Resource dependencies
48
+ const deps = (res.resource.dependencies || {});
49
+ for (const depKey of Object.keys(deps)) {
50
+ const dep = deps[depKey];
51
+ const depId = dep?.id;
52
+ if (!depId || !shouldInclude(depId))
53
+ continue;
54
+ edges.push({
55
+ type: "dependsOn",
56
+ from: (0, model_1.normalizeId)(res.resource.id),
57
+ to: (0, model_1.normalizeId)(depId),
58
+ meta: { key: depKey },
59
+ });
60
+ }
61
+ // Resource middleware
62
+ for (const mw of res.resource.middleware || []) {
63
+ const mwId = mw.id;
64
+ if (!mwId || !shouldInclude(mwId))
65
+ continue;
66
+ edges.push({
67
+ type: "middleware",
68
+ from: (0, model_1.normalizeId)(res.resource.id),
69
+ to: (0, model_1.normalizeId)(mwId),
70
+ meta: { scope: "resource" },
71
+ });
72
+ }
73
+ }
74
+ // Tasks
75
+ for (const t of store.tasks.values()) {
76
+ if (!shouldInclude(t.task.id))
77
+ continue;
78
+ nodes.push({
79
+ ...(0, model_1.buildBaseNode)("task", t.task.id, t.task[defs_1.symbols.filePath], t.task.meta),
80
+ on: t.task.on
81
+ ? t.task.on === "*"
82
+ ? "*"
83
+ : (0, model_1.normalizeId)(t.task.on.id)
84
+ : undefined,
85
+ listenerOrder: t.task.listenerOrder,
86
+ });
87
+ // Dependencies
88
+ const deps = (t.task.dependencies || {});
89
+ for (const depKey of Object.keys(deps)) {
90
+ const dep = deps[depKey];
91
+ const depId = dep?.id;
92
+ if (!depId || !shouldInclude(depId))
93
+ continue;
94
+ edges.push({
95
+ type: "dependsOn",
96
+ from: (0, model_1.normalizeId)(t.task.id),
97
+ to: (0, model_1.normalizeId)(depId),
98
+ meta: { key: depKey },
99
+ });
100
+ }
101
+ // Middleware
102
+ for (const mw of t.task.middleware || []) {
103
+ const mwId = mw.id;
104
+ if (!mwId || !shouldInclude(mwId))
105
+ continue;
106
+ edges.push({
107
+ type: "middleware",
108
+ from: (0, model_1.normalizeId)(t.task.id),
109
+ to: (0, model_1.normalizeId)(mwId),
110
+ meta: { scope: "task" },
111
+ });
112
+ }
113
+ // Listeners
114
+ if (t.task.on && t.task.on !== "*") {
115
+ const eventId = t.task.on.id;
116
+ if (shouldInclude(eventId)) {
117
+ edges.push({
118
+ type: "listensTo",
119
+ from: (0, model_1.normalizeId)(t.task.id),
120
+ to: (0, model_1.normalizeId)(eventId),
121
+ });
122
+ }
123
+ }
124
+ }
125
+ // Events (registered globally + lifecycle + custom)
126
+ for (const e of store.events.values()) {
127
+ const eventId = e.event.id;
128
+ if (!eventId)
129
+ continue;
130
+ if (!shouldInclude(eventId))
131
+ continue;
132
+ nodes.push({
133
+ ...(0, model_1.buildBaseNode)("event", eventId, e.event[defs_1.symbols.filePath], e.event.meta),
134
+ });
135
+ }
136
+ // Middleware nodes
137
+ for (const mw of store.middlewares.values()) {
138
+ if (!shouldInclude(mw.middleware.id))
139
+ continue;
140
+ nodes.push({
141
+ ...(0, model_1.buildBaseNode)("middleware", mw.middleware.id, mw.middleware[defs_1.symbols.filePath], mw.middleware.meta),
142
+ everywhere: {
143
+ tasks: Boolean(mw.middleware[defs_1.symbols.middlewareEverywhereTasks]),
144
+ resources: Boolean(mw.middleware[defs_1.symbols.middlewareEverywhereResources]),
145
+ },
146
+ });
147
+ // Dependencies of middleware
148
+ const deps = (mw.middleware.dependencies || {});
149
+ for (const depKey of Object.keys(deps)) {
150
+ const dep = deps[depKey];
151
+ const depId = dep?.id;
152
+ if (!depId || !shouldInclude(depId))
153
+ continue;
154
+ edges.push({
155
+ type: "dependsOn",
156
+ from: (0, model_1.normalizeId)(mw.middleware.id),
157
+ to: (0, model_1.normalizeId)(depId),
158
+ meta: { key: depKey },
159
+ });
160
+ }
161
+ }
162
+ // Override requests and overrides mapping
163
+ for (const req of store.overrideRequests) {
164
+ const source = req.source;
165
+ const targetId = req.override?.id || req.override?.resource?.id;
166
+ if (targetId && shouldInclude(source) && shouldInclude(targetId)) {
167
+ edges.push({
168
+ type: "overrideRequest",
169
+ from: (0, model_1.normalizeId)(source),
170
+ to: (0, model_1.normalizeId)(targetId),
171
+ });
172
+ }
173
+ }
174
+ for (const [id, ov] of store.overrides) {
175
+ if (!shouldInclude(id))
176
+ continue;
177
+ edges.push({
178
+ type: "overrides",
179
+ from: (0, model_1.normalizeId)(ov.id || ov?.resource?.id),
180
+ to: (0, model_1.normalizeId)(id),
181
+ });
182
+ }
183
+ const graph = {
184
+ version: 1,
185
+ summary: {
186
+ counts: {
187
+ resources: nodes.filter((n) => n.kind === "resource").length,
188
+ tasks: nodes.filter((n) => n.kind === "task").length,
189
+ events: nodes.filter((n) => n.kind === "event").length,
190
+ middleware: nodes.filter((n) => n.kind === "middleware").length,
191
+ edges: edges.length,
192
+ },
193
+ },
194
+ nodes,
195
+ edges,
196
+ };
197
+ return graph;
198
+ }
199
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/docs/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { DocsGraph } from "./model";
2
+ export declare function renderMarkdown(graph: DocsGraph, outDir: string): void;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMarkdown = renderMarkdown;
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ function ensureDir(dir) {
7
+ fs.mkdirSync(dir, { recursive: true });
8
+ }
9
+ function escapeMd(s) {
10
+ if (!s)
11
+ return "";
12
+ return String(s).replace(/\|/g, "\\|");
13
+ }
14
+ function kinds(nodes) {
15
+ return {
16
+ resources: nodes.filter((n) => n.kind === "resource"),
17
+ tasks: nodes.filter((n) => n.kind === "task"),
18
+ events: nodes.filter((n) => n.kind === "event"),
19
+ middleware: nodes.filter((n) => n.kind === "middleware"),
20
+ };
21
+ }
22
+ function slugifyId(id) {
23
+ return id
24
+ .replace(/Symbol\(([^)]*)\)/g, "$1")
25
+ .replace(/[^a-zA-Z0-9._-]+/g, "-")
26
+ .replace(/-+/g, "-")
27
+ .replace(/^-|-$|\.$/g, "");
28
+ }
29
+ function kindDir(kind) {
30
+ if (kind === "resource")
31
+ return "resources";
32
+ if (kind === "task")
33
+ return "tasks";
34
+ if (kind === "event")
35
+ return "events";
36
+ return "middleware";
37
+ }
38
+ function renderTable(nodes) {
39
+ if (nodes.length === 0)
40
+ return "_None_\n";
41
+ let out = "| ID | Title | Description | File | Tags |\n| --- | --- | --- | --- | --- |\n";
42
+ for (const n of nodes) {
43
+ const tags = Array.isArray(n.tags)
44
+ ? n.tags
45
+ .map((t) => (typeof t === "string" ? t : t?.id ?? "[tag]"))
46
+ .join(", ")
47
+ : "";
48
+ const link = `${kindDir(n.kind)}/${slugifyId(n.id)}.md`;
49
+ out += `| [${escapeMd(n.id)}](${link}) | ${escapeMd(n.title)} | ${escapeMd(n.description)} | ${escapeMd(n.file)} | ${escapeMd(tags)} |\n`;
50
+ }
51
+ return out + "\n";
52
+ }
53
+ function renderMarkdown(graph, outDir) {
54
+ ensureDir(outDir);
55
+ ensureDir(path.join(outDir, "resources"));
56
+ ensureDir(path.join(outDir, "tasks"));
57
+ ensureDir(path.join(outDir, "events"));
58
+ ensureDir(path.join(outDir, "middleware"));
59
+ const idx = [
60
+ `# Project Book`,
61
+ ``,
62
+ `This document was generated from your Runner definitions.`,
63
+ ``,
64
+ `## Summary`,
65
+ `- Resources: ${graph.summary.counts.resources}`,
66
+ `- Tasks: ${graph.summary.counts.tasks}`,
67
+ `- Events: ${graph.summary.counts.events}`,
68
+ `- Middleware: ${graph.summary.counts.middleware}`,
69
+ `- Edges: ${graph.summary.counts.edges}`,
70
+ ``,
71
+ `## Table of Contents`,
72
+ `- [Resources](#resources)`,
73
+ `- [Tasks](#tasks)`,
74
+ `- [Events](#events)`,
75
+ `- [Middleware](#middleware)`,
76
+ `- [Namespaces](#namespaces)`,
77
+ ``,
78
+ ];
79
+ const grouped = kinds(graph.nodes);
80
+ idx.push("## Resources\n\n" + renderTable(grouped.resources));
81
+ idx.push("## Tasks\n\n" + renderTable(grouped.tasks));
82
+ idx.push("## Events\n\n" + renderTable(grouped.events));
83
+ idx.push("## Middleware\n\n" + renderTable(grouped.middleware));
84
+ // Namespaces section
85
+ const byNs = new Map();
86
+ for (const n of graph.nodes) {
87
+ const ns = n.namespace || "(none)";
88
+ const list = byNs.get(ns) || [];
89
+ list.push(n);
90
+ byNs.set(ns, list);
91
+ }
92
+ idx.push("## Namespaces\n");
93
+ for (const [ns, list] of Array.from(byNs.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {
94
+ const counts = kinds(list);
95
+ idx.push(`### ${ns}\n- resources: ${counts.resources.length}\n- tasks: ${counts.tasks.length}\n- events: ${counts.events.length}\n- middleware: ${counts.middleware.length}\n`);
96
+ }
97
+ const readme = idx.join("\n");
98
+ fs.writeFileSync(path.join(outDir, "index.md"), readme, "utf-8");
99
+ fs.writeFileSync(path.join(outDir, "README.md"), readme, "utf-8");
100
+ // Build reverse edge index for dependents
101
+ const incoming = new Map();
102
+ for (const e of graph.edges) {
103
+ const list = incoming.get(e.to) || [];
104
+ list.push({ type: e.type, from: e.from, meta: e.meta });
105
+ incoming.set(e.to, list);
106
+ }
107
+ // Detail pages
108
+ for (const n of graph.nodes) {
109
+ const header = [
110
+ `# ${n.id}`,
111
+ "",
112
+ n.title ? `> ${n.title}` : "",
113
+ n.description ? `\n${n.description}\n` : "",
114
+ ];
115
+ const file = n.file
116
+ ? `- File: \
117
+ \`${n.file}\``
118
+ : "";
119
+ const tags = Array.isArray(n.tags)
120
+ ? n.tags
121
+ .map((t) => typeof t === "string" ? `\`${t}\`` : `\`${t?.id}\``)
122
+ .join(" ")
123
+ : "";
124
+ const edgesOut = graph.edges.filter((e) => e.from === n.id);
125
+ const edgesIn = incoming.get(n.id) || [];
126
+ const sect = [
127
+ ...header,
128
+ "",
129
+ file,
130
+ tags ? `- Tags: ${tags}` : "",
131
+ "",
132
+ "## Outgoing",
133
+ edgesOut.length ? "" : "_None_",
134
+ ...edgesOut.map((e) => `- ${e.type} → \
135
+ \`${e.to}\`${e.meta ? ` (${JSON.stringify(e.meta)})` : ""}`),
136
+ "",
137
+ "## Incoming",
138
+ edgesIn.length ? "" : "_None_",
139
+ ...edgesIn.map((e) => `- ${e.type} ← \
140
+ \`${e.from}\`${e.meta ? ` (${JSON.stringify(e.meta)})` : ""}`),
141
+ "",
142
+ "[Back to index](../index.md)",
143
+ ].filter(Boolean);
144
+ const dir = path.join(outDir, kindDir(n.kind));
145
+ fs.writeFileSync(path.join(dir, `${slugifyId(n.id)}.md`), sect.join("\n"), "utf-8");
146
+ }
147
+ }
148
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/docs/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export type NormalizedId = string;
2
+ export type NodeKind = "resource" | "task" | "event" | "middleware";
3
+ export type BaseNode = {
4
+ id: NormalizedId;
5
+ kind: NodeKind;
6
+ file?: string;
7
+ title?: string;
8
+ description?: string;
9
+ tags?: any[];
10
+ namespace?: string;
11
+ };
12
+ export type ResourceNode = BaseNode & {
13
+ kind: "resource";
14
+ };
15
+ export type TaskNode = BaseNode & {
16
+ kind: "task";
17
+ on?: NormalizedId | "*";
18
+ listenerOrder?: number;
19
+ };
20
+ export type EventNode = BaseNode & {
21
+ kind: "event";
22
+ };
23
+ export type MiddlewareNode = BaseNode & {
24
+ kind: "middleware";
25
+ everywhere?: {
26
+ tasks: boolean;
27
+ resources: boolean;
28
+ };
29
+ };
30
+ export type GraphNode = ResourceNode | TaskNode | EventNode | MiddlewareNode;
31
+ export type EdgeType = "registers" | "dependsOn" | "listensTo" | "middleware" | "overrideRequest" | "overrides";
32
+ export type GraphEdge = {
33
+ type: EdgeType;
34
+ from: NormalizedId;
35
+ to: NormalizedId;
36
+ meta?: Record<string, any>;
37
+ };
38
+ export type DocsGraph = {
39
+ version: 1;
40
+ summary: {
41
+ counts: {
42
+ resources: number;
43
+ tasks: number;
44
+ events: number;
45
+ middleware: number;
46
+ edges: number;
47
+ };
48
+ };
49
+ nodes: GraphNode[];
50
+ edges: GraphEdge[];
51
+ packages?: {
52
+ name: string;
53
+ root?: string;
54
+ }[];
55
+ };
56
+ export declare function guessNamespaceFromId(id: string): string | undefined;
57
+ export declare function normalizeId(id: string | symbol): NormalizedId;
58
+ export declare function buildBaseNode(kind: NodeKind, id: string | symbol, file: string | undefined, meta: {
59
+ title?: string;
60
+ description?: string;
61
+ tags?: any[];
62
+ } | undefined): BaseNode;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.guessNamespaceFromId = guessNamespaceFromId;
4
+ exports.normalizeId = normalizeId;
5
+ exports.buildBaseNode = buildBaseNode;
6
+ function guessNamespaceFromId(id) {
7
+ if (!id)
8
+ return undefined;
9
+ const parts = id.split(".");
10
+ if (parts.length < 2)
11
+ return parts[0] || undefined;
12
+ // Heuristic: first two segments, eg: "app.tasks"
13
+ return parts.slice(0, 2).join(".");
14
+ }
15
+ function normalizeId(id) {
16
+ if (typeof id === "string")
17
+ return id;
18
+ const s = id.toString?.() || String(id);
19
+ return s;
20
+ }
21
+ function buildBaseNode(kind, id, file, meta) {
22
+ const normId = normalizeId(id);
23
+ return {
24
+ id: normId,
25
+ kind,
26
+ file,
27
+ title: meta?.title,
28
+ description: meta?.description,
29
+ tags: meta?.tags,
30
+ namespace: typeof id === "string" ? guessNamespaceFromId(id) : undefined,
31
+ };
32
+ }
33
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/docs/model.ts"],"names":[],"mappings":";;AAuEA,oDAMC;AAED,kCAIC;AAED,sCAgBC;AA9BD,SAAgB,oBAAoB,CAAC,EAAU;IAC7C,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACnD,iDAAiD;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,WAAW,CAAC,EAAmB;IAC7C,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,CAAC,GAAI,EAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,aAAa,CAC3B,IAAc,EACd,EAAmB,EACnB,IAAwB,EACxB,IAAwE;IAExE,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO;QACL,EAAE,EAAE,MAAM;QACV,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,IAAI,EAAE,KAAK;QAClB,WAAW,EAAE,IAAI,EAAE,WAAW;QAC9B,IAAI,EAAE,IAAI,EAAE,IAAI;QAChB,SAAS,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Router } from "express";
2
+ import type { IResource } from "../defs";
3
+ type DocsRouterOptions = {
4
+ getRoot: () => {
5
+ resource: IResource<any, any, any, any>;
6
+ config?: any;
7
+ };
8
+ includeGlobals?: boolean;
9
+ enabled?: boolean | (() => boolean);
10
+ };
11
+ export declare function createDocsRouter(options: DocsRouterOptions): Router;
12
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDocsRouter = createDocsRouter;
4
+ const express_1 = require("express");
5
+ const introspect_1 = require("../docs/introspect");
6
+ function createDocsRouter(options) {
7
+ const router = express_1.default.Router();
8
+ const isEnabled = () => {
9
+ if (typeof options.enabled === "function")
10
+ return options.enabled();
11
+ if (typeof options.enabled === "boolean")
12
+ return options.enabled;
13
+ return process.env.RUNNER_DOCS === "1";
14
+ };
15
+ router.get("/docs.json", async (req, res) => {
16
+ if (!isEnabled())
17
+ return res.status(404).end();
18
+ const { resource, config } = options.getRoot();
19
+ const graph = await (0, introspect_1.introspectResource)(resource, config ?? {}, {
20
+ includeGlobals: options.includeGlobals,
21
+ });
22
+ res.json(graph);
23
+ });
24
+ router.get("/docs", (req, res) => {
25
+ if (!isEnabled())
26
+ return res.status(404).end();
27
+ res.setHeader("content-type", "text/html");
28
+ res.end(`<!doctype html>
29
+ <html>
30
+ <head>
31
+ <meta charset="utf-8" />
32
+ <title>Runner Docs</title>
33
+ <style>
34
+ body { font-family: -apple-system, Segoe UI, Roboto, sans-serif; margin: 2rem; }
35
+ pre { background: #f6f8fa; padding: 1rem; overflow: auto; }
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <h1>Runner Docs</h1>
40
+ <p>This is a minimal viewer. Fetching <code>/docs.json</code> below:</p>
41
+ <pre id="out">Loading...</pre>
42
+ <script>
43
+ fetch('./docs.json').then(r=>r.json()).then(g=>{
44
+ document.getElementById('out').textContent = JSON.stringify(g, null, 2);
45
+ }).catch(e=>{
46
+ document.getElementById('out').textContent = String(e);
47
+ });
48
+ </script>
49
+ </body>
50
+ </html>`);
51
+ });
52
+ return router;
53
+ }
54
+ //# sourceMappingURL=docsRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docsRouter.js","sourceRoot":"","sources":["../../src/express/docsRouter.ts"],"names":[],"mappings":";;AAUA,4CA8CC;AAxDD,qCAA0C;AAC1C,mDAAwD;AASxD,SAAgB,gBAAgB,CAAC,OAA0B;IACzD,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACpE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC;QACjE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAkB,EAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE;YAC7D,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/B,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;UAsBF,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -20,4 +20,5 @@ export declare const globalMiddlewares: {
20
20
  cacheFactoryTask: import("../defs").ITask<any, Promise<import("./middleware/cache.middleware").ICacheInstance>, any, undefined>;
21
21
  }, any>;
22
22
  }>;
23
+ timeout: import("../defs").IMiddleware<import("./middleware/timeout.middleware").TimeoutMiddlewareConfig, import("../defs").DependencyMapType>;
23
24
  };
@@ -4,6 +4,7 @@ exports.globalMiddlewares = void 0;
4
4
  const cache_middleware_1 = require("./middleware/cache.middleware");
5
5
  const requireContext_middleware_1 = require("./middleware/requireContext.middleware");
6
6
  const retry_middleware_1 = require("./middleware/retry.middleware");
7
+ const timeout_middleware_1 = require("./middleware/timeout.middleware");
7
8
  /**
8
9
  * Global middlewares
9
10
  */
@@ -11,5 +12,6 @@ exports.globalMiddlewares = {
11
12
  requireContext: requireContext_middleware_1.requireContextMiddleware,
12
13
  retry: retry_middleware_1.retryMiddleware,
13
14
  cache: cache_middleware_1.cacheMiddleware,
15
+ timeout: timeout_middleware_1.timeoutMiddleware,
14
16
  };
15
17
  //# sourceMappingURL=globalMiddleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"globalMiddleware.js","sourceRoot":"","sources":["../../src/globals/globalMiddleware.ts"],"names":[],"mappings":";;;AAEA,oEAAgE;AAChE,sFAAkF;AAClF,oEAAgE;AAEhE;;GAEG;AACU,QAAA,iBAAiB,GAAG;IAC/B,cAAc,EAAE,oDAAwB;IACxC,KAAK,EAAE,kCAAe;IACtB,KAAK,EAAE,kCAAe;CACvB,CAAC"}
1
+ {"version":3,"file":"globalMiddleware.js","sourceRoot":"","sources":["../../src/globals/globalMiddleware.ts"],"names":[],"mappings":";;;AAEA,oEAAgE;AAChE,sFAAkF;AAClF,oEAAgE;AAChE,wEAAoE;AAEpE;;GAEG;AACU,QAAA,iBAAiB,GAAG;IAC/B,cAAc,EAAE,oDAAwB;IACxC,KAAK,EAAE,kCAAe;IACtB,KAAK,EAAE,kCAAe;IACtB,OAAO,EAAE,sCAAiB;CAC3B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface TimeoutMiddlewareConfig {
2
+ /**
3
+ * Maximum time in milliseconds before the wrapped operation is aborted
4
+ * and a timeout error is thrown. Defaults to 5000ms.
5
+ */
6
+ ttl: number;
7
+ }
8
+ export declare const timeoutMiddleware: import("../../defs").IMiddleware<TimeoutMiddlewareConfig, import("../../defs").DependencyMapType>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timeoutMiddleware = void 0;
4
+ const define_1 = require("../../define");
5
+ exports.timeoutMiddleware = (0, define_1.defineMiddleware)({
6
+ id: "globals.middleware.timeout",
7
+ async run({ task, resource, next }, _deps, config) {
8
+ const input = task ? task.input : resource?.config;
9
+ const ttl = Math.max(0, config.ttl);
10
+ const message = `Operation timed out after ${ttl}ms`;
11
+ // Fast-path: immediate timeout
12
+ if (ttl === 0) {
13
+ const error = new Error(message);
14
+ error.name = "TimeoutError";
15
+ throw error;
16
+ }
17
+ const controller = new AbortController();
18
+ // Create a timeout promise that rejects when aborted
19
+ const timeoutPromise = new Promise((_, reject) => {
20
+ const timeoutId = setTimeout(() => {
21
+ controller.abort();
22
+ const error = new Error(message);
23
+ error.name = "TimeoutError";
24
+ reject(error);
25
+ }, ttl);
26
+ // Clean up timeout if abort signal fires for other reasons
27
+ controller.signal.addEventListener("abort", () => {
28
+ clearTimeout(timeoutId);
29
+ });
30
+ });
31
+ // Race between the actual operation and the timeout
32
+ return Promise.race([next(input), timeoutPromise]);
33
+ },
34
+ });
35
+ //# sourceMappingURL=timeout.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.middleware.js","sourceRoot":"","sources":["../../../src/globals/middleware/timeout.middleware.ts"],"names":[],"mappings":";;;AAAA,yCAAgD;AAUnC,QAAA,iBAAiB,GAAG,IAAA,yBAAgB,EAAC;IAChD,EAAE,EAAE,4BAA4B;IAChC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAA+B;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,6BAA6B,GAAG,IAAI,CAAC;QAErD,+BAA+B;QAC/B,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,KAAa,CAAC,IAAI,GAAG,cAAc,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,qDAAqD;QACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,KAAa,CAAC,IAAI,GAAG,cAAc,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,EAAE,GAAG,CAAC,CAAC;YAER,2DAA2D;YAC3D,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC/C,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,oDAAoD;QACpD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACrD,CAAC;CACF,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { defineTask, defineResource, defineEvent, defineMiddleware, defineIndex } from "./define";
1
+ import { defineTask, defineResource, defineEvent, defineMiddleware, defineIndex, defineTag, defineOverride } from "./define";
2
2
  import { createContext } from "./context";
3
3
  import { run } from "./run";
4
+ import { createTestResource } from "./testing";
4
5
  declare const globals: {
5
6
  events: {
6
7
  beforeInit: import("./defs").IEvent<void>;
@@ -81,9 +82,10 @@ declare const globals: {
81
82
  cacheFactoryTask: import("./defs").ITask<any, Promise<import("./defs").ICacheInstance>, any, undefined>;
82
83
  }, any>;
83
84
  }>;
85
+ timeout: import("./defs").IMiddleware<import("./globals/middleware/timeout.middleware").TimeoutMiddlewareConfig, import("./defs").DependencyMapType>;
84
86
  };
85
87
  };
86
88
  export { globals };
87
- export { defineTask as task, defineResource as resource, defineEvent as event, defineMiddleware as middleware, defineIndex as index, run, createContext, };
89
+ export { defineTask as task, defineResource as resource, defineEvent as event, defineMiddleware as middleware, defineIndex as index, defineTag as tag, defineOverride as override, run, createContext, createTestResource, };
88
90
  export * as definitions from "./defs";
89
91
  export { Semaphore, Store, EventManager, TaskRunner, Queue } from "./models";