@trebired/result 0.1.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/CHANGELOG.md +5 -0
- package/LICENSE +21 -0
- package/README.md +184 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/presets.d.ts +6 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +156 -0
- package/dist/presets.js.map +1 -0
- package/dist/responder.d.ts +4 -0
- package/dist/responder.d.ts.map +1 -0
- package/dist/responder.js +116 -0
- package/dist/responder.js.map +1 -0
- package/dist/responder_support.d.ts +10 -0
- package/dist/responder_support.d.ts.map +1 -0
- package/dist/responder_support.js +88 -0
- package/dist/responder_support.js.map +1 -0
- package/dist/result.d.ts +23 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +89 -0
- package/dist/result.js.map +1 -0
- package/dist/shared.d.ts +19 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +175 -0
- package/dist/shared.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/presets.d.ts +6 -0
- package/dist/src/presets.d.ts.map +1 -0
- package/dist/src/presets.js +156 -0
- package/dist/src/presets.js.map +1 -0
- package/dist/src/responder.d.ts +4 -0
- package/dist/src/responder.d.ts.map +1 -0
- package/dist/src/responder.js +116 -0
- package/dist/src/responder.js.map +1 -0
- package/dist/src/responder_support.d.ts +10 -0
- package/dist/src/responder_support.d.ts.map +1 -0
- package/dist/src/responder_support.js +88 -0
- package/dist/src/responder_support.js.map +1 -0
- package/dist/src/result.d.ts +23 -0
- package/dist/src/result.d.ts.map +1 -0
- package/dist/src/result.js +89 -0
- package/dist/src/result.js.map +1 -0
- package/dist/src/shared.d.ts +19 -0
- package/dist/src/shared.d.ts.map +1 -0
- package/dist/src/shared.js +175 -0
- package/dist/src/shared.js.map +1 -0
- package/dist/src/types.d.ts +105 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/types.d.ts +105 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Trebired
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# @trebired/result
|
|
2
|
+
|
|
3
|
+
Shared result builders and transport-agnostic response orchestration for Bun and Node.js products.
|
|
4
|
+
|
|
5
|
+
`@trebired/result` is intentionally product-agnostic.
|
|
6
|
+
|
|
7
|
+
It does not know about Express, React, platform page names, agent sync payloads, logger group conventions, or any specific request/response runtime. It gives consumers a shared result envelope plus a responder layer they can wire into their own HTTP, RPC, worker, or page-rendering stack.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
Runtime support: Bun 1+ and Node.js 18+.
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm install @trebired/result
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
Build shared results from normal business logic:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { result } from "@trebired/result";
|
|
23
|
+
|
|
24
|
+
const saved = result.ok("Project saved.", {
|
|
25
|
+
data: {
|
|
26
|
+
id: "project_42",
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const missing = result.notFound("project-not-found", "Project not found.", {
|
|
31
|
+
details: {
|
|
32
|
+
id: "project_42",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Create a responder by supplying transport adapters:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { createResultResponder, result } from "@trebired/result";
|
|
41
|
+
|
|
42
|
+
const responder = createResultResponder({
|
|
43
|
+
json({ res, payload }) {
|
|
44
|
+
return res.status(payload.status).json(payload);
|
|
45
|
+
},
|
|
46
|
+
render({ res, model }) {
|
|
47
|
+
return res.status(model.status).render("result", model);
|
|
48
|
+
},
|
|
49
|
+
text({ res, model, text }) {
|
|
50
|
+
return res.status(model.status).type("text/plain").send(text);
|
|
51
|
+
},
|
|
52
|
+
getRenderModePath({ res }) {
|
|
53
|
+
return res.locals.renderModePath;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return responder.respond({
|
|
58
|
+
req,
|
|
59
|
+
res,
|
|
60
|
+
result: result.notFound("project-not-found", "Project not found."),
|
|
61
|
+
render: true,
|
|
62
|
+
type: "app.project",
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Result Builder
|
|
67
|
+
|
|
68
|
+
The shared result envelope is consistent across success, noop, and error outcomes:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
type ResultLike = {
|
|
72
|
+
ok: boolean;
|
|
73
|
+
error: boolean;
|
|
74
|
+
noop: boolean;
|
|
75
|
+
status: number;
|
|
76
|
+
error_code: string;
|
|
77
|
+
message: string;
|
|
78
|
+
data: unknown | null;
|
|
79
|
+
details?: unknown;
|
|
80
|
+
redirect?: string;
|
|
81
|
+
meta?: Record<string, unknown>;
|
|
82
|
+
};
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Builder helpers:
|
|
86
|
+
|
|
87
|
+
- `result.ok(message?, meta?)`
|
|
88
|
+
- `result.noop(code?, message?, meta?)`
|
|
89
|
+
- `result.error(status?, code?, message?, meta?)`
|
|
90
|
+
- `result.badRequest(...)`
|
|
91
|
+
- `result.unauthorized(...)`
|
|
92
|
+
- `result.forbidden(...)`
|
|
93
|
+
- `result.notFound(...)`
|
|
94
|
+
- `result.conflict(...)`
|
|
95
|
+
- `result.internal(...)`
|
|
96
|
+
|
|
97
|
+
The `meta` argument is a typed object with optional `data`, `details`, `redirect`, `meta`, and `error` fields.
|
|
98
|
+
|
|
99
|
+
## Responder Model
|
|
100
|
+
|
|
101
|
+
The responder factory keeps transport concerns outside the package:
|
|
102
|
+
|
|
103
|
+
- `json` handles API-style payload delivery.
|
|
104
|
+
- `render` is optional and only used when `respond({ render: true })` is requested.
|
|
105
|
+
- `text` receives a fallback payload when render is unavailable or throws.
|
|
106
|
+
- `getRenderModePath` is optional and lets a host derive mode-aware render variants such as `app.process.error`.
|
|
107
|
+
|
|
108
|
+
The responder resolves presets by:
|
|
109
|
+
|
|
110
|
+
1. result level
|
|
111
|
+
2. exact status for that level
|
|
112
|
+
3. parent type chain from least specific to most specific
|
|
113
|
+
|
|
114
|
+
That means `app.process.publication` can inherit from `app`, then override with `app.process`, then override again with `app.process.publication`.
|
|
115
|
+
|
|
116
|
+
## Presets
|
|
117
|
+
|
|
118
|
+
The package exports shared defaults plus helpers for extension:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import {
|
|
122
|
+
DEFAULT_RESULT_PRESETS,
|
|
123
|
+
mergeResultPresets,
|
|
124
|
+
resolveResultPreset,
|
|
125
|
+
} from "@trebired/result";
|
|
126
|
+
|
|
127
|
+
const presets = mergeResultPresets(DEFAULT_RESULT_PRESETS, {
|
|
128
|
+
error: {
|
|
129
|
+
types: {
|
|
130
|
+
"app.project": {
|
|
131
|
+
statuses: {
|
|
132
|
+
404: {
|
|
133
|
+
title: "Project not found",
|
|
134
|
+
message: "The requested project does not exist.",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const preset = resolveResultPreset({
|
|
143
|
+
presets,
|
|
144
|
+
level: "error",
|
|
145
|
+
status: 404,
|
|
146
|
+
type: "app.project.branch",
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Defaults intentionally stay reusable. No product-specific page names or views are built into the package.
|
|
151
|
+
|
|
152
|
+
## Public API
|
|
153
|
+
|
|
154
|
+
Runtime exports:
|
|
155
|
+
|
|
156
|
+
- `result`
|
|
157
|
+
- `ok`
|
|
158
|
+
- `noop`
|
|
159
|
+
- `error`
|
|
160
|
+
- `badRequest`
|
|
161
|
+
- `unauthorized`
|
|
162
|
+
- `forbidden`
|
|
163
|
+
- `notFound`
|
|
164
|
+
- `conflict`
|
|
165
|
+
- `internal`
|
|
166
|
+
- `createResultResponder`
|
|
167
|
+
- `DEFAULT_RESULT_PRESETS`
|
|
168
|
+
- `mergeResultPresets`
|
|
169
|
+
- `resolveResultPreset`
|
|
170
|
+
- `buildResultRenderModePath`
|
|
171
|
+
- `getResultLevel`
|
|
172
|
+
- `normalizeResultErrorCode`
|
|
173
|
+
- `toResultStatus`
|
|
174
|
+
|
|
175
|
+
Type exports:
|
|
176
|
+
|
|
177
|
+
- `ResultLike`
|
|
178
|
+
- `ResultLevel`
|
|
179
|
+
- `ResultInit`
|
|
180
|
+
- `ResultPreset`
|
|
181
|
+
- `ResultPresetMap`
|
|
182
|
+
- `ResultResponderConfig`
|
|
183
|
+
- `ResultRespondInput`
|
|
184
|
+
- `ResultRenderModel`
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { badRequest, conflict, error, forbidden, internal, noop, notFound, ok, result, unauthorized, } from "./result.js";
|
|
2
|
+
export { createResultResponder } from "./responder.js";
|
|
3
|
+
export { DEFAULT_RESULT_PRESETS, mergeResultPresets, resolveResultPreset, } from "./presets.js";
|
|
4
|
+
export { buildResultRenderModePath, getResultLevel, normalizeResultErrorCode, toResultStatus, } from "./shared.js";
|
|
5
|
+
export type * from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,EAAE,EACF,MAAM,EACN,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,wBAAwB,EACxB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,mBAAmB,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { badRequest, conflict, error, forbidden, internal, noop, notFound, ok, result, unauthorized, } from "./result.js";
|
|
2
|
+
export { createResultResponder } from "./responder.js";
|
|
3
|
+
export { DEFAULT_RESULT_PRESETS, mergeResultPresets, resolveResultPreset, } from "./presets.js";
|
|
4
|
+
export { buildResultRenderModePath, getResultLevel, normalizeResultErrorCode, toResultStatus, } from "./shared.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,EAAE,EACF,MAAM,EACN,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,wBAAwB,EACxB,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResolveResultPresetInput, ResultPreset, ResultPresetMap } from "./types.js";
|
|
2
|
+
declare const DEFAULT_RESULT_PRESETS: ResultPresetMap;
|
|
3
|
+
declare function mergeResultPresets<TType extends string = string>(base: ResultPresetMap<TType> | null | undefined, override: ResultPresetMap<TType> | null | undefined): ResultPresetMap<TType>;
|
|
4
|
+
declare function resolveResultPreset<TType extends string = string>({ presets, level, status, type, }: ResolveResultPresetInput<TType>): ResultPreset;
|
|
5
|
+
export { DEFAULT_RESULT_PRESETS, mergeResultPresets, resolveResultPreset, };
|
|
6
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/presets.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,wBAAwB,EAGxB,YAAY,EAEZ,eAAe,EAChB,MAAM,QAAQ,CAAC;AAEhB,QAAA,MAAM,sBAAsB,EAAE,eAiD7B,CAAC;AAEF,iBAAS,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EACvD,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/C,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,eAAe,CAAC,KAAK,CAAC,CAaxB;AAED,iBAAS,mBAAmB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,EAC1D,OAAO,EACP,KAAK,EACL,MAAM,EACN,IAAI,GACL,EAAE,wBAAwB,CAAC,KAAK,CAAC,GAAG,YAAY,CAUhD;AA0HD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,CAAC"}
|
package/dist/presets.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { defaultResultMessage, defaultResultStatus, defaultResultTitle, isObject, mergeMetadata, toResultStatus, typeHierarchy, } from "./shared.js";
|
|
2
|
+
const DEFAULT_RESULT_PRESETS = {
|
|
3
|
+
ok: {
|
|
4
|
+
default: {
|
|
5
|
+
status: 200,
|
|
6
|
+
title: "Success",
|
|
7
|
+
message: "The request completed successfully.",
|
|
8
|
+
},
|
|
9
|
+
},
|
|
10
|
+
noop: {
|
|
11
|
+
default: {
|
|
12
|
+
status: 200,
|
|
13
|
+
title: "No changes",
|
|
14
|
+
message: "No changes were needed.",
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
error: {
|
|
18
|
+
default: {
|
|
19
|
+
status: 500,
|
|
20
|
+
title: "Oops..",
|
|
21
|
+
message: "Something went wrong.",
|
|
22
|
+
},
|
|
23
|
+
statuses: {
|
|
24
|
+
"400": {
|
|
25
|
+
status: 400,
|
|
26
|
+
title: "Bad request",
|
|
27
|
+
message: "The request could not be completed.",
|
|
28
|
+
},
|
|
29
|
+
"401": {
|
|
30
|
+
status: 401,
|
|
31
|
+
title: "Unauthorized",
|
|
32
|
+
message: "You must sign in to continue.",
|
|
33
|
+
},
|
|
34
|
+
"403": {
|
|
35
|
+
status: 403,
|
|
36
|
+
title: "Forbidden",
|
|
37
|
+
message: "You do not have access to this resource.",
|
|
38
|
+
},
|
|
39
|
+
"404": {
|
|
40
|
+
status: 404,
|
|
41
|
+
title: "Not Found",
|
|
42
|
+
message: "The requested resource does not exist.",
|
|
43
|
+
},
|
|
44
|
+
"409": {
|
|
45
|
+
status: 409,
|
|
46
|
+
title: "Conflict",
|
|
47
|
+
message: "The request conflicts with the current resource state.",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
function mergeResultPresets(base, override) {
|
|
53
|
+
const levels = ["ok", "noop", "error"];
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const level of levels) {
|
|
56
|
+
const merged = mergePresetGroup(base?.[level], override?.[level]);
|
|
57
|
+
if (merged) {
|
|
58
|
+
out[level] = merged;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function resolveResultPreset({ presets, level, status, type, }) {
|
|
64
|
+
const merged = mergeResultPresets(DEFAULT_RESULT_PRESETS, presets);
|
|
65
|
+
const group = merged[level];
|
|
66
|
+
const resolvedStatus = toResultStatus(status, defaultResultStatus(level));
|
|
67
|
+
const fallback = createFallbackPreset(level, resolvedStatus);
|
|
68
|
+
const resolved = group
|
|
69
|
+
? resolvePresetFromGroup(group, resolvedStatus, type)
|
|
70
|
+
: {};
|
|
71
|
+
return mergePresetEntries(fallback, resolved);
|
|
72
|
+
}
|
|
73
|
+
function mergePresetGroup(base, override) {
|
|
74
|
+
if (!base && !override) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const baseTypes = base?.types || {};
|
|
78
|
+
const overrideTypes = override?.types || {};
|
|
79
|
+
const typeKeys = new Set([
|
|
80
|
+
...Object.keys(baseTypes),
|
|
81
|
+
...Object.keys(overrideTypes),
|
|
82
|
+
]);
|
|
83
|
+
const types = Object.fromEntries(Array.from(typeKeys)
|
|
84
|
+
.map((key) => [key, mergePresetGroup(baseTypes[key], overrideTypes[key])])
|
|
85
|
+
.filter((entry) => Boolean(entry[1])));
|
|
86
|
+
const statuses = {
|
|
87
|
+
...(base?.statuses || {}),
|
|
88
|
+
...(override?.statuses || {}),
|
|
89
|
+
};
|
|
90
|
+
const out = {};
|
|
91
|
+
const mergedDefault = mergePresetEntries(base?.default, override?.default);
|
|
92
|
+
if (Object.keys(mergedDefault).length > 0) {
|
|
93
|
+
out.default = mergedDefault;
|
|
94
|
+
}
|
|
95
|
+
if (Object.keys(statuses).length > 0) {
|
|
96
|
+
out.statuses = statuses;
|
|
97
|
+
}
|
|
98
|
+
if (Object.keys(types).length > 0) {
|
|
99
|
+
out.types = types;
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function resolvePresetFromGroup(group, status, type) {
|
|
104
|
+
let resolved = mergePresetEntries(group.default, readStatusPreset(group.statuses, status));
|
|
105
|
+
for (const candidate of typeHierarchy(type)) {
|
|
106
|
+
const typeGroup = group.types?.[candidate];
|
|
107
|
+
if (!typeGroup) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
resolved = mergePresetEntries(resolved, typeGroup.default, readStatusPreset(typeGroup.statuses, status));
|
|
111
|
+
}
|
|
112
|
+
return resolved;
|
|
113
|
+
}
|
|
114
|
+
function readStatusPreset(statuses, status) {
|
|
115
|
+
if (!statuses) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
return statuses[String(status)];
|
|
119
|
+
}
|
|
120
|
+
function createFallbackPreset(level, status) {
|
|
121
|
+
return {
|
|
122
|
+
status,
|
|
123
|
+
title: defaultResultTitle(level, status),
|
|
124
|
+
message: defaultResultMessage(level, status),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function mergePresetEntries(...items) {
|
|
128
|
+
const out = {};
|
|
129
|
+
let mergedMeta = null;
|
|
130
|
+
for (const item of items) {
|
|
131
|
+
if (!item) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (typeof item.status === "number") {
|
|
135
|
+
out.status = item.status;
|
|
136
|
+
}
|
|
137
|
+
if (typeof item.title === "string") {
|
|
138
|
+
out.title = item.title;
|
|
139
|
+
}
|
|
140
|
+
if (typeof item.message === "string") {
|
|
141
|
+
out.message = item.message;
|
|
142
|
+
}
|
|
143
|
+
if (typeof item.view === "string") {
|
|
144
|
+
out.view = item.view;
|
|
145
|
+
}
|
|
146
|
+
if (isObject(item.meta)) {
|
|
147
|
+
mergedMeta = mergeMetadata(mergedMeta, item.meta);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (mergedMeta && Object.keys(mergedMeta).length > 0) {
|
|
151
|
+
out.meta = mergedMeta;
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
export { DEFAULT_RESULT_PRESETS, mergeResultPresets, resolveResultPreset, };
|
|
156
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ResultResponder, ResultResponderConfig } from "./types.js";
|
|
2
|
+
declare function createResultResponder<Req = unknown, Res = unknown, TType extends string = string>(config: ResultResponderConfig<Req, Res, TType>): ResultResponder<Req, Res, TType>;
|
|
3
|
+
export { createResultResponder, };
|
|
4
|
+
//# sourceMappingURL=responder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder.d.ts","sourceRoot":"","sources":["../../src/responder.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAKV,eAAe,EACf,qBAAqB,EAGtB,MAAM,QAAQ,CAAC;AAEhB,iBAAS,qBAAqB,CAC5B,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,MAAM,EAAE,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAoBlF;AAoJD,OAAO,EACL,qBAAqB,GACtB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { resolveResultPreset } from "./presets.js";
|
|
2
|
+
import { createTextContext, handleRenderFailure, resolveDetails, resolveErrorCode, resolveMessage, resolveTitle, resolveView, } from "./responder_support.js";
|
|
3
|
+
import { buildResultRenderModePath, defaultResultStatus, extractResultExtras, getResultLevel, hasOwn, isObject, isPromiseLike, mergeMetadata, normalizeResultLike, toResultStatus, } from "./shared.js";
|
|
4
|
+
function createResultResponder(config) {
|
|
5
|
+
return {
|
|
6
|
+
respond(input) {
|
|
7
|
+
const context = createBaseContext(config, input);
|
|
8
|
+
if (input.render === true) {
|
|
9
|
+
const model = buildRenderModel(config, context);
|
|
10
|
+
return respondWithRender(config, context, model);
|
|
11
|
+
}
|
|
12
|
+
const jsonContext = createJsonContext(context);
|
|
13
|
+
return config.json(jsonContext);
|
|
14
|
+
},
|
|
15
|
+
resolvePreset(input) {
|
|
16
|
+
return resolveResultPreset({
|
|
17
|
+
...input,
|
|
18
|
+
presets: config.presets,
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function createBaseContext(config, input) {
|
|
24
|
+
const result = normalizeResultLike(input.result);
|
|
25
|
+
const level = getResultLevel(result);
|
|
26
|
+
const status = toResultStatus(result.status, level === "error" ? 400 : 200);
|
|
27
|
+
return {
|
|
28
|
+
req: input.req,
|
|
29
|
+
res: input.res,
|
|
30
|
+
input,
|
|
31
|
+
result,
|
|
32
|
+
level,
|
|
33
|
+
status,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function createJsonContext(context) {
|
|
37
|
+
return {
|
|
38
|
+
...context,
|
|
39
|
+
payload: buildJsonPayload(context),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function buildJsonPayload(context) {
|
|
43
|
+
const { input, level, result, status } = context;
|
|
44
|
+
const payload = {
|
|
45
|
+
ok: level !== "error",
|
|
46
|
+
error: level === "error" ? result.error !== false : false,
|
|
47
|
+
noop: level === "noop",
|
|
48
|
+
status,
|
|
49
|
+
error_code: resolveErrorCode(level, status, result),
|
|
50
|
+
message: resolveMessage(level, status, result, input),
|
|
51
|
+
data: hasOwn(result, "data") ? (result.data ?? null) : null,
|
|
52
|
+
};
|
|
53
|
+
if (hasOwn(result, "details") && result.details !== undefined) {
|
|
54
|
+
payload.details = result.details;
|
|
55
|
+
}
|
|
56
|
+
if (typeof result.redirect === "string" && result.redirect.length > 0) {
|
|
57
|
+
payload.redirect = result.redirect;
|
|
58
|
+
}
|
|
59
|
+
if (isObject(result.meta) && Object.keys(result.meta).length > 0) {
|
|
60
|
+
payload.meta = result.meta;
|
|
61
|
+
}
|
|
62
|
+
Object.assign(payload, extractResultExtras(result));
|
|
63
|
+
return payload;
|
|
64
|
+
}
|
|
65
|
+
function buildRenderModel(config, context) {
|
|
66
|
+
const { input, level, result } = context;
|
|
67
|
+
const preset = resolveResultPreset({
|
|
68
|
+
presets: config.presets,
|
|
69
|
+
level,
|
|
70
|
+
status: result.status,
|
|
71
|
+
type: input.type,
|
|
72
|
+
});
|
|
73
|
+
const status = toResultStatus(result.status, toResultStatus(preset.status, defaultResultStatus(level)));
|
|
74
|
+
const message = resolveMessage(level, status, result, input, preset);
|
|
75
|
+
const renderModePath = buildResultRenderModePath(config.getRenderModePath?.({
|
|
76
|
+
...context,
|
|
77
|
+
status,
|
|
78
|
+
}), level);
|
|
79
|
+
const meta = mergeMetadata(preset.meta, isObject(result.meta) ? result.meta : null, input.meta);
|
|
80
|
+
return {
|
|
81
|
+
level,
|
|
82
|
+
status,
|
|
83
|
+
type: (input.type || ""),
|
|
84
|
+
title: resolveTitle(level, status, result, input, preset),
|
|
85
|
+
message,
|
|
86
|
+
view: resolveView(result, input, preset),
|
|
87
|
+
details: resolveDetails(result, input),
|
|
88
|
+
meta,
|
|
89
|
+
error_code: resolveErrorCode(level, status, result),
|
|
90
|
+
redirect: typeof result.redirect === "string" && result.redirect.length > 0 ? result.redirect : null,
|
|
91
|
+
preset,
|
|
92
|
+
renderModePath,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function respondWithRender(config, context, model) {
|
|
96
|
+
const renderContext = {
|
|
97
|
+
...context,
|
|
98
|
+
status: model.status,
|
|
99
|
+
model,
|
|
100
|
+
};
|
|
101
|
+
if (!config.render) {
|
|
102
|
+
return config.text(createTextContext(renderContext, "no-renderer"));
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const rendered = config.render(renderContext);
|
|
106
|
+
if (isPromiseLike(rendered)) {
|
|
107
|
+
return Promise.resolve(rendered).catch((error) => handleRenderFailure(config, renderContext, error));
|
|
108
|
+
}
|
|
109
|
+
return rendered;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return handleRenderFailure(config, renderContext, error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export { createResultResponder, };
|
|
116
|
+
//# sourceMappingURL=responder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder.js","sourceRoot":"","sources":["../../src/responder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResultLike, ResultPreset, ResultRenderContext, ResultResponderConfig, ResultResponderContextBase, ResultRespondInput, ResultTextContext } from "./types.js";
|
|
2
|
+
declare function createTextContext<Req = unknown, Res = unknown, TType extends string = string>(context: ResultRenderContext<Req, Res, TType>, cause: "fallback" | "no-renderer", renderError?: unknown): ResultTextContext<Req, Res, TType>;
|
|
3
|
+
declare function handleRenderFailure<Req = unknown, Res = unknown, TType extends string = string>(config: ResultResponderConfig<Req, Res, TType>, context: ResultRenderContext<Req, Res, TType>, error: unknown): unknown;
|
|
4
|
+
declare function resolveMessage<Req = unknown, Res = unknown, TType extends string = string>(level: ResultResponderContextBase<Req, Res, TType>["level"], status: number, result: ResultLike, input: ResultRespondInput<Req, Res, TType>, preset?: ResultPreset): string;
|
|
5
|
+
declare function resolveTitle<Req = unknown, Res = unknown, TType extends string = string>(level: ResultResponderContextBase<Req, Res, TType>["level"], status: number, result: ResultLike, input: ResultRespondInput<Req, Res, TType>, preset: ResultPreset): string;
|
|
6
|
+
declare function resolveView<Req = unknown, Res = unknown, TType extends string = string>(result: ResultLike, input: ResultRespondInput<Req, Res, TType>, preset: ResultPreset): string | null;
|
|
7
|
+
declare function resolveDetails<Req = unknown, Res = unknown, TType extends string = string>(result: ResultLike, input: ResultRespondInput<Req, Res, TType>): unknown;
|
|
8
|
+
declare function resolveErrorCode(level: ResultRenderContext["level"], status: number, result: ResultLike): string;
|
|
9
|
+
export { createTextContext, handleRenderFailure, resolveDetails, resolveErrorCode, resolveMessage, resolveTitle, resolveView, };
|
|
10
|
+
//# sourceMappingURL=responder_support.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder_support.d.ts","sourceRoot":"","sources":["../../src/responder_support.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAEhB,iBAAS,iBAAiB,CACxB,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC7C,KAAK,EAAE,UAAU,GAAG,aAAa,EACjC,WAAW,CAAC,EAAE,OAAO,GACpB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAOpC;AAED,iBAAS,mBAAmB,CAC1B,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,MAAM,EAAE,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC9C,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC7C,KAAK,EAAE,OAAO,WAYf;AAED,iBAAS,cAAc,CACrB,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,KAAK,EAAE,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAC3D,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC1C,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,CAkBR;AAED,iBAAS,YAAY,CACnB,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,KAAK,EAAE,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAC3D,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,YAAY,GACnB,MAAM,CAgBR;AAED,iBAAS,WAAW,CAClB,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,YAAY,GACnB,MAAM,GAAG,IAAI,CAgBf;AAED,iBAAS,cAAc,CACrB,GAAG,GAAG,OAAO,EACb,GAAG,GAAG,OAAO,EACb,KAAK,SAAS,MAAM,GAAG,MAAM,EAE7B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GACzC,OAAO,CAUT;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAoBzG;AAED,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { defaultResultMessage, defaultResultTitle, defaultTextFallback, formatErrorMessage, hasOwn, normalizeResultErrorCode, } from "./shared.js";
|
|
2
|
+
function createTextContext(context, cause, renderError) {
|
|
3
|
+
return {
|
|
4
|
+
...context,
|
|
5
|
+
text: defaultTextFallback(context.model.level, context.model.status, context.model.title),
|
|
6
|
+
cause,
|
|
7
|
+
renderError,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function handleRenderFailure(config, context, error) {
|
|
11
|
+
config.logger?.error?.("result.responder", "render-failed", {
|
|
12
|
+
level: context.level,
|
|
13
|
+
status: context.model.status,
|
|
14
|
+
type: context.model.type || null,
|
|
15
|
+
view: context.model.view,
|
|
16
|
+
error: formatErrorMessage(error),
|
|
17
|
+
...context.model.meta,
|
|
18
|
+
});
|
|
19
|
+
return config.text(createTextContext(context, "fallback", error));
|
|
20
|
+
}
|
|
21
|
+
function resolveMessage(level, status, result, input, preset) {
|
|
22
|
+
if ((level === "ok" || level === "noop") && typeof input.successMessage === "string" && input.successMessage.trim()) {
|
|
23
|
+
return input.successMessage;
|
|
24
|
+
}
|
|
25
|
+
if (typeof input.message === "string" && input.message.trim()) {
|
|
26
|
+
return input.message;
|
|
27
|
+
}
|
|
28
|
+
if (typeof result.message === "string" && result.message.trim()) {
|
|
29
|
+
return result.message;
|
|
30
|
+
}
|
|
31
|
+
if (typeof preset?.message === "string" && preset.message.trim()) {
|
|
32
|
+
return preset.message;
|
|
33
|
+
}
|
|
34
|
+
return defaultResultMessage(level, status);
|
|
35
|
+
}
|
|
36
|
+
function resolveTitle(level, status, result, input, preset) {
|
|
37
|
+
const titleFromResult = typeof result.title === "string" ? result.title : "";
|
|
38
|
+
if (typeof input.title === "string" && input.title.trim()) {
|
|
39
|
+
return input.title;
|
|
40
|
+
}
|
|
41
|
+
if (titleFromResult.trim()) {
|
|
42
|
+
return titleFromResult;
|
|
43
|
+
}
|
|
44
|
+
if (typeof preset.title === "string" && preset.title.trim()) {
|
|
45
|
+
return preset.title;
|
|
46
|
+
}
|
|
47
|
+
return defaultResultTitle(level, status);
|
|
48
|
+
}
|
|
49
|
+
function resolveView(result, input, preset) {
|
|
50
|
+
const viewFromResult = typeof result.view === "string" ? result.view : "";
|
|
51
|
+
if (typeof input.view === "string" && input.view.trim()) {
|
|
52
|
+
return input.view;
|
|
53
|
+
}
|
|
54
|
+
if (viewFromResult.trim()) {
|
|
55
|
+
return viewFromResult;
|
|
56
|
+
}
|
|
57
|
+
if (typeof preset.view === "string" && preset.view.trim()) {
|
|
58
|
+
return preset.view;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function resolveDetails(result, input) {
|
|
63
|
+
if (input.details !== undefined) {
|
|
64
|
+
return input.details;
|
|
65
|
+
}
|
|
66
|
+
if (hasOwn(result, "details")) {
|
|
67
|
+
return result.details;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
function resolveErrorCode(level, status, result) {
|
|
72
|
+
const normalized = normalizeResultErrorCode(result.error_code);
|
|
73
|
+
if (normalized) {
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
if (level === "noop") {
|
|
77
|
+
return "noop";
|
|
78
|
+
}
|
|
79
|
+
if (level === "ok") {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
if (status === 404) {
|
|
83
|
+
return "not-found";
|
|
84
|
+
}
|
|
85
|
+
return "failed";
|
|
86
|
+
}
|
|
87
|
+
export { createTextContext, handleRenderFailure, resolveDetails, resolveErrorCode, resolveMessage, resolveTitle, resolveView, };
|
|
88
|
+
//# sourceMappingURL=responder_support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder_support.js","sourceRoot":"","sources":["../../src/responder_support.ts"],"names":[],"mappings":"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"}
|