@voltro/protocol 0.81.0 → 0.82.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 +1520 -6
- package/dist/apikey.d.ts +2 -2
- package/dist/index.d.ts +607 -65
- package/dist/index.js +881 -644
- package/dist/inspect.d.ts +67 -1
- package/dist/inspect.js +95 -61
- package/dist/jwt.d.ts +1 -1
- package/dist/rest.d.ts +40 -3
- package/dist/rest.js +191 -159
- package/dist/{restFormat-CzdGVkuB.js → restFormat-EZ8k9ZcQ.js} +38 -33
- package/dist/{scopes-CvU5QBQ4.js → scopes-Di756ENh.js} +126 -106
- package/dist/session.d.ts +11 -0
- package/dist/session.js +53 -52
- package/dist/sessionHeader-DriTZhmv.js +7 -0
- package/package.json +3 -3
package/dist/rest.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { H as e, V as t } from "./scopes-Di756ENh.js";
|
|
2
|
+
import { E as n, O as r, T as i, a, c as o, d as s, f as c, i as l, k as u, l as d, n as f, o as p, r as m, s as h, t as g, u as _, v, w as y, y as b } from "./restFormat-EZ8k9ZcQ.js";
|
|
3
3
|
import { Effect as x, ParseResult as S, Schema as C } from "effect";
|
|
4
4
|
import * as w from "effect/SchemaAST";
|
|
5
5
|
//#region src/publicApi.ts
|
|
@@ -7,7 +7,7 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
7
7
|
let t = e.split("/").pop() ?? e;
|
|
8
8
|
return t.endsWith("ies") ? `${t.slice(0, -3)}y` : t.endsWith("ses") || t.endsWith("xes") ? t.slice(0, -2) : t.endsWith("s") ? t.slice(0, -1) : t;
|
|
9
9
|
}, O = (e, t) => {
|
|
10
|
-
let n = t != null && (typeof t == "object" || typeof t == "function") && "ast" in t ?
|
|
10
|
+
let n = t != null && (typeof t == "object" || typeof t == "function") && "ast" in t ? B(t) : void 0;
|
|
11
11
|
if (n === void 0) return;
|
|
12
12
|
let r = `${D(e)}Id`;
|
|
13
13
|
return n.has(r) ? r : n.has("id") ? "id" : void 0;
|
|
@@ -29,19 +29,19 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
29
29
|
method: "POST",
|
|
30
30
|
path: `${o}/${s}`
|
|
31
31
|
};
|
|
32
|
-
}, A = (e) => e.replace(/\{([A-Za-z0-9_]+)\}/g, ":$1"),
|
|
32
|
+
}, A = (e) => e.replace(/\{([A-Za-z0-9_]+)\}/g, ":$1"), j = (e) => [...e.matchAll(/:([A-Za-z0-9_]+)/g)].map((e) => e[1]), M = (e) => {
|
|
33
33
|
if (w.isUnion(e)) {
|
|
34
34
|
let t = e.types.filter((e) => !w.isUndefinedKeyword(e));
|
|
35
35
|
if (t.length === 1) return t[0];
|
|
36
36
|
if (t.length !== e.types.length) return w.Union.make(t);
|
|
37
37
|
}
|
|
38
38
|
return e;
|
|
39
|
-
},
|
|
40
|
-
let n =
|
|
41
|
-
if (w.isRefinement(n) || w.isTransformation(n)) return
|
|
39
|
+
}, N = /^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, P = (e, t) => {
|
|
40
|
+
let n = M(t);
|
|
41
|
+
if (w.isRefinement(n) || w.isTransformation(n)) return P(e, n.from);
|
|
42
42
|
if (w.isUnion(n)) {
|
|
43
43
|
for (let t of n.types) {
|
|
44
|
-
let n =
|
|
44
|
+
let n = P(e, t);
|
|
45
45
|
if (n !== e) return n;
|
|
46
46
|
}
|
|
47
47
|
return e;
|
|
@@ -50,27 +50,27 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
50
50
|
let t = Array.isArray(e) ? e : e === void 0 ? void 0 : [e];
|
|
51
51
|
if (t === void 0) return e;
|
|
52
52
|
let r = n.rest[0]?.type ?? n.elements[0]?.type;
|
|
53
|
-
return r === void 0 ? t : t.map((e) =>
|
|
53
|
+
return r === void 0 ? t : t.map((e) => P(e, r));
|
|
54
54
|
}
|
|
55
55
|
if (typeof e != "string") return e;
|
|
56
|
-
if (w.isNumberKeyword(n)) return
|
|
56
|
+
if (w.isNumberKeyword(n)) return N.test(e.trim()) ? Number(e) : e;
|
|
57
57
|
if (w.isBooleanKeyword(n)) return e === "true" || e !== "false" && e;
|
|
58
58
|
if (w.isLiteral(n)) {
|
|
59
59
|
let t = n.literal;
|
|
60
|
-
return typeof t == "number" &&
|
|
60
|
+
return typeof t == "number" && N.test(e.trim()) && Number(e) === t || typeof t == "boolean" && String(t) === e ? t : e;
|
|
61
61
|
}
|
|
62
62
|
return e;
|
|
63
|
-
},
|
|
63
|
+
}, F = (e, t) => {
|
|
64
64
|
if (typeof e != "object" || !e || Array.isArray(e)) return e;
|
|
65
|
-
let n =
|
|
65
|
+
let n = M(w.encodedAST(t.ast));
|
|
66
66
|
if (!w.isTypeLiteral(n)) return e;
|
|
67
67
|
let r = { ...e };
|
|
68
68
|
for (let e of n.propertySignatures) {
|
|
69
69
|
let t = String(e.name);
|
|
70
|
-
t in r && (r[t] =
|
|
70
|
+
t in r && (r[t] = P(r[t], e.type));
|
|
71
71
|
}
|
|
72
72
|
return r;
|
|
73
|
-
},
|
|
73
|
+
}, I = (e) => {
|
|
74
74
|
let t = /* @__PURE__ */ new Set();
|
|
75
75
|
if (e === void 0) return t;
|
|
76
76
|
let n = (e) => {
|
|
@@ -92,7 +92,7 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
92
92
|
}
|
|
93
93
|
};
|
|
94
94
|
return n(e.ast), t;
|
|
95
|
-
},
|
|
95
|
+
}, L = (e, t, n) => {
|
|
96
96
|
if (n !== void 0) try {
|
|
97
97
|
let r = C.encodeUnknownSync(n)(e);
|
|
98
98
|
if (typeof r == "object" && r) return {
|
|
@@ -103,49 +103,49 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
103
103
|
let r = { error: t };
|
|
104
104
|
for (let [t, n] of Object.entries(e)) t !== "stack" && t !== "_tag" && (r[t] = n);
|
|
105
105
|
return r;
|
|
106
|
-
},
|
|
106
|
+
}, R = (e, t, n, r = []) => {
|
|
107
107
|
if (typeof e != "object" || !e) return e;
|
|
108
108
|
let i = e._tag;
|
|
109
|
-
if (typeof i != "string" || i === "ScopeError") return e;
|
|
110
|
-
if (
|
|
111
|
-
let a = r.find((e) =>
|
|
109
|
+
if (typeof i != "string" || i === "ScopeError" || i === "NoSuchResource") return e;
|
|
110
|
+
if (I(t.error).has(i)) return new Y(n.errorStatus?.[i] ?? 422, L(e, i, t.error));
|
|
111
|
+
let a = r.find((e) => I(e.schema).has(i));
|
|
112
112
|
if (a === void 0) return e;
|
|
113
113
|
let o = n.errorStatus?.[i] ?? a.rest?.status ?? 422, s = a.rest?.headers?.(e);
|
|
114
|
-
return new
|
|
115
|
-
},
|
|
116
|
-
let o =
|
|
117
|
-
if (!(o instanceof
|
|
118
|
-
let { error: s, _tag: c, ...
|
|
114
|
+
return new Y(o, L(e, i, a.schema), s);
|
|
115
|
+
}, ee = (e, t, n, r, i, a) => {
|
|
116
|
+
let o = R(e, t, n, r);
|
|
117
|
+
if (!(o instanceof Y) || i.errors === "tagged" && i.encodeError === void 0) return o;
|
|
118
|
+
let { error: s, _tag: c, ...u } = o.body, d = typeof u.message == "string" ? u.message : typeof u.reason == "string" ? u.reason : "", f = l(i, {
|
|
119
119
|
status: o.status,
|
|
120
120
|
tag: s,
|
|
121
|
-
message:
|
|
122
|
-
fields:
|
|
121
|
+
message: d,
|
|
122
|
+
fields: u
|
|
123
123
|
}, {
|
|
124
124
|
...a,
|
|
125
125
|
status: o.status
|
|
126
126
|
});
|
|
127
|
-
return new
|
|
127
|
+
return new Y(o.status, f.body, {
|
|
128
128
|
...o.headers ?? {},
|
|
129
129
|
...f.headers ?? {}
|
|
130
130
|
}, f.contentType);
|
|
131
|
-
},
|
|
131
|
+
}, z = (e, t) => {
|
|
132
132
|
if (e === void 0) return;
|
|
133
133
|
let n = w.isUnion(e.ast) ? e.ast.types : [e.ast];
|
|
134
134
|
for (let e of n) {
|
|
135
135
|
let n = C.make(e);
|
|
136
|
-
if (
|
|
136
|
+
if (I(n).has(t)) return n;
|
|
137
137
|
}
|
|
138
|
-
},
|
|
139
|
-
let t =
|
|
138
|
+
}, te = (e) => e.split(".").map((e, t) => t === 0 ? e : e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_"), B = (e) => {
|
|
139
|
+
let t = M(w.encodedAST(e.ast));
|
|
140
140
|
return w.isTypeLiteral(t) && t.indexSignatures.length === 0 ? new Set(t.propertySignatures.map((e) => String(e.name))) : void 0;
|
|
141
|
-
},
|
|
142
|
-
let n =
|
|
141
|
+
}, ne = (e, t) => e === t || JSON.stringify(e) === JSON.stringify(t), re = (e, t) => {
|
|
142
|
+
let n = M(w.encodedAST(t.ast)), r = {}, i = w.isTypeLiteral(n) ? new Map(n.propertySignatures.map((e) => [String(e.name), e.type])) : /* @__PURE__ */ new Map();
|
|
143
143
|
for (let [t, n] of Object.entries(e)) {
|
|
144
144
|
let e = i.get(t);
|
|
145
|
-
r[t] = e === void 0 ? n :
|
|
145
|
+
r[t] = e === void 0 ? n : P(n, e);
|
|
146
146
|
}
|
|
147
147
|
return r;
|
|
148
|
-
},
|
|
148
|
+
}, V = (e, t) => {
|
|
149
149
|
if (e !== void 0) {
|
|
150
150
|
try {
|
|
151
151
|
return C.encodeUnknownSync(t)(e);
|
|
@@ -155,28 +155,28 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
155
155
|
} catch {}
|
|
156
156
|
return e;
|
|
157
157
|
}
|
|
158
|
-
},
|
|
159
|
-
...e.request === void 0 ? {} : { request:
|
|
160
|
-
...e.response === void 0 ? {} : { response:
|
|
161
|
-
}),
|
|
158
|
+
}, H = (e, t, n) => ({
|
|
159
|
+
...e.request === void 0 ? {} : { request: V(e.request, t) },
|
|
160
|
+
...e.response === void 0 ? {} : { response: V(e.response, n) }
|
|
161
|
+
}), ie = () => (e) => {
|
|
162
162
|
if (e.subject.type !== "anonymous") return;
|
|
163
163
|
let t = e.subject.credentialRejected;
|
|
164
164
|
return t === void 0 ? void 0 : {
|
|
165
165
|
status: 401,
|
|
166
166
|
message: t
|
|
167
167
|
};
|
|
168
|
-
},
|
|
168
|
+
}, U = (e, t, n, r = {}) => {
|
|
169
169
|
let i = e.publicApi;
|
|
170
170
|
if (i === void 0) throw Error(`publicApiRoute: descriptor '${e.name}' has no publicApi annotation`);
|
|
171
|
-
let
|
|
171
|
+
let o = d(r.profile, i.format), c = r.pluginErrors ?? [], l = {
|
|
172
172
|
kind: e.kind,
|
|
173
173
|
input: e.input,
|
|
174
174
|
target: e.target
|
|
175
|
-
}, u = T(e.kind, i,
|
|
176
|
-
if (
|
|
177
|
-
for (let t of h) if (!
|
|
175
|
+
}, u = T(e.kind, i, l), f = (e) => o.naming === "snake_case" ? s(e) : e, p = E(e.name, i, l), m = p.replace(/:([A-Za-z0-9_]+)/g, (e, t) => `:${f(t)}`), h = j(m), g = _(e.input, o), v = B(g);
|
|
176
|
+
if (v !== void 0) {
|
|
177
|
+
for (let t of h) if (!v.has(t)) throw Error(`publicApi: descriptor '${e.name}' — path '${p}' binds ':${t}', and the input declares no field of that name` + (v.size > 0 ? ` (fields: ${[...v].join(", ")})` : " (the input declares no fields)"));
|
|
178
178
|
}
|
|
179
|
-
let y =
|
|
179
|
+
let y = _(e.output, o), b = C.Struct({ value: g }), w = u !== "GET" && (v === void 0 || [...v].some((e) => !h.includes(e))), D = {
|
|
180
180
|
query: C.Unknown,
|
|
181
181
|
params: C.Unknown,
|
|
182
182
|
form: C.Boolean
|
|
@@ -186,9 +186,9 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
186
186
|
}) : C.Struct(D), k = C.transformOrFail(O, b, {
|
|
187
187
|
strict: !1,
|
|
188
188
|
decode: (e, t, n) => {
|
|
189
|
-
let r = "body" in e ? e.body : void 0, i = u === "GET" ?
|
|
189
|
+
let r = "body" in e ? e.body : void 0, i = u === "GET" ? F(e.query, g) : e.form ? F(r ?? {}, g) : r ?? {}, a = typeof e.params == "object" && e.params !== null ? re(e.params, g) : {};
|
|
190
190
|
if (typeof i != "object" || !i || Array.isArray(i)) return S.succeed({ value: i });
|
|
191
|
-
let o = i, s = Object.keys(a).filter((e) => e in o && !
|
|
191
|
+
let o = i, s = Object.keys(a).filter((e) => e in o && !ne(o[e], a[e]));
|
|
192
192
|
if (s.length > 0) {
|
|
193
193
|
let t = u === "GET" ? "query string" : "body";
|
|
194
194
|
return S.fail(new S.Type(n, e, `${s.map((e) => `'${e}'`).join(", ")} ${s.length === 1 ? "is" : "are"} bound by the path and sent with another value in the ${t}`));
|
|
@@ -200,85 +200,86 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
200
200
|
},
|
|
201
201
|
encode: (e) => S.succeed(e)
|
|
202
202
|
}), A = [
|
|
203
|
-
|
|
204
|
-
...e.openAccess === void 0 ? [
|
|
205
|
-
...(i.scopes ?? []).map((e) =>
|
|
206
|
-
],
|
|
203
|
+
ie(),
|
|
204
|
+
...e.openAccess === void 0 ? [K()] : [],
|
|
205
|
+
...(i.scopes ?? []).map((e) => q(e))
|
|
206
|
+
], M = (() => {
|
|
207
207
|
let t = e.source;
|
|
208
208
|
return typeof t == "string" ? t : Array.isArray(t) ? t[0] : void 0;
|
|
209
|
-
})(),
|
|
209
|
+
})(), N = (t, n = 200) => ({
|
|
210
210
|
tag: e.name,
|
|
211
211
|
method: t.method,
|
|
212
212
|
path: t.path,
|
|
213
213
|
query: t.query,
|
|
214
|
-
source:
|
|
214
|
+
source: M,
|
|
215
215
|
status: n
|
|
216
|
-
}),
|
|
217
|
-
r(
|
|
216
|
+
}), P = i.stream === "sse" && e.kind === "query" && n !== void 0, L = C.encodeUnknown(y), R = P ? (e, t) => ue((r) => n(e.value, t, (e) => {
|
|
217
|
+
r(de(String(e._tag ?? "message"), e));
|
|
218
218
|
})) : async (n, r) => {
|
|
219
|
-
let
|
|
219
|
+
let s;
|
|
220
220
|
try {
|
|
221
|
-
|
|
221
|
+
s = await t(n.value, r);
|
|
222
222
|
} catch (t) {
|
|
223
|
-
throw
|
|
223
|
+
throw ee(t, e, i, c, o, N(r));
|
|
224
224
|
}
|
|
225
|
-
let l = await x.runPromise(
|
|
226
|
-
return
|
|
225
|
+
let l = await x.runPromise(L(s)), u = a(o, l, N(r));
|
|
226
|
+
return J(u.body, {
|
|
227
227
|
...u.headers === void 0 ? {} : { headers: u.headers },
|
|
228
228
|
...u.contentType === void 0 ? {} : { contentType: u.contentType }
|
|
229
229
|
});
|
|
230
|
-
},
|
|
231
|
-
for (let e of
|
|
232
|
-
let t =
|
|
233
|
-
t !== void 0 &&
|
|
230
|
+
}, V = e.error, U = [...I(V)], W = [];
|
|
231
|
+
for (let e of U) {
|
|
232
|
+
let t = z(V, e);
|
|
233
|
+
t !== void 0 && W.push({
|
|
234
234
|
status: i.errorStatus?.[e] ?? 422,
|
|
235
235
|
tag: e,
|
|
236
236
|
schema: t
|
|
237
237
|
});
|
|
238
238
|
}
|
|
239
|
-
for (let e of
|
|
240
|
-
if (
|
|
239
|
+
for (let e of c) for (let t of I(e.schema)) {
|
|
240
|
+
if (U.includes(t)) continue;
|
|
241
241
|
let n = i.errorStatus?.[t] ?? e.rest?.status;
|
|
242
242
|
if (n === void 0) continue;
|
|
243
|
-
let r =
|
|
244
|
-
|
|
243
|
+
let r = z(e.schema, t) ?? e.schema;
|
|
244
|
+
W.push({
|
|
245
245
|
status: n,
|
|
246
246
|
tag: t,
|
|
247
247
|
schema: r
|
|
248
248
|
});
|
|
249
249
|
}
|
|
250
|
-
let
|
|
250
|
+
let G = i.security === !1 ? "none" : i.security ?? (e.openAccess === void 0 ? "required" : "optional"), ae = {
|
|
251
251
|
tag: e.name,
|
|
252
252
|
kind: e.kind,
|
|
253
253
|
version: i.version ?? "v1",
|
|
254
|
-
security:
|
|
254
|
+
security: G,
|
|
255
255
|
idempotent: i.idempotent === !0,
|
|
256
256
|
input: g,
|
|
257
257
|
pathParams: h,
|
|
258
258
|
output: y,
|
|
259
|
-
source:
|
|
260
|
-
errorResponses:
|
|
261
|
-
format:
|
|
259
|
+
source: M,
|
|
260
|
+
errorResponses: W,
|
|
261
|
+
format: o
|
|
262
262
|
};
|
|
263
263
|
return le({
|
|
264
264
|
method: u,
|
|
265
265
|
path: m,
|
|
266
266
|
input: k,
|
|
267
267
|
output: C.Unknown,
|
|
268
|
-
handler:
|
|
269
|
-
...
|
|
268
|
+
handler: R,
|
|
269
|
+
...P ? { streaming: !0 } : {},
|
|
270
270
|
guards: A,
|
|
271
|
-
operationId: i.operationId ??
|
|
271
|
+
operationId: i.operationId ?? te(e.name),
|
|
272
272
|
tags: i.tags ?? [e.name.split(".")[0] ?? e.name],
|
|
273
|
-
projection:
|
|
274
|
-
...
|
|
275
|
-
...i.
|
|
273
|
+
projection: ae,
|
|
274
|
+
...o.etag && u === "GET" && !P ? { etag: !0 } : {},
|
|
275
|
+
...i.cache !== void 0 && u === "GET" && !P ? { cache: i.cache } : {},
|
|
276
|
+
...i.example === void 0 ? {} : { example: H(i.example, g, y) },
|
|
276
277
|
...i.summary === void 0 ? {} : { summary: i.summary },
|
|
277
278
|
...i.description === void 0 ? {} : { description: i.description },
|
|
278
279
|
...i.deprecated === void 0 ? {} : { deprecated: i.deprecated },
|
|
279
280
|
...i.sunset === void 0 ? {} : { sunset: i.sunset }
|
|
280
281
|
});
|
|
281
|
-
},
|
|
282
|
+
}, W = (e, t = {}) => e.filter((e) => e.descriptor.publicApi !== void 0).map((e) => U(e.descriptor, e.invoke, e.subscribe, t)).sort((e, t) => e.path.localeCompare(t.path)), G = (e) => b(e.filter((e) => e.projection !== void 0).map((e) => {
|
|
282
283
|
let t = e.projection, n = {
|
|
283
284
|
tag: t.tag,
|
|
284
285
|
method: e.method,
|
|
@@ -288,31 +289,53 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
288
289
|
security: t.security,
|
|
289
290
|
errors: [...t.errorResponses].map((e) => `${e.status}:${e.tag}`).sort()
|
|
290
291
|
};
|
|
291
|
-
return `${JSON.stringify(n)} ${
|
|
292
|
-
}).sort().join("\n")),
|
|
292
|
+
return `${JSON.stringify(n)} ${v(t.input.ast)} ${v(t.output.ast)}`;
|
|
293
|
+
}).sort().join("\n")), K = () => (e) => {
|
|
293
294
|
if (e.subject.type === "anonymous") return {
|
|
294
295
|
status: 401,
|
|
295
296
|
message: e.subject.credentialRejected ?? "Authentication required"
|
|
296
297
|
};
|
|
297
|
-
},
|
|
298
|
+
}, q = (e) => (t) => {
|
|
298
299
|
let n = t.subject.scopes;
|
|
299
300
|
if (!(n && (n.includes(e) || n.includes("admin:full")))) return {
|
|
300
301
|
status: 403,
|
|
301
302
|
message: `Missing required scope: ${e}`
|
|
302
303
|
};
|
|
303
|
-
},
|
|
304
|
+
}, ae = (e) => (t) => {
|
|
304
305
|
let n = t.subject.scopes;
|
|
305
306
|
if (!(n && (n.includes("admin:full") || e.some((e) => n.includes(e))))) return {
|
|
306
307
|
status: 403,
|
|
307
308
|
message: `Missing required scope: one of ${e.join(", ")}`
|
|
308
309
|
};
|
|
309
|
-
},
|
|
310
|
+
}, oe = (e, t, n, r) => {
|
|
311
|
+
if (e === void 0) return {};
|
|
312
|
+
let i = { Vary: "Authorization, Cookie" };
|
|
313
|
+
if (t.headers.authorization !== void 0 || t.headers.cookie !== void 0) return {
|
|
314
|
+
"Cache-Control": "private, no-cache",
|
|
315
|
+
...i
|
|
316
|
+
};
|
|
317
|
+
let a = Math.max(0, Math.floor(e.maxAge)), o = [
|
|
318
|
+
"public",
|
|
319
|
+
`max-age=${a}`,
|
|
320
|
+
`s-maxage=${a}`
|
|
321
|
+
];
|
|
322
|
+
e.staleWhileRevalidate !== void 0 && o.push(`stale-while-revalidate=${Math.max(0, Math.floor(e.staleWhileRevalidate))}`);
|
|
323
|
+
let s = [...new Set((e.tags?.(n, r) ?? []).filter((e) => e !== "" && !/[\s,]/.test(e)))];
|
|
324
|
+
return {
|
|
325
|
+
"Cache-Control": o.join(", "),
|
|
326
|
+
...i,
|
|
327
|
+
...s.length > 0 ? {
|
|
328
|
+
"Cache-Tag": s.join(","),
|
|
329
|
+
"Surrogate-Key": s.join(" ")
|
|
330
|
+
} : {}
|
|
331
|
+
};
|
|
332
|
+
}, J = (e, t = {}) => ({
|
|
310
333
|
__voltroRestResponse: !0,
|
|
311
334
|
status: t.status ?? 200,
|
|
312
335
|
body: e,
|
|
313
336
|
...t.headers === void 0 ? {} : { headers: t.headers },
|
|
314
337
|
...t.contentType === void 0 ? {} : { contentType: t.contentType }
|
|
315
|
-
}),
|
|
338
|
+
}), se = (e) => typeof e == "object" && !!e && e.__voltroRestResponse === !0, Y = class extends Error {
|
|
316
339
|
status;
|
|
317
340
|
body;
|
|
318
341
|
headers;
|
|
@@ -320,7 +343,7 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
320
343
|
constructor(e, t, n, r) {
|
|
321
344
|
super(`REST ${e}`), this.name = "RestRouteError", this.status = e, this.body = t, this.headers = n, this.contentType = r;
|
|
322
345
|
}
|
|
323
|
-
}, ce = (e, t, n) => new
|
|
346
|
+
}, ce = (e, t, n) => new Y(e, t, n), le = (e) => {
|
|
324
347
|
if (e.version === void 0) return e;
|
|
325
348
|
if (!/^v\d+$/.test(e.version)) throw Error(`defineRestRoute(${e.method} ${e.path}): version "${e.version}" must be 'v' followed by digits — 'v1', 'v2', …`);
|
|
326
349
|
if ((/* @__PURE__ */ RegExp("^/v\\d+(/|$)")).test(e.path)) throw Error(`defineRestRoute(${e.method} ${e.path}): the path already starts with a version segment AND declares version: '${e.version}'. Pick one spelling — either bake the version into the path, or declare version: and keep the path bare ('/customers'). Both would mount '/${e.version}${e.path}', which is never what the author meant.`);
|
|
@@ -328,13 +351,13 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
328
351
|
...e,
|
|
329
352
|
path: `/${e.version}${e.path}`
|
|
330
353
|
};
|
|
331
|
-
},
|
|
354
|
+
}, ue = (e, t = {}) => ({
|
|
332
355
|
__voltroRestStream: !0,
|
|
333
356
|
stream: {
|
|
334
357
|
subscribe: e,
|
|
335
358
|
...t.keepAliveMs === void 0 ? {} : { keepAliveMs: t.keepAliveMs }
|
|
336
359
|
}
|
|
337
|
-
}),
|
|
360
|
+
}), de = (e, t) => `event: ${e}\n${(typeof t == "string" ? t : JSON.stringify(t)).split("\n").map((e) => `data: ${e}`).join("\n")}\n\n`, fe = (e) => typeof e == "object" && !!e && e.__voltroRestStream === !0, pe = (e, t = {}) => ({
|
|
338
361
|
__voltroRestBytes: !0,
|
|
339
362
|
byteStream: {
|
|
340
363
|
stream: e,
|
|
@@ -344,7 +367,7 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
344
367
|
...t.contentType === void 0 ? {} : { contentType: t.contentType },
|
|
345
368
|
...t.status === void 0 ? {} : { status: t.status },
|
|
346
369
|
...t.headers === void 0 ? {} : { headers: t.headers }
|
|
347
|
-
}), X = (e) => typeof e == "object" && !!e && e.__voltroRestBytes === !0,
|
|
370
|
+
}), X = (e) => typeof e == "object" && !!e && e.__voltroRestBytes === !0, me = async (e) => {
|
|
348
371
|
let t = await globalThis.crypto.subtle.digest("SHA-1", new TextEncoder().encode(e));
|
|
349
372
|
return [...new Uint8Array(t)].map((e) => e.toString(16).padStart(2, "0")).join("");
|
|
350
373
|
}, Z = (e, t, n, r = "application/json; charset=utf-8") => ({
|
|
@@ -365,17 +388,17 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
365
388
|
query: t.query,
|
|
366
389
|
source: s.source,
|
|
367
390
|
status: n
|
|
368
|
-
},
|
|
391
|
+
}, u = l(s.format, {
|
|
369
392
|
status: n,
|
|
370
393
|
tag: r,
|
|
371
394
|
message: i,
|
|
372
395
|
fields: a
|
|
373
396
|
}, c);
|
|
374
|
-
return Z(n,
|
|
397
|
+
return Z(n, u.body, {
|
|
375
398
|
...o,
|
|
376
|
-
...
|
|
377
|
-
},
|
|
378
|
-
},
|
|
399
|
+
...u.headers ?? {}
|
|
400
|
+
}, u.contentType);
|
|
401
|
+
}, he = (e) => (e.headers["content-type"] ?? "application/json").split(";")[0].trim().toLowerCase(), ge = (e, t) => {
|
|
379
402
|
if (e.length === 0) return;
|
|
380
403
|
let n = t === "application/x-www-form-urlencoded";
|
|
381
404
|
if (!n && t !== "application/json" && !/^application\/[^/;\s]+\+json$/.test(t)) return;
|
|
@@ -383,21 +406,21 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
383
406
|
if (r.trim() !== "") {
|
|
384
407
|
if (n) {
|
|
385
408
|
let e = (e) => decodeURIComponent(e.replace(/\+/g, " "));
|
|
386
|
-
return
|
|
409
|
+
return ve(r.split("&").filter(Boolean).map((t) => {
|
|
387
410
|
let n = t.indexOf("=");
|
|
388
411
|
return n < 0 ? [e(t), ""] : [e(t.slice(0, n)), e(t.slice(n + 1))];
|
|
389
412
|
}));
|
|
390
413
|
}
|
|
391
414
|
return JSON.parse(r);
|
|
392
415
|
}
|
|
393
|
-
},
|
|
416
|
+
}, _e = (e) => ve(new URLSearchParams(e)), ve = (e) => {
|
|
394
417
|
let t = /* @__PURE__ */ new Map();
|
|
395
418
|
for (let [n, r] of e) {
|
|
396
419
|
let e = t.get(n);
|
|
397
420
|
e === void 0 ? t.set(n, r) : Array.isArray(e) ? e.push(r) : t.set(n, [e, r]);
|
|
398
421
|
}
|
|
399
422
|
return Object.fromEntries(t);
|
|
400
|
-
},
|
|
423
|
+
}, ye = (e, t) => {
|
|
401
424
|
let n = e.split("/").filter((e) => e.length > 0), r = t.split("/").filter((e) => e.length > 0), i = {};
|
|
402
425
|
for (let e = 0; e < n.length; e++) {
|
|
403
426
|
let t = n[e];
|
|
@@ -411,7 +434,7 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
411
434
|
}
|
|
412
435
|
}
|
|
413
436
|
return i;
|
|
414
|
-
},
|
|
437
|
+
}, be = (e, t) => {
|
|
415
438
|
let n = e.path.split("/"), r = n[n.length - 1] === "*", i = r ? n.slice(0, -1) : n, a = t.split("/");
|
|
416
439
|
if (a.length < i.length) return !1;
|
|
417
440
|
for (let e = 0; e < i.length; e++) {
|
|
@@ -421,18 +444,18 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
421
444
|
} else if (t !== n) return !1;
|
|
422
445
|
}
|
|
423
446
|
return a.length === i.length ? !0 : e.match === "exact" && !r ? !1 : a.slice(i.length).some((e) => e.length > 0);
|
|
424
|
-
},
|
|
425
|
-
query:
|
|
447
|
+
}, xe = (e, t, n) => ({
|
|
448
|
+
query: _e(e.query),
|
|
426
449
|
params: t,
|
|
427
|
-
body: n ?
|
|
428
|
-
form:
|
|
450
|
+
body: n ? ge(e.rawBody, he(e)) : void 0,
|
|
451
|
+
form: he(e) === "application/x-www-form-urlencoded"
|
|
429
452
|
}), $ = /* @__PURE__ */ new Set([
|
|
430
453
|
"POST",
|
|
431
454
|
"PUT",
|
|
432
455
|
"PATCH",
|
|
433
456
|
"DELETE"
|
|
434
|
-
]),
|
|
435
|
-
if (e instanceof
|
|
457
|
+
]), Se = (e, n, r, i, a) => {
|
|
458
|
+
if (e instanceof Y) return Z(e.status, e.body, {
|
|
436
459
|
...i,
|
|
437
460
|
...e.headers
|
|
438
461
|
}, e.contentType);
|
|
@@ -444,8 +467,15 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
444
467
|
let e = n.type === "anonymous" ? 401 : 403;
|
|
445
468
|
return Q(r, a, e, e === 401 ? "Unauthorized" : "Forbidden", typeof o.message == "string" ? o.message : "Forbidden", {}, { ...i });
|
|
446
469
|
}
|
|
470
|
+
if (o._tag === "NoSuchResource") {
|
|
471
|
+
let t = e;
|
|
472
|
+
return Q(r, a, 404, "NoSuchResource", typeof o.message == "string" ? o.message : "Not Found", {
|
|
473
|
+
resourceType: typeof t.resourceType == "string" ? t.resourceType : null,
|
|
474
|
+
resourceId: typeof t.resourceId == "string" ? t.resourceId : null
|
|
475
|
+
}, { ...i });
|
|
476
|
+
}
|
|
447
477
|
}
|
|
448
|
-
return
|
|
478
|
+
return c({
|
|
449
479
|
error: e,
|
|
450
480
|
source: "rest",
|
|
451
481
|
name: `${r.method} ${r.path}`,
|
|
@@ -454,65 +484,65 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
454
484
|
...Q(r, a, 500, "InternalServerError", "Internal Server Error", {}, { ...i }),
|
|
455
485
|
cause: e
|
|
456
486
|
};
|
|
457
|
-
},
|
|
458
|
-
let
|
|
459
|
-
|
|
460
|
-
let m = (e) => e.replace(/\/$/, "").split("/").length, h = m(
|
|
461
|
-
return
|
|
462
|
-
method:
|
|
487
|
+
}, Ce = (a, o, s) => {
|
|
488
|
+
let c = a.input ? C.decodeUnknown(a.input) : void 0, l = C.encode(a.output), d = a.input === void 0 ? void 0 : w.encodedAST(a.input.ast), f = d !== void 0 && (!w.isTypeLiteral(d) || d.indexSignatures.length > 0 || d.propertySignatures.some((e) => e.name === "body")), p = {};
|
|
489
|
+
a.projection !== void 0 && (p["x-voltro-rest-profile"] = a.projection.format.name);
|
|
490
|
+
let m = (e) => e.replace(/\/$/, "").split("/").length, h = m(a.path);
|
|
491
|
+
return a.deprecated !== void 0 && (p.Deprecation = "true"), a.sunset !== void 0 && (p.Sunset = a.sunset), {
|
|
492
|
+
method: a.method,
|
|
463
493
|
answersOtherMethods: !0,
|
|
464
|
-
path:
|
|
465
|
-
match:
|
|
466
|
-
...
|
|
494
|
+
path: a.path,
|
|
495
|
+
match: a.path.endsWith("/*") ? "prefix" : "exact",
|
|
496
|
+
...a.maxBodyBytes === void 0 ? {} : { maxBodyBytes: a.maxBodyBytes },
|
|
467
497
|
handle: async (d) => {
|
|
468
|
-
if (!
|
|
498
|
+
if (!a.path.endsWith("/*") && m(d.path) !== h) return Q(a, d, 404, "NotFound", "Not Found", {}, { ...p });
|
|
469
499
|
let g = d.method.toUpperCase();
|
|
470
|
-
if (!(g ===
|
|
500
|
+
if (!(g === a.method || g === "HEAD" && a.method === "GET")) return Q(a, d, 405, "MethodNotAllowed", "Method Not Allowed", { allow: s }, {
|
|
471
501
|
...p,
|
|
472
|
-
Allow:
|
|
502
|
+
Allow: s
|
|
473
503
|
});
|
|
474
|
-
if (
|
|
475
|
-
let e = Date.parse(
|
|
476
|
-
if (!Number.isNaN(e) && Date.now() >= e) return Q(
|
|
477
|
-
...
|
|
478
|
-
...
|
|
504
|
+
if (a.sunset !== void 0) {
|
|
505
|
+
let e = Date.parse(a.sunset);
|
|
506
|
+
if (!Number.isNaN(e) && Date.now() >= e) return Q(a, d, 410, "Gone", "Gone", {
|
|
507
|
+
...a.version === void 0 ? {} : { version: a.version },
|
|
508
|
+
...a.deprecated === void 0 ? {} : { replacement: a.deprecated }
|
|
479
509
|
}, { ...p });
|
|
480
510
|
}
|
|
481
511
|
let _;
|
|
482
|
-
if (
|
|
512
|
+
if (c) {
|
|
483
513
|
let e;
|
|
484
514
|
try {
|
|
485
|
-
e =
|
|
515
|
+
e = xe(d, ye(a.path, d.path), f);
|
|
486
516
|
} catch {
|
|
487
|
-
return Q(
|
|
517
|
+
return Q(a, d, 400, "InvalidRequest", "Malformed request body", {}, { ...p });
|
|
488
518
|
}
|
|
489
|
-
let t = await x.runPromise(
|
|
519
|
+
let t = await x.runPromise(c(e).pipe(x.map((e) => ({
|
|
490
520
|
ok: !0,
|
|
491
521
|
value: e
|
|
492
522
|
})), x.catchAll((e) => x.succeed({
|
|
493
523
|
ok: !1,
|
|
494
524
|
cause: e
|
|
495
525
|
}))));
|
|
496
|
-
if (!t.ok) return Q(
|
|
526
|
+
if (!t.ok) return Q(a, d, 400, "InvalidRequest", "Invalid request", { detail: String(t.cause) }, { ...p });
|
|
497
527
|
_ = t.value;
|
|
498
528
|
}
|
|
499
529
|
let v;
|
|
500
530
|
try {
|
|
501
|
-
v =
|
|
531
|
+
v = o.resolveSubject ? await o.resolveSubject(d.headers) : e(d.headers["x-tenant"] ?? null);
|
|
502
532
|
} catch (e) {
|
|
503
533
|
if (e instanceof t || typeof e == "object" && e && e._tag === "Unauthenticated") {
|
|
504
534
|
let t = e.reason;
|
|
505
|
-
return Q(
|
|
535
|
+
return Q(a, d, 401, "Unauthorized", t ?? "Authentication required", {}, { ...p });
|
|
506
536
|
}
|
|
507
537
|
throw e;
|
|
508
538
|
}
|
|
509
|
-
let
|
|
539
|
+
let b;
|
|
510
540
|
try {
|
|
511
|
-
|
|
541
|
+
b = o.buildContext ? await o.buildContext(v, d.headers) : void 0;
|
|
512
542
|
} catch (e) {
|
|
513
|
-
return
|
|
543
|
+
return Se(e, v, a, p, d);
|
|
514
544
|
}
|
|
515
|
-
let S = typeof
|
|
545
|
+
let S = typeof b == "object" && b && "store" in b ? b.store : o.store, C = {
|
|
516
546
|
subject: v,
|
|
517
547
|
headers: d.headers,
|
|
518
548
|
store: S,
|
|
@@ -520,26 +550,26 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
520
550
|
path: d.path,
|
|
521
551
|
query: d.query,
|
|
522
552
|
rawBody: d.rawBody,
|
|
523
|
-
...
|
|
553
|
+
...b === void 0 ? {} : { app: b },
|
|
524
554
|
...d.remoteAddr === void 0 ? {} : { remoteAddr: d.remoteAddr }
|
|
525
555
|
};
|
|
526
|
-
if (
|
|
556
|
+
if (a.guards) for (let e of a.guards) {
|
|
527
557
|
let t = await e(C);
|
|
528
|
-
if (t) return Q(
|
|
558
|
+
if (t) return Q(a, d, t.status, t.status === 401 ? "Unauthorized" : t.status === 403 ? "Forbidden" : "GuardRejected", t.message, {}, { ...p });
|
|
529
559
|
}
|
|
530
|
-
let w =
|
|
560
|
+
let w = o.idempotency, T = w && $.has(a.method) ? d.headers[w.header.toLowerCase()] : void 0, E = w && T ? u(v.tenantId, a.method, a.path) : "", D;
|
|
531
561
|
if (w && T) {
|
|
532
|
-
let e = await
|
|
562
|
+
let e = await y(w.store, E, T, w.ttlMs, Date.now());
|
|
533
563
|
if (e.kind === "replay") return Z(e.response.status, e.response.body, {
|
|
534
564
|
...p,
|
|
535
565
|
"Idempotency-Replayed": "true"
|
|
536
566
|
});
|
|
537
|
-
if (e.kind === "conflict") return Q(
|
|
567
|
+
if (e.kind === "conflict") return Q(a, d, 409, "Conflict", "A request with this Idempotency-Key is already being processed", {}, { ...p });
|
|
538
568
|
D = r(w.store, E, T);
|
|
539
569
|
}
|
|
540
570
|
try {
|
|
541
|
-
let e = await
|
|
542
|
-
if (
|
|
571
|
+
let e = await a.handler(_, C);
|
|
572
|
+
if (fe(e) || X(e)) return w && T && await i(w.store, E, T), X(e) ? {
|
|
543
573
|
status: e.status ?? 200,
|
|
544
574
|
headers: {
|
|
545
575
|
...p,
|
|
@@ -552,38 +582,40 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
552
582
|
headers: p,
|
|
553
583
|
stream: e.stream
|
|
554
584
|
};
|
|
555
|
-
let t =
|
|
585
|
+
let t = se(e) ? e : J(e), r = await x.runPromise(l(t.body)), o = a.method === "GET" && t.status === 200 ? oe(a.cache, d, r, _) : {}, s = {
|
|
556
586
|
...p,
|
|
557
|
-
...t.headers
|
|
587
|
+
...t.headers,
|
|
588
|
+
...o
|
|
558
589
|
};
|
|
559
|
-
if (w && T && await
|
|
590
|
+
if (w && T && await n(w.store, E, T, {
|
|
560
591
|
status: t.status,
|
|
561
|
-
body:
|
|
562
|
-
}, Date.now()),
|
|
563
|
-
let e = `W/"${await
|
|
564
|
-
return
|
|
592
|
+
body: r
|
|
593
|
+
}, Date.now()), a.etag === !0 && a.method === "GET") {
|
|
594
|
+
let e = `W/"${await me(JSON.stringify(r))}"`, n = d.headers["if-none-match"];
|
|
595
|
+
return n !== void 0 && n.split(",").some((t) => t.trim() === e) ? {
|
|
565
596
|
status: 304,
|
|
566
597
|
headers: {
|
|
567
598
|
...p,
|
|
599
|
+
...o,
|
|
568
600
|
ETag: e
|
|
569
601
|
}
|
|
570
|
-
} : Z(t.status,
|
|
571
|
-
...
|
|
602
|
+
} : Z(t.status, r, {
|
|
603
|
+
...s,
|
|
572
604
|
ETag: e
|
|
573
605
|
}, t.contentType);
|
|
574
606
|
}
|
|
575
607
|
return t.status === 204 || t.status === 304 ? {
|
|
576
608
|
status: t.status,
|
|
577
|
-
headers:
|
|
578
|
-
} : Z(t.status,
|
|
609
|
+
headers: s
|
|
610
|
+
} : Z(t.status, r, s, t.contentType);
|
|
579
611
|
} catch (e) {
|
|
580
|
-
return w && T && await
|
|
612
|
+
return w && T && await i(w.store, E, T), Se(e, v, a, p, d);
|
|
581
613
|
} finally {
|
|
582
614
|
D?.();
|
|
583
615
|
}
|
|
584
616
|
}
|
|
585
617
|
};
|
|
586
|
-
},
|
|
618
|
+
}, we = (e, t = {}) => {
|
|
587
619
|
if (t.idempotency !== void 0) {
|
|
588
620
|
for (let t of e) if (t.streaming === !0 && $.has(t.method)) throw Error(`REST route ${t.method} ${t.path} declares \`streaming: true\` on a method the idempotency binding claims (${[...$].join("/")}). A stream cannot complete an idempotency claim — there is no replayable body to cache — so a retried request would 409 until the claim's TTL. Either serve the stream on GET, or scope the idempotency binding away from this app's streaming routes.`);
|
|
589
621
|
}
|
|
@@ -592,11 +624,11 @@ var T = (e, t, n) => t.method ?? (t.resource !== void 0 && n !== void 0 ? k("",
|
|
|
592
624
|
let e = r.get(n(t.path)) ?? [];
|
|
593
625
|
e.includes(t.method) || e.push(t.method), r.set(n(t.path), e);
|
|
594
626
|
}
|
|
595
|
-
return e.map((e) =>
|
|
596
|
-
},
|
|
627
|
+
return e.map((e) => Ce(e, t, r.get(n(e.path)).join(", ")));
|
|
628
|
+
}, Te = async (e, t) => {
|
|
597
629
|
let n = await e[0].handle(t);
|
|
598
630
|
for (let r = 1; r < e.length && n.status === 405; r++) n = await e[r].handle(t);
|
|
599
631
|
return n;
|
|
600
632
|
};
|
|
601
633
|
//#endregion
|
|
602
|
-
export {
|
|
634
|
+
export { g as JSONAPI_MEDIA_TYPE, f as PROBLEM_JSON, m as REST_PROFILE_NAMES, Y as RestRouteError, pe as bytes, F as coerceQueryObject, P as coerceQueryValue, W as collectPublicApiRoutes, I as declaredErrorTags, le as defineRestRoute, T as derivePublicMethod, E as derivePublicPath, k as deriveResource, Te as dispatchSharedPath, l as encodeRestError, a as encodeRestSuccess, z as errorMemberSchema, X as isRestByteResponse, se as isRestResponse, fe as isRestStreamResponse, ye as matchPathParams, p as nextLink, A as normalizePathParams, te as operationIdOf, j as pathParamNames, h as problemDetails, o as problemTypeOf, R as projectedFailure, U as publicApiRoute, G as publicSurfaceDigest, ae as requireAnyScope, K as requireAuthenticated, q as requireScope, d as resolveRestFormat, O as resourceIdField, J as response, ce as restError, we as restRoutesToHttpRoutes, _ as restViewSchema, be as routeAcceptsPath, ue as sse, de as sseFrame, s as toSnakeCase, H as wireExample };
|