From 735ccf780e1b097d6033b25d89f4ea7d092c2ba5 Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:22:29 -0700 Subject: [PATCH 1/3] Release 0.13.9 --- CHANGELOG.md | 10 +++++++++- 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, 32 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7fc8fec9..fa8ae47be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,19 @@ # Changelog -## 0.13.8 +## 0.13.9 ### New Features +- **WorkOS organization-owned API keys** — the WorkOS emulator now serves the SDK's organization API key surface: `GET /organizations/:id/api_keys` lists an organization's own keys (organization-owned only — members' personal keys never share the listing) and `POST /organizations/:id/api_keys` mints one. An organization-owned key carries the real wire owner shape (`owner: { type: "organization", id }`, no member field), round-trips through `POST /api_keys/validations` with that shape, and deletes through the shared `DELETE /api_keys/:id`. Unknown organizations 404. + + + +## 0.13.8 + +### New Features + - **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. diff --git a/packages/@emulators/adapter-next/package.json b/packages/@emulators/adapter-next/package.json index 516d4cb97..1a18a65c2 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.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/apple/package.json b/packages/@emulators/apple/package.json index a76897718..e0208dbfd 100644 --- a/packages/@emulators/apple/package.json +++ b/packages/@emulators/apple/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/apple", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/autumn/package.json b/packages/@emulators/autumn/package.json index 8cee4a065..8b0c98c24 100644 --- a/packages/@emulators/autumn/package.json +++ b/packages/@emulators/autumn/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/autumn", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/aws/package.json b/packages/@emulators/aws/package.json index 2d0861c50..91be4db17 100644 --- a/packages/@emulators/aws/package.json +++ b/packages/@emulators/aws/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/aws", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/clerk/package.json b/packages/@emulators/clerk/package.json index d7931930c..2c3c0f02b 100644 --- a/packages/@emulators/clerk/package.json +++ b/packages/@emulators/clerk/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/clerk", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/cloudflare/package.json b/packages/@emulators/cloudflare/package.json index 6f585cf5d..6150aefb7 100644 --- a/packages/@emulators/cloudflare/package.json +++ b/packages/@emulators/cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/cloudflare", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/core/package.json b/packages/@emulators/core/package.json index ed0dd7aac..de9eb006f 100644 --- a/packages/@emulators/core/package.json +++ b/packages/@emulators/core/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/core", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/github/package.json b/packages/@emulators/github/package.json index 03a58d956..7f5d867d4 100644 --- a/packages/@emulators/github/package.json +++ b/packages/@emulators/github/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/github", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/gitlab/package.json b/packages/@emulators/gitlab/package.json index fa6acbe10..004b62f68 100644 --- a/packages/@emulators/gitlab/package.json +++ b/packages/@emulators/gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/gitlab", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/google/package.json b/packages/@emulators/google/package.json index 100440cb1..fdcacc588 100644 --- a/packages/@emulators/google/package.json +++ b/packages/@emulators/google/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/google", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/mcp/package.json b/packages/@emulators/mcp/package.json index 00271a659..458a9d32c 100644 --- a/packages/@emulators/mcp/package.json +++ b/packages/@emulators/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/mcp", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/microsoft/package.json b/packages/@emulators/microsoft/package.json index c88492d9c..00bffc7f1 100644 --- a/packages/@emulators/microsoft/package.json +++ b/packages/@emulators/microsoft/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/microsoft", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/mongoatlas/package.json b/packages/@emulators/mongoatlas/package.json index 8b6cb0ac8..64dbbb39b 100644 --- a/packages/@emulators/mongoatlas/package.json +++ b/packages/@emulators/mongoatlas/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/mongoatlas", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/okta/package.json b/packages/@emulators/okta/package.json index 90be39e34..623cc626f 100644 --- a/packages/@emulators/okta/package.json +++ b/packages/@emulators/okta/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/okta", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/posthog/package.json b/packages/@emulators/posthog/package.json index b43e7a9d3..b7fe8db4a 100644 --- a/packages/@emulators/posthog/package.json +++ b/packages/@emulators/posthog/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/posthog", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/resend/package.json b/packages/@emulators/resend/package.json index d2fea0aba..1301b5bd9 100644 --- a/packages/@emulators/resend/package.json +++ b/packages/@emulators/resend/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/resend", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/slack/package.json b/packages/@emulators/slack/package.json index b5b245475..e3868eb0f 100644 --- a/packages/@emulators/slack/package.json +++ b/packages/@emulators/slack/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/slack", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/spotify/package.json b/packages/@emulators/spotify/package.json index 6a4785e61..28c74e2c8 100644 --- a/packages/@emulators/spotify/package.json +++ b/packages/@emulators/spotify/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/spotify", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/stripe/package.json b/packages/@emulators/stripe/package.json index 37f904875..74fab9e9c 100644 --- a/packages/@emulators/stripe/package.json +++ b/packages/@emulators/stripe/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/stripe", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/vercel/package.json b/packages/@emulators/vercel/package.json index ada6ab460..b2c994c51 100644 --- a/packages/@emulators/vercel/package.json +++ b/packages/@emulators/vercel/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/vercel", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/workos/package.json b/packages/@emulators/workos/package.json index 3f0094b9e..606fcd8b0 100644 --- a/packages/@emulators/workos/package.json +++ b/packages/@emulators/workos/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/workos", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/@emulators/x/package.json b/packages/@emulators/x/package.json index 2975174da..5b0d33d3f 100644 --- a/packages/@emulators/x/package.json +++ b/packages/@emulators/x/package.json @@ -1,6 +1,6 @@ { "name": "@emulators/x", - "version": "0.13.8", + "version": "0.13.9", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/packages/emulate/package.json b/packages/emulate/package.json index 20977d4e1..dc60d0909 100644 --- a/packages/emulate/package.json +++ b/packages/emulate/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/emulate", - "version": "0.13.8", + "version": "0.13.9", "description": "Local drop-in replacement services for CI and no-network sandboxes", "license": "Apache-2.0", "type": "module", From 9fb674c74702415a9a6a94f143a30a36cf118932 Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:22:54 -0700 Subject: [PATCH 2/3] Keep release markers only on the latest entry --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa8ae47be..616558c89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,6 @@ - **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 From 74c4aa159ee719f077296fa8e8a6026e5fb16ea1 Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:25:38 -0700 Subject: [PATCH 3/3] Format --- packages/@emulators/workos/src/__tests__/workos.test.ts | 4 +--- packages/@emulators/workos/src/store.ts | 7 +------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/@emulators/workos/src/__tests__/workos.test.ts b/packages/@emulators/workos/src/__tests__/workos.test.ts index 1ff3525bf..8d4e58635 100644 --- a/packages/@emulators/workos/src/__tests__/workos.test.ts +++ b/packages/@emulators/workos/src/__tests__/workos.test.ts @@ -383,9 +383,7 @@ describe("workos emulator with the real @workos-inc/node SDK", () => { expect(afterDelete.data).toEqual([]); // An unknown org 404s rather than answering an empty list. - await expect( - workos.organizations.listOrganizationApiKeys({ organizationId: "org_missing" }), - ).rejects.toThrow(); + await expect(workos.organizations.listOrganizationApiKeys({ organizationId: "org_missing" })).rejects.toThrow(); }); it("serves JWKS on both surfaces and OAuth AS metadata", async () => { diff --git a/packages/@emulators/workos/src/store.ts b/packages/@emulators/workos/src/store.ts index f38e1af4e..aac0836ac 100644 --- a/packages/@emulators/workos/src/store.ts +++ b/packages/@emulators/workos/src/store.ts @@ -46,12 +46,7 @@ export function getWorkosStore(store: Store): WorkosStore { "organization_id", "token", ]), - apiKeys: store.collection("workos.api_keys", [ - "workos_id", - "value", - "user_id", - "organization_id", - ]), + apiKeys: store.collection("workos.api_keys", ["workos_id", "value", "user_id", "organization_id"]), authCodes: store.collection("workos.auth_codes", ["code"]), sessions: store.collection("workos.sessions", ["refresh_token", "workos_id"]), vaultObjects: store.collection("workos.vault_objects", ["workos_id", "name"]),