@limboai/node 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/index.cjs +438 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.mjs +433 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.ts +94 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# @limboai/node
|
|
2
|
+
|
|
3
|
+
Node.js SDK for [C2PA](https://c2pa.org/) content credential validation.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn add @limboai/node
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { newClient, validateImageFromUrl } from '@limboai/node';
|
|
15
|
+
|
|
16
|
+
const client = newClient(new URL('https://api.limbo.ai'));
|
|
17
|
+
const result = await validateImageFromUrl(client, 'https://example.com/photo.jpg');
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
For videos (async with polling):
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { newClient, validateVideo } from '@limboai/node';
|
|
24
|
+
|
|
25
|
+
const client = newClient(new URL('https://api.limbo.ai'));
|
|
26
|
+
const { validate } = await validateVideo(client, {
|
|
27
|
+
url: new URL('https://example.com/video.mp4'),
|
|
28
|
+
token: 'your-auth-token'
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
let result = await validate();
|
|
32
|
+
while (result.status === 'pending') {
|
|
33
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
34
|
+
result = await validate();
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## License
|
|
39
|
+
|
|
40
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region ../../node_modules/openapi-fetch/dist/index.mjs
|
|
4
|
+
const PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
5
|
+
const supportsRequestInitExt = () => {
|
|
6
|
+
return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;
|
|
7
|
+
};
|
|
8
|
+
function randomID() {
|
|
9
|
+
return Math.random().toString(36).slice(2, 11);
|
|
10
|
+
}
|
|
11
|
+
function createClient(clientOptions) {
|
|
12
|
+
let { baseUrl = "", Request: CustomRequest = globalThis.Request, fetch: baseFetch = globalThis.fetch, querySerializer: globalQuerySerializer, bodySerializer: globalBodySerializer, headers: baseHeaders, requestInitExt = void 0, ...baseOptions } = { ...clientOptions };
|
|
13
|
+
requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;
|
|
14
|
+
baseUrl = removeTrailingSlash(baseUrl);
|
|
15
|
+
const globalMiddlewares = [];
|
|
16
|
+
async function coreFetch(schemaPath, fetchOptions) {
|
|
17
|
+
const { baseUrl: localBaseUrl, fetch = baseFetch, Request = CustomRequest, headers, params = {}, parseAs = "json", querySerializer: requestQuerySerializer, bodySerializer = globalBodySerializer ?? defaultBodySerializer, body, middleware: requestMiddlewares = [], ...init } = fetchOptions || {};
|
|
18
|
+
let finalBaseUrl = baseUrl;
|
|
19
|
+
if (localBaseUrl) finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
|
|
20
|
+
let querySerializer = typeof globalQuerySerializer === "function" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);
|
|
21
|
+
if (requestQuerySerializer) querySerializer = typeof requestQuerySerializer === "function" ? requestQuerySerializer : createQuerySerializer({
|
|
22
|
+
...typeof globalQuerySerializer === "object" ? globalQuerySerializer : {},
|
|
23
|
+
...requestQuerySerializer
|
|
24
|
+
});
|
|
25
|
+
const serializedBody = body === void 0 ? void 0 : bodySerializer(body, mergeHeaders(baseHeaders, headers, params.header));
|
|
26
|
+
const finalHeaders = mergeHeaders(serializedBody === void 0 || serializedBody instanceof FormData ? {} : { "Content-Type": "application/json" }, baseHeaders, headers, params.header);
|
|
27
|
+
const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
|
|
28
|
+
const requestInit = {
|
|
29
|
+
redirect: "follow",
|
|
30
|
+
...baseOptions,
|
|
31
|
+
...init,
|
|
32
|
+
body: serializedBody,
|
|
33
|
+
headers: finalHeaders
|
|
34
|
+
};
|
|
35
|
+
let id;
|
|
36
|
+
let options;
|
|
37
|
+
let request = new Request(createFinalURL(schemaPath, {
|
|
38
|
+
baseUrl: finalBaseUrl,
|
|
39
|
+
params,
|
|
40
|
+
querySerializer
|
|
41
|
+
}), requestInit);
|
|
42
|
+
let response;
|
|
43
|
+
for (const key in init) if (!(key in request)) request[key] = init[key];
|
|
44
|
+
if (finalMiddlewares.length) {
|
|
45
|
+
id = randomID();
|
|
46
|
+
options = Object.freeze({
|
|
47
|
+
baseUrl: finalBaseUrl,
|
|
48
|
+
fetch,
|
|
49
|
+
parseAs,
|
|
50
|
+
querySerializer,
|
|
51
|
+
bodySerializer
|
|
52
|
+
});
|
|
53
|
+
for (const m of finalMiddlewares) if (m && typeof m === "object" && typeof m.onRequest === "function") {
|
|
54
|
+
const result = await m.onRequest({
|
|
55
|
+
request,
|
|
56
|
+
schemaPath,
|
|
57
|
+
params,
|
|
58
|
+
options,
|
|
59
|
+
id
|
|
60
|
+
});
|
|
61
|
+
if (result) if (result instanceof Request) request = result;
|
|
62
|
+
else if (result instanceof Response) {
|
|
63
|
+
response = result;
|
|
64
|
+
break;
|
|
65
|
+
} else throw new Error("onRequest: must return new Request() or Response() when modifying the request");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!response) {
|
|
69
|
+
try {
|
|
70
|
+
response = await fetch(request, requestInitExt);
|
|
71
|
+
} catch (error2) {
|
|
72
|
+
let errorAfterMiddleware = error2;
|
|
73
|
+
if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
|
|
74
|
+
const m = finalMiddlewares[i];
|
|
75
|
+
if (m && typeof m === "object" && typeof m.onError === "function") {
|
|
76
|
+
const result = await m.onError({
|
|
77
|
+
request,
|
|
78
|
+
error: errorAfterMiddleware,
|
|
79
|
+
schemaPath,
|
|
80
|
+
params,
|
|
81
|
+
options,
|
|
82
|
+
id
|
|
83
|
+
});
|
|
84
|
+
if (result) {
|
|
85
|
+
if (result instanceof Response) {
|
|
86
|
+
errorAfterMiddleware = void 0;
|
|
87
|
+
response = result;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
if (result instanceof Error) {
|
|
91
|
+
errorAfterMiddleware = result;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
throw new Error("onError: must return new Response() or instance of Error");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (errorAfterMiddleware) throw errorAfterMiddleware;
|
|
99
|
+
}
|
|
100
|
+
if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
|
|
101
|
+
const m = finalMiddlewares[i];
|
|
102
|
+
if (m && typeof m === "object" && typeof m.onResponse === "function") {
|
|
103
|
+
const result = await m.onResponse({
|
|
104
|
+
request,
|
|
105
|
+
response,
|
|
106
|
+
schemaPath,
|
|
107
|
+
params,
|
|
108
|
+
options,
|
|
109
|
+
id
|
|
110
|
+
});
|
|
111
|
+
if (result) {
|
|
112
|
+
if (!(result instanceof Response)) throw new Error("onResponse: must return new Response() when modifying the response");
|
|
113
|
+
response = result;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (response.status === 204 || request.method === "HEAD" || response.headers.get("Content-Length") === "0") return response.ok ? {
|
|
119
|
+
data: void 0,
|
|
120
|
+
response
|
|
121
|
+
} : {
|
|
122
|
+
error: void 0,
|
|
123
|
+
response
|
|
124
|
+
};
|
|
125
|
+
if (response.ok) {
|
|
126
|
+
if (parseAs === "stream") return {
|
|
127
|
+
data: response.body,
|
|
128
|
+
response
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
data: await response[parseAs](),
|
|
132
|
+
response
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
let error = await response.text();
|
|
136
|
+
try {
|
|
137
|
+
error = JSON.parse(error);
|
|
138
|
+
} catch {}
|
|
139
|
+
return {
|
|
140
|
+
error,
|
|
141
|
+
response
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
request(method, url, init) {
|
|
146
|
+
return coreFetch(url, {
|
|
147
|
+
...init,
|
|
148
|
+
method: method.toUpperCase()
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
GET(url, init) {
|
|
152
|
+
return coreFetch(url, {
|
|
153
|
+
...init,
|
|
154
|
+
method: "GET"
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
PUT(url, init) {
|
|
158
|
+
return coreFetch(url, {
|
|
159
|
+
...init,
|
|
160
|
+
method: "PUT"
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
POST(url, init) {
|
|
164
|
+
return coreFetch(url, {
|
|
165
|
+
...init,
|
|
166
|
+
method: "POST"
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
DELETE(url, init) {
|
|
170
|
+
return coreFetch(url, {
|
|
171
|
+
...init,
|
|
172
|
+
method: "DELETE"
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
OPTIONS(url, init) {
|
|
176
|
+
return coreFetch(url, {
|
|
177
|
+
...init,
|
|
178
|
+
method: "OPTIONS"
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
HEAD(url, init) {
|
|
182
|
+
return coreFetch(url, {
|
|
183
|
+
...init,
|
|
184
|
+
method: "HEAD"
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
PATCH(url, init) {
|
|
188
|
+
return coreFetch(url, {
|
|
189
|
+
...init,
|
|
190
|
+
method: "PATCH"
|
|
191
|
+
});
|
|
192
|
+
},
|
|
193
|
+
TRACE(url, init) {
|
|
194
|
+
return coreFetch(url, {
|
|
195
|
+
...init,
|
|
196
|
+
method: "TRACE"
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
use(...middleware) {
|
|
200
|
+
for (const m of middleware) {
|
|
201
|
+
if (!m) continue;
|
|
202
|
+
if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
|
|
203
|
+
globalMiddlewares.push(m);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
eject(...middleware) {
|
|
207
|
+
for (const m of middleware) {
|
|
208
|
+
const i = globalMiddlewares.indexOf(m);
|
|
209
|
+
if (i !== -1) globalMiddlewares.splice(i, 1);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function serializePrimitiveParam(name, value, options) {
|
|
215
|
+
if (value === void 0 || value === null) return "";
|
|
216
|
+
if (typeof value === "object") throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");
|
|
217
|
+
return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;
|
|
218
|
+
}
|
|
219
|
+
function serializeObjectParam(name, value, options) {
|
|
220
|
+
if (!value || typeof value !== "object") return "";
|
|
221
|
+
const values = [];
|
|
222
|
+
const joiner = {
|
|
223
|
+
simple: ",",
|
|
224
|
+
label: ".",
|
|
225
|
+
matrix: ";"
|
|
226
|
+
}[options.style] || "&";
|
|
227
|
+
if (options.style !== "deepObject" && options.explode === false) {
|
|
228
|
+
for (const k in value) values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));
|
|
229
|
+
const final2 = values.join(",");
|
|
230
|
+
switch (options.style) {
|
|
231
|
+
case "form": return `${name}=${final2}`;
|
|
232
|
+
case "label": return `.${final2}`;
|
|
233
|
+
case "matrix": return `;${name}=${final2}`;
|
|
234
|
+
default: return final2;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for (const k in value) {
|
|
238
|
+
const finalName = options.style === "deepObject" ? `${name}[${k}]` : k;
|
|
239
|
+
values.push(serializePrimitiveParam(finalName, value[k], options));
|
|
240
|
+
}
|
|
241
|
+
const final = values.join(joiner);
|
|
242
|
+
return options.style === "label" || options.style === "matrix" ? `${joiner}${final}` : final;
|
|
243
|
+
}
|
|
244
|
+
function serializeArrayParam(name, value, options) {
|
|
245
|
+
if (!Array.isArray(value)) return "";
|
|
246
|
+
if (options.explode === false) {
|
|
247
|
+
const joiner2 = {
|
|
248
|
+
form: ",",
|
|
249
|
+
spaceDelimited: "%20",
|
|
250
|
+
pipeDelimited: "|"
|
|
251
|
+
}[options.style] || ",";
|
|
252
|
+
const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);
|
|
253
|
+
switch (options.style) {
|
|
254
|
+
case "simple": return final;
|
|
255
|
+
case "label": return `.${final}`;
|
|
256
|
+
case "matrix": return `;${name}=${final}`;
|
|
257
|
+
default: return `${name}=${final}`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const joiner = {
|
|
261
|
+
simple: ",",
|
|
262
|
+
label: ".",
|
|
263
|
+
matrix: ";"
|
|
264
|
+
}[options.style] || "&";
|
|
265
|
+
const values = [];
|
|
266
|
+
for (const v of value) if (options.style === "simple" || options.style === "label") values.push(options.allowReserved === true ? v : encodeURIComponent(v));
|
|
267
|
+
else values.push(serializePrimitiveParam(name, v, options));
|
|
268
|
+
return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner);
|
|
269
|
+
}
|
|
270
|
+
function createQuerySerializer(options) {
|
|
271
|
+
return function querySerializer(queryParams) {
|
|
272
|
+
const search = [];
|
|
273
|
+
if (queryParams && typeof queryParams === "object") for (const name in queryParams) {
|
|
274
|
+
const value = queryParams[name];
|
|
275
|
+
if (value === void 0 || value === null) continue;
|
|
276
|
+
if (Array.isArray(value)) {
|
|
277
|
+
if (value.length === 0) continue;
|
|
278
|
+
search.push(serializeArrayParam(name, value, {
|
|
279
|
+
style: "form",
|
|
280
|
+
explode: true,
|
|
281
|
+
...options?.array,
|
|
282
|
+
allowReserved: options?.allowReserved || false
|
|
283
|
+
}));
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (typeof value === "object") {
|
|
287
|
+
search.push(serializeObjectParam(name, value, {
|
|
288
|
+
style: "deepObject",
|
|
289
|
+
explode: true,
|
|
290
|
+
...options?.object,
|
|
291
|
+
allowReserved: options?.allowReserved || false
|
|
292
|
+
}));
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
search.push(serializePrimitiveParam(name, value, options));
|
|
296
|
+
}
|
|
297
|
+
return search.join("&");
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function defaultPathSerializer(pathname, pathParams) {
|
|
301
|
+
let nextURL = pathname;
|
|
302
|
+
for (const match of pathname.match(PATH_PARAM_RE) ?? []) {
|
|
303
|
+
let name = match.substring(1, match.length - 1);
|
|
304
|
+
let explode = false;
|
|
305
|
+
let style = "simple";
|
|
306
|
+
if (name.endsWith("*")) {
|
|
307
|
+
explode = true;
|
|
308
|
+
name = name.substring(0, name.length - 1);
|
|
309
|
+
}
|
|
310
|
+
if (name.startsWith(".")) {
|
|
311
|
+
style = "label";
|
|
312
|
+
name = name.substring(1);
|
|
313
|
+
} else if (name.startsWith(";")) {
|
|
314
|
+
style = "matrix";
|
|
315
|
+
name = name.substring(1);
|
|
316
|
+
}
|
|
317
|
+
if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) continue;
|
|
318
|
+
const value = pathParams[name];
|
|
319
|
+
if (Array.isArray(value)) {
|
|
320
|
+
nextURL = nextURL.replace(match, serializeArrayParam(name, value, {
|
|
321
|
+
style,
|
|
322
|
+
explode
|
|
323
|
+
}));
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (typeof value === "object") {
|
|
327
|
+
nextURL = nextURL.replace(match, serializeObjectParam(name, value, {
|
|
328
|
+
style,
|
|
329
|
+
explode
|
|
330
|
+
}));
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (style === "matrix") {
|
|
334
|
+
nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
nextURL = nextURL.replace(match, style === "label" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));
|
|
338
|
+
}
|
|
339
|
+
return nextURL;
|
|
340
|
+
}
|
|
341
|
+
function defaultBodySerializer(body, headers) {
|
|
342
|
+
if (body instanceof FormData) return body;
|
|
343
|
+
if (headers) {
|
|
344
|
+
if ((headers.get instanceof Function ? headers.get("Content-Type") ?? headers.get("content-type") : headers["Content-Type"] ?? headers["content-type"]) === "application/x-www-form-urlencoded") return new URLSearchParams(body).toString();
|
|
345
|
+
}
|
|
346
|
+
return JSON.stringify(body);
|
|
347
|
+
}
|
|
348
|
+
function createFinalURL(pathname, options) {
|
|
349
|
+
let finalURL = `${options.baseUrl}${pathname}`;
|
|
350
|
+
if (options.params?.path) finalURL = defaultPathSerializer(finalURL, options.params.path);
|
|
351
|
+
let search = options.querySerializer(options.params.query ?? {});
|
|
352
|
+
if (search.startsWith("?")) search = search.substring(1);
|
|
353
|
+
if (search) finalURL += `?${search}`;
|
|
354
|
+
return finalURL;
|
|
355
|
+
}
|
|
356
|
+
function mergeHeaders(...allHeaders) {
|
|
357
|
+
const finalHeaders = new Headers();
|
|
358
|
+
for (const h of allHeaders) {
|
|
359
|
+
if (!h || typeof h !== "object") continue;
|
|
360
|
+
const iterator = h instanceof Headers ? h.entries() : Object.entries(h);
|
|
361
|
+
for (const [k, v] of iterator) if (v === null) finalHeaders.delete(k);
|
|
362
|
+
else if (Array.isArray(v)) for (const v2 of v) finalHeaders.append(k, v2);
|
|
363
|
+
else if (v !== void 0) finalHeaders.set(k, v);
|
|
364
|
+
}
|
|
365
|
+
return finalHeaders;
|
|
366
|
+
}
|
|
367
|
+
function removeTrailingSlash(url) {
|
|
368
|
+
if (url.endsWith("/")) return url.substring(0, url.length - 1);
|
|
369
|
+
return url;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
//#endregion
|
|
373
|
+
//#region package.json
|
|
374
|
+
var name = "@limboai/node";
|
|
375
|
+
var version = "0.1.0";
|
|
376
|
+
|
|
377
|
+
//#endregion
|
|
378
|
+
//#region src/index.ts
|
|
379
|
+
const newClient = (url) => createClient({ baseUrl: url.toString() });
|
|
380
|
+
const Status = {
|
|
381
|
+
Done: "done",
|
|
382
|
+
Pending: "pending"
|
|
383
|
+
};
|
|
384
|
+
const UA = `${name} v${version}`;
|
|
385
|
+
const validateImageFromUrl = async (client, url) => {
|
|
386
|
+
const image = await fetch(url, { headers: { "User-Agent": UA } });
|
|
387
|
+
if (!image.ok) throw new Error(`Failed to fetch image from URL: ${image.status} ${image.statusText}`);
|
|
388
|
+
const blob = await image.blob();
|
|
389
|
+
const filename = url.split("/").pop();
|
|
390
|
+
if (!filename) throw new Error(`Failed to extract filename from URL: ${url}`);
|
|
391
|
+
return validateImageFromBlob(client, {
|
|
392
|
+
blob,
|
|
393
|
+
filename
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
const validateImageFromBlob = async (client, params) => {
|
|
397
|
+
const result = await client.POST("/image/validate", {
|
|
398
|
+
body: { file: "@file" },
|
|
399
|
+
headers: { "User-Agent": UA },
|
|
400
|
+
bodySerializer: (_) => {
|
|
401
|
+
const fd = new FormData();
|
|
402
|
+
fd.append("file", params.blob, params.filename);
|
|
403
|
+
return fd;
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
if (result.error) throw new Error(`Image validation failed: ${result.error.message}`);
|
|
407
|
+
return result.data;
|
|
408
|
+
};
|
|
409
|
+
const validateVideo = async (client, params) => {
|
|
410
|
+
const bearer = `Bearer ${params.token}`;
|
|
411
|
+
const result = await client.POST("/video/register", {
|
|
412
|
+
body: { videoUrl: params.url.toString() },
|
|
413
|
+
params: { header: { authorization: bearer } },
|
|
414
|
+
headers: { "User-Agent": UA }
|
|
415
|
+
});
|
|
416
|
+
if (result.error) throw new Error(`Video registration failed: ${result.error.message}`);
|
|
417
|
+
return { validate: async () => {
|
|
418
|
+
const validation = await client.GET("/video/validate", { params: {
|
|
419
|
+
query: { registrationId: result.data.id },
|
|
420
|
+
header: { authorization: bearer }
|
|
421
|
+
} });
|
|
422
|
+
if (validation.error) {
|
|
423
|
+
if (validation.response.status === 102) return { status: Status.Pending };
|
|
424
|
+
throw new Error(`Video validation failed: ${validation.error.message}`);
|
|
425
|
+
}
|
|
426
|
+
return {
|
|
427
|
+
data: { ...validation.data },
|
|
428
|
+
status: Status.Done
|
|
429
|
+
};
|
|
430
|
+
} };
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
//#endregion
|
|
434
|
+
exports.newClient = newClient;
|
|
435
|
+
exports.validateImageFromBlob = validateImageFromBlob;
|
|
436
|
+
exports.validateImageFromUrl = validateImageFromUrl;
|
|
437
|
+
exports.validateVideo = validateVideo;
|
|
438
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../node_modules/openapi-fetch/dist/index.mjs","../package.json","../src/index.ts"],"sourcesContent":["const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\nconst supportsRequestInitExt = () => {\n return typeof process === \"object\" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;\n};\nfunction randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\nfunction createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = void 0,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;\n baseUrl = removeTrailingSlash(baseUrl);\n const globalMiddlewares = [];\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n middleware: requestMiddlewares = [],\n ...init\n } = fetchOptions || {};\n let finalBaseUrl = baseUrl;\n if (localBaseUrl) {\n finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n }\n let querySerializer = typeof globalQuerySerializer === \"function\" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer = typeof requestQuerySerializer === \"function\" ? requestQuerySerializer : createQuerySerializer({\n ...typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {},\n ...requestQuerySerializer\n });\n }\n const serializedBody = body === void 0 ? void 0 : bodySerializer(\n body,\n // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:\n // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,\n // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,\n // setting the content-type at the very beginning to be overwritten.\n // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.\n mergeHeaders(baseHeaders, headers, params.header)\n );\n const finalHeaders = mergeHeaders(\n // with no body, we should not to set Content-Type\n serializedBody === void 0 || // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData ? {} : {\n \"Content-Type\": \"application/json\"\n },\n baseHeaders,\n headers,\n params.header\n );\n const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: finalHeaders\n };\n let id;\n let options;\n let request = new Request(\n createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),\n requestInit\n );\n let response;\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n if (finalMiddlewares.length) {\n id = randomID();\n options = Object.freeze({\n baseUrl: finalBaseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer\n });\n for (const m of finalMiddlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (result instanceof Request) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n if (!response) {\n try {\n response = await fetch(request, requestInitExt);\n } catch (error2) {\n let errorAfterMiddleware = error2;\n if (finalMiddlewares.length) {\n for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n const m = finalMiddlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (result instanceof Response) {\n errorAfterMiddleware = void 0;\n response = result;\n break;\n }\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n if (finalMiddlewares.length) {\n for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n const m = finalMiddlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n if (response.status === 204 || request.method === \"HEAD\" || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: void 0, response } : { error: void 0, response };\n }\n if (response.ok) {\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n let error = await response.text();\n try {\n error = JSON.parse(error);\n } catch {\n }\n return { error, response };\n }\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n globalMiddlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = globalMiddlewares.indexOf(m);\n if (i !== -1) {\n globalMiddlewares.splice(i, 1);\n }\n }\n }\n };\n}\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n GET = (init) => {\n return this.client.GET(this.url, init);\n };\n PUT = (init) => {\n return this.client.PUT(this.url, init);\n };\n POST = (init) => {\n return this.client.POST(this.url, init);\n };\n DELETE = (init) => {\n return this.client.DELETE(this.url, init);\n };\n OPTIONS = (init) => {\n return this.client.OPTIONS(this.url, init);\n };\n HEAD = (init) => {\n return this.client.HEAD(this.url, init);\n };\n PATCH = (init) => {\n return this.client.PATCH(this.url, init);\n };\n TRACE = (init) => {\n return this.client.TRACE(this.url, init);\n };\n}\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\nfunction wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n function Client() {\n }\n Client.prototype = proxy;\n const client = new Client();\n handler.client = client;\n return client;\n}\nfunction createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\nfunction serializePrimitiveParam(name, value, options) {\n if (value === void 0 || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren\\u2019t supported. Provide your own `querySerializer()` to handle these.\"\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\nfunction serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner = {\n simple: \",\",\n label: \".\",\n matrix: \";\"\n }[options.style] || \"&\";\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final2 = values.join(\",\");\n switch (options.style) {\n case \"form\": {\n return `${name}=${final2}`;\n }\n case \"label\": {\n return `.${final2}`;\n }\n case \"matrix\": {\n return `;${name}=${final2}`;\n }\n default: {\n return final2;\n }\n }\n }\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\nfunction serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n if (options.explode === false) {\n const joiner2 = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\";\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${values.join(joiner)}` : values.join(joiner);\n}\nfunction createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === void 0 || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false\n })\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false\n })\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\nfunction defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\nfunction defaultBodySerializer(body, headers) {\n if (body instanceof FormData) {\n return body;\n }\n if (headers) {\n const contentType = headers.get instanceof Function ? headers.get(\"Content-Type\") ?? headers.get(\"content-type\") : headers[\"Content-Type\"] ?? headers[\"content-type\"];\n if (contentType === \"application/x-www-form-urlencoded\") {\n return new URLSearchParams(body).toString();\n }\n }\n return JSON.stringify(body);\n}\nfunction createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\nfunction mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== void 0) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\nfunction removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n\nexport { createFinalURL, createPathBasedClient, createQuerySerializer, createClient as default, defaultBodySerializer, defaultPathSerializer, mergeHeaders, randomID, removeTrailingSlash, serializeArrayParam, serializeObjectParam, serializePrimitiveParam, wrapAsPathBasedClient };\n//# sourceMappingURL=index.mjs.map\n","","import createClient from \"openapi-fetch\";\n\nimport { name, version } from \"../package.json\";\n\nimport type { paths } from \"../types\";\nimport type { C2PAValidationResponse } from \"./types\";\n\n// Re-export C2PA types\nexport type {\n\tAssertion,\n\tC2PAValidationResponse,\n\tCertificateExtension,\n\tCertificateInfo,\n\tIdentityAssertionValue,\n\tIdentityProvider,\n\tIngredient,\n\tManifestEntry,\n\tManifestInfo,\n\tSignatureInfo,\n\tVerifiedIdentity,\n} from \"./types\";\n\nexport const newClient = (url: URL) =>\n\tcreateClient<paths>({\n\t\tbaseUrl: url.toString(),\n\t});\n\nconst Status = {\n\tDone: \"done\" as const,\n\tPending: \"pending\" as const,\n};\n\nconst UA = `${name} v${version}`;\n\nexport const validateImageFromUrl = async (\n\tclient: ReturnType<typeof newClient>,\n\turl: string,\n): Promise<C2PAValidationResponse> => {\n\tconst image = await fetch(url, {\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t});\n\tif (!image.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to fetch image from URL: ${image.status} ${image.statusText}`,\n\t\t);\n\t}\n\n\tconst blob = await image.blob();\n\n\tconst filename = url.split(\"/\").pop();\n\tif (!filename) {\n\t\tthrow new Error(`Failed to extract filename from URL: ${url}`);\n\t}\n\n\treturn validateImageFromBlob(client, {\n\t\tblob,\n\t\tfilename,\n\t});\n};\n\nexport const validateImageFromBlob = async (\n\tclient: ReturnType<typeof newClient>,\n\tparams: {\n\t\tblob: Blob;\n\t\tfilename: string;\n\t},\n): Promise<C2PAValidationResponse> => {\n\tconst result = await client.POST(\"/image/validate\", {\n\t\tbody: {\n\t\t\tfile: \"@file\",\n\t\t},\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t\tbodySerializer: (_) => {\n\t\t\tconst fd = new FormData();\n\t\t\tfd.append(\"file\", params.blob, params.filename);\n\t\t\treturn fd;\n\t\t},\n\t});\n\n\tif (result.error) {\n\t\tthrow new Error(`Image validation failed: ${result.error.message}`);\n\t}\n\n\treturn result.data as C2PAValidationResponse;\n};\n\nexport const validateVideo = async (\n\tclient: ReturnType<typeof newClient>,\n\tparams: {\n\t\turl: URL;\n\t\ttoken: string;\n\t},\n) => {\n\tconst bearer = `Bearer ${params.token}`;\n\n\tconst result = await client.POST(\"/video/register\", {\n\t\tbody: {\n\t\t\tvideoUrl: params.url.toString(),\n\t\t},\n\t\tparams: {\n\t\t\theader: {\n\t\t\t\tauthorization: bearer,\n\t\t\t},\n\t\t},\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t});\n\n\tif (result.error) {\n\t\tthrow new Error(`Video registration failed: ${result.error.message}`);\n\t}\n\n\treturn {\n\t\tvalidate: async () => {\n\t\t\tconst validation = await client.GET(\"/video/validate\", {\n\t\t\t\tparams: {\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tregistrationId: result.data.id,\n\t\t\t\t\t},\n\t\t\t\t\theader: {\n\t\t\t\t\t\tauthorization: bearer,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (validation.error) {\n\t\t\t\tif (validation.response.status === 102) {\n\t\t\t\t\treturn { status: Status.Pending };\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Video validation failed: ${validation.error.message}`);\n\t\t\t}\n\n\t\t\tconst data = { ...validation.data } as unknown as C2PAValidationResponse;\n\n\t\t\treturn {\n\t\t\t\tdata,\n\t\t\t\tstatus: Status.Done,\n\t\t\t};\n\t\t},\n\t};\n};\n\n// export const awaitValidation = async (validate: Awaited<ReturnType<typeof validateVideo>>[\"validate\"], interval = 2000) => {\n// return new Promise((resolve, reject) => {\n// const timer = setInterval(async () => {\n// try {\n// const result = await validate();\n\n// if (result.status === Status.Done) {\n// clearInterval(timer);\n// resolve(result.data);\n// }\n// } catch (error) {\n// clearInterval(timer);\n// reject(error);\n// }\n// }, interval);\n// });\n// };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { paths } from "../types";
|
|
2
|
+
import type { C2PAValidationResponse } from "./types";
|
|
3
|
+
export type { Assertion, C2PAValidationResponse, CertificateExtension, CertificateInfo, IdentityAssertionValue, IdentityProvider, Ingredient, ManifestEntry, ManifestInfo, SignatureInfo, VerifiedIdentity, } from "./types";
|
|
4
|
+
export declare const newClient: (url: URL) => import("openapi-fetch").Client<paths, `${string}/${string}`>;
|
|
5
|
+
export declare const validateImageFromUrl: (client: ReturnType<typeof newClient>, url: string) => Promise<C2PAValidationResponse>;
|
|
6
|
+
export declare const validateImageFromBlob: (client: ReturnType<typeof newClient>, params: {
|
|
7
|
+
blob: Blob;
|
|
8
|
+
filename: string;
|
|
9
|
+
}) => Promise<C2PAValidationResponse>;
|
|
10
|
+
export declare const validateVideo: (client: ReturnType<typeof newClient>, params: {
|
|
11
|
+
url: URL;
|
|
12
|
+
token: string;
|
|
13
|
+
}) => Promise<{
|
|
14
|
+
validate: () => Promise<{
|
|
15
|
+
status: "pending";
|
|
16
|
+
data?: undefined;
|
|
17
|
+
} | {
|
|
18
|
+
data: C2PAValidationResponse;
|
|
19
|
+
status: "done";
|
|
20
|
+
}>;
|
|
21
|
+
}>;
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
//#region ../../node_modules/openapi-fetch/dist/index.mjs
|
|
2
|
+
const PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
3
|
+
const supportsRequestInitExt = () => {
|
|
4
|
+
return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;
|
|
5
|
+
};
|
|
6
|
+
function randomID() {
|
|
7
|
+
return Math.random().toString(36).slice(2, 11);
|
|
8
|
+
}
|
|
9
|
+
function createClient(clientOptions) {
|
|
10
|
+
let { baseUrl = "", Request: CustomRequest = globalThis.Request, fetch: baseFetch = globalThis.fetch, querySerializer: globalQuerySerializer, bodySerializer: globalBodySerializer, headers: baseHeaders, requestInitExt = void 0, ...baseOptions } = { ...clientOptions };
|
|
11
|
+
requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;
|
|
12
|
+
baseUrl = removeTrailingSlash(baseUrl);
|
|
13
|
+
const globalMiddlewares = [];
|
|
14
|
+
async function coreFetch(schemaPath, fetchOptions) {
|
|
15
|
+
const { baseUrl: localBaseUrl, fetch = baseFetch, Request = CustomRequest, headers, params = {}, parseAs = "json", querySerializer: requestQuerySerializer, bodySerializer = globalBodySerializer ?? defaultBodySerializer, body, middleware: requestMiddlewares = [], ...init } = fetchOptions || {};
|
|
16
|
+
let finalBaseUrl = baseUrl;
|
|
17
|
+
if (localBaseUrl) finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
|
|
18
|
+
let querySerializer = typeof globalQuerySerializer === "function" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);
|
|
19
|
+
if (requestQuerySerializer) querySerializer = typeof requestQuerySerializer === "function" ? requestQuerySerializer : createQuerySerializer({
|
|
20
|
+
...typeof globalQuerySerializer === "object" ? globalQuerySerializer : {},
|
|
21
|
+
...requestQuerySerializer
|
|
22
|
+
});
|
|
23
|
+
const serializedBody = body === void 0 ? void 0 : bodySerializer(body, mergeHeaders(baseHeaders, headers, params.header));
|
|
24
|
+
const finalHeaders = mergeHeaders(serializedBody === void 0 || serializedBody instanceof FormData ? {} : { "Content-Type": "application/json" }, baseHeaders, headers, params.header);
|
|
25
|
+
const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
|
|
26
|
+
const requestInit = {
|
|
27
|
+
redirect: "follow",
|
|
28
|
+
...baseOptions,
|
|
29
|
+
...init,
|
|
30
|
+
body: serializedBody,
|
|
31
|
+
headers: finalHeaders
|
|
32
|
+
};
|
|
33
|
+
let id;
|
|
34
|
+
let options;
|
|
35
|
+
let request = new Request(createFinalURL(schemaPath, {
|
|
36
|
+
baseUrl: finalBaseUrl,
|
|
37
|
+
params,
|
|
38
|
+
querySerializer
|
|
39
|
+
}), requestInit);
|
|
40
|
+
let response;
|
|
41
|
+
for (const key in init) if (!(key in request)) request[key] = init[key];
|
|
42
|
+
if (finalMiddlewares.length) {
|
|
43
|
+
id = randomID();
|
|
44
|
+
options = Object.freeze({
|
|
45
|
+
baseUrl: finalBaseUrl,
|
|
46
|
+
fetch,
|
|
47
|
+
parseAs,
|
|
48
|
+
querySerializer,
|
|
49
|
+
bodySerializer
|
|
50
|
+
});
|
|
51
|
+
for (const m of finalMiddlewares) if (m && typeof m === "object" && typeof m.onRequest === "function") {
|
|
52
|
+
const result = await m.onRequest({
|
|
53
|
+
request,
|
|
54
|
+
schemaPath,
|
|
55
|
+
params,
|
|
56
|
+
options,
|
|
57
|
+
id
|
|
58
|
+
});
|
|
59
|
+
if (result) if (result instanceof Request) request = result;
|
|
60
|
+
else if (result instanceof Response) {
|
|
61
|
+
response = result;
|
|
62
|
+
break;
|
|
63
|
+
} else throw new Error("onRequest: must return new Request() or Response() when modifying the request");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!response) {
|
|
67
|
+
try {
|
|
68
|
+
response = await fetch(request, requestInitExt);
|
|
69
|
+
} catch (error2) {
|
|
70
|
+
let errorAfterMiddleware = error2;
|
|
71
|
+
if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
|
|
72
|
+
const m = finalMiddlewares[i];
|
|
73
|
+
if (m && typeof m === "object" && typeof m.onError === "function") {
|
|
74
|
+
const result = await m.onError({
|
|
75
|
+
request,
|
|
76
|
+
error: errorAfterMiddleware,
|
|
77
|
+
schemaPath,
|
|
78
|
+
params,
|
|
79
|
+
options,
|
|
80
|
+
id
|
|
81
|
+
});
|
|
82
|
+
if (result) {
|
|
83
|
+
if (result instanceof Response) {
|
|
84
|
+
errorAfterMiddleware = void 0;
|
|
85
|
+
response = result;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (result instanceof Error) {
|
|
89
|
+
errorAfterMiddleware = result;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
throw new Error("onError: must return new Response() or instance of Error");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (errorAfterMiddleware) throw errorAfterMiddleware;
|
|
97
|
+
}
|
|
98
|
+
if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
|
|
99
|
+
const m = finalMiddlewares[i];
|
|
100
|
+
if (m && typeof m === "object" && typeof m.onResponse === "function") {
|
|
101
|
+
const result = await m.onResponse({
|
|
102
|
+
request,
|
|
103
|
+
response,
|
|
104
|
+
schemaPath,
|
|
105
|
+
params,
|
|
106
|
+
options,
|
|
107
|
+
id
|
|
108
|
+
});
|
|
109
|
+
if (result) {
|
|
110
|
+
if (!(result instanceof Response)) throw new Error("onResponse: must return new Response() when modifying the response");
|
|
111
|
+
response = result;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (response.status === 204 || request.method === "HEAD" || response.headers.get("Content-Length") === "0") return response.ok ? {
|
|
117
|
+
data: void 0,
|
|
118
|
+
response
|
|
119
|
+
} : {
|
|
120
|
+
error: void 0,
|
|
121
|
+
response
|
|
122
|
+
};
|
|
123
|
+
if (response.ok) {
|
|
124
|
+
if (parseAs === "stream") return {
|
|
125
|
+
data: response.body,
|
|
126
|
+
response
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
data: await response[parseAs](),
|
|
130
|
+
response
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
let error = await response.text();
|
|
134
|
+
try {
|
|
135
|
+
error = JSON.parse(error);
|
|
136
|
+
} catch {}
|
|
137
|
+
return {
|
|
138
|
+
error,
|
|
139
|
+
response
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
request(method, url, init) {
|
|
144
|
+
return coreFetch(url, {
|
|
145
|
+
...init,
|
|
146
|
+
method: method.toUpperCase()
|
|
147
|
+
});
|
|
148
|
+
},
|
|
149
|
+
GET(url, init) {
|
|
150
|
+
return coreFetch(url, {
|
|
151
|
+
...init,
|
|
152
|
+
method: "GET"
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
PUT(url, init) {
|
|
156
|
+
return coreFetch(url, {
|
|
157
|
+
...init,
|
|
158
|
+
method: "PUT"
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
POST(url, init) {
|
|
162
|
+
return coreFetch(url, {
|
|
163
|
+
...init,
|
|
164
|
+
method: "POST"
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
DELETE(url, init) {
|
|
168
|
+
return coreFetch(url, {
|
|
169
|
+
...init,
|
|
170
|
+
method: "DELETE"
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
OPTIONS(url, init) {
|
|
174
|
+
return coreFetch(url, {
|
|
175
|
+
...init,
|
|
176
|
+
method: "OPTIONS"
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
HEAD(url, init) {
|
|
180
|
+
return coreFetch(url, {
|
|
181
|
+
...init,
|
|
182
|
+
method: "HEAD"
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
PATCH(url, init) {
|
|
186
|
+
return coreFetch(url, {
|
|
187
|
+
...init,
|
|
188
|
+
method: "PATCH"
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
TRACE(url, init) {
|
|
192
|
+
return coreFetch(url, {
|
|
193
|
+
...init,
|
|
194
|
+
method: "TRACE"
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
use(...middleware) {
|
|
198
|
+
for (const m of middleware) {
|
|
199
|
+
if (!m) continue;
|
|
200
|
+
if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
|
|
201
|
+
globalMiddlewares.push(m);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
eject(...middleware) {
|
|
205
|
+
for (const m of middleware) {
|
|
206
|
+
const i = globalMiddlewares.indexOf(m);
|
|
207
|
+
if (i !== -1) globalMiddlewares.splice(i, 1);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function serializePrimitiveParam(name, value, options) {
|
|
213
|
+
if (value === void 0 || value === null) return "";
|
|
214
|
+
if (typeof value === "object") throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");
|
|
215
|
+
return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;
|
|
216
|
+
}
|
|
217
|
+
function serializeObjectParam(name, value, options) {
|
|
218
|
+
if (!value || typeof value !== "object") return "";
|
|
219
|
+
const values = [];
|
|
220
|
+
const joiner = {
|
|
221
|
+
simple: ",",
|
|
222
|
+
label: ".",
|
|
223
|
+
matrix: ";"
|
|
224
|
+
}[options.style] || "&";
|
|
225
|
+
if (options.style !== "deepObject" && options.explode === false) {
|
|
226
|
+
for (const k in value) values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));
|
|
227
|
+
const final2 = values.join(",");
|
|
228
|
+
switch (options.style) {
|
|
229
|
+
case "form": return `${name}=${final2}`;
|
|
230
|
+
case "label": return `.${final2}`;
|
|
231
|
+
case "matrix": return `;${name}=${final2}`;
|
|
232
|
+
default: return final2;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
for (const k in value) {
|
|
236
|
+
const finalName = options.style === "deepObject" ? `${name}[${k}]` : k;
|
|
237
|
+
values.push(serializePrimitiveParam(finalName, value[k], options));
|
|
238
|
+
}
|
|
239
|
+
const final = values.join(joiner);
|
|
240
|
+
return options.style === "label" || options.style === "matrix" ? `${joiner}${final}` : final;
|
|
241
|
+
}
|
|
242
|
+
function serializeArrayParam(name, value, options) {
|
|
243
|
+
if (!Array.isArray(value)) return "";
|
|
244
|
+
if (options.explode === false) {
|
|
245
|
+
const joiner2 = {
|
|
246
|
+
form: ",",
|
|
247
|
+
spaceDelimited: "%20",
|
|
248
|
+
pipeDelimited: "|"
|
|
249
|
+
}[options.style] || ",";
|
|
250
|
+
const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);
|
|
251
|
+
switch (options.style) {
|
|
252
|
+
case "simple": return final;
|
|
253
|
+
case "label": return `.${final}`;
|
|
254
|
+
case "matrix": return `;${name}=${final}`;
|
|
255
|
+
default: return `${name}=${final}`;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const joiner = {
|
|
259
|
+
simple: ",",
|
|
260
|
+
label: ".",
|
|
261
|
+
matrix: ";"
|
|
262
|
+
}[options.style] || "&";
|
|
263
|
+
const values = [];
|
|
264
|
+
for (const v of value) if (options.style === "simple" || options.style === "label") values.push(options.allowReserved === true ? v : encodeURIComponent(v));
|
|
265
|
+
else values.push(serializePrimitiveParam(name, v, options));
|
|
266
|
+
return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner);
|
|
267
|
+
}
|
|
268
|
+
function createQuerySerializer(options) {
|
|
269
|
+
return function querySerializer(queryParams) {
|
|
270
|
+
const search = [];
|
|
271
|
+
if (queryParams && typeof queryParams === "object") for (const name in queryParams) {
|
|
272
|
+
const value = queryParams[name];
|
|
273
|
+
if (value === void 0 || value === null) continue;
|
|
274
|
+
if (Array.isArray(value)) {
|
|
275
|
+
if (value.length === 0) continue;
|
|
276
|
+
search.push(serializeArrayParam(name, value, {
|
|
277
|
+
style: "form",
|
|
278
|
+
explode: true,
|
|
279
|
+
...options?.array,
|
|
280
|
+
allowReserved: options?.allowReserved || false
|
|
281
|
+
}));
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (typeof value === "object") {
|
|
285
|
+
search.push(serializeObjectParam(name, value, {
|
|
286
|
+
style: "deepObject",
|
|
287
|
+
explode: true,
|
|
288
|
+
...options?.object,
|
|
289
|
+
allowReserved: options?.allowReserved || false
|
|
290
|
+
}));
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
search.push(serializePrimitiveParam(name, value, options));
|
|
294
|
+
}
|
|
295
|
+
return search.join("&");
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function defaultPathSerializer(pathname, pathParams) {
|
|
299
|
+
let nextURL = pathname;
|
|
300
|
+
for (const match of pathname.match(PATH_PARAM_RE) ?? []) {
|
|
301
|
+
let name = match.substring(1, match.length - 1);
|
|
302
|
+
let explode = false;
|
|
303
|
+
let style = "simple";
|
|
304
|
+
if (name.endsWith("*")) {
|
|
305
|
+
explode = true;
|
|
306
|
+
name = name.substring(0, name.length - 1);
|
|
307
|
+
}
|
|
308
|
+
if (name.startsWith(".")) {
|
|
309
|
+
style = "label";
|
|
310
|
+
name = name.substring(1);
|
|
311
|
+
} else if (name.startsWith(";")) {
|
|
312
|
+
style = "matrix";
|
|
313
|
+
name = name.substring(1);
|
|
314
|
+
}
|
|
315
|
+
if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) continue;
|
|
316
|
+
const value = pathParams[name];
|
|
317
|
+
if (Array.isArray(value)) {
|
|
318
|
+
nextURL = nextURL.replace(match, serializeArrayParam(name, value, {
|
|
319
|
+
style,
|
|
320
|
+
explode
|
|
321
|
+
}));
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (typeof value === "object") {
|
|
325
|
+
nextURL = nextURL.replace(match, serializeObjectParam(name, value, {
|
|
326
|
+
style,
|
|
327
|
+
explode
|
|
328
|
+
}));
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (style === "matrix") {
|
|
332
|
+
nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
nextURL = nextURL.replace(match, style === "label" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));
|
|
336
|
+
}
|
|
337
|
+
return nextURL;
|
|
338
|
+
}
|
|
339
|
+
function defaultBodySerializer(body, headers) {
|
|
340
|
+
if (body instanceof FormData) return body;
|
|
341
|
+
if (headers) {
|
|
342
|
+
if ((headers.get instanceof Function ? headers.get("Content-Type") ?? headers.get("content-type") : headers["Content-Type"] ?? headers["content-type"]) === "application/x-www-form-urlencoded") return new URLSearchParams(body).toString();
|
|
343
|
+
}
|
|
344
|
+
return JSON.stringify(body);
|
|
345
|
+
}
|
|
346
|
+
function createFinalURL(pathname, options) {
|
|
347
|
+
let finalURL = `${options.baseUrl}${pathname}`;
|
|
348
|
+
if (options.params?.path) finalURL = defaultPathSerializer(finalURL, options.params.path);
|
|
349
|
+
let search = options.querySerializer(options.params.query ?? {});
|
|
350
|
+
if (search.startsWith("?")) search = search.substring(1);
|
|
351
|
+
if (search) finalURL += `?${search}`;
|
|
352
|
+
return finalURL;
|
|
353
|
+
}
|
|
354
|
+
function mergeHeaders(...allHeaders) {
|
|
355
|
+
const finalHeaders = new Headers();
|
|
356
|
+
for (const h of allHeaders) {
|
|
357
|
+
if (!h || typeof h !== "object") continue;
|
|
358
|
+
const iterator = h instanceof Headers ? h.entries() : Object.entries(h);
|
|
359
|
+
for (const [k, v] of iterator) if (v === null) finalHeaders.delete(k);
|
|
360
|
+
else if (Array.isArray(v)) for (const v2 of v) finalHeaders.append(k, v2);
|
|
361
|
+
else if (v !== void 0) finalHeaders.set(k, v);
|
|
362
|
+
}
|
|
363
|
+
return finalHeaders;
|
|
364
|
+
}
|
|
365
|
+
function removeTrailingSlash(url) {
|
|
366
|
+
if (url.endsWith("/")) return url.substring(0, url.length - 1);
|
|
367
|
+
return url;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
//#endregion
|
|
371
|
+
//#region package.json
|
|
372
|
+
var name = "@limboai/node";
|
|
373
|
+
var version = "0.1.0";
|
|
374
|
+
|
|
375
|
+
//#endregion
|
|
376
|
+
//#region src/index.ts
|
|
377
|
+
const newClient = (url) => createClient({ baseUrl: url.toString() });
|
|
378
|
+
const Status = {
|
|
379
|
+
Done: "done",
|
|
380
|
+
Pending: "pending"
|
|
381
|
+
};
|
|
382
|
+
const UA = `${name} v${version}`;
|
|
383
|
+
const validateImageFromUrl = async (client, url) => {
|
|
384
|
+
const image = await fetch(url, { headers: { "User-Agent": UA } });
|
|
385
|
+
if (!image.ok) throw new Error(`Failed to fetch image from URL: ${image.status} ${image.statusText}`);
|
|
386
|
+
const blob = await image.blob();
|
|
387
|
+
const filename = url.split("/").pop();
|
|
388
|
+
if (!filename) throw new Error(`Failed to extract filename from URL: ${url}`);
|
|
389
|
+
return validateImageFromBlob(client, {
|
|
390
|
+
blob,
|
|
391
|
+
filename
|
|
392
|
+
});
|
|
393
|
+
};
|
|
394
|
+
const validateImageFromBlob = async (client, params) => {
|
|
395
|
+
const result = await client.POST("/image/validate", {
|
|
396
|
+
body: { file: "@file" },
|
|
397
|
+
headers: { "User-Agent": UA },
|
|
398
|
+
bodySerializer: (_) => {
|
|
399
|
+
const fd = new FormData();
|
|
400
|
+
fd.append("file", params.blob, params.filename);
|
|
401
|
+
return fd;
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
if (result.error) throw new Error(`Image validation failed: ${result.error.message}`);
|
|
405
|
+
return result.data;
|
|
406
|
+
};
|
|
407
|
+
const validateVideo = async (client, params) => {
|
|
408
|
+
const bearer = `Bearer ${params.token}`;
|
|
409
|
+
const result = await client.POST("/video/register", {
|
|
410
|
+
body: { videoUrl: params.url.toString() },
|
|
411
|
+
params: { header: { authorization: bearer } },
|
|
412
|
+
headers: { "User-Agent": UA }
|
|
413
|
+
});
|
|
414
|
+
if (result.error) throw new Error(`Video registration failed: ${result.error.message}`);
|
|
415
|
+
return { validate: async () => {
|
|
416
|
+
const validation = await client.GET("/video/validate", { params: {
|
|
417
|
+
query: { registrationId: result.data.id },
|
|
418
|
+
header: { authorization: bearer }
|
|
419
|
+
} });
|
|
420
|
+
if (validation.error) {
|
|
421
|
+
if (validation.response.status === 102) return { status: Status.Pending };
|
|
422
|
+
throw new Error(`Video validation failed: ${validation.error.message}`);
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
data: { ...validation.data },
|
|
426
|
+
status: Status.Done
|
|
427
|
+
};
|
|
428
|
+
} };
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
//#endregion
|
|
432
|
+
export { newClient, validateImageFromBlob, validateImageFromUrl, validateVideo };
|
|
433
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../node_modules/openapi-fetch/dist/index.mjs","../package.json","../src/index.ts"],"sourcesContent":["const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\nconst supportsRequestInitExt = () => {\n return typeof process === \"object\" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;\n};\nfunction randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\nfunction createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = void 0,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;\n baseUrl = removeTrailingSlash(baseUrl);\n const globalMiddlewares = [];\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n middleware: requestMiddlewares = [],\n ...init\n } = fetchOptions || {};\n let finalBaseUrl = baseUrl;\n if (localBaseUrl) {\n finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n }\n let querySerializer = typeof globalQuerySerializer === \"function\" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer = typeof requestQuerySerializer === \"function\" ? requestQuerySerializer : createQuerySerializer({\n ...typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {},\n ...requestQuerySerializer\n });\n }\n const serializedBody = body === void 0 ? void 0 : bodySerializer(\n body,\n // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:\n // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,\n // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,\n // setting the content-type at the very beginning to be overwritten.\n // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.\n mergeHeaders(baseHeaders, headers, params.header)\n );\n const finalHeaders = mergeHeaders(\n // with no body, we should not to set Content-Type\n serializedBody === void 0 || // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData ? {} : {\n \"Content-Type\": \"application/json\"\n },\n baseHeaders,\n headers,\n params.header\n );\n const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: finalHeaders\n };\n let id;\n let options;\n let request = new Request(\n createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),\n requestInit\n );\n let response;\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n if (finalMiddlewares.length) {\n id = randomID();\n options = Object.freeze({\n baseUrl: finalBaseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer\n });\n for (const m of finalMiddlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (result instanceof Request) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n if (!response) {\n try {\n response = await fetch(request, requestInitExt);\n } catch (error2) {\n let errorAfterMiddleware = error2;\n if (finalMiddlewares.length) {\n for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n const m = finalMiddlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (result instanceof Response) {\n errorAfterMiddleware = void 0;\n response = result;\n break;\n }\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n if (finalMiddlewares.length) {\n for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n const m = finalMiddlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n if (response.status === 204 || request.method === \"HEAD\" || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: void 0, response } : { error: void 0, response };\n }\n if (response.ok) {\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n let error = await response.text();\n try {\n error = JSON.parse(error);\n } catch {\n }\n return { error, response };\n }\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n globalMiddlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = globalMiddlewares.indexOf(m);\n if (i !== -1) {\n globalMiddlewares.splice(i, 1);\n }\n }\n }\n };\n}\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n GET = (init) => {\n return this.client.GET(this.url, init);\n };\n PUT = (init) => {\n return this.client.PUT(this.url, init);\n };\n POST = (init) => {\n return this.client.POST(this.url, init);\n };\n DELETE = (init) => {\n return this.client.DELETE(this.url, init);\n };\n OPTIONS = (init) => {\n return this.client.OPTIONS(this.url, init);\n };\n HEAD = (init) => {\n return this.client.HEAD(this.url, init);\n };\n PATCH = (init) => {\n return this.client.PATCH(this.url, init);\n };\n TRACE = (init) => {\n return this.client.TRACE(this.url, init);\n };\n}\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\nfunction wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n function Client() {\n }\n Client.prototype = proxy;\n const client = new Client();\n handler.client = client;\n return client;\n}\nfunction createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\nfunction serializePrimitiveParam(name, value, options) {\n if (value === void 0 || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren\\u2019t supported. Provide your own `querySerializer()` to handle these.\"\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\nfunction serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner = {\n simple: \",\",\n label: \".\",\n matrix: \";\"\n }[options.style] || \"&\";\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final2 = values.join(\",\");\n switch (options.style) {\n case \"form\": {\n return `${name}=${final2}`;\n }\n case \"label\": {\n return `.${final2}`;\n }\n case \"matrix\": {\n return `;${name}=${final2}`;\n }\n default: {\n return final2;\n }\n }\n }\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\nfunction serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n if (options.explode === false) {\n const joiner2 = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\";\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${values.join(joiner)}` : values.join(joiner);\n}\nfunction createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === void 0 || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false\n })\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false\n })\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\nfunction defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\nfunction defaultBodySerializer(body, headers) {\n if (body instanceof FormData) {\n return body;\n }\n if (headers) {\n const contentType = headers.get instanceof Function ? headers.get(\"Content-Type\") ?? headers.get(\"content-type\") : headers[\"Content-Type\"] ?? headers[\"content-type\"];\n if (contentType === \"application/x-www-form-urlencoded\") {\n return new URLSearchParams(body).toString();\n }\n }\n return JSON.stringify(body);\n}\nfunction createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\nfunction mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== void 0) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\nfunction removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n\nexport { createFinalURL, createPathBasedClient, createQuerySerializer, createClient as default, defaultBodySerializer, defaultPathSerializer, mergeHeaders, randomID, removeTrailingSlash, serializeArrayParam, serializeObjectParam, serializePrimitiveParam, wrapAsPathBasedClient };\n//# sourceMappingURL=index.mjs.map\n","","import createClient from \"openapi-fetch\";\n\nimport { name, version } from \"../package.json\";\n\nimport type { paths } from \"../types\";\nimport type { C2PAValidationResponse } from \"./types\";\n\n// Re-export C2PA types\nexport type {\n\tAssertion,\n\tC2PAValidationResponse,\n\tCertificateExtension,\n\tCertificateInfo,\n\tIdentityAssertionValue,\n\tIdentityProvider,\n\tIngredient,\n\tManifestEntry,\n\tManifestInfo,\n\tSignatureInfo,\n\tVerifiedIdentity,\n} from \"./types\";\n\nexport const newClient = (url: URL) =>\n\tcreateClient<paths>({\n\t\tbaseUrl: url.toString(),\n\t});\n\nconst Status = {\n\tDone: \"done\" as const,\n\tPending: \"pending\" as const,\n};\n\nconst UA = `${name} v${version}`;\n\nexport const validateImageFromUrl = async (\n\tclient: ReturnType<typeof newClient>,\n\turl: string,\n): Promise<C2PAValidationResponse> => {\n\tconst image = await fetch(url, {\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t});\n\tif (!image.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to fetch image from URL: ${image.status} ${image.statusText}`,\n\t\t);\n\t}\n\n\tconst blob = await image.blob();\n\n\tconst filename = url.split(\"/\").pop();\n\tif (!filename) {\n\t\tthrow new Error(`Failed to extract filename from URL: ${url}`);\n\t}\n\n\treturn validateImageFromBlob(client, {\n\t\tblob,\n\t\tfilename,\n\t});\n};\n\nexport const validateImageFromBlob = async (\n\tclient: ReturnType<typeof newClient>,\n\tparams: {\n\t\tblob: Blob;\n\t\tfilename: string;\n\t},\n): Promise<C2PAValidationResponse> => {\n\tconst result = await client.POST(\"/image/validate\", {\n\t\tbody: {\n\t\t\tfile: \"@file\",\n\t\t},\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t\tbodySerializer: (_) => {\n\t\t\tconst fd = new FormData();\n\t\t\tfd.append(\"file\", params.blob, params.filename);\n\t\t\treturn fd;\n\t\t},\n\t});\n\n\tif (result.error) {\n\t\tthrow new Error(`Image validation failed: ${result.error.message}`);\n\t}\n\n\treturn result.data as C2PAValidationResponse;\n};\n\nexport const validateVideo = async (\n\tclient: ReturnType<typeof newClient>,\n\tparams: {\n\t\turl: URL;\n\t\ttoken: string;\n\t},\n) => {\n\tconst bearer = `Bearer ${params.token}`;\n\n\tconst result = await client.POST(\"/video/register\", {\n\t\tbody: {\n\t\t\tvideoUrl: params.url.toString(),\n\t\t},\n\t\tparams: {\n\t\t\theader: {\n\t\t\t\tauthorization: bearer,\n\t\t\t},\n\t\t},\n\t\theaders: {\n\t\t\t\"User-Agent\": UA,\n\t\t},\n\t});\n\n\tif (result.error) {\n\t\tthrow new Error(`Video registration failed: ${result.error.message}`);\n\t}\n\n\treturn {\n\t\tvalidate: async () => {\n\t\t\tconst validation = await client.GET(\"/video/validate\", {\n\t\t\t\tparams: {\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tregistrationId: result.data.id,\n\t\t\t\t\t},\n\t\t\t\t\theader: {\n\t\t\t\t\t\tauthorization: bearer,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (validation.error) {\n\t\t\t\tif (validation.response.status === 102) {\n\t\t\t\t\treturn { status: Status.Pending };\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Video validation failed: ${validation.error.message}`);\n\t\t\t}\n\n\t\t\tconst data = { ...validation.data } as unknown as C2PAValidationResponse;\n\n\t\t\treturn {\n\t\t\t\tdata,\n\t\t\t\tstatus: Status.Done,\n\t\t\t};\n\t\t},\n\t};\n};\n\n// export const awaitValidation = async (validate: Awaited<ReturnType<typeof validateVideo>>[\"validate\"], interval = 2000) => {\n// return new Promise((resolve, reject) => {\n// const timer = setInterval(async () => {\n// try {\n// const result = await validate();\n\n// if (result.status === Status.Done) {\n// clearInterval(timer);\n// resolve(result.data);\n// }\n// } catch (error) {\n// clearInterval(timer);\n// reject(error);\n// }\n// }, interval);\n// });\n// };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export interface SignatureInfo {
|
|
2
|
+
algorithm: string;
|
|
3
|
+
issuer: string;
|
|
4
|
+
time: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface Assertion {
|
|
7
|
+
label: string;
|
|
8
|
+
value?: unknown;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Ingredient {
|
|
12
|
+
title: string;
|
|
13
|
+
format: string;
|
|
14
|
+
instance_id: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ManifestEntry {
|
|
17
|
+
label: string;
|
|
18
|
+
title: string;
|
|
19
|
+
format: string;
|
|
20
|
+
instance_id: string;
|
|
21
|
+
claim_generator: string;
|
|
22
|
+
signature_info: SignatureInfo;
|
|
23
|
+
assertions: Assertion[];
|
|
24
|
+
ingredients: Ingredient[];
|
|
25
|
+
has_thumbnail: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface CertificateExtension {
|
|
28
|
+
oid: string;
|
|
29
|
+
critical: boolean;
|
|
30
|
+
value: string;
|
|
31
|
+
}
|
|
32
|
+
export interface CertificateInfo {
|
|
33
|
+
issuer: string;
|
|
34
|
+
subject: string;
|
|
35
|
+
serial_number: string;
|
|
36
|
+
not_before: string;
|
|
37
|
+
not_after: string;
|
|
38
|
+
signature_algorithm: string;
|
|
39
|
+
public_key_algorithm: string;
|
|
40
|
+
key_size: number;
|
|
41
|
+
thumbprint: string;
|
|
42
|
+
extensions: CertificateExtension[];
|
|
43
|
+
certificate_chain: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface ManifestInfo {
|
|
46
|
+
title: string;
|
|
47
|
+
format: string;
|
|
48
|
+
instance_id: string;
|
|
49
|
+
assertions: Assertion[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* C2PA Validation Response
|
|
53
|
+
*
|
|
54
|
+
* This type represents the validation result from @limboai/node SDK.
|
|
55
|
+
*/
|
|
56
|
+
export interface C2PAValidationResponse {
|
|
57
|
+
status: string;
|
|
58
|
+
has_credentials: boolean;
|
|
59
|
+
manifest_info?: ManifestInfo;
|
|
60
|
+
certificate_info?: CertificateInfo;
|
|
61
|
+
validation_issues: string[];
|
|
62
|
+
human_readable_summary: string;
|
|
63
|
+
manifest_chain?: ManifestEntry[];
|
|
64
|
+
active_manifest_label?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface IdentityProvider {
|
|
67
|
+
id?: string;
|
|
68
|
+
name: string;
|
|
69
|
+
}
|
|
70
|
+
export interface VerifiedIdentity {
|
|
71
|
+
/** Display name - may come as "name" from CAWG spec or "username" */
|
|
72
|
+
name: string;
|
|
73
|
+
/** Provider information */
|
|
74
|
+
provider: IdentityProvider;
|
|
75
|
+
/** When the identity was verified (ISO 8601) */
|
|
76
|
+
verifiedAt: string;
|
|
77
|
+
/** URI to the identity profile */
|
|
78
|
+
uri?: string;
|
|
79
|
+
/** Identity type (e.g., "cawg.social_media") */
|
|
80
|
+
type?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* CAWG Identity Assertion Value
|
|
84
|
+
* Supports both direct verifiedIdentities and nested credentialSubject structure
|
|
85
|
+
*/
|
|
86
|
+
export interface IdentityAssertionValue {
|
|
87
|
+
/** Direct verifiedIdentities (simplified format) */
|
|
88
|
+
verifiedIdentities?: VerifiedIdentity[];
|
|
89
|
+
/** Verifiable Credential structure (CAWG 1.1 spec) */
|
|
90
|
+
credentialSubject?: {
|
|
91
|
+
c2paAsset?: unknown;
|
|
92
|
+
verifiedIdentities?: VerifiedIdentity[];
|
|
93
|
+
};
|
|
94
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@limboai/node",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Limbo AI Node.js SDK",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"gen": "openapi-typescript http://0.0.0.0:3041/doc/json --output ./types/index.d.ts",
|
|
21
|
+
"build": "yarn dlx rolldown -c && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"openapi-fetch": "^0.15.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"openapi-typescript": "^7.10.1",
|
|
28
|
+
"rolldown": "^1.0.0-beta.9",
|
|
29
|
+
"tsc-alias": "^1.8.16",
|
|
30
|
+
"tslib": "^2.8.1",
|
|
31
|
+
"typescript": "~5.9.3"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
}
|
|
36
|
+
}
|