emulate 0.5.0 → 0.6.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 +141 -19
- package/dist/api.js +460 -24
- package/dist/api.js.map +1 -1
- package/dist/{dist-PWGOAQC6.js → dist-2ZZGNPJI.js} +1 -1
- package/dist/dist-2ZZGNPJI.js.map +1 -0
- package/dist/{dist-4X2KPMAJ.js → dist-CXRPM6BK.js} +1 -3
- package/dist/dist-CXRPM6BK.js.map +1 -0
- package/dist/{dist-LDUHEJAN.js → dist-DSJSF3GY.js} +1 -3
- package/dist/dist-DSJSF3GY.js.map +1 -0
- package/dist/{dist-ETHHYBGF.js → dist-IFULY5LE.js} +1 -2
- package/dist/dist-IFULY5LE.js.map +1 -0
- package/dist/{dist-J6LHUR52.js → dist-IRUBHCZU.js} +1 -2
- package/dist/dist-IRUBHCZU.js.map +1 -0
- package/dist/{dist-ENKE2S7V.js → dist-NJJLJT2N.js} +1 -3
- package/dist/dist-NJJLJT2N.js.map +1 -0
- package/dist/dist-OGSAVJ25.js +4874 -0
- package/dist/dist-OGSAVJ25.js.map +1 -0
- package/dist/{dist-REDHDZ3V.js → dist-PO4CL5SJ.js} +1 -3
- package/dist/dist-PO4CL5SJ.js.map +1 -0
- package/dist/{dist-IBXD3O6A.js → dist-R3TNKUIE.js} +1 -3
- package/dist/dist-R3TNKUIE.js.map +1 -0
- package/dist/{dist-CFST4X4K.js → dist-WACHAAVU.js} +1 -2
- package/dist/dist-WACHAAVU.js.map +1 -0
- package/dist/{dist-5JVGPOL3.js → dist-XWWZVLQQ.js} +1 -2
- package/dist/dist-XWWZVLQQ.js.map +1 -0
- package/dist/{dist-KKTYBE5S.js → dist-ZY5SZSJ2.js} +8 -3
- package/dist/dist-ZY5SZSJ2.js.map +1 -0
- package/dist/index.js +464 -26
- package/dist/index.js.map +1 -1
- package/package.json +14 -15
- package/dist/chunk-AQ2CLRU3.js +0 -2146
- package/dist/chunk-AQ2CLRU3.js.map +0 -1
- package/dist/dist-4X2KPMAJ.js.map +0 -1
- package/dist/dist-5JVGPOL3.js.map +0 -1
- package/dist/dist-CE6BUCWQ.js +0 -1438
- package/dist/dist-CE6BUCWQ.js.map +0 -1
- package/dist/dist-CFST4X4K.js.map +0 -1
- package/dist/dist-ENKE2S7V.js.map +0 -1
- package/dist/dist-ETHHYBGF.js.map +0 -1
- package/dist/dist-IBXD3O6A.js.map +0 -1
- package/dist/dist-J6LHUR52.js.map +0 -1
- package/dist/dist-KKTYBE5S.js.map +0 -1
- package/dist/dist-LDUHEJAN.js.map +0 -1
- package/dist/dist-PWGOAQC6.js.map +0 -1
- package/dist/dist-REDHDZ3V.js.map +0 -1
package/dist/api.js
CHANGED
|
@@ -2,12 +2,9 @@ import {
|
|
|
2
2
|
importPKCS8,
|
|
3
3
|
jwtVerify
|
|
4
4
|
} from "./chunk-D6EKRYGP.js";
|
|
5
|
-
import {
|
|
6
|
-
Hono,
|
|
7
|
-
cors
|
|
8
|
-
} from "./chunk-AQ2CLRU3.js";
|
|
9
5
|
|
|
10
6
|
// ../@emulators/core/dist/index.js
|
|
7
|
+
import { createServer as createNodeServer } from "http";
|
|
11
8
|
import { createHmac } from "crypto";
|
|
12
9
|
import { readFileSync } from "fs";
|
|
13
10
|
import { fileURLToPath } from "url";
|
|
@@ -231,6 +228,397 @@ var Store = class {
|
|
|
231
228
|
}
|
|
232
229
|
}
|
|
233
230
|
};
|
|
231
|
+
var HonoRequest = class {
|
|
232
|
+
constructor(request, params) {
|
|
233
|
+
this.params = params;
|
|
234
|
+
this.raw = request;
|
|
235
|
+
this.url = request.url;
|
|
236
|
+
this.method = request.method;
|
|
237
|
+
this.path = new URL(request.url).pathname;
|
|
238
|
+
}
|
|
239
|
+
raw;
|
|
240
|
+
url;
|
|
241
|
+
method;
|
|
242
|
+
path;
|
|
243
|
+
header(name) {
|
|
244
|
+
if (name) return this.raw.headers.get(name) ?? void 0;
|
|
245
|
+
const headers = {};
|
|
246
|
+
this.raw.headers.forEach((value, key) => {
|
|
247
|
+
headers[key] = value;
|
|
248
|
+
});
|
|
249
|
+
return headers;
|
|
250
|
+
}
|
|
251
|
+
query(name) {
|
|
252
|
+
return new URL(this.url).searchParams.get(name) ?? void 0;
|
|
253
|
+
}
|
|
254
|
+
queries(name) {
|
|
255
|
+
const values = new URL(this.url).searchParams.getAll(name);
|
|
256
|
+
return values.length > 0 ? values : void 0;
|
|
257
|
+
}
|
|
258
|
+
param(name) {
|
|
259
|
+
if (!name) return { ...this.params };
|
|
260
|
+
return this.params[name] ?? "";
|
|
261
|
+
}
|
|
262
|
+
json() {
|
|
263
|
+
return this.raw.json();
|
|
264
|
+
}
|
|
265
|
+
text() {
|
|
266
|
+
return this.raw.text();
|
|
267
|
+
}
|
|
268
|
+
arrayBuffer() {
|
|
269
|
+
return this.raw.arrayBuffer();
|
|
270
|
+
}
|
|
271
|
+
async parseBody() {
|
|
272
|
+
const contentType = this.header("Content-Type") ?? "";
|
|
273
|
+
if (contentType.includes("multipart/form-data")) {
|
|
274
|
+
return formDataToObject(await this.raw.formData());
|
|
275
|
+
}
|
|
276
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
277
|
+
const params = new URLSearchParams(await this.raw.text());
|
|
278
|
+
const out = {};
|
|
279
|
+
for (const [key, value] of params) {
|
|
280
|
+
appendBodyValue(out, key, value);
|
|
281
|
+
}
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
if (contentType.includes("application/json")) {
|
|
285
|
+
const body = await this.raw.json().catch(() => ({}));
|
|
286
|
+
return body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
287
|
+
}
|
|
288
|
+
return {};
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
var Context = class {
|
|
292
|
+
constructor(request, params, notFoundHandler) {
|
|
293
|
+
this.notFoundHandler = notFoundHandler;
|
|
294
|
+
this.req = new HonoRequest(request, params);
|
|
295
|
+
}
|
|
296
|
+
req;
|
|
297
|
+
vars = /* @__PURE__ */ new Map();
|
|
298
|
+
responseHeaders = new Headers();
|
|
299
|
+
responseStatus = 200;
|
|
300
|
+
get(key) {
|
|
301
|
+
return this.vars.get(key);
|
|
302
|
+
}
|
|
303
|
+
set(key, value) {
|
|
304
|
+
this.vars.set(key, value);
|
|
305
|
+
}
|
|
306
|
+
header(name, value) {
|
|
307
|
+
this.responseHeaders.set(name, value);
|
|
308
|
+
}
|
|
309
|
+
status(status) {
|
|
310
|
+
this.responseStatus = status;
|
|
311
|
+
}
|
|
312
|
+
json(data, status, headers) {
|
|
313
|
+
return this.response(JSON.stringify(data), status, defaultContentType(headers, "application/json; charset=UTF-8"));
|
|
314
|
+
}
|
|
315
|
+
text(text, status, headers) {
|
|
316
|
+
return this.response(text, status, defaultContentType(headers, "text/plain; charset=UTF-8"));
|
|
317
|
+
}
|
|
318
|
+
html(html, status, headers) {
|
|
319
|
+
return this.response(html, status, defaultContentType(headers, "text/html; charset=UTF-8"));
|
|
320
|
+
}
|
|
321
|
+
body(body, status, headers) {
|
|
322
|
+
return this.response(body, status, headers);
|
|
323
|
+
}
|
|
324
|
+
redirect(location, status = 302) {
|
|
325
|
+
return this.response(null, status, { Location: location });
|
|
326
|
+
}
|
|
327
|
+
notFound() {
|
|
328
|
+
return this.notFoundHandler(this);
|
|
329
|
+
}
|
|
330
|
+
finalize(response) {
|
|
331
|
+
if (!hasHeaders(this.responseHeaders)) return response;
|
|
332
|
+
const headers = new Headers(response.headers);
|
|
333
|
+
this.responseHeaders.forEach((value, key) => {
|
|
334
|
+
headers.set(key, value);
|
|
335
|
+
});
|
|
336
|
+
return new Response(response.body, {
|
|
337
|
+
status: response.status,
|
|
338
|
+
statusText: response.statusText,
|
|
339
|
+
headers
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
response(body, status, headers) {
|
|
343
|
+
const merged = new Headers(headers);
|
|
344
|
+
this.responseHeaders.forEach((value, key) => {
|
|
345
|
+
merged.set(key, value);
|
|
346
|
+
});
|
|
347
|
+
return new Response(body, {
|
|
348
|
+
status: status ?? this.responseStatus,
|
|
349
|
+
headers: merged
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
var Hono = class {
|
|
354
|
+
middleware = [];
|
|
355
|
+
routes = [];
|
|
356
|
+
errorHandler = (err) => {
|
|
357
|
+
const message = err instanceof Error ? err.message : "Internal Server Error";
|
|
358
|
+
return new Response(message, { status: 500 });
|
|
359
|
+
};
|
|
360
|
+
notFoundHandler = () => new Response("404 Not Found", { status: 404 });
|
|
361
|
+
use(pathOrHandler, ...handlers) {
|
|
362
|
+
if (typeof pathOrHandler === "string") {
|
|
363
|
+
this.middleware.push({ method: "ALL", compiled: compilePath(pathOrHandler), handlers });
|
|
364
|
+
} else {
|
|
365
|
+
this.middleware.push({ method: "ALL", compiled: compilePath("*"), handlers: [pathOrHandler, ...handlers] });
|
|
366
|
+
}
|
|
367
|
+
return this;
|
|
368
|
+
}
|
|
369
|
+
on(method, path, ...handlers) {
|
|
370
|
+
this.routes.push({ method: method.toUpperCase(), compiled: compilePath(path), handlers });
|
|
371
|
+
return this;
|
|
372
|
+
}
|
|
373
|
+
get(path, ...handlers) {
|
|
374
|
+
return this.on("GET", path, ...handlers);
|
|
375
|
+
}
|
|
376
|
+
post(path, ...handlers) {
|
|
377
|
+
return this.on("POST", path, ...handlers);
|
|
378
|
+
}
|
|
379
|
+
put(path, ...handlers) {
|
|
380
|
+
return this.on("PUT", path, ...handlers);
|
|
381
|
+
}
|
|
382
|
+
patch(path, ...handlers) {
|
|
383
|
+
return this.on("PATCH", path, ...handlers);
|
|
384
|
+
}
|
|
385
|
+
delete(path, ...handlers) {
|
|
386
|
+
return this.on("DELETE", path, ...handlers);
|
|
387
|
+
}
|
|
388
|
+
onError(handler) {
|
|
389
|
+
this.errorHandler = handler;
|
|
390
|
+
return this;
|
|
391
|
+
}
|
|
392
|
+
notFound(handler) {
|
|
393
|
+
this.notFoundHandler = handler;
|
|
394
|
+
return this;
|
|
395
|
+
}
|
|
396
|
+
async request(input, init) {
|
|
397
|
+
if (input instanceof Request) return this.fetch(input);
|
|
398
|
+
const url = input.startsWith("/") ? `http://localhost${input}` : input;
|
|
399
|
+
return this.fetch(new Request(url, init));
|
|
400
|
+
}
|
|
401
|
+
fetch = async (request) => {
|
|
402
|
+
const url = new URL(request.url);
|
|
403
|
+
const path = url.pathname;
|
|
404
|
+
const method = request.method.toUpperCase();
|
|
405
|
+
const matched = this.match(method, path);
|
|
406
|
+
const context = new Context(request, matched.params, this.notFoundHandler);
|
|
407
|
+
try {
|
|
408
|
+
const response = await this.dispatch(context, matched.handlers);
|
|
409
|
+
return context.finalize(response ?? await this.notFoundHandler(context));
|
|
410
|
+
} catch (err) {
|
|
411
|
+
return context.finalize(await this.errorHandler(err, context));
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
match(method, path) {
|
|
415
|
+
const handlers = [];
|
|
416
|
+
const params = {};
|
|
417
|
+
for (const route2 of this.middleware) {
|
|
418
|
+
const match = matchPath(route2.compiled, path);
|
|
419
|
+
if (!match) continue;
|
|
420
|
+
Object.assign(params, match);
|
|
421
|
+
for (const handler of route2.handlers) {
|
|
422
|
+
handlers.push({ handler, params: match });
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const route = this.routes.find((candidate) => candidate.method === method && matchPath(candidate.compiled, path) != null) ?? (method === "HEAD" ? this.routes.find((candidate) => candidate.method === "GET" && matchPath(candidate.compiled, path) != null) : void 0);
|
|
426
|
+
if (route) {
|
|
427
|
+
const match = matchPath(route.compiled, path) ?? {};
|
|
428
|
+
Object.assign(params, match);
|
|
429
|
+
for (const handler of route.handlers) {
|
|
430
|
+
handlers.push({ handler, params: match });
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return { handlers, params };
|
|
434
|
+
}
|
|
435
|
+
async dispatch(context, handlers) {
|
|
436
|
+
let index = -1;
|
|
437
|
+
const run = async (nextIndex) => {
|
|
438
|
+
if (nextIndex <= index) throw new Error("next() called multiple times");
|
|
439
|
+
index = nextIndex;
|
|
440
|
+
const matched = handlers[nextIndex];
|
|
441
|
+
if (!matched) return void 0;
|
|
442
|
+
const originalParams = context.req.param();
|
|
443
|
+
Object.assign(originalParams, matched.params);
|
|
444
|
+
let nextResponse = void 0;
|
|
445
|
+
let nextCalled = false;
|
|
446
|
+
const next = async () => {
|
|
447
|
+
nextCalled = true;
|
|
448
|
+
nextResponse = await run(nextIndex + 1);
|
|
449
|
+
};
|
|
450
|
+
const response = await matched.handler(context, next);
|
|
451
|
+
if (response instanceof Response) return response;
|
|
452
|
+
if (nextCalled) return nextResponse;
|
|
453
|
+
return response;
|
|
454
|
+
};
|
|
455
|
+
return run(0);
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
function cors(options = {}) {
|
|
459
|
+
const origin = options.origin ?? "*";
|
|
460
|
+
const allowMethods = options.allowMethods ?? ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"];
|
|
461
|
+
return async (c, next) => {
|
|
462
|
+
c.header("Access-Control-Allow-Origin", origin);
|
|
463
|
+
if (options.credentials) c.header("Access-Control-Allow-Credentials", "true");
|
|
464
|
+
if (c.req.method.toUpperCase() === "OPTIONS") {
|
|
465
|
+
c.header("Access-Control-Allow-Methods", allowMethods.join(","));
|
|
466
|
+
const allowHeaders = options.allowHeaders?.join(",") ?? c.req.header("Access-Control-Request-Headers");
|
|
467
|
+
if (allowHeaders) c.header("Access-Control-Allow-Headers", allowHeaders);
|
|
468
|
+
if (options.maxAge != null) c.header("Access-Control-Max-Age", String(options.maxAge));
|
|
469
|
+
return c.body(null, 204);
|
|
470
|
+
}
|
|
471
|
+
await next();
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
function serve(options) {
|
|
475
|
+
const port = options.port ?? 3e3;
|
|
476
|
+
const server = createNodeServer(async (req, res) => {
|
|
477
|
+
try {
|
|
478
|
+
const request = nodeRequestToFetchRequest(req);
|
|
479
|
+
const response = await options.fetch(request);
|
|
480
|
+
await writeFetchResponse(res, response, req.method?.toUpperCase() === "HEAD");
|
|
481
|
+
} catch (err) {
|
|
482
|
+
const message = err instanceof Error ? err.message : "Internal Server Error";
|
|
483
|
+
res.statusCode = 500;
|
|
484
|
+
res.setHeader("Content-Type", "text/plain; charset=UTF-8");
|
|
485
|
+
res.end(message);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
server.listen(port, options.hostname);
|
|
489
|
+
return server;
|
|
490
|
+
}
|
|
491
|
+
function compilePath(pattern) {
|
|
492
|
+
if (pattern === "*" || pattern === "/*") {
|
|
493
|
+
return { pattern, regex: /^.*$/, paramNames: [] };
|
|
494
|
+
}
|
|
495
|
+
const paramNames = [];
|
|
496
|
+
let source = "^";
|
|
497
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
498
|
+
const char = pattern[i];
|
|
499
|
+
if (char !== ":") {
|
|
500
|
+
source += escapeRegex(char);
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
let name = "";
|
|
504
|
+
i++;
|
|
505
|
+
while (i < pattern.length && /[A-Za-z0-9_]/.test(pattern[i])) {
|
|
506
|
+
name += pattern[i];
|
|
507
|
+
i++;
|
|
508
|
+
}
|
|
509
|
+
i--;
|
|
510
|
+
paramNames.push(name);
|
|
511
|
+
if (pattern[i + 1] === "{") {
|
|
512
|
+
const close = pattern.indexOf("}", i + 2);
|
|
513
|
+
if (close < 0) throw new Error(`Invalid route pattern: ${pattern}`);
|
|
514
|
+
const expr = pattern.slice(i + 2, close);
|
|
515
|
+
source += `(${expr})`;
|
|
516
|
+
i = close;
|
|
517
|
+
} else {
|
|
518
|
+
source += "([^/]+)";
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
source += "$";
|
|
522
|
+
return { pattern, regex: new RegExp(source), paramNames };
|
|
523
|
+
}
|
|
524
|
+
function matchPath(compiled, path) {
|
|
525
|
+
const match = compiled.regex.exec(path);
|
|
526
|
+
if (!match) return null;
|
|
527
|
+
const params = {};
|
|
528
|
+
for (let i = 0; i < compiled.paramNames.length; i++) {
|
|
529
|
+
params[compiled.paramNames[i]] = decodePathParam(match[i + 1] ?? "");
|
|
530
|
+
}
|
|
531
|
+
return params;
|
|
532
|
+
}
|
|
533
|
+
function decodePathParam(value) {
|
|
534
|
+
try {
|
|
535
|
+
return decodeURIComponent(value);
|
|
536
|
+
} catch {
|
|
537
|
+
return value;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
function escapeRegex(value) {
|
|
541
|
+
return value.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
542
|
+
}
|
|
543
|
+
function hasHeaders(headers) {
|
|
544
|
+
for (const _ of headers) return true;
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
function defaultContentType(headers, contentType) {
|
|
548
|
+
const out = new Headers(headers);
|
|
549
|
+
if (!out.has("Content-Type")) {
|
|
550
|
+
out.set("Content-Type", contentType);
|
|
551
|
+
}
|
|
552
|
+
return out;
|
|
553
|
+
}
|
|
554
|
+
function formDataToObject(formData) {
|
|
555
|
+
const out = {};
|
|
556
|
+
for (const [key, value] of formData) {
|
|
557
|
+
appendBodyValue(out, key, value);
|
|
558
|
+
}
|
|
559
|
+
return out;
|
|
560
|
+
}
|
|
561
|
+
function appendBodyValue(target, key, value) {
|
|
562
|
+
const existing = target[key];
|
|
563
|
+
if (existing === void 0) {
|
|
564
|
+
target[key] = value;
|
|
565
|
+
} else if (Array.isArray(existing)) {
|
|
566
|
+
existing.push(value);
|
|
567
|
+
} else {
|
|
568
|
+
target[key] = [existing, value];
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
function nodeRequestToFetchRequest(req) {
|
|
572
|
+
const host = req.headers.host ?? "localhost";
|
|
573
|
+
const url = new URL(req.url ?? "/", `http://${host}`);
|
|
574
|
+
const headers = new Headers();
|
|
575
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
576
|
+
if (value == null) continue;
|
|
577
|
+
if (Array.isArray(value)) {
|
|
578
|
+
for (const item of value) headers.append(key, item);
|
|
579
|
+
} else {
|
|
580
|
+
headers.set(key, value);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
const method = req.method ?? "GET";
|
|
584
|
+
const hasBody = method !== "GET" && method !== "HEAD";
|
|
585
|
+
return new Request(url.toString(), {
|
|
586
|
+
method,
|
|
587
|
+
headers,
|
|
588
|
+
body: hasBody ? req : void 0,
|
|
589
|
+
duplex: "half"
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
async function writeFetchResponse(res, response, headOnly) {
|
|
593
|
+
res.statusCode = response.status;
|
|
594
|
+
res.statusMessage = response.statusText;
|
|
595
|
+
const headersWithCookies = response.headers;
|
|
596
|
+
const cookies = headersWithCookies.getSetCookie?.();
|
|
597
|
+
response.headers.forEach((value, key) => {
|
|
598
|
+
if (key.toLowerCase() === "set-cookie" && cookies && cookies.length > 0) return;
|
|
599
|
+
res.setHeader(key, value);
|
|
600
|
+
});
|
|
601
|
+
if (cookies && cookies.length > 0) {
|
|
602
|
+
res.setHeader("Set-Cookie", cookies);
|
|
603
|
+
}
|
|
604
|
+
if (headOnly || !response.body) {
|
|
605
|
+
res.end();
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const reader = response.body.getReader();
|
|
609
|
+
try {
|
|
610
|
+
while (true) {
|
|
611
|
+
const { done, value } = await reader.read();
|
|
612
|
+
if (done) break;
|
|
613
|
+
if (!res.write(value)) {
|
|
614
|
+
await new Promise((resolve) => res.once("drain", resolve));
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
res.end();
|
|
618
|
+
} catch (err) {
|
|
619
|
+
res.destroy(err instanceof Error ? err : void 0);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
234
622
|
var MAX_DELIVERIES = 1e3;
|
|
235
623
|
var WebhookDispatcher = class {
|
|
236
624
|
subscriptions = [];
|
|
@@ -520,7 +908,7 @@ var SERVICE_REGISTRY = {
|
|
|
520
908
|
label: "Vercel REST API emulator",
|
|
521
909
|
endpoints: "projects, deployments, domains, env vars, users, teams, file uploads, protection bypass",
|
|
522
910
|
async load() {
|
|
523
|
-
const mod = await import("./dist-
|
|
911
|
+
const mod = await import("./dist-CXRPM6BK.js");
|
|
524
912
|
return { plugin: mod.vercelPlugin, seedFromConfig: mod.seedFromConfig };
|
|
525
913
|
},
|
|
526
914
|
defaultFallback(cfg) {
|
|
@@ -547,7 +935,7 @@ var SERVICE_REGISTRY = {
|
|
|
547
935
|
label: "GitHub REST API emulator",
|
|
548
936
|
endpoints: "users, repos, issues, PRs, comments, reviews, labels, milestones, branches, git data, orgs, teams, releases, webhooks, search, actions, checks, rate limit",
|
|
549
937
|
async load() {
|
|
550
|
-
const mod = await import("./dist-
|
|
938
|
+
const mod = await import("./dist-PO4CL5SJ.js");
|
|
551
939
|
return {
|
|
552
940
|
plugin: mod.githubPlugin,
|
|
553
941
|
seedFromConfig: mod.seedFromConfig,
|
|
@@ -614,7 +1002,7 @@ var SERVICE_REGISTRY = {
|
|
|
614
1002
|
label: "Google OAuth 2.0 / OpenID Connect + Gmail, Calendar, and Drive emulator",
|
|
615
1003
|
endpoints: "OAuth authorize, token exchange, userinfo, OIDC discovery, token revocation, Gmail messages/drafts/threads/labels/history/settings, Calendar lists/events/freebusy, Drive files/uploads",
|
|
616
1004
|
async load() {
|
|
617
|
-
const mod = await import("./dist-
|
|
1005
|
+
const mod = await import("./dist-ZY5SZSJ2.js");
|
|
618
1006
|
return { plugin: mod.googlePlugin, seedFromConfig: mod.seedFromConfig };
|
|
619
1007
|
},
|
|
620
1008
|
defaultFallback(cfg) {
|
|
@@ -694,18 +1082,34 @@ var SERVICE_REGISTRY = {
|
|
|
694
1082
|
},
|
|
695
1083
|
slack: {
|
|
696
1084
|
label: "Slack API emulator",
|
|
697
|
-
endpoints: "auth, chat, conversations, users, reactions, team, OAuth, incoming webhooks",
|
|
1085
|
+
endpoints: "auth, chat, conversations, users, profiles, presence, files, pins, bookmarks, views, reactions, team, OAuth, incoming webhooks, inspector",
|
|
698
1086
|
async load() {
|
|
699
|
-
const mod = await import("./dist-
|
|
1087
|
+
const mod = await import("./dist-OGSAVJ25.js");
|
|
700
1088
|
return { plugin: mod.slackPlugin, seedFromConfig: mod.seedFromConfig };
|
|
701
1089
|
},
|
|
702
1090
|
defaultFallback() {
|
|
703
|
-
return {
|
|
1091
|
+
return {
|
|
1092
|
+
login: "U000000001",
|
|
1093
|
+
id: 1,
|
|
1094
|
+
scopes: []
|
|
1095
|
+
};
|
|
704
1096
|
},
|
|
705
1097
|
initConfig: {
|
|
706
1098
|
slack: {
|
|
707
1099
|
team: { name: "My Workspace", domain: "my-workspace" },
|
|
708
|
-
users: [
|
|
1100
|
+
users: [
|
|
1101
|
+
{
|
|
1102
|
+
name: "developer",
|
|
1103
|
+
real_name: "Developer",
|
|
1104
|
+
email: "dev@example.com",
|
|
1105
|
+
profile: {
|
|
1106
|
+
title: "Local Developer",
|
|
1107
|
+
status_text: "Testing locally",
|
|
1108
|
+
status_emoji: ":computer:"
|
|
1109
|
+
},
|
|
1110
|
+
presence: "active"
|
|
1111
|
+
}
|
|
1112
|
+
],
|
|
709
1113
|
channels: [
|
|
710
1114
|
{ name: "general", topic: "General discussion" },
|
|
711
1115
|
{ name: "random", topic: "Random stuff" }
|
|
@@ -715,10 +1119,45 @@ var SERVICE_REGISTRY = {
|
|
|
715
1119
|
{
|
|
716
1120
|
client_id: "12345.67890",
|
|
717
1121
|
client_secret: "example_client_secret",
|
|
1122
|
+
app_id: "A000000001",
|
|
718
1123
|
name: "My Slack App",
|
|
719
|
-
redirect_uris: ["http://localhost:3000/api/auth/callback/slack"]
|
|
1124
|
+
redirect_uris: ["http://localhost:3000/api/auth/callback/slack"],
|
|
1125
|
+
scopes: [
|
|
1126
|
+
"chat:write",
|
|
1127
|
+
"channels:read",
|
|
1128
|
+
"channels:history",
|
|
1129
|
+
"channels:join",
|
|
1130
|
+
"channels:manage",
|
|
1131
|
+
"channels:write",
|
|
1132
|
+
"groups:read",
|
|
1133
|
+
"groups:history",
|
|
1134
|
+
"groups:write",
|
|
1135
|
+
"im:read",
|
|
1136
|
+
"im:history",
|
|
1137
|
+
"im:write",
|
|
1138
|
+
"mpim:read",
|
|
1139
|
+
"mpim:history",
|
|
1140
|
+
"mpim:write",
|
|
1141
|
+
"users:read",
|
|
1142
|
+
"users:read.email",
|
|
1143
|
+
"users.profile:read",
|
|
1144
|
+
"users.profile:write",
|
|
1145
|
+
"users:write",
|
|
1146
|
+
"files:read",
|
|
1147
|
+
"files:write",
|
|
1148
|
+
"pins:read",
|
|
1149
|
+
"pins:write",
|
|
1150
|
+
"bookmarks:read",
|
|
1151
|
+
"bookmarks:write",
|
|
1152
|
+
"reactions:read",
|
|
1153
|
+
"reactions:write",
|
|
1154
|
+
"team:read"
|
|
1155
|
+
],
|
|
1156
|
+
user_scopes: ["users:read", "users.profile:read"],
|
|
1157
|
+
bot_name: "my-bot"
|
|
720
1158
|
}
|
|
721
|
-
]
|
|
1159
|
+
],
|
|
1160
|
+
strict_scopes: false
|
|
722
1161
|
}
|
|
723
1162
|
}
|
|
724
1163
|
},
|
|
@@ -726,7 +1165,7 @@ var SERVICE_REGISTRY = {
|
|
|
726
1165
|
label: "Apple Sign In / OAuth emulator",
|
|
727
1166
|
endpoints: "OAuth authorize, token exchange, JWKS",
|
|
728
1167
|
async load() {
|
|
729
|
-
const mod = await import("./dist-
|
|
1168
|
+
const mod = await import("./dist-WACHAAVU.js");
|
|
730
1169
|
return { plugin: mod.applePlugin, seedFromConfig: mod.seedFromConfig };
|
|
731
1170
|
},
|
|
732
1171
|
defaultFallback(cfg) {
|
|
@@ -751,7 +1190,7 @@ var SERVICE_REGISTRY = {
|
|
|
751
1190
|
label: "Microsoft Entra ID OAuth 2.0 / OpenID Connect emulator",
|
|
752
1191
|
endpoints: "OAuth authorize, token exchange, userinfo, OIDC discovery, Graph /me, logout, token revocation",
|
|
753
1192
|
async load() {
|
|
754
|
-
const mod = await import("./dist-
|
|
1193
|
+
const mod = await import("./dist-IFULY5LE.js");
|
|
755
1194
|
return { plugin: mod.microsoftPlugin, seedFromConfig: mod.seedFromConfig };
|
|
756
1195
|
},
|
|
757
1196
|
defaultFallback(cfg) {
|
|
@@ -776,7 +1215,7 @@ var SERVICE_REGISTRY = {
|
|
|
776
1215
|
label: "Okta OAuth 2.0 / OpenID Connect + management API emulator",
|
|
777
1216
|
endpoints: "OIDC discovery, JWKS, OAuth authorize/token/userinfo/introspect/revoke/logout, users, groups, apps, authorization servers",
|
|
778
1217
|
async load() {
|
|
779
|
-
const mod = await import("./dist-
|
|
1218
|
+
const mod = await import("./dist-XWWZVLQQ.js");
|
|
780
1219
|
return { plugin: mod.oktaPlugin, seedFromConfig: mod.seedFromConfig };
|
|
781
1220
|
},
|
|
782
1221
|
defaultFallback(cfg) {
|
|
@@ -804,7 +1243,7 @@ var SERVICE_REGISTRY = {
|
|
|
804
1243
|
label: "AWS cloud service emulator",
|
|
805
1244
|
endpoints: "S3 (buckets, objects), SQS (queues, messages), IAM (users, roles, access keys), STS (assume role, caller identity)",
|
|
806
1245
|
async load() {
|
|
807
|
-
const mod = await import("./dist-
|
|
1246
|
+
const mod = await import("./dist-DSJSF3GY.js");
|
|
808
1247
|
return { plugin: mod.awsPlugin, seedFromConfig: mod.seedFromConfig };
|
|
809
1248
|
},
|
|
810
1249
|
defaultFallback() {
|
|
@@ -826,7 +1265,7 @@ var SERVICE_REGISTRY = {
|
|
|
826
1265
|
label: "Resend email API emulator",
|
|
827
1266
|
endpoints: "emails, domains, contacts, API keys, inbox UI",
|
|
828
1267
|
async load() {
|
|
829
|
-
const mod = await import("./dist-
|
|
1268
|
+
const mod = await import("./dist-R3TNKUIE.js");
|
|
830
1269
|
return { plugin: mod.resendPlugin, seedFromConfig: mod.seedFromConfig };
|
|
831
1270
|
},
|
|
832
1271
|
defaultFallback() {
|
|
@@ -843,7 +1282,7 @@ var SERVICE_REGISTRY = {
|
|
|
843
1282
|
label: "Stripe payments emulator",
|
|
844
1283
|
endpoints: "customers, payment methods, customer sessions, payment intents, charges, products, prices, checkout sessions, webhooks",
|
|
845
1284
|
async load() {
|
|
846
|
-
const mod = await import("./dist-
|
|
1285
|
+
const mod = await import("./dist-NJJLJT2N.js");
|
|
847
1286
|
return { plugin: mod.stripePlugin, seedFromConfig: mod.seedFromConfig };
|
|
848
1287
|
},
|
|
849
1288
|
defaultFallback() {
|
|
@@ -861,7 +1300,7 @@ var SERVICE_REGISTRY = {
|
|
|
861
1300
|
label: "MongoDB Atlas service emulator",
|
|
862
1301
|
endpoints: "Atlas Admin API v2 (projects, clusters, database users, databases, collections), Atlas Data API v1 (findOne, find, insertOne, insertMany, updateOne, updateMany, deleteOne, deleteMany, aggregate)",
|
|
863
1302
|
async load() {
|
|
864
|
-
const mod = await import("./dist-
|
|
1303
|
+
const mod = await import("./dist-2ZZGNPJI.js");
|
|
865
1304
|
return { plugin: mod.mongoatlasPlugin, seedFromConfig: mod.seedFromConfig };
|
|
866
1305
|
},
|
|
867
1306
|
defaultFallback() {
|
|
@@ -880,7 +1319,7 @@ var SERVICE_REGISTRY = {
|
|
|
880
1319
|
label: "Clerk authentication and user management emulator",
|
|
881
1320
|
endpoints: "OIDC discovery, JWKS, OAuth authorize/token/userinfo, users, email addresses, organizations, memberships, invitations, sessions",
|
|
882
1321
|
async load() {
|
|
883
|
-
const mod = await import("./dist-
|
|
1322
|
+
const mod = await import("./dist-IRUBHCZU.js");
|
|
884
1323
|
return { plugin: mod.clerkPlugin, seedFromConfig: mod.seedFromConfig };
|
|
885
1324
|
},
|
|
886
1325
|
defaultFallback(cfg) {
|
|
@@ -917,9 +1356,6 @@ var SERVICE_REGISTRY = {
|
|
|
917
1356
|
}
|
|
918
1357
|
};
|
|
919
1358
|
|
|
920
|
-
// src/api.ts
|
|
921
|
-
import { serve } from "@hono/node-server";
|
|
922
|
-
|
|
923
1359
|
// src/base-url.ts
|
|
924
1360
|
function resolveBaseUrl(opts) {
|
|
925
1361
|
if (opts.seedBaseUrl) {
|