@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.
Files changed (60) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +184 -0
  4. package/dist/index.d.ts +6 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +5 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/presets.d.ts +6 -0
  9. package/dist/presets.d.ts.map +1 -0
  10. package/dist/presets.js +156 -0
  11. package/dist/presets.js.map +1 -0
  12. package/dist/responder.d.ts +4 -0
  13. package/dist/responder.d.ts.map +1 -0
  14. package/dist/responder.js +116 -0
  15. package/dist/responder.js.map +1 -0
  16. package/dist/responder_support.d.ts +10 -0
  17. package/dist/responder_support.d.ts.map +1 -0
  18. package/dist/responder_support.js +88 -0
  19. package/dist/responder_support.js.map +1 -0
  20. package/dist/result.d.ts +23 -0
  21. package/dist/result.d.ts.map +1 -0
  22. package/dist/result.js +89 -0
  23. package/dist/result.js.map +1 -0
  24. package/dist/shared.d.ts +19 -0
  25. package/dist/shared.d.ts.map +1 -0
  26. package/dist/shared.js +175 -0
  27. package/dist/shared.js.map +1 -0
  28. package/dist/src/index.d.ts +6 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +5 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/presets.d.ts +6 -0
  33. package/dist/src/presets.d.ts.map +1 -0
  34. package/dist/src/presets.js +156 -0
  35. package/dist/src/presets.js.map +1 -0
  36. package/dist/src/responder.d.ts +4 -0
  37. package/dist/src/responder.d.ts.map +1 -0
  38. package/dist/src/responder.js +116 -0
  39. package/dist/src/responder.js.map +1 -0
  40. package/dist/src/responder_support.d.ts +10 -0
  41. package/dist/src/responder_support.d.ts.map +1 -0
  42. package/dist/src/responder_support.js +88 -0
  43. package/dist/src/responder_support.js.map +1 -0
  44. package/dist/src/result.d.ts +23 -0
  45. package/dist/src/result.d.ts.map +1 -0
  46. package/dist/src/result.js +89 -0
  47. package/dist/src/result.js.map +1 -0
  48. package/dist/src/shared.d.ts +19 -0
  49. package/dist/src/shared.d.ts.map +1 -0
  50. package/dist/src/shared.js +175 -0
  51. package/dist/src/shared.js.map +1 -0
  52. package/dist/src/types.d.ts +105 -0
  53. package/dist/src/types.d.ts.map +1 -0
  54. package/dist/src/types.js +2 -0
  55. package/dist/src/types.js.map +1 -0
  56. package/dist/types.d.ts +105 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +2 -0
  59. package/dist/types.js.map +1 -0
  60. package/package.json +71 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - Added the initial `@trebired/result` release with typed result builders, a transport-agnostic responder factory, preset resolution with parent type fallback, and pack verification coverage.
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`
@@ -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"}
@@ -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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"}