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.
Files changed (45) hide show
  1. package/README.md +141 -19
  2. package/dist/api.js +460 -24
  3. package/dist/api.js.map +1 -1
  4. package/dist/{dist-PWGOAQC6.js → dist-2ZZGNPJI.js} +1 -1
  5. package/dist/dist-2ZZGNPJI.js.map +1 -0
  6. package/dist/{dist-4X2KPMAJ.js → dist-CXRPM6BK.js} +1 -3
  7. package/dist/dist-CXRPM6BK.js.map +1 -0
  8. package/dist/{dist-LDUHEJAN.js → dist-DSJSF3GY.js} +1 -3
  9. package/dist/dist-DSJSF3GY.js.map +1 -0
  10. package/dist/{dist-ETHHYBGF.js → dist-IFULY5LE.js} +1 -2
  11. package/dist/dist-IFULY5LE.js.map +1 -0
  12. package/dist/{dist-J6LHUR52.js → dist-IRUBHCZU.js} +1 -2
  13. package/dist/dist-IRUBHCZU.js.map +1 -0
  14. package/dist/{dist-ENKE2S7V.js → dist-NJJLJT2N.js} +1 -3
  15. package/dist/dist-NJJLJT2N.js.map +1 -0
  16. package/dist/dist-OGSAVJ25.js +4874 -0
  17. package/dist/dist-OGSAVJ25.js.map +1 -0
  18. package/dist/{dist-REDHDZ3V.js → dist-PO4CL5SJ.js} +1 -3
  19. package/dist/dist-PO4CL5SJ.js.map +1 -0
  20. package/dist/{dist-IBXD3O6A.js → dist-R3TNKUIE.js} +1 -3
  21. package/dist/dist-R3TNKUIE.js.map +1 -0
  22. package/dist/{dist-CFST4X4K.js → dist-WACHAAVU.js} +1 -2
  23. package/dist/dist-WACHAAVU.js.map +1 -0
  24. package/dist/{dist-5JVGPOL3.js → dist-XWWZVLQQ.js} +1 -2
  25. package/dist/dist-XWWZVLQQ.js.map +1 -0
  26. package/dist/{dist-KKTYBE5S.js → dist-ZY5SZSJ2.js} +8 -3
  27. package/dist/dist-ZY5SZSJ2.js.map +1 -0
  28. package/dist/index.js +464 -26
  29. package/dist/index.js.map +1 -1
  30. package/package.json +14 -15
  31. package/dist/chunk-AQ2CLRU3.js +0 -2146
  32. package/dist/chunk-AQ2CLRU3.js.map +0 -1
  33. package/dist/dist-4X2KPMAJ.js.map +0 -1
  34. package/dist/dist-5JVGPOL3.js.map +0 -1
  35. package/dist/dist-CE6BUCWQ.js +0 -1438
  36. package/dist/dist-CE6BUCWQ.js.map +0 -1
  37. package/dist/dist-CFST4X4K.js.map +0 -1
  38. package/dist/dist-ENKE2S7V.js.map +0 -1
  39. package/dist/dist-ETHHYBGF.js.map +0 -1
  40. package/dist/dist-IBXD3O6A.js.map +0 -1
  41. package/dist/dist-J6LHUR52.js.map +0 -1
  42. package/dist/dist-KKTYBE5S.js.map +0 -1
  43. package/dist/dist-LDUHEJAN.js.map +0 -1
  44. package/dist/dist-PWGOAQC6.js.map +0 -1
  45. 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-4X2KPMAJ.js");
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-REDHDZ3V.js");
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-KKTYBE5S.js");
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-CE6BUCWQ.js");
1087
+ const mod = await import("./dist-OGSAVJ25.js");
700
1088
  return { plugin: mod.slackPlugin, seedFromConfig: mod.seedFromConfig };
701
1089
  },
702
1090
  defaultFallback() {
703
- return { login: "U000000001", id: 1, scopes: ["chat:write", "channels:read", "users:read", "reactions:write"] };
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: [{ name: "developer", real_name: "Developer", email: "dev@example.com" }],
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-CFST4X4K.js");
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-ETHHYBGF.js");
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-5JVGPOL3.js");
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-LDUHEJAN.js");
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-IBXD3O6A.js");
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-ENKE2S7V.js");
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-PWGOAQC6.js");
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-J6LHUR52.js");
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) {