@executor-js/emulate 0.6.0 → 0.7.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.
@@ -82,10 +82,7 @@ function autumnApiRoutes(ctx) {
82
82
  });
83
83
  });
84
84
  app.post("/v1/plans.list", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));
85
- app.post(
86
- "/v1/features.list",
87
- async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 })
88
- );
85
+ app.post("/v1/features.list", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));
89
86
  app.post("/v1/events.list", async (c) => {
90
87
  const events = as().events.all().map((event) => ({
91
88
  id: `evt_emulate_${event.id}`,
@@ -97,6 +94,133 @@ function autumnApiRoutes(ctx) {
97
94
  return c.json({ list: events, total: events.length, offset: 0, limit: 100 });
98
95
  });
99
96
  }
97
+ function openapiRoutes({ app, baseUrl }) {
98
+ app.get("/openapi.json", (c) => c.json(buildSpec(baseUrl)));
99
+ }
100
+ var ok = (description) => ({
101
+ description,
102
+ content: { "application/json": { schema: { type: "object" } } }
103
+ });
104
+ var jsonBody = (properties, required, description) => ({
105
+ required: true,
106
+ description,
107
+ content: {
108
+ "application/json": {
109
+ schema: { type: "object", properties, required: [...required] }
110
+ }
111
+ }
112
+ });
113
+ function buildSpec(baseUrl) {
114
+ return {
115
+ openapi: "3.1.0",
116
+ info: {
117
+ title: "Autumn API (Emulated)",
118
+ version: "1.0.0",
119
+ description: "Emulated subset of the Autumn v1 API (RPC-style paths, all POST). Authenticate with a bearer secret key (mint one at POST /_emulate/credentials)."
120
+ },
121
+ servers: [{ url: baseUrl }],
122
+ components: {
123
+ securitySchemes: {
124
+ bearerAuth: {
125
+ type: "http",
126
+ scheme: "bearer",
127
+ description: "Autumn secret key, sent as `Authorization: Bearer am_sk_\u2026`."
128
+ }
129
+ }
130
+ },
131
+ security: [{ bearerAuth: [] }],
132
+ paths: {
133
+ "/v1/customers.get_or_create": {
134
+ post: {
135
+ operationId: "customers.get_or_create",
136
+ tags: ["customers"],
137
+ summary: "Get or create a customer",
138
+ requestBody: jsonBody(
139
+ {
140
+ customer_id: { type: "string" },
141
+ customer_data: {
142
+ type: "object",
143
+ properties: { name: { type: "string" }, email: { type: "string" } }
144
+ },
145
+ name: { type: "string" },
146
+ email: { type: "string" }
147
+ },
148
+ ["customer_id"],
149
+ "The customer to fetch or create."
150
+ ),
151
+ responses: { "200": ok("The customer."), "400": ok("Validation error.") }
152
+ }
153
+ },
154
+ "/v1/customers.list": {
155
+ post: {
156
+ operationId: "customers.list",
157
+ tags: ["customers"],
158
+ summary: "List customers",
159
+ responses: { "200": ok("Customer list.") }
160
+ }
161
+ },
162
+ "/v1/customers.update": {
163
+ post: {
164
+ operationId: "customers.update",
165
+ tags: ["customers"],
166
+ summary: "Update a customer",
167
+ requestBody: jsonBody(
168
+ {
169
+ customer_id: { type: "string" },
170
+ name: { type: "string" },
171
+ email: { type: "string" }
172
+ },
173
+ ["customer_id"],
174
+ "The customer fields to update."
175
+ ),
176
+ responses: { "200": ok("The updated customer."), "404": ok("Not found.") }
177
+ }
178
+ },
179
+ "/v1/balances.track": {
180
+ post: {
181
+ operationId: "balances.track",
182
+ tags: ["balances"],
183
+ summary: "Track a usage event",
184
+ requestBody: jsonBody(
185
+ {
186
+ customer_id: { type: "string" },
187
+ feature_id: { type: "string" },
188
+ event_name: { type: "string" },
189
+ value: { type: "number" }
190
+ },
191
+ ["customer_id", "feature_id"],
192
+ "The usage event to record (`event_name` is accepted as an alias for `feature_id`)."
193
+ ),
194
+ responses: { "200": ok("Event confirmation."), "400": ok("Validation error.") }
195
+ }
196
+ },
197
+ "/v1/plans.list": {
198
+ post: {
199
+ operationId: "plans.list",
200
+ tags: ["plans"],
201
+ summary: "List plans",
202
+ responses: { "200": ok("Plan list.") }
203
+ }
204
+ },
205
+ "/v1/features.list": {
206
+ post: {
207
+ operationId: "features.list",
208
+ tags: ["features"],
209
+ summary: "List features",
210
+ responses: { "200": ok("Feature list.") }
211
+ }
212
+ },
213
+ "/v1/events.list": {
214
+ post: {
215
+ operationId: "events.list",
216
+ tags: ["events"],
217
+ summary: "List tracked usage events",
218
+ responses: { "200": ok("Event list.") }
219
+ }
220
+ }
221
+ }
222
+ };
223
+ }
100
224
  var manifest = {
101
225
  id: "autumn",
102
226
  name: "Autumn",
@@ -106,11 +230,17 @@ var manifest = {
106
230
  auth: [{ id: "api-key", title: "Autumn secret key", type: "api-key", status: "supported" }],
107
231
  specs: [
108
232
  {
109
- kind: "manual",
233
+ kind: "openapi",
110
234
  title: "Autumn v1 subset",
111
235
  coverage: "hand-authored",
236
+ url: "/openapi.json",
112
237
  operations: [
113
- { operationId: "customers.get_or_create", method: "POST", path: "/v1/customers.get_or_create", status: "hand-authored" },
238
+ {
239
+ operationId: "customers.get_or_create",
240
+ method: "POST",
241
+ path: "/v1/customers.get_or_create",
242
+ status: "hand-authored"
243
+ },
114
244
  { operationId: "customers.list", method: "POST", path: "/v1/customers.list", status: "hand-authored" },
115
245
  { operationId: "customers.update", method: "POST", path: "/v1/customers.update", status: "hand-authored" },
116
246
  { operationId: "balances.track", method: "POST", path: "/v1/balances.track", status: "hand-authored" },
@@ -174,6 +304,7 @@ var autumnPlugin = {
174
304
  register(app, store, webhooks, baseUrl, tokenMap) {
175
305
  const ctx = { app, store, webhooks, baseUrl, tokenMap };
176
306
  autumnApiRoutes(ctx);
307
+ openapiRoutes(ctx);
177
308
  },
178
309
  seed(_store, _baseUrl) {
179
310
  }
@@ -186,4 +317,4 @@ export {
186
317
  manifest,
187
318
  seedFromConfig
188
319
  };
189
- //# sourceMappingURL=dist-JJ2ZRCAX.js.map
320
+ //# sourceMappingURL=dist-YXHZTLFR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../@emulators/autumn/src/store.ts","../../@emulators/autumn/src/routes/api.ts","../../@emulators/autumn/src/routes/openapi.ts","../../@emulators/autumn/src/manifest.ts","../../@emulators/autumn/src/index.ts"],"sourcesContent":["import { Store, type Collection } from \"@emulators/core\";\n\nimport type { AutumnCustomer, AutumnTrackEvent } from \"./entities.js\";\n\nexport interface AutumnStore {\n customers: Collection<AutumnCustomer>;\n events: Collection<AutumnTrackEvent>;\n}\n\nexport function getAutumnStore(store: Store): AutumnStore {\n return {\n customers: store.collection<AutumnCustomer>(\"autumn.customers\", [\"customer_id\"]),\n events: store.collection<AutumnTrackEvent>(\"autumn.events\", [\"customer_id\", \"feature_id\"]),\n };\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nimport { getAutumnStore, type AutumnStore } from \"../store.js\";\nimport type { AutumnCustomer } from \"../entities.js\";\n\nfunction serializeCustomer(customer: AutumnCustomer): Record<string, unknown> {\n return {\n id: customer.customer_id,\n created_at: Date.parse(customer.created_at),\n name: customer.name,\n email: customer.email,\n fingerprint: null,\n stripe_id: `cus_emulate_${customer.id}`,\n env: \"sandbox\",\n metadata: {},\n subscriptions: customer.subscriptions,\n products: [],\n features: {},\n invoices: [],\n purchases: [],\n balances: {},\n flags: {},\n billing_controls: {},\n };\n}\n\nfunction ensureCustomer(as: AutumnStore, id: string, data: { name?: unknown; email?: unknown }): AutumnCustomer {\n const existing = as.customers.findOneBy(\"customer_id\", id);\n if (existing) return existing;\n return as.customers.insert({\n customer_id: id,\n name: typeof data.name === \"string\" ? data.name : null,\n email: typeof data.email === \"string\" ? data.email : null,\n subscriptions: [],\n });\n}\n\n/** Autumn v1 RPC-style API (paths mirror autumn-js: /v1/<group>.<method>). */\nexport function autumnApiRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n const as = () => getAutumnStore(store);\n\n app.post(\"/v1/customers.get_or_create\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const id = String(body.customer_id ?? body.id ?? \"\");\n if (!id) return c.json({ message: \"customer_id is required\", code: \"invalid_request\" }, 400);\n const data = (body.customer_data as Record<string, unknown> | undefined) ?? body;\n const customer = ensureCustomer(as(), id, data);\n return c.json(serializeCustomer(customer));\n });\n\n app.post(\"/v1/customers.list\", async (c) => {\n const customers = as().customers.all().map(serializeCustomer);\n return c.json({ list: customers, total: customers.length, offset: 0, limit: 100 });\n });\n\n app.post(\"/v1/customers.update\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const id = String(body.customer_id ?? body.id ?? \"\");\n const customer = as().customers.findOneBy(\"customer_id\", id);\n if (!customer) return c.json({ message: \"Customer not found\", code: \"not_found\" }, 404);\n const updated = as().customers.update(customer.id, {\n name: typeof body.name === \"string\" ? body.name : customer.name,\n email: typeof body.email === \"string\" ? body.email : customer.email,\n })!;\n return c.json(serializeCustomer(updated));\n });\n\n app.post(\"/v1/balances.track\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const customerId = String(body.customer_id ?? \"\");\n const featureId = String(body.feature_id ?? body.event_name ?? \"\");\n if (!customerId || !featureId) {\n return c.json({ message: \"customer_id and feature_id are required\", code: \"invalid_request\" }, 400);\n }\n ensureCustomer(as(), customerId, {});\n const event = as().events.insert({\n customer_id: customerId,\n feature_id: featureId,\n value: typeof body.value === \"number\" ? body.value : 1,\n });\n return c.json({\n id: `evt_emulate_${event.id}`,\n code: \"event_received\",\n customer_id: customerId,\n feature_id: featureId,\n });\n });\n\n app.post(\"/v1/plans.list\", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));\n app.post(\"/v1/features.list\", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));\n app.post(\"/v1/events.list\", async (c) => {\n const events = as()\n .events.all()\n .map((event) => ({\n id: `evt_emulate_${event.id}`,\n customer_id: event.customer_id,\n feature_id: event.feature_id,\n value: event.value,\n timestamp: Date.parse(event.created_at),\n }));\n return c.json({ list: events, total: events.length, offset: 0, limit: 100 });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\n// OpenAPI 3.1 document for this Autumn emulator instance, pointed at itself,\n// with the bearer-token security scheme real Autumn uses. Covers the\n// hand-authored surface (see manifest.ts); unsupported operations are omitted\n// so OpenAPI-aware clients only see what actually works.\nexport function openapiRoutes({ app, baseUrl }: RouteContext): void {\n app.get(\"/openapi.json\", (c) => c.json(buildSpec(baseUrl)));\n}\n\nconst ok = (description: string) => ({\n description,\n content: { \"application/json\": { schema: { type: \"object\" } } },\n});\nconst jsonBody = (properties: Record<string, unknown>, required: readonly string[], description: string) => ({\n required: true,\n description,\n content: {\n \"application/json\": {\n schema: { type: \"object\", properties, required: [...required] },\n },\n },\n});\n\nfunction buildSpec(baseUrl: string): Record<string, unknown> {\n return {\n openapi: \"3.1.0\",\n info: {\n title: \"Autumn API (Emulated)\",\n version: \"1.0.0\",\n description:\n \"Emulated subset of the Autumn v1 API (RPC-style paths, all POST). Authenticate with a bearer secret key (mint one at POST /_emulate/credentials).\",\n },\n servers: [{ url: baseUrl }],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n description: \"Autumn secret key, sent as `Authorization: Bearer am_sk_…`.\",\n },\n },\n },\n security: [{ bearerAuth: [] }],\n paths: {\n \"/v1/customers.get_or_create\": {\n post: {\n operationId: \"customers.get_or_create\",\n tags: [\"customers\"],\n summary: \"Get or create a customer\",\n requestBody: jsonBody(\n {\n customer_id: { type: \"string\" },\n customer_data: {\n type: \"object\",\n properties: { name: { type: \"string\" }, email: { type: \"string\" } },\n },\n name: { type: \"string\" },\n email: { type: \"string\" },\n },\n [\"customer_id\"],\n \"The customer to fetch or create.\",\n ),\n responses: { \"200\": ok(\"The customer.\"), \"400\": ok(\"Validation error.\") },\n },\n },\n \"/v1/customers.list\": {\n post: {\n operationId: \"customers.list\",\n tags: [\"customers\"],\n summary: \"List customers\",\n responses: { \"200\": ok(\"Customer list.\") },\n },\n },\n \"/v1/customers.update\": {\n post: {\n operationId: \"customers.update\",\n tags: [\"customers\"],\n summary: \"Update a customer\",\n requestBody: jsonBody(\n {\n customer_id: { type: \"string\" },\n name: { type: \"string\" },\n email: { type: \"string\" },\n },\n [\"customer_id\"],\n \"The customer fields to update.\",\n ),\n responses: { \"200\": ok(\"The updated customer.\"), \"404\": ok(\"Not found.\") },\n },\n },\n \"/v1/balances.track\": {\n post: {\n operationId: \"balances.track\",\n tags: [\"balances\"],\n summary: \"Track a usage event\",\n requestBody: jsonBody(\n {\n customer_id: { type: \"string\" },\n feature_id: { type: \"string\" },\n event_name: { type: \"string\" },\n value: { type: \"number\" },\n },\n [\"customer_id\", \"feature_id\"],\n \"The usage event to record (`event_name` is accepted as an alias for `feature_id`).\",\n ),\n responses: { \"200\": ok(\"Event confirmation.\"), \"400\": ok(\"Validation error.\") },\n },\n },\n \"/v1/plans.list\": {\n post: {\n operationId: \"plans.list\",\n tags: [\"plans\"],\n summary: \"List plans\",\n responses: { \"200\": ok(\"Plan list.\") },\n },\n },\n \"/v1/features.list\": {\n post: {\n operationId: \"features.list\",\n tags: [\"features\"],\n summary: \"List features\",\n responses: { \"200\": ok(\"Feature list.\") },\n },\n },\n \"/v1/events.list\": {\n post: {\n operationId: \"events.list\",\n tags: [\"events\"],\n summary: \"List tracked usage events\",\n responses: { \"200\": ok(\"Event list.\") },\n },\n },\n },\n };\n}\n","import type { ServiceManifest } from \"@emulators/core\";\n\nexport const manifest: ServiceManifest = {\n id: \"autumn\",\n name: \"Autumn\",\n description:\n \"Stateful Autumn billing emulator: customers (with seedable subscriptions), usage tracking, and list endpoints for plans, features, and events.\",\n docsUrl: \"https://docs.emulators.dev/autumn\",\n surfaces: [{ id: \"rest\", kind: \"rest\", title: \"Autumn v1 API\", status: \"partial\", basePath: \"/v1\" }],\n auth: [{ id: \"api-key\", title: \"Autumn secret key\", type: \"api-key\", status: \"supported\" }],\n specs: [\n {\n kind: \"openapi\",\n title: \"Autumn v1 subset\",\n coverage: \"hand-authored\",\n url: \"/openapi.json\",\n operations: [\n {\n operationId: \"customers.get_or_create\",\n method: \"POST\",\n path: \"/v1/customers.get_or_create\",\n status: \"hand-authored\",\n },\n { operationId: \"customers.list\", method: \"POST\", path: \"/v1/customers.list\", status: \"hand-authored\" },\n { operationId: \"customers.update\", method: \"POST\", path: \"/v1/customers.update\", status: \"hand-authored\" },\n { operationId: \"balances.track\", method: \"POST\", path: \"/v1/balances.track\", status: \"hand-authored\" },\n { operationId: \"plans.list\", method: \"POST\", path: \"/v1/plans.list\", status: \"hand-authored\" },\n { operationId: \"features.list\", method: \"POST\", path: \"/v1/features.list\", status: \"hand-authored\" },\n { operationId: \"events.list\", method: \"POST\", path: \"/v1/events.list\", status: \"hand-authored\" },\n ],\n },\n ],\n seedSchema: {\n description: \"Seed customers with subscriptions (e.g. a paid plan).\",\n fields: [\n {\n key: \"customers\",\n title: \"Customers\",\n description: \"Customers keyed by id, each with optional subscriptions.\",\n example: [{ id: \"org_123\", subscriptions: [{ plan_id: \"pro\", status: \"active\" }] }],\n },\n ],\n example: {\n customers: [{ id: \"org_123\", subscriptions: [{ plan_id: \"pro\", status: \"active\" }] }],\n },\n },\n stateModel: {\n description: \"Entities mutated by Autumn provider calls.\",\n collections: [{ name: \"autumn.customers\" }, { name: \"autumn.events\" }],\n },\n connections: [\n {\n id: \"autumn-js\",\n title: \"autumn-js SDK\",\n kind: \"sdk\",\n language: \"typescript\",\n description: \"Point autumn-js at the emulator via serverURL.\",\n template:\n 'import { Autumn } from \"autumn-js\";\\n\\nconst autumn = new Autumn({ secretKey: \"{{token}}\", serverURL: \"{{baseUrl}}\" });',\n },\n ],\n};\n","import type { Hono, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext, ServicePlugin } from \"@emulators/core\";\n\nimport { getAutumnStore, type AutumnStore } from \"./store.js\";\nimport { autumnApiRoutes } from \"./routes/api.js\";\nimport { openapiRoutes } from \"./routes/openapi.js\";\nimport { manifest } from \"./manifest.js\";\nimport type { AutumnSubscription } from \"./entities.js\";\n\nexport { getAutumnStore, type AutumnStore } from \"./store.js\";\nexport * from \"./entities.js\";\nexport { manifest } from \"./manifest.js\";\n\nexport interface AutumnSeedConfig {\n customers?: Array<{\n id: string;\n name?: string;\n email?: string;\n subscriptions?: AutumnSubscription[];\n }>;\n}\n\nexport function seedFromConfig(store: Store, _baseUrl: string, config: AutumnSeedConfig): void {\n const as = getAutumnStore(store);\n for (const customer of config.customers ?? []) {\n const existing = as.customers.findOneBy(\"customer_id\", customer.id);\n if (existing) {\n as.customers.update(existing.id, {\n name: customer.name ?? existing.name,\n email: customer.email ?? existing.email,\n subscriptions: customer.subscriptions ?? existing.subscriptions,\n });\n continue;\n }\n as.customers.insert({\n customer_id: customer.id,\n name: customer.name ?? null,\n email: customer.email ?? null,\n subscriptions: customer.subscriptions ?? [],\n });\n }\n}\n\nexport const autumnPlugin: ServicePlugin = {\n name: \"autumn\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n autumnApiRoutes(ctx);\n openapiRoutes(ctx);\n },\n seed(_store: Store, _baseUrl: string): void {\n // No default seed; customers are created on first get_or_create.\n },\n};\n\nexport default autumnPlugin;\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -2186,7 +2186,7 @@ var SERVICE_REGISTRY = {
2186
2186
  label: "Slack API emulator",
2187
2187
  endpoints: "auth, chat, conversations, users, profiles, presence, files, pins, bookmarks, views, reactions, team, OAuth, incoming webhooks, inspector",
2188
2188
  async load() {
2189
- const mod = await import("./dist-YPRJYQHW.js");
2189
+ const mod = await import("./dist-FE2JWST3.js");
2190
2190
  return { plugin: mod.slackPlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2191
2191
  },
2192
2192
  defaultFallback() {
@@ -2317,7 +2317,7 @@ var SERVICE_REGISTRY = {
2317
2317
  label: "Okta OAuth 2.0 / OpenID Connect + management API emulator",
2318
2318
  endpoints: "OIDC discovery, JWKS, OAuth authorize/token/userinfo/introspect/revoke/logout, users, groups, apps, authorization servers",
2319
2319
  async load() {
2320
- const mod = await import("./dist-BTEY33DJ.js");
2320
+ const mod = await import("./dist-QXFWC3LV.js");
2321
2321
  return { plugin: mod.oktaPlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2322
2322
  },
2323
2323
  defaultFallback(cfg) {
@@ -2386,7 +2386,7 @@ var SERVICE_REGISTRY = {
2386
2386
  label: "Resend email API emulator",
2387
2387
  endpoints: "emails, domains, contacts, API keys, inbox UI",
2388
2388
  async load() {
2389
- const mod = await import("./dist-XM5HSBDC.js");
2389
+ const mod = await import("./dist-TWJXVA7X.js");
2390
2390
  return { plugin: mod.resendPlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2391
2391
  },
2392
2392
  defaultFallback() {
@@ -2403,7 +2403,7 @@ var SERVICE_REGISTRY = {
2403
2403
  label: "Stripe payments emulator",
2404
2404
  endpoints: "customers, payment methods, customer sessions, payment intents, charges, products, prices, checkout sessions, webhooks",
2405
2405
  async load() {
2406
- const mod = await import("./dist-K4CVTD6K.js");
2406
+ const mod = await import("./dist-KBZ6SM7D.js");
2407
2407
  return { plugin: mod.stripePlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2408
2408
  },
2409
2409
  defaultFallback() {
@@ -2421,7 +2421,7 @@ var SERVICE_REGISTRY = {
2421
2421
  label: "MongoDB Atlas service emulator",
2422
2422
  endpoints: "Atlas Admin API v2 (projects, clusters, database users, databases, collections), Atlas Data API v1 (findOne, find, insertOne, insertMany, updateOne, updateMany, deleteOne, deleteMany, aggregate)",
2423
2423
  async load() {
2424
- const mod = await import("./dist-RMPDKZUA.js");
2424
+ const mod = await import("./dist-OT6R2YO2.js");
2425
2425
  return { plugin: mod.mongoatlasPlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2426
2426
  },
2427
2427
  defaultFallback() {
@@ -2440,7 +2440,7 @@ var SERVICE_REGISTRY = {
2440
2440
  label: "Clerk authentication and user management emulator",
2441
2441
  endpoints: "OIDC discovery, JWKS, OAuth authorize/token/userinfo, users, email addresses, organizations, memberships, invitations, sessions",
2442
2442
  async load() {
2443
- const mod = await import("./dist-WBKONLOE.js");
2443
+ const mod = await import("./dist-OVTPVMMW.js");
2444
2444
  return { plugin: mod.clerkPlugin, manifest: mod.manifest, seedFromConfig: mod.seedFromConfig };
2445
2445
  },
2446
2446
  defaultFallback(cfg) {
@@ -2545,7 +2545,7 @@ var SERVICE_REGISTRY = {
2545
2545
  label: "WorkOS emulator",
2546
2546
  endpoints: "AuthKit user management (hosted login, code/refresh grants, sealed-session JWKS), organizations, memberships, invitations, API keys, Vault KV, OAuth authorization server",
2547
2547
  async load() {
2548
- const mod = await import("./dist-IYZPDKJW.js");
2548
+ const mod = await import("./dist-S47YJ552.js");
2549
2549
  return {
2550
2550
  plugin: mod.workosPlugin,
2551
2551
  manifest: mod.manifest,
@@ -2570,7 +2570,7 @@ var SERVICE_REGISTRY = {
2570
2570
  label: "Autumn billing emulator",
2571
2571
  endpoints: "customers (get_or_create with seedable subscriptions), usage tracking, plans/features/events lists",
2572
2572
  async load() {
2573
- const mod = await import("./dist-JJ2ZRCAX.js");
2573
+ const mod = await import("./dist-YXHZTLFR.js");
2574
2574
  return {
2575
2575
  plugin: mod.autumnPlugin,
2576
2576
  manifest: mod.manifest,
@@ -2704,7 +2704,7 @@ function resolveBaseUrl(opts) {
2704
2704
  }
2705
2705
 
2706
2706
  // src/commands/start.ts
2707
- var pkg = { version: "0.6.0" };
2707
+ var pkg = { version: "0.7.0" };
2708
2708
  function loadSeedConfig(seedPath) {
2709
2709
  if (seedPath) {
2710
2710
  const fullPath = resolve(seedPath);
@@ -2934,7 +2934,7 @@ function listCommand() {
2934
2934
  }
2935
2935
 
2936
2936
  // src/index.ts
2937
- var pkg2 = { version: "0.6.0" };
2937
+ var pkg2 = { version: "0.7.0" };
2938
2938
  var defaultPort = process.env.EMULATE_PORT ?? process.env.PORT ?? "4000";
2939
2939
  var program = new Command();
2940
2940
  program.name("emulate").description("Local drop-in replacement services for CI and no-network sandboxes").version(pkg2.version);