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 e7fc8fec..fa8ae47b 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 516d4cb9..1a18a65c 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 a7689771..e0208dbf 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 8cee4a06..8b0c98c2 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 2d0861c5..91be4db1 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 d7931930..2c3c0f02 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 6f585cf5..6150aefb 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 ed0dd7aa..de9eb006 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 03a58d95..7f5d867d 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 fa6acbe1..004b62f6 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 100440cb..fdcacc58 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 00271a65..458a9d32 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 c88492d9..00bffc7f 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 8b6cb0ac..64dbbb39 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 90be39e3..623cc626 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 b43e7a9d..b7fe8db4 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 d2fea0ab..1301b5bd 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 b5b24547..e3868eb0 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 6a4785e6..28c74e2c 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 37f90487..74fab9e9 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 ada6ab46..b2c994c5 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 3f0094b9..606fcd8b 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 2975174d..5b0d33d3 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 20977d4e..dc60d090 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 fa8ae47b..616558c8 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 1ff3525b..8d4e5863 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 f38e1af4..aac0836a 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"]),