From 715fa32b5d9e8570394ee492bb500dc63382a0bd Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:12:18 -0700 Subject: [PATCH 1/2] Release 0.13.8 --- CHANGELOG.md | 12 ++++++++++-- packages/@emulators/adapter-next/package.json | 2 +- packages/@emulators/apple/package.json | 2 +- packages/@emulators/autumn/package.json | 2 +- packages/@emulators/aws/package.json | 2 +- packages/@emulators/clerk/package.json | 2 +- packages/@emulators/cloudflare/package.json | 2 +- packages/@emulators/core/package.json | 2 +- packages/@emulators/github/package.json | 2 +- packages/@emulators/gitlab/package.json | 2 +- packages/@emulators/google/package.json | 2 +- packages/@emulators/mcp/package.json | 2 +- packages/@emulators/microsoft/package.json | 2 +- packages/@emulators/mongoatlas/package.json | 2 +- packages/@emulators/okta/package.json | 2 +- packages/@emulators/posthog/package.json | 2 +- packages/@emulators/resend/package.json | 2 +- packages/@emulators/slack/package.json | 2 +- packages/@emulators/spotify/package.json | 2 +- packages/@emulators/stripe/package.json | 2 +- packages/@emulators/vercel/package.json | 2 +- packages/@emulators/workos/package.json | 2 +- packages/@emulators/x/package.json | 2 +- packages/emulate/package.json | 2 +- 24 files changed, 33 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ecf68d4..e7fc8fec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,23 @@ # Changelog -## 0.13.7 +## 0.13.8 ### New Features -- **MCP OAuth compliance scenario knobs** — the MCP emulator gains a seedable `oauth` config for exercising RFC 7591/8414/9728 client compliance: `issuerOverride` (advertise a lying issuer), `resourceOverride` (protected-resource metadata naming a foreign resource), `tokenEndpointAuthMethods` (advertise an exact list, or `"omit"` to drop the field so RFC 8414's client_secret_basic default applies), `dcrAuthMethodOverride` (the DCR response substitutes the requested token auth method), and `rejectClientNameContaining` (registration rejects branded client names with `invalid_client_metadata`). The token endpoint now supports HTTP Basic client authentication and enforces the registered method strictly: `client_secret_basic` clients must use Basic, `client_secret_post` clients must use the form body. +- **WorkOS organization domains** — the WorkOS emulator now persists organization domains statefully: `POST /organization_domains` creates a pending domain with a DNS verification token, `GET /organization_domains/:id` returns its current state, `POST /organization_domains/:id/verify` performs the real SDK verification transition, and `DELETE /organization_domains/:id` removes it. Deleting an organization cascades to its domains, and a test-only `POST /_emulate/organization_domains/:id/verify` hook flips a pending domain to verified out of band. Domains are globally unique across organizations with WorkOS-shaped conflict errors. +- **Stripe OpenAPI discovery in YAML** — the Stripe emulator serves `GET /openapi.yaml` alongside `GET /openapi.json`, derived from the same OpenAPI document. Form-encoded deep-object metadata (`metadata[foo]=bar`) is modeled in the spec's request encodings, and the customers API projects nested metadata in responses, matching Stripe's wire behavior. The request ledger records the parsed deep-object bodies. +## 0.13.7 + +### New Features + +- **MCP OAuth compliance scenario knobs** — the MCP emulator gains a seedable `oauth` config for exercising RFC 7591/8414/9728 client compliance: `issuerOverride` (advertise a lying issuer), `resourceOverride` (protected-resource metadata naming a foreign resource), `tokenEndpointAuthMethods` (advertise an exact list, or `"omit"` to drop the field so RFC 8414's client_secret_basic default applies), `dcrAuthMethodOverride` (the DCR response substitutes the requested token auth method), and `rejectClientNameContaining` (registration rejects branded client names with `invalid_client_metadata`). The token endpoint now supports HTTP Basic client authentication and enforces the registered method strictly: `client_secret_basic` clients must use Basic, `client_secret_post` clients must use the form body. + + ## 0.13.6 ### New Features diff --git a/packages/@emulators/adapter-next/package.json b/packages/@emulators/adapter-next/package.json index 1c127cf2..27071151 100644 --- a/packages/@emulators/adapter-next/package.json +++ b/packages/@emulators/adapter-next/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/adapter-next", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/apple/package.json b/packages/@emulators/apple/package.json index 63bc6ab1..e9c611a3 100644 --- a/packages/@emulators/apple/package.json +++ b/packages/@emulators/apple/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/apple", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/autumn/package.json b/packages/@emulators/autumn/package.json index d804b4c6..952ff2aa 100644 --- a/packages/@emulators/autumn/package.json +++ b/packages/@emulators/autumn/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/autumn", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/aws/package.json b/packages/@emulators/aws/package.json index 7471c403..6a9cc6e4 100644 --- a/packages/@emulators/aws/package.json +++ b/packages/@emulators/aws/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/aws", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/clerk/package.json b/packages/@emulators/clerk/package.json index 466e6bf5..bc941754 100644 --- a/packages/@emulators/clerk/package.json +++ b/packages/@emulators/clerk/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/clerk", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/cloudflare/package.json b/packages/@emulators/cloudflare/package.json index 753fbc28..8ee14513 100644 --- a/packages/@emulators/cloudflare/package.json +++ b/packages/@emulators/cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/cloudflare", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/core/package.json b/packages/@emulators/core/package.json index a397a14a..867899ee 100644 --- a/packages/@emulators/core/package.json +++ b/packages/@emulators/core/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/core", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/github/package.json b/packages/@emulators/github/package.json index ad20e0d0..08210169 100644 --- a/packages/@emulators/github/package.json +++ b/packages/@emulators/github/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/github", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/gitlab/package.json b/packages/@emulators/gitlab/package.json index af99c7b1..35ef0192 100644 --- a/packages/@emulators/gitlab/package.json +++ b/packages/@emulators/gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/gitlab", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/google/package.json b/packages/@emulators/google/package.json index 325ea929..21668f53 100644 --- a/packages/@emulators/google/package.json +++ b/packages/@emulators/google/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/google", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/mcp/package.json b/packages/@emulators/mcp/package.json index f430f864..46e1256a 100644 --- a/packages/@emulators/mcp/package.json +++ b/packages/@emulators/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/mcp", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/microsoft/package.json b/packages/@emulators/microsoft/package.json index fae9f6fd..0d7c5336 100644 --- a/packages/@emulators/microsoft/package.json +++ b/packages/@emulators/microsoft/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/microsoft", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/mongoatlas/package.json b/packages/@emulators/mongoatlas/package.json index d065c35b..8bb5463a 100644 --- a/packages/@emulators/mongoatlas/package.json +++ b/packages/@emulators/mongoatlas/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/mongoatlas", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/okta/package.json b/packages/@emulators/okta/package.json index b4164250..a06b8b98 100644 --- a/packages/@emulators/okta/package.json +++ b/packages/@emulators/okta/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/okta", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/posthog/package.json b/packages/@emulators/posthog/package.json index 821f0a97..1ff704b3 100644 --- a/packages/@emulators/posthog/package.json +++ b/packages/@emulators/posthog/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/posthog", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/resend/package.json b/packages/@emulators/resend/package.json index 62a301f9..0cf6944a 100644 --- a/packages/@emulators/resend/package.json +++ b/packages/@emulators/resend/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/resend", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/slack/package.json b/packages/@emulators/slack/package.json index 34ac429d..43c3017d 100644 --- a/packages/@emulators/slack/package.json +++ b/packages/@emulators/slack/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/slack", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/spotify/package.json b/packages/@emulators/spotify/package.json index 40d13024..b87bb963 100644 --- a/packages/@emulators/spotify/package.json +++ b/packages/@emulators/spotify/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/spotify", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/stripe/package.json b/packages/@emulators/stripe/package.json index 750c9653..858d0266 100644 --- a/packages/@emulators/stripe/package.json +++ b/packages/@emulators/stripe/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/stripe", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/vercel/package.json b/packages/@emulators/vercel/package.json index e3a36e0d..00a83b9e 100644 --- a/packages/@emulators/vercel/package.json +++ b/packages/@emulators/vercel/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/vercel", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/workos/package.json b/packages/@emulators/workos/package.json index 8c33f225..6261bf11 100644 --- a/packages/@emulators/workos/package.json +++ b/packages/@emulators/workos/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/workos", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/@emulators/x/package.json b/packages/@emulators/x/package.json index 6a3410bb..b6dc1db7 100644 --- a/packages/@emulators/x/package.json +++ b/packages/@emulators/x/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/x", - "version": "0.13.7", + "version": "0.13.8", "license": "Apache-2.0", "type": "module", "main": "./dist/index.js", diff --git a/packages/emulate/package.json b/packages/emulate/package.json index 8f636f1b..20977d4e 100644 --- a/packages/emulate/package.json +++ b/packages/emulate/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/emulate", - "version": "0.13.7", + "version": "0.13.8", "description": "Local drop-in replacement services for CI and no-network sandboxes", "license": "Apache-2.0", "type": "module", From 68ef88d2ef8b5991f2011991e7fef2a422df5b29 Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:15:37 -0700 Subject: [PATCH 2/2] Fix formatting --- .../google/src/__tests__/google.test.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/@emulators/google/src/__tests__/google.test.ts b/packages/@emulators/google/src/__tests__/google.test.ts index 53227b2b..02cf5e44 100644 --- a/packages/@emulators/google/src/__tests__/google.test.ts +++ b/packages/@emulators/google/src/__tests__/google.test.ts @@ -964,15 +964,23 @@ describe("Google plugin integration", () => { }); const tokens = (await tokenRes.json()) as { access_token: string; refresh_token: string }; - expect((await app.request(`${base}/oauth2/v2/userinfo`, { - headers: { Authorization: `Bearer ${tokens.access_token}` }, - })).status).toBe(200); + expect( + ( + await app.request(`${base}/oauth2/v2/userinfo`, { + headers: { Authorization: `Bearer ${tokens.access_token}` }, + }) + ).status, + ).toBe(200); const expired = await app.request(`${base}/_emulate/oauth/access-tokens/expire`, { method: "POST" }); expect(expired.status).toBe(200); expect(await expired.json()).toMatchObject({ expired: expect.any(Number) }); - expect((await app.request(`${base}/oauth2/v2/userinfo`, { - headers: { Authorization: `Bearer ${tokens.access_token}` }, - })).status).toBe(401); + expect( + ( + await app.request(`${base}/oauth2/v2/userinfo`, { + headers: { Authorization: `Bearer ${tokens.access_token}` }, + }) + ).status, + ).toBe(401); const revoked = await app.request(`${base}/_emulate/oauth/refresh-tokens/revoke`, { method: "POST" }); expect(revoked.status).toBe(200);