@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/dist/rest.js CHANGED
@@ -1,5 +1,5 @@
1
- import { B as e, z as t } from "./scopes-CvU5QBQ4.js";
2
- import { C as n, D as r, O as i, T as a, _ as o, a as s, c, d as l, f as u, i as d, l as f, n as p, o as m, r as h, s as g, t as _, u as v, v as y, w as b } from "./restFormat-CzdGVkuB.js";
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 ? re(t) : void 0;
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"), ee = (e) => [...e.matchAll(/:([A-Za-z0-9_]+)/g)].map((e) => e[1]), j = (e) => {
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
- }, M = /^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, N = (e, t) => {
40
- let n = j(t);
41
- if (w.isRefinement(n) || w.isTransformation(n)) return N(e, n.from);
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 = N(e, t);
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) => N(e, r));
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 M.test(e.trim()) ? Number(e) : e;
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" && M.test(e.trim()) && Number(e) === t || typeof t == "boolean" && String(t) === e ? t : e;
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
- }, P = (e, t) => {
63
+ }, F = (e, t) => {
64
64
  if (typeof e != "object" || !e || Array.isArray(e)) return e;
65
- let n = j(w.encodedAST(t.ast));
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] = N(r[t], e.type));
70
+ t in r && (r[t] = P(r[t], e.type));
71
71
  }
72
72
  return r;
73
- }, F = (e) => {
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
- }, I = (e, t, n) => {
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
- }, L = (e, t, n, r = []) => {
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 (F(t.error).has(i)) return new J(n.errorStatus?.[i] ?? 422, I(e, i, t.error));
111
- let a = r.find((e) => F(e.schema).has(i));
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 J(o, I(e, i, a.schema), s);
115
- }, te = (e, t, n, r, i, a) => {
116
- let o = L(e, t, n, r);
117
- if (!(o instanceof J) || i.errors === "tagged" && i.encodeError === void 0) return o;
118
- let { error: s, _tag: c, ...l } = o.body, u = typeof l.message == "string" ? l.message : typeof l.reason == "string" ? l.reason : "", f = d(i, {
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: u,
122
- fields: l
121
+ message: d,
122
+ fields: u
123
123
  }, {
124
124
  ...a,
125
125
  status: o.status
126
126
  });
127
- return new J(o.status, f.body, {
127
+ return new Y(o.status, f.body, {
128
128
  ...o.headers ?? {},
129
129
  ...f.headers ?? {}
130
130
  }, f.contentType);
131
- }, R = (e, t) => {
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 (F(n).has(t)) return n;
136
+ if (I(n).has(t)) return n;
137
137
  }
138
- }, ne = (e) => e.split(".").map((e, t) => t === 0 ? e : e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_"), re = (e) => {
139
- let t = j(w.encodedAST(e.ast));
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
- }, ie = (e, t) => e === t || JSON.stringify(e) === JSON.stringify(t), ae = (e, t) => {
142
- let n = j(w.encodedAST(t.ast)), r = {}, i = w.isTypeLiteral(n) ? new Map(n.propertySignatures.map((e) => [String(e.name), e.type])) : /* @__PURE__ */ new Map();
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 : N(n, e);
145
+ r[t] = e === void 0 ? n : P(n, e);
146
146
  }
147
147
  return r;
148
- }, z = (e, t) => {
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
- }, oe = (e, t, n) => ({
159
- ...e.request === void 0 ? {} : { request: z(e.request, t) },
160
- ...e.response === void 0 ? {} : { response: z(e.response, n) }
161
- }), se = () => (e) => {
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
- }, B = (e, t, n, r = {}) => {
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 a = f(r.profile, i.format), o = r.pluginErrors ?? [], c = {
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, c), d = (e) => a.naming === "snake_case" ? l(e) : e, p = E(e.name, i, c), m = p.replace(/:([A-Za-z0-9_]+)/g, (e, t) => `:${d(t)}`), h = ee(m), g = v(e.input, a), _ = re(g);
176
- if (_ !== void 0) {
177
- for (let t of h) if (!_.has(t)) throw Error(`publicApi: descriptor '${e.name}' — path '${p}' binds ':${t}', and the input declares no field of that name` + (_.size > 0 ? ` (fields: ${[..._].join(", ")})` : " (the input declares no fields)"));
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 = v(e.output, a), b = C.Struct({ value: g }), w = u !== "GET" && (_ === void 0 || [..._].some((e) => !h.includes(e))), D = {
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" ? P(e.query, g) : e.form ? P(r ?? {}, g) : r ?? {}, a = typeof e.params == "object" && e.params !== null ? ae(e.params, g) : {};
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 && !ie(o[e], a[e]));
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
- se(),
204
- ...e.openAccess === void 0 ? [U()] : [],
205
- ...(i.scopes ?? []).map((e) => W(e))
206
- ], j = (() => {
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
- })(), M = (t, n = 200) => ({
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: j,
214
+ source: M,
215
215
  status: n
216
- }), N = i.stream === "sse" && e.kind === "query" && n !== void 0, I = C.encodeUnknown(y), L = N ? (e, t) => Y((r) => n(e.value, t, (e) => {
217
- r(ue(String(e._tag ?? "message"), e));
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 c;
219
+ let s;
220
220
  try {
221
- c = await t(n.value, r);
221
+ s = await t(n.value, r);
222
222
  } catch (t) {
223
- throw te(t, e, i, o, a, M(r));
223
+ throw ee(t, e, i, c, o, N(r));
224
224
  }
225
- let l = await x.runPromise(I(c)), u = s(a, l, M(r));
226
- return K(u.body, {
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
- }, z = e.error, B = [...F(z)], V = [];
231
- for (let e of B) {
232
- let t = R(z, e);
233
- t !== void 0 && V.push({
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 o) for (let t of F(e.schema)) {
240
- if (B.includes(t)) continue;
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 = R(e.schema, t) ?? e.schema;
244
- V.push({
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 H = i.security === !1 ? "none" : i.security ?? (e.openAccess === void 0 ? "required" : "optional"), G = {
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: H,
254
+ security: G,
255
255
  idempotent: i.idempotent === !0,
256
256
  input: g,
257
257
  pathParams: h,
258
258
  output: y,
259
- source: j,
260
- errorResponses: V,
261
- format: a
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: L,
269
- ...N ? { streaming: !0 } : {},
268
+ handler: R,
269
+ ...P ? { streaming: !0 } : {},
270
270
  guards: A,
271
- operationId: i.operationId ?? ne(e.name),
271
+ operationId: i.operationId ?? te(e.name),
272
272
  tags: i.tags ?? [e.name.split(".")[0] ?? e.name],
273
- projection: G,
274
- ...a.etag && u === "GET" && !N ? { etag: !0 } : {},
275
- ...i.example === void 0 ? {} : { example: oe(i.example, g, y) },
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
- }, V = (e, t = {}) => e.filter((e) => e.descriptor.publicApi !== void 0).map((e) => B(e.descriptor, e.invoke, e.subscribe, t)).sort((e, t) => e.path.localeCompare(t.path)), H = (e) => y(e.filter((e) => e.projection !== void 0).map((e) => {
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)} ${o(t.input.ast)} ${o(t.output.ast)}`;
292
- }).sort().join("\n")), U = () => (e) => {
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
- }, W = (e) => (t) => {
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
- }, G = (e) => (t) => {
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
- }, K = (e, t = {}) => ({
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
- }), q = (e) => typeof e == "object" && !!e && e.__voltroRestResponse === !0, J = class extends Error {
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 J(e, t, n), le = (e) => {
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
- }, Y = (e, t = {}) => ({
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
- }), ue = (e, t) => `event: ${e}\n${(typeof t == "string" ? t : JSON.stringify(t)).split("\n").map((e) => `data: ${e}`).join("\n")}\n\n`, de = (e) => typeof e == "object" && !!e && e.__voltroRestStream === !0, fe = (e, t = {}) => ({
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, pe = async (e) => {
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
- }, l = d(s.format, {
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, l.body, {
397
+ return Z(n, u.body, {
375
398
  ...o,
376
- ...l.headers ?? {}
377
- }, l.contentType);
378
- }, me = (e) => (e.headers["content-type"] ?? "application/json").split(";")[0].trim().toLowerCase(), he = (e, t) => {
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 _e(r.split("&").filter(Boolean).map((t) => {
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
- }, ge = (e) => _e(new URLSearchParams(e)), _e = (e) => {
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
- }, ve = (e, t) => {
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
- }, ye = (e, t) => {
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
- }, be = (e, t, n) => ({
425
- query: ge(e.query),
447
+ }, xe = (e, t, n) => ({
448
+ query: _e(e.query),
426
449
  params: t,
427
- body: n ? he(e.rawBody, me(e)) : void 0,
428
- form: me(e) === "application/x-www-form-urlencoded"
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
- ]), xe = (e, n, r, i, a) => {
435
- if (e instanceof J) return Z(e.status, e.body, {
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 u({
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
- }, Se = (o, s, c) => {
458
- let l = o.input ? C.decodeUnknown(o.input) : void 0, u = C.encode(o.output), d = o.input === void 0 ? void 0 : w.encodedAST(o.input.ast), f = d !== void 0 && (!w.isTypeLiteral(d) || d.indexSignatures.length > 0 || d.propertySignatures.some((e) => e.name === "body")), p = {};
459
- o.projection !== void 0 && (p["x-voltro-rest-profile"] = o.projection.format.name);
460
- let m = (e) => e.replace(/\/$/, "").split("/").length, h = m(o.path);
461
- return o.deprecated !== void 0 && (p.Deprecation = "true"), o.sunset !== void 0 && (p.Sunset = o.sunset), {
462
- method: o.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: o.path,
465
- match: o.path.endsWith("/*") ? "prefix" : "exact",
466
- ...o.maxBodyBytes === void 0 ? {} : { maxBodyBytes: o.maxBodyBytes },
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 (!o.path.endsWith("/*") && m(d.path) !== h) return Q(o, d, 404, "NotFound", "Not Found", {}, { ...p });
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 === o.method || g === "HEAD" && o.method === "GET")) return Q(o, d, 405, "MethodNotAllowed", "Method Not Allowed", { allow: c }, {
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: c
502
+ Allow: s
473
503
  });
474
- if (o.sunset !== void 0) {
475
- let e = Date.parse(o.sunset);
476
- if (!Number.isNaN(e) && Date.now() >= e) return Q(o, d, 410, "Gone", "Gone", {
477
- ...o.version === void 0 ? {} : { version: o.version },
478
- ...o.deprecated === void 0 ? {} : { replacement: o.deprecated }
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 (l) {
512
+ if (c) {
483
513
  let e;
484
514
  try {
485
- e = be(d, ve(o.path, d.path), f);
515
+ e = xe(d, ye(a.path, d.path), f);
486
516
  } catch {
487
- return Q(o, d, 400, "InvalidRequest", "Malformed request body", {}, { ...p });
517
+ return Q(a, d, 400, "InvalidRequest", "Malformed request body", {}, { ...p });
488
518
  }
489
- let t = await x.runPromise(l(e).pipe(x.map((e) => ({
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(o, d, 400, "InvalidRequest", "Invalid request", { detail: String(t.cause) }, { ...p });
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 = s.resolveSubject ? await s.resolveSubject(d.headers) : e(d.headers["x-tenant"] ?? null);
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(o, d, 401, "Unauthorized", t ?? "Authentication required", {}, { ...p });
535
+ return Q(a, d, 401, "Unauthorized", t ?? "Authentication required", {}, { ...p });
506
536
  }
507
537
  throw e;
508
538
  }
509
- let y;
539
+ let b;
510
540
  try {
511
- y = s.buildContext ? await s.buildContext(v, d.headers) : void 0;
541
+ b = o.buildContext ? await o.buildContext(v, d.headers) : void 0;
512
542
  } catch (e) {
513
- return xe(e, v, o, p, d);
543
+ return Se(e, v, a, p, d);
514
544
  }
515
- let S = typeof y == "object" && y && "store" in y ? y.store : s.store, C = {
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
- ...y === void 0 ? {} : { app: y },
553
+ ...b === void 0 ? {} : { app: b },
524
554
  ...d.remoteAddr === void 0 ? {} : { remoteAddr: d.remoteAddr }
525
555
  };
526
- if (o.guards) for (let e of o.guards) {
556
+ if (a.guards) for (let e of a.guards) {
527
557
  let t = await e(C);
528
- if (t) return Q(o, d, t.status, t.status === 401 ? "Unauthorized" : t.status === 403 ? "Forbidden" : "GuardRejected", t.message, {}, { ...p });
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 = s.idempotency, T = w && $.has(o.method) ? d.headers[w.header.toLowerCase()] : void 0, E = w && T ? i(v.tenantId, o.method, o.path) : "", D;
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 n(w.store, E, T, w.ttlMs, Date.now());
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(o, d, 409, "Conflict", "A request with this Idempotency-Key is already being processed", {}, { ...p });
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 o.handler(_, C);
542
- if (de(e) || X(e)) return w && T && await b(w.store, E, T), X(e) ? {
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 = q(e) ? e : K(e), n = await x.runPromise(u(t.body)), r = {
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 a(w.store, E, T, {
590
+ if (w && T && await n(w.store, E, T, {
560
591
  status: t.status,
561
- body: n
562
- }, Date.now()), o.etag === !0 && o.method === "GET") {
563
- let e = `W/"${await pe(JSON.stringify(n))}"`, i = d.headers["if-none-match"];
564
- return i !== void 0 && i.split(",").some((t) => t.trim() === e) ? {
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, n, {
571
- ...r,
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: r
578
- } : Z(t.status, n, r, t.contentType);
609
+ headers: s
610
+ } : Z(t.status, r, s, t.contentType);
579
611
  } catch (e) {
580
- return w && T && await b(w.store, E, T), xe(e, v, o, p, d);
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
- }, Ce = (e, t = {}) => {
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) => Se(e, t, r.get(n(e.path)).join(", ")));
596
- }, we = async (e, t) => {
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 { _ as JSONAPI_MEDIA_TYPE, p as PROBLEM_JSON, h as REST_PROFILE_NAMES, J as RestRouteError, fe as bytes, P as coerceQueryObject, N as coerceQueryValue, V as collectPublicApiRoutes, F as declaredErrorTags, le as defineRestRoute, T as derivePublicMethod, E as derivePublicPath, k as deriveResource, we as dispatchSharedPath, d as encodeRestError, s as encodeRestSuccess, R as errorMemberSchema, X as isRestByteResponse, q as isRestResponse, de as isRestStreamResponse, ve as matchPathParams, m as nextLink, A as normalizePathParams, ne as operationIdOf, ee as pathParamNames, g as problemDetails, c as problemTypeOf, L as projectedFailure, B as publicApiRoute, H as publicSurfaceDigest, G as requireAnyScope, U as requireAuthenticated, W as requireScope, f as resolveRestFormat, O as resourceIdField, K as response, ce as restError, Ce as restRoutesToHttpRoutes, v as restViewSchema, ye as routeAcceptsPath, Y as sse, ue as sseFrame, l as toSnakeCase, oe as wireExample };
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 };