@bluelibs/runner 4.8.6 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -3440
- package/dist/browser/index.cjs +6586 -3478
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.mts +2890 -0
- package/dist/browser/index.d.ts +2890 -0
- package/dist/browser/index.mjs +6574 -3466
- package/dist/browser/index.mjs.map +1 -1
- package/dist/edge/index.cjs +6586 -3478
- package/dist/edge/index.cjs.map +1 -1
- package/dist/edge/index.d.mts +2890 -0
- package/dist/edge/index.d.ts +2890 -0
- package/dist/edge/index.mjs +6574 -3466
- package/dist/edge/index.mjs.map +1 -1
- package/dist/node/node.cjs +42337 -7087
- package/dist/node/node.cjs.map +1 -1
- package/dist/node/node.d.mts +4593 -0
- package/dist/node/node.d.ts +4546 -55
- package/dist/node/node.mjs +42251 -7035
- package/dist/node/node.mjs.map +1 -1
- package/dist/ui/assets/index-2cb8f39f.js +141 -0
- package/dist/ui/assets/index-b1f988bf.css +1 -0
- package/dist/ui/index.html +14 -0
- package/dist/universal/index.cjs +7109 -4003
- package/dist/universal/index.cjs.map +1 -1
- package/dist/universal/index.d.mts +2890 -0
- package/dist/universal/index.d.ts +2890 -0
- package/dist/universal/index.mjs +7102 -3996
- package/dist/universal/index.mjs.map +1 -1
- package/package.json +57 -25
- package/readmes/AI.md +534 -0
- package/AI.md +0 -454
- package/dist/define.d.ts +0 -9
- package/dist/definers/builders/asyncContext.d.ts +0 -13
- package/dist/definers/builders/core.d.ts +0 -30
- package/dist/definers/builders/error.d.ts +0 -15
- package/dist/definers/builders/event.d.ts +0 -12
- package/dist/definers/builders/hook.d.ts +0 -20
- package/dist/definers/builders/middleware.d.ts +0 -39
- package/dist/definers/builders/resource.d.ts +0 -40
- package/dist/definers/builders/tag.d.ts +0 -10
- package/dist/definers/builders/task.d.ts +0 -37
- package/dist/definers/builders/task.phantom.d.ts +0 -27
- package/dist/definers/builders/utils.d.ts +0 -4
- package/dist/definers/defineAsyncContext.d.ts +0 -15
- package/dist/definers/defineError.d.ts +0 -26
- package/dist/definers/defineEvent.d.ts +0 -2
- package/dist/definers/defineHook.d.ts +0 -6
- package/dist/definers/defineOverride.d.ts +0 -17
- package/dist/definers/defineResource.d.ts +0 -2
- package/dist/definers/defineResourceMiddleware.d.ts +0 -2
- package/dist/definers/defineTag.d.ts +0 -12
- package/dist/definers/defineTask.d.ts +0 -18
- package/dist/definers/defineTaskMiddleware.d.ts +0 -2
- package/dist/definers/tools.d.ts +0 -53
- package/dist/defs.d.ts +0 -31
- package/dist/errors.d.ts +0 -62
- package/dist/globals/debug.d.ts +0 -10
- package/dist/globals/globalEvents.d.ts +0 -8
- package/dist/globals/globalMiddleware.d.ts +0 -31
- package/dist/globals/globalResources.d.ts +0 -41
- package/dist/globals/globalTags.d.ts +0 -11
- package/dist/globals/middleware/cache.middleware.d.ts +0 -27
- package/dist/globals/middleware/requireContext.middleware.d.ts +0 -6
- package/dist/globals/middleware/retry.middleware.d.ts +0 -21
- package/dist/globals/middleware/timeout.middleware.d.ts +0 -9
- package/dist/globals/middleware/tunnel.middleware.d.ts +0 -2
- package/dist/globals/resources/debug/debug.resource.d.ts +0 -7
- package/dist/globals/resources/debug/debug.tag.d.ts +0 -2
- package/dist/globals/resources/debug/debugConfig.resource.d.ts +0 -22
- package/dist/globals/resources/debug/executionTracker.middleware.d.ts +0 -50
- package/dist/globals/resources/debug/globalEvent.hook.d.ts +0 -27
- package/dist/globals/resources/debug/hook.hook.d.ts +0 -30
- package/dist/globals/resources/debug/index.d.ts +0 -6
- package/dist/globals/resources/debug/middleware.hook.d.ts +0 -30
- package/dist/globals/resources/debug/types.d.ts +0 -25
- package/dist/globals/resources/debug/utils.d.ts +0 -2
- package/dist/globals/resources/httpClientFactory.resource.d.ts +0 -28
- package/dist/globals/resources/queue.resource.d.ts +0 -10
- package/dist/globals/resources/tunnel/ejson-extensions.d.ts +0 -1
- package/dist/globals/resources/tunnel/error-utils.d.ts +0 -1
- package/dist/globals/resources/tunnel/plan.d.ts +0 -19
- package/dist/globals/resources/tunnel/protocol.d.ts +0 -47
- package/dist/globals/resources/tunnel/serializer.d.ts +0 -9
- package/dist/globals/resources/tunnel/tunnel.policy.tag.d.ts +0 -18
- package/dist/globals/resources/tunnel/tunnel.tag.d.ts +0 -2
- package/dist/globals/resources/tunnel/types.d.ts +0 -42
- package/dist/globals/tunnels/index.d.ts +0 -23
- package/dist/globals/types.d.ts +0 -4
- package/dist/http-client.d.ts +0 -25
- package/dist/http-fetch-tunnel.resource.d.ts +0 -11
- package/dist/index.d.ts +0 -117
- package/dist/models/DependencyProcessor.d.ts +0 -48
- package/dist/models/EventManager.d.ts +0 -153
- package/dist/models/LogPrinter.d.ts +0 -55
- package/dist/models/Logger.d.ts +0 -85
- package/dist/models/MiddlewareManager.d.ts +0 -75
- package/dist/models/OverrideManager.d.ts +0 -13
- package/dist/models/Queue.d.ts +0 -26
- package/dist/models/ResourceInitializer.d.ts +0 -20
- package/dist/models/RunResult.d.ts +0 -35
- package/dist/models/Semaphore.d.ts +0 -61
- package/dist/models/Store.d.ts +0 -73
- package/dist/models/StoreRegistry.d.ts +0 -49
- package/dist/models/StoreValidator.d.ts +0 -8
- package/dist/models/TaskRunner.d.ts +0 -27
- package/dist/models/UnhandledError.d.ts +0 -11
- package/dist/models/index.d.ts +0 -11
- package/dist/models/middleware/InterceptorRegistry.d.ts +0 -56
- package/dist/models/middleware/MiddlewareResolver.d.ts +0 -31
- package/dist/models/middleware/ResourceMiddlewareComposer.d.ts +0 -34
- package/dist/models/middleware/TaskMiddlewareComposer.d.ts +0 -43
- package/dist/models/middleware/ValidationHelper.d.ts +0 -20
- package/dist/models/middleware/index.d.ts +0 -6
- package/dist/models/middleware/types.d.ts +0 -10
- package/dist/models/utils/findCircularDependencies.d.ts +0 -16
- package/dist/models/utils/safeStringify.d.ts +0 -3
- package/dist/node/exposure/allowList.d.ts +0 -3
- package/dist/node/exposure/authenticator.d.ts +0 -6
- package/dist/node/exposure/cors.d.ts +0 -4
- package/dist/node/exposure/createNodeExposure.d.ts +0 -2
- package/dist/node/exposure/exposureServer.d.ts +0 -18
- package/dist/node/exposure/httpResponse.d.ts +0 -10
- package/dist/node/exposure/logging.d.ts +0 -4
- package/dist/node/exposure/multipart.d.ts +0 -27
- package/dist/node/exposure/requestBody.d.ts +0 -11
- package/dist/node/exposure/requestContext.d.ts +0 -17
- package/dist/node/exposure/requestHandlers.d.ts +0 -24
- package/dist/node/exposure/resourceTypes.d.ts +0 -60
- package/dist/node/exposure/router.d.ts +0 -17
- package/dist/node/exposure/serverLifecycle.d.ts +0 -13
- package/dist/node/exposure/types.d.ts +0 -31
- package/dist/node/exposure/utils.d.ts +0 -17
- package/dist/node/exposure.resource.d.ts +0 -12
- package/dist/node/files.d.ts +0 -9
- package/dist/node/http-mixed-client.d.ts +0 -30
- package/dist/node/http-smart-client.model.d.ts +0 -24
- package/dist/node/index.d.ts +0 -1
- package/dist/node/inputFile.model.d.ts +0 -22
- package/dist/node/inputFile.utils.d.ts +0 -14
- package/dist/node/platform/createFile.d.ts +0 -9
- package/dist/node/resources/http-mixed-client.factory.resource.d.ts +0 -17
- package/dist/node/resources/http-smart-client.factory.resource.d.ts +0 -16
- package/dist/node/tunnel.allowlist.d.ts +0 -7
- package/dist/node/upload/manifest.d.ts +0 -22
- package/dist/platform/adapters/browser.d.ts +0 -14
- package/dist/platform/adapters/edge.d.ts +0 -5
- package/dist/platform/adapters/node-als.d.ts +0 -1
- package/dist/platform/adapters/node.d.ts +0 -15
- package/dist/platform/adapters/universal-generic.d.ts +0 -14
- package/dist/platform/adapters/universal.d.ts +0 -17
- package/dist/platform/createFile.d.ts +0 -10
- package/dist/platform/createWebFile.d.ts +0 -11
- package/dist/platform/factory.d.ts +0 -2
- package/dist/platform/index.d.ts +0 -27
- package/dist/platform/types.d.ts +0 -29
- package/dist/processHooks.d.ts +0 -2
- package/dist/run.d.ts +0 -14
- package/dist/testing.d.ts +0 -25
- package/dist/tools/getCallerFile.d.ts +0 -1
- package/dist/tunnels/buildUniversalManifest.d.ts +0 -24
- package/dist/types/asyncContext.d.ts +0 -41
- package/dist/types/contracts.d.ts +0 -63
- package/dist/types/error.d.ts +0 -36
- package/dist/types/event.d.ts +0 -74
- package/dist/types/hook.d.ts +0 -23
- package/dist/types/inputFile.d.ts +0 -34
- package/dist/types/meta.d.ts +0 -22
- package/dist/types/resource.d.ts +0 -87
- package/dist/types/resourceMiddleware.d.ts +0 -47
- package/dist/types/runner.d.ts +0 -68
- package/dist/types/storeTypes.d.ts +0 -40
- package/dist/types/symbols.d.ts +0 -32
- package/dist/types/tag.d.ts +0 -46
- package/dist/types/task.d.ts +0 -54
- package/dist/types/taskMiddleware.d.ts +0 -48
- package/dist/types/utilities.d.ts +0 -113
- package/dist/utils/detectRunnerMode.d.ts +0 -9
package/AI.md
DELETED
|
@@ -1,454 +0,0 @@
|
|
|
1
|
-
# BlueLibs Runner: Fluent Builder Field Guide
|
|
2
|
-
|
|
3
|
-
> Token-friendly (<5000 tokens). This guide spotlights the fluent builder API (`r.*`) that ships with Runner 4.x. Classic `defineX` / `resource({...})` remain supported for backwards compatibility, but fluent builders are the default throughout.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [BlueLibs Runner: Fluent Builder Field Guide](#bluelibs-runner-fluent-builder-field-guide)
|
|
8
|
-
- [Table of Contents](#table-of-contents)
|
|
9
|
-
- [Install](#install)
|
|
10
|
-
- [Resources](#resources)
|
|
11
|
-
- [Tasks](#tasks)
|
|
12
|
-
- [Events and Hooks](#events-and-hooks)
|
|
13
|
-
- [Middleware](#middleware)
|
|
14
|
-
- [Tags](#tags)
|
|
15
|
-
- [Async Context](#async-context)
|
|
16
|
-
- [Errors](#errors)
|
|
17
|
-
- [HTTP \& Tunnels](#http--tunnels)
|
|
18
|
-
- [Serialization](#serialization)
|
|
19
|
-
- [Testing](#testing)
|
|
20
|
-
- [Observability \& Debugging](#observability--debugging)
|
|
21
|
-
- [Advanced Patterns](#advanced-patterns)
|
|
22
|
-
- [Interop With Classic APIs](#interop-with-classic-apis)
|
|
23
|
-
|
|
24
|
-
## Install
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
npm install @bluelibs/runner
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Resources
|
|
31
|
-
|
|
32
|
-
```ts
|
|
33
|
-
import express from "express";
|
|
34
|
-
import { r, run, globals } from "@bluelibs/runner";
|
|
35
|
-
import { nodeExposure } from "@bluelibs/runner/node";
|
|
36
|
-
|
|
37
|
-
const server = r
|
|
38
|
-
.resource<{ port: number }>("app.server")
|
|
39
|
-
.context(() => ({ app: express() }))
|
|
40
|
-
.init(async ({ port }, _deps, ctx) => {
|
|
41
|
-
ctx.app.use(express.json());
|
|
42
|
-
const listener = ctx.app.listen(port);
|
|
43
|
-
return { ...ctx, listener };
|
|
44
|
-
})
|
|
45
|
-
.dispose(async ({ listener }) => listener.close())
|
|
46
|
-
.build();
|
|
47
|
-
|
|
48
|
-
const createUser = r
|
|
49
|
-
.task("app.tasks.createUser")
|
|
50
|
-
.dependencies({ logger: globals.resources.logger })
|
|
51
|
-
.inputSchema<{ name: string }>({ parse: (value) => value })
|
|
52
|
-
.resultSchema<{ id: string; name: string }>({ parse: (value) => value })
|
|
53
|
-
.run(async (input, { logger }) => {
|
|
54
|
-
await logger.info(`Creating user ${input.name}`);
|
|
55
|
-
return { id: "user-1", name: input.name };
|
|
56
|
-
})
|
|
57
|
-
.build();
|
|
58
|
-
|
|
59
|
-
const api = r
|
|
60
|
-
.resource("app.api")
|
|
61
|
-
.register([
|
|
62
|
-
server.with({ port: 3000 }),
|
|
63
|
-
nodeExposure.with({
|
|
64
|
-
http: { basePath: "/__runner", listen: { port: 3000 } },
|
|
65
|
-
}),
|
|
66
|
-
createUser,
|
|
67
|
-
])
|
|
68
|
-
.dependencies({ server, createUser })
|
|
69
|
-
.init(async (_config, { server, createUser }) => {
|
|
70
|
-
server.listener.on("listening", () => {
|
|
71
|
-
console.log("Runner HTTP server ready on port 3000");
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
server.app.post("/users", async (req, res) => {
|
|
75
|
-
const user = await createUser(req.body);
|
|
76
|
-
res.json(user);
|
|
77
|
-
});
|
|
78
|
-
})
|
|
79
|
-
.build();
|
|
80
|
-
|
|
81
|
-
const runtime = await run(api);
|
|
82
|
-
await runtime.runTask(createUser, { name: "Ada" });
|
|
83
|
-
// runtime.dispose() when you are done.
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
- `r.*.with(config)` produces a configured copy of the definition.
|
|
87
|
-
- `run(root)` wires dependencies, runs `init`, emits lifecycle events, and returns helpers such as `runTask`, `getResourceValue`, and `dispose`.
|
|
88
|
-
- Enable verbose logging with `run(root, { debug: "verbose" })`.
|
|
89
|
-
|
|
90
|
-
### Tasks
|
|
91
|
-
|
|
92
|
-
Tasks are your business actions. They are plain async functions with DI, middleware, and validation.
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
import { r } from "@bluelibs/runner";
|
|
96
|
-
|
|
97
|
-
const sendEmail = r
|
|
98
|
-
.task("app.tasks.sendEmail")
|
|
99
|
-
.inputSchema<{ to: string; subject: string; body: string }>({
|
|
100
|
-
parse: (value) => value,
|
|
101
|
-
})
|
|
102
|
-
.dependencies({ emailer: userService })
|
|
103
|
-
.middleware((config) => [
|
|
104
|
-
loggingMiddleware.with({ label: "email" }),
|
|
105
|
-
tracingMiddleware,
|
|
106
|
-
])
|
|
107
|
-
.run(async (input, { emailer }) => {
|
|
108
|
-
await emailer.send(input);
|
|
109
|
-
return { delivered: true };
|
|
110
|
-
})
|
|
111
|
-
.build();
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
- `.dependencies()` accepts a literal map or a function `(config) => deps`.
|
|
115
|
-
- `.middleware()` appends by default; pass `{ override: true }` to replace. `.tags()` replaces the list each time.
|
|
116
|
-
- `.dependencies()` appends (shallow-merge) by default on resources, tasks, hooks, and middleware; pass `{ override: true }` to replace. Functions and objects are merged consistently.
|
|
117
|
-
- Provide result validation with `.resultSchema()` when the function returns structured data.
|
|
118
|
-
|
|
119
|
-
### Events and Hooks
|
|
120
|
-
|
|
121
|
-
Events are strongly typed signals. Hooks listen to them with predictable execution order.
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
import { r } from "@bluelibs/runner";
|
|
125
|
-
|
|
126
|
-
const userRegistered = r
|
|
127
|
-
.event("app.events.userRegistered")
|
|
128
|
-
.payloadSchema<{ userId: string; email: string }>({ parse: (v) => v })
|
|
129
|
-
.build();
|
|
130
|
-
|
|
131
|
-
const registerUser = r
|
|
132
|
-
.task("app.tasks.registerUser")
|
|
133
|
-
.dependencies({ userRegistered, userService })
|
|
134
|
-
.run(async (input, deps) => {
|
|
135
|
-
const user = await deps.userService.create(input);
|
|
136
|
-
await deps.userRegistered({ userId: user.id, email: user.email });
|
|
137
|
-
return user;
|
|
138
|
-
})
|
|
139
|
-
.build();
|
|
140
|
-
|
|
141
|
-
const sendWelcomeEmail = r
|
|
142
|
-
.hook("app.hooks.sendWelcomeEmail")
|
|
143
|
-
.on(userRegistered)
|
|
144
|
-
.dependencies({ mailer: sendEmail })
|
|
145
|
-
.run(async (event, { mailer }) => {
|
|
146
|
-
await mailer({ to: event.data.email, subject: "Welcome", body: "🎉" });
|
|
147
|
-
})
|
|
148
|
-
.build();
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
- Use `.on(onAnyOf(...))` to listen to several events while keeping inference.
|
|
152
|
-
- Hooks can set `.order(priority)`; lower numbers run first. Call `event.stopPropagation()` inside `run` to cancel downstream hooks.
|
|
153
|
-
- Wildcard hooks use `.on("*")` and receive every emission except events tagged with `globals.tags.excludeFromGlobalHooks`.
|
|
154
|
-
|
|
155
|
-
### Middleware
|
|
156
|
-
|
|
157
|
-
Middleware wraps tasks or resources. Fluent builders live under `r.middleware`.
|
|
158
|
-
|
|
159
|
-
```ts
|
|
160
|
-
import { r } from "@bluelibs/runner";
|
|
161
|
-
import { globals } from "@bluelibs/runner";
|
|
162
|
-
|
|
163
|
-
const auditTasks = r.middleware
|
|
164
|
-
.task("app.middleware.audit")
|
|
165
|
-
.dependencies({ logger: globals.resources.logger })
|
|
166
|
-
.everywhere((task) => !task.id.startsWith("admin."))
|
|
167
|
-
.run(async ({ task, next }, { logger }) => {
|
|
168
|
-
logger.info(`→ ${task.definition.id}`);
|
|
169
|
-
const result = await next(task.input);
|
|
170
|
-
logger.info(`← ${task.definition.id}`);
|
|
171
|
-
return result;
|
|
172
|
-
})
|
|
173
|
-
.build();
|
|
174
|
-
|
|
175
|
-
const cacheResources = r.middleware
|
|
176
|
-
.resource("app.middleware.cache")
|
|
177
|
-
.configSchema<{ ttl: number }>({ parse: (value) => value })
|
|
178
|
-
.run(async ({ value, next }, _deps, config) => {
|
|
179
|
-
if (value.current) {
|
|
180
|
-
return value.current;
|
|
181
|
-
}
|
|
182
|
-
const computed = await next();
|
|
183
|
-
value.current = computed;
|
|
184
|
-
setTimeout(() => (value.current = null), config.ttl);
|
|
185
|
-
return computed;
|
|
186
|
-
})
|
|
187
|
-
.build();
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Attach middleware using `.middleware([auditTasks])` on the definition that owns it, and register the middleware alongside the target resource or task at the root.
|
|
191
|
-
|
|
192
|
-
### Tags
|
|
193
|
-
|
|
194
|
-
Tags let you annotate definitions with metadata that can be queried later.
|
|
195
|
-
|
|
196
|
-
```ts
|
|
197
|
-
import { r, globals } from "@bluelibs/runner";
|
|
198
|
-
|
|
199
|
-
const httpRouteTag = r
|
|
200
|
-
.tag("app.tags.httpRoute")
|
|
201
|
-
.configSchema<{ method: "GET" | "POST"; path: string }>({
|
|
202
|
-
parse: (value) => value,
|
|
203
|
-
})
|
|
204
|
-
.build();
|
|
205
|
-
|
|
206
|
-
const getHealth = r
|
|
207
|
-
.task("app.tasks.getHealth")
|
|
208
|
-
.tags([httpRouteTag.with({ method: "GET", path: "/health" })])
|
|
209
|
-
.run(async () => ({ status: "ok" }))
|
|
210
|
-
.build();
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
Retrieve tagged items by using `globals.resources.store` inside a hook or resource and calling `store.getTasksWithTag(tag)`.
|
|
214
|
-
|
|
215
|
-
### Async Context
|
|
216
|
-
|
|
217
|
-
Async Context provides per-request/thread-local state via the platform's `AsyncLocalStorage` (Node). Use the fluent builder under `r.asyncContext` or the classic `asyncContext({ ... })` export.
|
|
218
|
-
|
|
219
|
-
```ts
|
|
220
|
-
import { r } from "@bluelibs/runner";
|
|
221
|
-
|
|
222
|
-
const requestContext = r
|
|
223
|
-
.asyncContext<{ requestId: string }>("app.ctx.request")
|
|
224
|
-
// below is optional
|
|
225
|
-
.configSchema(z.object({ ... }))
|
|
226
|
-
.serialize((data) => JSON.stringify(data))
|
|
227
|
-
.parse((raw) => JSON.parse(raw))
|
|
228
|
-
.build();
|
|
229
|
-
|
|
230
|
-
// Provide and read within an async boundary
|
|
231
|
-
await requestContext.provide({ requestId: "abc" }, async () => {
|
|
232
|
-
const ctx = requestContext.use(); // { requestId: "abc" }
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// Require middleware for tasks that need the context
|
|
236
|
-
r.task('task').middleware([requestContext.require()]);
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
- If you don't provide `serialize`/`parse`, Runner uses its default EJSON serializer to preserve Dates, RegExp, etc.
|
|
240
|
-
- You can also inject async contexts as dependencies; the injected value is the helper itself. Contexts must be registered to be used.
|
|
241
|
-
|
|
242
|
-
```ts
|
|
243
|
-
const whoAmI = r
|
|
244
|
-
.task("app.tasks.whoAmI")
|
|
245
|
-
.dependencies({ requestContext })
|
|
246
|
-
.run(async (_input, { requestContext }) => requestContext.use().requestId)
|
|
247
|
-
.build();
|
|
248
|
-
|
|
249
|
-
const app = r.resource("app").register([requestContext, whoAmI]).build();
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### Errors
|
|
253
|
-
|
|
254
|
-
Define typed, namespaced errors with a fluent builder. Built helpers expose `throw`, `is`, and `toString`:
|
|
255
|
-
|
|
256
|
-
```ts
|
|
257
|
-
import { r } from "@bluelibs/runner";
|
|
258
|
-
|
|
259
|
-
// Fluent builder
|
|
260
|
-
const AppError = r
|
|
261
|
-
.error<{ code: number; message: string }>("app.errors.AppError")
|
|
262
|
-
.dataSchema(zod) // or { parse(obj) => obj }
|
|
263
|
-
.build();
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
AppError.throw({ code: 400, message: "Oops" });
|
|
267
|
-
} catch (err) {
|
|
268
|
-
if (AppError.is(err)) {
|
|
269
|
-
// Do something
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
- Error data must include a `message: string`. The thrown `Error` has `name = id` and `message = data.message` for predictable matching and logging.
|
|
275
|
-
|
|
276
|
-
## HTTP & Tunnels
|
|
277
|
-
|
|
278
|
-
Run Node exposures and connect to remote Runners with fluent resources.
|
|
279
|
-
|
|
280
|
-
```ts
|
|
281
|
-
import { r, globals } from "@bluelibs/runner";
|
|
282
|
-
import { nodeExposure } from "@bluelibs/runner/node";
|
|
283
|
-
|
|
284
|
-
const httpExposure = nodeExposure.with({
|
|
285
|
-
http: {
|
|
286
|
-
basePath: "/__runner",
|
|
287
|
-
listen: { host: "0.0.0.0", port: 7070 },
|
|
288
|
-
auth: { token: process.env.RUNNER_TOKEN },
|
|
289
|
-
},
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
const tunnelClient = r
|
|
293
|
-
.resource("app.tunnels.http")
|
|
294
|
-
.tags([globals.tags.tunnel])
|
|
295
|
-
.init(async () => ({
|
|
296
|
-
mode: "client" as const,
|
|
297
|
-
transport: "http" as const,
|
|
298
|
-
tasks: (task) => task.id.startsWith("remote.tasks."),
|
|
299
|
-
client: globals.tunnels.http.createClient({
|
|
300
|
-
url: process.env.REMOTE_URL ?? "http://127.0.0.1:7070/__runner",
|
|
301
|
-
auth: { token: process.env.RUNNER_TOKEN },
|
|
302
|
-
}),
|
|
303
|
-
}))
|
|
304
|
-
.build();
|
|
305
|
-
|
|
306
|
-
const root = r
|
|
307
|
-
.resource("app")
|
|
308
|
-
.register([httpExposure, tunnelClient, getHealth])
|
|
309
|
-
.build();
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
### HTTP Client Factory (Recommended)
|
|
313
|
-
|
|
314
|
-
The `globals.resources.httpClientFactory` automatically injects serializer, error registry, and async contexts from the store:
|
|
315
|
-
|
|
316
|
-
```ts
|
|
317
|
-
import { r, globals } from "@bluelibs/runner";
|
|
318
|
-
|
|
319
|
-
const myTask = r
|
|
320
|
-
.task("app.tasks.callRemote")
|
|
321
|
-
.dependencies({ clientFactory: globals.resources.httpClientFactory })
|
|
322
|
-
.run(async (input, { clientFactory }) => {
|
|
323
|
-
// Client automatically has serializer, errors, and contexts injected
|
|
324
|
-
const client = clientFactory({
|
|
325
|
-
baseUrl: process.env.API_URL,
|
|
326
|
-
auth: { token: process.env.API_TOKEN },
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
return await client.task("remote.task", input);
|
|
330
|
-
})
|
|
331
|
-
.build();
|
|
332
|
-
|
|
333
|
-
// Node streaming clients via Node DI factories
|
|
334
|
-
import { globals as nodeGlobals } from "@bluelibs/runner/node";
|
|
335
|
-
|
|
336
|
-
const nodeTask = r
|
|
337
|
-
.task("app.tasks.streamingCall")
|
|
338
|
-
.dependencies({ smartFactory: nodeGlobals.resources.httpSmartClientFactory })
|
|
339
|
-
.run(async (input, { smartFactory }) => {
|
|
340
|
-
const client = smartFactory({
|
|
341
|
-
baseUrl: process.env.API_URL,
|
|
342
|
-
});
|
|
343
|
-
// Supports duplex streams and multipart uploads
|
|
344
|
-
return await client.task("remote.streaming.task", input);
|
|
345
|
-
})
|
|
346
|
-
.build();
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
### Direct Client Creation (Legacy)
|
|
350
|
-
|
|
351
|
-
You can also create clients directly without DI (manual serializer/error/context passing):
|
|
352
|
-
|
|
353
|
-
```ts
|
|
354
|
-
import { createHttpClient } from "@bluelibs/runner";
|
|
355
|
-
import { createFile as createWebFile } from "@bluelibs/runner/platform/createFile";
|
|
356
|
-
|
|
357
|
-
const client = createHttpClient({
|
|
358
|
-
baseUrl: "/__runner",
|
|
359
|
-
auth: { token: "secret" },
|
|
360
|
-
serializer: JSON,
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
await client.task("app.tasks.getHealth");
|
|
364
|
-
|
|
365
|
-
const file = createWebFile({ name: "notes.txt" }, new Blob(["Hello"]));
|
|
366
|
-
await client.task("app.tasks.upload", { file });
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
- `createHttpSmartClient` (Node only) supports duplex streams.
|
|
370
|
-
- For Node-specific features such as `useExposureContext` for handling aborts and streaming in exposed tasks, see TUNNELS.md.
|
|
371
|
-
- Register authentication middleware or rate limiting on the exposure via middleware tags and filters.
|
|
372
|
-
- Single-owner policy: a task may be tunneled by exactly one tunnel resource. Runner enforces exclusivity at init time and throws if two tunnels select the same task. This is tracked via an internal symbol on the task linking it to the owning tunnel.
|
|
373
|
-
|
|
374
|
-
## Serialization
|
|
375
|
-
|
|
376
|
-
Runner ships with an EJSON serializer that round-trips Dates, RegExp, binary, and custom shapes across Node and web.
|
|
377
|
-
|
|
378
|
-
```ts
|
|
379
|
-
import { r, globals } from "@bluelibs/runner";
|
|
380
|
-
|
|
381
|
-
const serializerSetup = r
|
|
382
|
-
.resource("app.serialization")
|
|
383
|
-
.dependencies({ serializer: globals.resources.serializer })
|
|
384
|
-
.init(async (_config, { serializer }) => {
|
|
385
|
-
class Distance {
|
|
386
|
-
constructor(public value: number, public unit: string) {}
|
|
387
|
-
typeName() {
|
|
388
|
-
return "Distance";
|
|
389
|
-
}
|
|
390
|
-
toJSONValue() {
|
|
391
|
-
return { value: this.value, unit: this.unit };
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
serializer.addType(
|
|
396
|
-
"Distance",
|
|
397
|
-
(json) => new Distance(json.value, json.unit),
|
|
398
|
-
);
|
|
399
|
-
})
|
|
400
|
-
.build();
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
Use `getDefaultSerializer()` when you need a standalone instance outside DI.
|
|
404
|
-
|
|
405
|
-
Note on files: The “File” you see in tunnels is not an EJSON custom type. Runner uses a dedicated $ejson: "File" sentinel in inputs which the tunnel client/server convert to multipart streams via a manifest. We intentionally do not call `EJSON.addType("File", ...)` by default, because file handling is performed by the tunnel layer (manifest hydration and multipart), not by the serializer. Keep using `createWebFile`/`createNodeFile` for uploads; use `EJSON.addType` only for your own domain types.
|
|
406
|
-
|
|
407
|
-
## Testing
|
|
408
|
-
|
|
409
|
-
- Use `npm run coverage:ai` to execute the full Jest suite in a token-friendly format. Focused tests can run via `npm run test -- task-name`.
|
|
410
|
-
- In unit tests, prefer running a minimal root resource and call `await run(root)` to get `runTask`, `emitEvent`, or `getResourceValue`.
|
|
411
|
-
- `createTestResource` is available for legacy suites but new code should compose fluent resources directly.
|
|
412
|
-
|
|
413
|
-
Example:
|
|
414
|
-
|
|
415
|
-
```ts
|
|
416
|
-
import { run } from "@bluelibs/runner";
|
|
417
|
-
|
|
418
|
-
test("sends welcome email", async () => {
|
|
419
|
-
const app = r
|
|
420
|
-
.resource("spec.app")
|
|
421
|
-
.register([sendWelcomeEmail, registerUser])
|
|
422
|
-
.build();
|
|
423
|
-
const runtime = await run(app);
|
|
424
|
-
await runtime.runTask(registerUser, { email: "user@example.com" });
|
|
425
|
-
await runtime.dispose();
|
|
426
|
-
});
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
## Observability & Debugging
|
|
430
|
-
|
|
431
|
-
- Pass `{ debug: "verbose" }` to `run` for structured logs about registration, middleware, and lifecycle events.
|
|
432
|
-
- `globals.resources.logger` exposes the framework logger; register your own logger resource and override it at the root to capture logs centrally.
|
|
433
|
-
- Hooks and tasks emit metadata through `globals.resources.store`. Query it for dashboards or editor plugins.
|
|
434
|
-
- Use middleware for tracing (`r.middleware.task("...").run(...)`) to wrap every task call.
|
|
435
|
-
|
|
436
|
-
## Advanced Patterns
|
|
437
|
-
|
|
438
|
-
- **Optional dependencies:** mark dependencies as optional (`analytics: analyticsService.optional()`) so the builder injects `null` when the resource is absent.
|
|
439
|
-
- **Conditional registration:** `.register((config) => (config.enableFeature ? [featureResource] : []))`.
|
|
440
|
-
- **Async coordination:** `Semaphore` and `Queue` live in the main package.
|
|
441
|
-
- **Event safety:** Runner detects event emission cycles and throws an `EventCycleError` with the offending chain.
|
|
442
|
-
|
|
443
|
-
## Interop With Classic APIs
|
|
444
|
-
|
|
445
|
-
Existing code that uses `resource({ ... })`, `task({ ... })`, or `defineX` keeps working. You can gradually migrate:
|
|
446
|
-
|
|
447
|
-
```ts
|
|
448
|
-
import { r, resource as classicResource } from "@bluelibs/runner";
|
|
449
|
-
|
|
450
|
-
const classic = classicResource({ id: "legacy", init: async () => "ok" });
|
|
451
|
-
const modern = r.resource("modern").register([classic]).build();
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
Fluent builders produce the exact same runtime definitions, so you can mix both styles within one project.
|
package/dist/define.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { defineTask } from "./definers/defineTask";
|
|
2
|
-
export { defineHook } from "./definers/defineHook";
|
|
3
|
-
export { defineResource } from "./definers/defineResource";
|
|
4
|
-
export { defineEvent } from "./definers/defineEvent";
|
|
5
|
-
export { defineTaskMiddleware } from "./definers/defineTaskMiddleware";
|
|
6
|
-
export { defineResourceMiddleware } from "./definers/defineResourceMiddleware";
|
|
7
|
-
export { defineOverride } from "./definers/defineOverride";
|
|
8
|
-
export { defineTag } from "./definers/defineTag";
|
|
9
|
-
export { isTask, isPhantomTask, isResource, isResourceWithConfig, isEvent, isHook, isTaskMiddleware, isResourceMiddleware, isTag, isOptional, isError, isAsyncContext, } from "./definers/tools";
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { IAsyncContext } from "../../types/asyncContext";
|
|
2
|
-
import type { IValidationSchema } from "../../types/utilities";
|
|
3
|
-
import type { IAsyncContextMeta } from "../../types/meta";
|
|
4
|
-
export interface AsyncContextFluentBuilder<T = unknown> {
|
|
5
|
-
id: string;
|
|
6
|
-
serialize(fn: (data: T) => string): AsyncContextFluentBuilder<T>;
|
|
7
|
-
parse(fn: (raw: string) => T): AsyncContextFluentBuilder<T>;
|
|
8
|
-
configSchema(schema: IValidationSchema<T>): AsyncContextFluentBuilder<T>;
|
|
9
|
-
meta<TNewMeta extends IAsyncContextMeta>(m: TNewMeta): AsyncContextFluentBuilder<T>;
|
|
10
|
-
build(): IAsyncContext<T>;
|
|
11
|
-
}
|
|
12
|
-
export declare function asyncContextBuilder<T = unknown>(id: string): AsyncContextFluentBuilder<T>;
|
|
13
|
-
export declare const asyncContext: typeof asyncContextBuilder;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { DependencyMapType, IEventDefinition, IResourceDefinition, ITaskDefinition, IHookDefinition, ITaskMiddlewareDefinition, IResourceMiddlewareDefinition, TagType, ResourceMiddlewareAttachmentType, TaskMiddlewareAttachmentType } from "../../defs";
|
|
2
|
-
import type { IResourceMeta, ITaskMeta } from "../../defs";
|
|
3
|
-
export type Immutable<T> = {
|
|
4
|
-
readonly [K in keyof T]: Immutable<T[K]>;
|
|
5
|
-
};
|
|
6
|
-
export type ReadonlyDeep<T> = Immutable<T>;
|
|
7
|
-
export interface ResourceBuilder<TConfig = void, TValue extends Promise<any> = Promise<any>, TDeps extends DependencyMapType = {}, TContext = any, TMeta extends IResourceMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends ResourceMiddlewareAttachmentType[] = ResourceMiddlewareAttachmentType[]> {
|
|
8
|
-
id: string;
|
|
9
|
-
definition: ReadonlyDeep<IResourceDefinition<TConfig, TValue, TDeps, TContext, any, any, TMeta, TTags, TMiddleware>>;
|
|
10
|
-
}
|
|
11
|
-
export interface TaskBuilder<TInput = undefined, TOutput extends Promise<any> = any, TDeps extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> {
|
|
12
|
-
id: string;
|
|
13
|
-
definition: ReadonlyDeep<ITaskDefinition<TInput, TOutput, TDeps, TMeta, TTags, TMiddleware>>;
|
|
14
|
-
}
|
|
15
|
-
export interface EventBuilder<TPayload = void> {
|
|
16
|
-
id: string;
|
|
17
|
-
definition: ReadonlyDeep<IEventDefinition<TPayload>>;
|
|
18
|
-
}
|
|
19
|
-
export interface HookBuilder<TDeps extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | readonly IEventDefinition<any>[] = any, TMeta extends ITaskMeta = any> {
|
|
20
|
-
id: string;
|
|
21
|
-
definition: ReadonlyDeep<IHookDefinition<TDeps, TOn, TMeta>>;
|
|
22
|
-
}
|
|
23
|
-
export interface TaskMiddlewareBuilder<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> {
|
|
24
|
-
id: string;
|
|
25
|
-
definition: ReadonlyDeep<ITaskMiddlewareDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>>;
|
|
26
|
-
}
|
|
27
|
-
export interface ResourceMiddlewareBuilder<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> {
|
|
28
|
-
id: string;
|
|
29
|
-
definition: ReadonlyDeep<IResourceMiddlewareDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>>;
|
|
30
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { DefaultErrorType } from "../../types/error";
|
|
2
|
-
import { ErrorHelper } from "../defineError";
|
|
3
|
-
import type { IValidationSchema } from "../../types/utilities";
|
|
4
|
-
import type { IErrorMeta } from "../../types/meta";
|
|
5
|
-
export interface ErrorFluentBuilder<TData extends DefaultErrorType = DefaultErrorType> {
|
|
6
|
-
id: string;
|
|
7
|
-
serialize(fn: (data: TData) => string): ErrorFluentBuilder<TData>;
|
|
8
|
-
parse(fn: (raw: string) => TData): ErrorFluentBuilder<TData>;
|
|
9
|
-
dataSchema(schema: IValidationSchema<TData>): ErrorFluentBuilder<TData>;
|
|
10
|
-
build(): ErrorHelper<TData>;
|
|
11
|
-
format(fn: (data: TData) => string): ErrorFluentBuilder<TData>;
|
|
12
|
-
meta<TNewMeta extends IErrorMeta>(m: TNewMeta): ErrorFluentBuilder<TData>;
|
|
13
|
-
}
|
|
14
|
-
export declare function errorBuilder<TData extends DefaultErrorType = DefaultErrorType>(id: string): ErrorFluentBuilder<TData>;
|
|
15
|
-
export declare const error: typeof errorBuilder;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { IEvent, IEventMeta, IValidationSchema, TagType } from "../../defs";
|
|
2
|
-
export interface EventFluentBuilder<TPayload = void> {
|
|
3
|
-
id: string;
|
|
4
|
-
payloadSchema<TNew>(schema: IValidationSchema<TNew>): EventFluentBuilder<TNew>;
|
|
5
|
-
tags<TNewTags extends TagType[]>(t: TNewTags, options?: {
|
|
6
|
-
override?: boolean;
|
|
7
|
-
}): EventFluentBuilder<TPayload>;
|
|
8
|
-
meta<TNewMeta extends IEventMeta>(m: TNewMeta): EventFluentBuilder<TPayload>;
|
|
9
|
-
build(): IEvent<TPayload>;
|
|
10
|
-
}
|
|
11
|
-
export declare function eventBuilder(id: string): EventFluentBuilder<void>;
|
|
12
|
-
export declare const event: typeof eventBuilder;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { DependencyMapType, IEventDefinition, IHook, IHookDefinition, ITaskMeta, TagType } from "../../defs";
|
|
2
|
-
export interface HookFluentBuilder<TDeps extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | readonly IEventDefinition<any>[] = any, TMeta extends ITaskMeta = ITaskMeta> {
|
|
3
|
-
id: string;
|
|
4
|
-
on<TNewOn extends "*" | IEventDefinition<any> | readonly IEventDefinition<any>[]>(on: TNewOn): HookFluentBuilder<TDeps, TNewOn, TMeta>;
|
|
5
|
-
order(order: number): HookFluentBuilder<TDeps, TOn, TMeta>;
|
|
6
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | (() => TNewDeps), options?: {
|
|
7
|
-
override?: false;
|
|
8
|
-
}): HookFluentBuilder<TDeps & TNewDeps, TOn, TMeta>;
|
|
9
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | (() => TNewDeps), options: {
|
|
10
|
-
override: true;
|
|
11
|
-
}): HookFluentBuilder<TNewDeps, TOn, TMeta>;
|
|
12
|
-
tags<TNewTags extends TagType[]>(t: TNewTags, options?: {
|
|
13
|
-
override?: boolean;
|
|
14
|
-
}): HookFluentBuilder<TDeps, TOn, TMeta>;
|
|
15
|
-
meta<TNewMeta extends ITaskMeta>(m: TNewMeta): HookFluentBuilder<TDeps, TOn, TNewMeta>;
|
|
16
|
-
run(fn: IHookDefinition<TDeps, TOn, TMeta>["run"]): HookFluentBuilder<TDeps, TOn, TMeta>;
|
|
17
|
-
build(): IHook<TDeps, TOn, TMeta>;
|
|
18
|
-
}
|
|
19
|
-
export declare function hookBuilder(id: string): HookFluentBuilder<{}, any, ITaskMeta>;
|
|
20
|
-
export declare const hook: typeof hookBuilder;
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { DependencyMapType, ITaskMiddleware, ITaskMiddlewareDefinition, IResourceMiddleware, IResourceMiddlewareDefinition, IValidationSchema, IMiddlewareMeta, TagType, ITask, IResource } from "../../defs";
|
|
2
|
-
export interface TaskMiddlewareFluentBuilder<C = any, In = void, Out = void, D extends DependencyMapType = {}> {
|
|
3
|
-
id: string;
|
|
4
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: C) => TNewDeps), options?: {
|
|
5
|
-
override?: false;
|
|
6
|
-
}): TaskMiddlewareFluentBuilder<C, In, Out, D & TNewDeps>;
|
|
7
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: C) => TNewDeps), options: {
|
|
8
|
-
override: true;
|
|
9
|
-
}): TaskMiddlewareFluentBuilder<C, In, Out, TNewDeps>;
|
|
10
|
-
configSchema<TNew>(schema: IValidationSchema<TNew>): TaskMiddlewareFluentBuilder<TNew, In, Out, D>;
|
|
11
|
-
run(fn: ITaskMiddlewareDefinition<C, In, Out, D>["run"]): TaskMiddlewareFluentBuilder<C, In, Out, D>;
|
|
12
|
-
meta<TNewMeta extends IMiddlewareMeta>(m: TNewMeta): TaskMiddlewareFluentBuilder<C, In, Out, D>;
|
|
13
|
-
tags<TNewTags extends TagType[]>(t: TNewTags, options?: {
|
|
14
|
-
override?: boolean;
|
|
15
|
-
}): TaskMiddlewareFluentBuilder<C, In, Out, D>;
|
|
16
|
-
everywhere(flag: boolean | ((task: ITask<any, any, any, any>) => boolean)): TaskMiddlewareFluentBuilder<C, In, Out, D>;
|
|
17
|
-
build(): ITaskMiddleware<C, In, Out, D>;
|
|
18
|
-
}
|
|
19
|
-
export declare function taskMiddlewareBuilder<C = void, In = void, Out = void, D extends DependencyMapType = {}>(id: string): TaskMiddlewareFluentBuilder<C, In, Out, D>;
|
|
20
|
-
export interface ResourceMiddlewareFluentBuilder<C = any, In = void, Out = void, D extends DependencyMapType = {}> {
|
|
21
|
-
id: string;
|
|
22
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: C) => TNewDeps), options?: {
|
|
23
|
-
override?: false;
|
|
24
|
-
}): ResourceMiddlewareFluentBuilder<C, In, Out, D & TNewDeps>;
|
|
25
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: C) => TNewDeps), options: {
|
|
26
|
-
override: true;
|
|
27
|
-
}): ResourceMiddlewareFluentBuilder<C, In, Out, TNewDeps>;
|
|
28
|
-
configSchema<TNew>(schema: IValidationSchema<TNew>): ResourceMiddlewareFluentBuilder<TNew, In, Out, D>;
|
|
29
|
-
run(fn: IResourceMiddlewareDefinition<C, In, Out, D>["run"]): ResourceMiddlewareFluentBuilder<C, In, Out, D>;
|
|
30
|
-
meta<TNewMeta extends IMiddlewareMeta>(m: TNewMeta): ResourceMiddlewareFluentBuilder<C, In, Out, D>;
|
|
31
|
-
tags<TNewTags extends TagType[]>(t: TNewTags, options?: {
|
|
32
|
-
override?: boolean;
|
|
33
|
-
}): ResourceMiddlewareFluentBuilder<C, In, Out, D>;
|
|
34
|
-
everywhere(flag: boolean | ((resource: IResource<any, any, any, any, any>) => boolean)): ResourceMiddlewareFluentBuilder<C, In, Out, D>;
|
|
35
|
-
build(): IResourceMiddleware<C, In, Out, D>;
|
|
36
|
-
}
|
|
37
|
-
export declare function resourceMiddlewareBuilder<C = void, In = void, Out = void, D extends DependencyMapType = {}>(id: string): ResourceMiddlewareFluentBuilder<C, In, Out, D>;
|
|
38
|
-
export declare const taskMiddleware: typeof taskMiddlewareBuilder;
|
|
39
|
-
export declare const resourceMiddleware: typeof resourceMiddlewareBuilder;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { DependencyMapType, IResource, IResourceDefinition, IResourceMeta, IValidationSchema, OverridableElements, RegisterableItems, ResourceInitFn, ResourceMiddlewareAttachmentType, TagType } from "../../defs";
|
|
2
|
-
type ShouldReplaceConfig<T> = [T] extends [void] ? true : [T] extends [undefined] ? true : false;
|
|
3
|
-
type ResolveConfig<TExisting, TProposed> = ShouldReplaceConfig<TExisting> extends true ? TProposed : TExisting;
|
|
4
|
-
export interface ResourceFluentBuilder<TConfig = void, TValue extends Promise<any> = Promise<any>, TDeps extends DependencyMapType = {}, TContext = any, TMeta extends IResourceMeta = IResourceMeta, TTags extends TagType[] = TagType[], TMiddleware extends ResourceMiddlewareAttachmentType[] = ResourceMiddlewareAttachmentType[]> {
|
|
5
|
-
id: string;
|
|
6
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: TConfig) => TNewDeps), options?: {
|
|
7
|
-
override?: false;
|
|
8
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps & TNewDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
9
|
-
dependencies<TNewDeps extends DependencyMapType>(deps: TNewDeps | ((config: TConfig) => TNewDeps), options: {
|
|
10
|
-
override: true;
|
|
11
|
-
}): ResourceFluentBuilder<TConfig, TValue, TNewDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
12
|
-
register(items: RegisterableItems | Array<RegisterableItems> | ((config: TConfig) => RegisterableItems | Array<RegisterableItems>), options?: {
|
|
13
|
-
override?: boolean;
|
|
14
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
15
|
-
middleware<TNewMw extends ResourceMiddlewareAttachmentType[]>(mw: TNewMw, options?: {
|
|
16
|
-
override?: boolean;
|
|
17
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, TTags, TNewMw>;
|
|
18
|
-
tags<TNewTags extends TagType[]>(tags: TNewTags, options?: {
|
|
19
|
-
override?: false;
|
|
20
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, [
|
|
21
|
-
...TTags,
|
|
22
|
-
...TNewTags
|
|
23
|
-
], TMiddleware>;
|
|
24
|
-
tags<TNewTags extends TagType[]>(tags: TNewTags, options: {
|
|
25
|
-
override: true;
|
|
26
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, TNewTags, TMiddleware>;
|
|
27
|
-
context<TNewCtx>(factory: () => TNewCtx): ResourceFluentBuilder<TConfig, TValue, TDeps, TNewCtx, TMeta, TTags, TMiddleware>;
|
|
28
|
-
configSchema<TNewConfig>(schema: IValidationSchema<TNewConfig>): ResourceFluentBuilder<TNewConfig, TValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
29
|
-
resultSchema<TResolved>(schema: IValidationSchema<TResolved>): ResourceFluentBuilder<TConfig, Promise<TResolved>, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
30
|
-
init<TNewConfig = TConfig, TNewValue extends Promise<any> = TValue>(fn: ResourceInitFn<ResolveConfig<TConfig, TNewConfig>, TNewValue, TDeps, TContext, TMeta, TTags, TMiddleware>): ResourceFluentBuilder<ResolveConfig<TConfig, TNewConfig>, TNewValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
31
|
-
dispose(fn: NonNullable<IResourceDefinition<TConfig, TValue, TDeps, TContext, any, any, TMeta, TTags, TMiddleware>["dispose"]>): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
32
|
-
meta<TNewMeta extends IResourceMeta>(m: TNewMeta): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TNewMeta, TTags, TMiddleware>;
|
|
33
|
-
overrides(o: Array<OverridableElements>, options?: {
|
|
34
|
-
override?: boolean;
|
|
35
|
-
}): ResourceFluentBuilder<TConfig, TValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
36
|
-
build(): IResource<TConfig, TValue, TDeps, TContext, TMeta, TTags, TMiddleware>;
|
|
37
|
-
}
|
|
38
|
-
export declare function resourceBuilder<TConfig = void>(id: string): ResourceFluentBuilder<TConfig, Promise<any>, {}, any, IResourceMeta, TagType[], ResourceMiddlewareAttachmentType[]>;
|
|
39
|
-
export declare const resource: typeof resourceBuilder;
|
|
40
|
-
export {};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ITag, ITagMeta, IValidationSchema } from "../../defs";
|
|
2
|
-
export interface TagFluentBuilder<TConfig = void, TEnforceIn = void, TEnforceOut = void> {
|
|
3
|
-
id: string;
|
|
4
|
-
meta<TNewMeta extends ITagMeta>(m: TNewMeta): TagFluentBuilder<TConfig, TEnforceIn, TEnforceOut>;
|
|
5
|
-
configSchema<TNewConfig>(schema: IValidationSchema<TNewConfig>): TagFluentBuilder<TNewConfig, TEnforceIn, TEnforceOut>;
|
|
6
|
-
config<TNewConfig>(config: TNewConfig): TagFluentBuilder<TNewConfig, TEnforceIn, TEnforceOut>;
|
|
7
|
-
build(): ITag<TConfig, TEnforceIn, TEnforceOut>;
|
|
8
|
-
}
|
|
9
|
-
export declare function tagBuilder<TConfig = void, TEnforceIn = void, TEnforceOut = void>(id: string): TagFluentBuilder<TConfig, TEnforceIn, TEnforceOut>;
|
|
10
|
-
export declare const tag: typeof tagBuilder;
|