From 90a3f9e414dffa0a0113e187a1df0e9667299d48 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 12:56:49 +0100 Subject: [PATCH 1/8] fix(ep-commerce): stop serializing the shopper's EP token into page HTML MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `providerProps()` returned the session's EP access token, which the catchall page fed to `globalContextsProps` and Plasmic serialized into the document — readable by any script on the page. It now returns `{}`. Cart and checkout always run through the server routes; the browser-direct EP SDK cart path and the `serverCartMode` toggle that selected it are gone, along with the four `cart/use-*` hooks that drove it. `EPCheckoutCartSummary` reads `useCheckoutCart()` instead. The `getServerInfo` bridge and the `auth/ep-*-server-info` modules go too: they targeted a reverted upstream API and were never wired to a component. Server-side data flows through Studio Server Queries and `withEpSession`. `serverToken` and `serverCartMode` stay in the registered prop schema, hidden and inert — registered props on a hostless package are append-only, and removing one breaks hostless publishing for every package. Closes #282 --- .../app/[[...catchall]]/page.tsx | 9 - examples/ep-commerce-app-router/middleware.ts | 7 +- .../elastic-path/CHANGELOG.md | 46 ++++ .../commerce-providers/elastic-path/README.md | 73 +++-- .../ep-product-list-server-info.test.ts | 94 ------- .../__tests__/ep-product-provider.test.ts | 112 -------- .../auth/__tests__/ep-provider-ssr.test.ts | 61 ---- .../ep-related-products-server-info.test.ts | 92 ------- .../extract-ep-provider-config.test.ts | 5 - .../__tests__/create-ep-auth-adapter.test.ts | 10 +- .../auth/ep-plugin/create-ep-auth-better.ts | 5 +- .../src/auth/ep-plugin/proxy-routes.ts | 1 - .../src/auth/ep-product-list-server-info.ts | 89 ------ .../src/auth/ep-product-server-info.ts | 47 ---- .../src/auth/ep-provider-server-info.ts | 34 --- .../auth/ep-related-products-server-info.ts | 55 ---- .../src/auth/extract-ep-provider-config.ts | 12 +- .../src/cart/__tests__/use-add-item.test.tsx | 257 ----------------- .../src/cart/__tests__/use-cart.test.tsx | 231 ---------------- .../cart/__tests__/use-remove-item.test.tsx | 205 -------------- .../cart/__tests__/use-update-item.test.tsx | 260 ------------------ .../elastic-path/src/cart/index.ts | 2 - .../elastic-path/src/cart/use-add-item.tsx | 110 -------- .../elastic-path/src/cart/use-cart.tsx | 107 ------- .../elastic-path/src/cart/use-remove-item.tsx | 109 -------- .../elastic-path/src/cart/use-update-item.tsx | 147 ---------- .../composable/EPCheckoutCartSummary.tsx | 65 +---- .../elastic-path/src/client.ts | 32 +-- .../elastic-path/src/elastic-path.tsx | 3 +- .../__tests__/build-ep-ctx.test.ts | 3 +- .../__tests__/cart-mutations.test.ts | 1 - .../__tests__/getCart.test.ts | 1 - .../__tests__/getProduct.test.ts | 1 - .../__tests__/getProductList.test.ts | 1 - .../__tests__/getRelatedProducts.test.ts | 1 - .../__tests__/place-order.test.ts | 1 - .../__tests__/session-context.test.ts | 5 +- .../src/ep-server-functions/build-ep-ctx.ts | 2 - .../elastic-path/src/provider.ts | 35 +-- .../src/registerCommerceProvider.test.tsx | 44 +-- .../src/registerCommerceProvider.tsx | 52 ++-- .../ServerCartActionsProvider.tsx | 8 +- 42 files changed, 171 insertions(+), 2264 deletions(-) create mode 100644 plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-list-server-info.test.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-provider.test.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-provider-ssr.test.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-related-products-server-info.test.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-list-server-info.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-server-info.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-provider-server-info.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-related-products-server-info.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-add-item.test.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-cart.test.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-remove-item.test.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-update-item.test.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/index.ts delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/use-add-item.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/use-cart.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/use-remove-item.tsx delete mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/cart/use-update-item.tsx diff --git a/examples/ep-commerce-app-router/app/[[...catchall]]/page.tsx b/examples/ep-commerce-app-router/app/[[...catchall]]/page.tsx index 6ef4ffc444..683a264a72 100644 --- a/examples/ep-commerce-app-router/app/[[...catchall]]/page.tsx +++ b/examples/ep-commerce-app-router/app/[[...catchall]]/page.tsx @@ -73,19 +73,10 @@ export default async function PlasmicLoaderPage({ PLASMIC.unstable__getServerQueriesData(prefetchedData, queryCtx) ); - // The `$dev` suffix matches `registerWithDevMeta`'s convention in - // plasmic-register-dev-meta.ts. When registering for production - // (without dev-meta), drop the suffix here too so the component name - // matches what's actually registered. - const globalContextsProps = { - "plasmic-commerce-elastic-path-provider$dev": session.providerProps(), - }; - return ( diff --git a/examples/ep-commerce-app-router/middleware.ts b/examples/ep-commerce-app-router/middleware.ts index 7552376711..0afa407abd 100644 --- a/examples/ep-commerce-app-router/middleware.ts +++ b/examples/ep-commerce-app-router/middleware.ts @@ -6,10 +6,9 @@ * middleware runs BEFORE the page, mints an anonymous EP session via * the better-auth handler, and persists the resulting cookies. After * this fires once, every subsequent request carries - * `better-auth.session_token` + `better-auth.session_data`, the - * catchall page reads them via `epAuth.api.getSession({cookies})`, - * and the client-side EP SDK receives the same `serverToken` via - * globalContextsProps — no localStorage fallback. + * `better-auth.session_token` + `better-auth.session_data`, and the + * catchall page reads them via `epAuth.api.getSession({cookies})`. The + * token stays server-side from there. */ import { epAuthMiddleware } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; import { epAuth } from "@/lib/ep-auth"; diff --git a/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md new file mode 100644 index 0000000000..666158813e --- /dev/null +++ b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md @@ -0,0 +1,46 @@ +# Changelog + +## Unreleased + +### Breaking + +The shopper's Elastic Path access token no longer reaches the browser. It was +previously serialized into page HTML as `globalContextsProps.serverToken`, +readable by any script on the page. + +Cart and checkout now always run through the server routes. The browser-direct +Elastic Path SDK cart path, and the `serverCartMode` toggle that selected +between them, are gone. + +**Removed hooks** — all four called the Elastic Path SDK directly from the +browser using the leaked token: + +| Removed | Replacement | +| --- | --- | +| `cart/use-cart` | `useCart` from `shopper-context` | +| `cart/use-add-item` | `useAddItem` from `shopper-context`, or `EPAddToCartButton` | +| `cart/use-update-item` | `useUpdateItem` from `shopper-context` | +| `cart/use-remove-item` | `useRemoveItem` from `shopper-context` | + +**Removed provider surface** — `getElasticPathProvider` and +`getCommerceProvider` no longer take a `serverToken` argument, and the returned +provider no longer carries `cart`. `initElasticPathClient` takes credentials +only; its client serves catalog reads and mints its own anonymous token from +the public `clientId`. + +**Removed from the storefront** — drop the `globalContextsProps` entry that fed +`session.providerProps()` into `PlasmicClientRootProvider`. `providerProps()` +now returns `{}`. + +`serverToken` and `serverCartMode` remain in the registered prop schema, hidden +and ignored. Registered props on a hostless package are append-only; removing +one breaks hostless publishing for every package. Everywhere else the flag is +gone: `EpCtx` and `EpProviderBundleConfig` no longer carry `serverCartMode`, +and `extractEpProviderConfig` no longer scrapes it from the loader bundle. + +### Removed + +The `getServerInfo` bridge on the provider global context, along with the +`auth/ep-*-server-info.ts` modules it fed. They targeted an upstream API that +was reverted and were never wired to a component. Server-side data flows +through Studio Server Queries and `withEpSession` instead. diff --git a/plasmicpkgs/commerce-providers/elastic-path/README.md b/plasmicpkgs/commerce-providers/elastic-path/README.md index 38c911aed7..921bdc8d8e 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/README.md +++ b/plasmicpkgs/commerce-providers/elastic-path/README.md @@ -102,15 +102,10 @@ export default async function Page({ params }: { params: { catchall?: string[] } ), }); - // SSR: extract query data with server token injected + // SSR: extract query data. The session stays server-side — it is never + // handed to globalContextsProps, which Plasmic serializes into the HTML. const queryData = await extractPlasmicQueryData( - + ); @@ -127,9 +122,6 @@ export default async function Page({ params }: { params: { catchall?: string[] } loader={PLASMIC} prefetchedData={plasmicData} prefetchedQueryData={queryData} - globalContextsProps={{ - "plasmic-commerce-elastic-path-provider": session.providerProps(), - }} > @@ -161,15 +153,10 @@ export const getServerSideProps: GetServerSideProps = async ({ req, res, params cookies: req.cookies as Record, }); - // SSR: extract query data with server token injected + // SSR: extract query data. The session stays server-side — it is never + // handed to globalContextsProps, which Plasmic serializes into the HTML. const queryData = await extractPlasmicQueryData( - + ); @@ -243,20 +230,29 @@ three rather than only to the factory. ``` First visit: - page.tsx → epAuth.api.getSession() → OAuth with clientId → serverToken - → EP Provider (prepass) → product data SSRs + page.tsx → epAuth.api.getSession() → OAuth with clientId → access token + → buildEpCtx() → withEpSession() → Server Queries SSR product data → commitCookies() → httpOnly ep_token cookie set Returning visit: - page.tsx → epAuth.api.getSession() → reads ep_token cookie → serverToken - → EP Provider (prepass) → product data SSRs → zero OAuth calls + page.tsx → epAuth.api.getSession() → reads ep_token cookie → access token + → buildEpCtx() → withEpSession() → Server Queries SSR → zero OAuth calls ``` -The access token never reaches the browser. It flows through: -1. Server-side `getSession()` → httpOnly cookie -2. `providerProps()` → `globalContextsProps` (server-only, not serialized to HTML) -3. EP Provider `getServerInfo` → `providedContexts` (server prepass only) -4. Product components `getServerInfo` → `ops.readContext("ep-server-token")` +The access token never reaches the browser. It stays on the server: +1. `getSession()` reads or mints it, then writes it to an httpOnly cookie +2. `buildEpCtx()` puts it on an `EpCtx`, which `withEpSession()` publishes + through AsyncLocalStorage +3. Server Queries and the `/api/ep` proxy routes read it via + `getCurrentEpSession()` and call Elastic Path directly + +`providerProps()` returns `{}`. Whatever it returned would be handed to +`globalContextsProps` and serialized into the page HTML, so it never carries +a credential. + +Browser-side catalog reads go through the Elastic Path SDK client, which mints +its own anonymous token from the public `clientId` and holds it in memory — +never localStorage, never a cookie. ### API Routes @@ -283,14 +279,13 @@ All cookies: `HttpOnly; SameSite=Lax; Path=/`. `Secure` in production. ### Server-Side Rendering -Product components implement `getServerInfo` for the Loader v2 RSC-native path: - -- **EP Provider** → provides `ep-server-token` and `ep-host` contexts -- **EPProductProvider** → fetches single product via EP catalog API -- **EPProductListProvider** → fetches paginated product list -- **EPRelatedProductsProvider** → fetches related products +Product data server-renders through Studio Server Queries against the EP custom +functions — see [Studio Server Queries (SSR)](#studio-server-queries-ssr) below. +`buildEpCtx()` + `withEpSession()` carry the session; each `ep.*` function reads +it via `getCurrentEpSession()`. -Data flows through `ops.fetchData()` → SWR cache → `prefetchedQueryData` → client hydration. Product data SSRs for SEO. Token never enters the cache. +Data flows into `prefetchedQueryData` → client hydration. Product data SSRs for +SEO. The token never enters the cache. ### Better Auth Alignment @@ -429,13 +424,13 @@ Then bind the `EPProductProvider` component's advanced `product` prop to `$q.pro ## Components ### Core -- **EP Provider** — Global context: `clientId`, `host`, `locale`, `serverCartMode`, `serverToken` +- **EP Provider** — Global context: `clientId`, `host`, `locale`, `currency` - **Shopper Context** — Global context: `cartId`, `accountId`, `basePath` overrides ### Product Display -- **EPProductProvider** — Single product data (with `getServerInfo` for SSR) -- **EPProductListProvider** — Paginated product listing (with `getServerInfo`) -- **EPRelatedProductsProvider** — Related products (with `getServerInfo`) +- **EPProductProvider** — Single product data +- **EPProductListProvider** — Paginated product listing +- **EPRelatedProductsProvider** — Related products - **EPProductGrid** — Repeater for product list items ### Cart diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-list-server-info.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-list-server-info.test.ts deleted file mode 100644 index 6c572430e0..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-list-server-info.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - epProductListGetServerInfo, - fetchProductListForServer, -} from "../ep-product-list-server-info"; - -const mockFetch = jest.fn(); -(global as any).fetch = mockFetch; - -beforeEach(() => { - mockFetch.mockReset(); -}); - -const mockProducts = { - data: [{ id: "p1" }, { id: "p2" }], - meta: { results: { total: 2 } }, -}; - -describe("fetchProductListForServer", () => { - it("fetches products with pagination params", async () => { - mockFetch.mockResolvedValue({ - ok: true, - json: () => Promise.resolve(mockProducts), - }); - - const result = await fetchProductListForServer( - "server-token", - "https://useast.api.elasticpath.com", - { page: 0, pageSize: 12 } - ); - - expect(mockFetch).toHaveBeenCalledTimes(1); - const [url, opts] = mockFetch.mock.calls[0]; - expect(url).toContain("/catalog/products"); - expect(url).toContain("page%5Blimit%5D=12"); - expect(url).toContain("page%5Boffset%5D=0"); - expect(opts.headers["Authorization"]).toBe("Bearer server-token"); - expect(result).toEqual(mockProducts); - }); - - it("includes category filter when provided", async () => { - mockFetch.mockResolvedValue({ - ok: true, - json: () => Promise.resolve(mockProducts), - }); - - await fetchProductListForServer( - "server-token", - "https://useast.api.elasticpath.com", - { page: 0, pageSize: 12, categoryId: "cat-1" } - ); - - const [url] = mockFetch.mock.calls[0]; - expect(url).toContain("filter=eq%28category.id%2Ccat-1%29"); - }); -}); - -describe("epProductListGetServerInfo", () => { - it("returns providedData when serverToken available", () => { - const mockOps = { - readContext: jest.fn((key: string) => { - if (key === "ep-server-token") return "token-abc"; - if (key === "ep-host") return "https://useast.api.elasticpath.com"; - return undefined; - }), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn().mockReturnValue(mockProducts), - }; - - const result = epProductListGetServerInfo( - { pageSize: 12 }, - mockOps - ); - - expect(mockOps.fetchData).toHaveBeenCalled(); - expect(result.providedData).toEqual([ - { name: "epProductList", data: mockProducts }, - ]); - }); - - it("returns empty when no serverToken", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue(undefined), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - const result = epProductListGetServerInfo({ pageSize: 12 }, mockOps); - expect(result).toEqual({}); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-provider.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-provider.test.ts deleted file mode 100644 index d9b50caf22..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-product-provider.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { - epProductGetServerInfo, - fetchProductForServer, -} from "../ep-product-server-info"; - -const mockFetch = jest.fn(); -(global as any).fetch = mockFetch; - -beforeEach(() => { - mockFetch.mockReset(); -}); - -const mockProduct = { - data: { - id: "prod-123", - attributes: { name: "Test Product", sku: "SKU-1" }, - }, - included: { main_images: [{ id: "img-1" }] }, -}; - -describe("fetchProductForServer", () => { - it("fetches a product from EP API using server token", async () => { - mockFetch.mockResolvedValue({ - ok: true, - json: () => Promise.resolve(mockProduct), - }); - - const result = await fetchProductForServer( - "prod-123", - "server-token-abc", - "https://useast.api.elasticpath.com" - ); - - expect(mockFetch).toHaveBeenCalledTimes(1); - const [url, opts] = mockFetch.mock.calls[0]; - expect(url).toContain("/catalog/products/prod-123"); - expect(url).toContain("include=main_image"); - expect(opts.headers["Authorization"]).toBe("Bearer server-token-abc"); - expect(result).toEqual(mockProduct); - }); - - it("throws on non-ok response", async () => { - mockFetch.mockResolvedValue({ - ok: false, - status: 404, - text: () => Promise.resolve("Not found"), - }); - - await expect( - fetchProductForServer("bad-id", "token", "https://useast.api.elasticpath.com") - ).rejects.toThrow(); - }); -}); - -describe("epProductGetServerInfo", () => { - it("returns providedData with product when serverToken and productId available", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue("server-token-abc"), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn().mockReturnValue(mockProduct), - }; - - const result = epProductGetServerInfo( - { productId: "prod-123" }, - mockOps - ); - - expect(mockOps.readContext).toHaveBeenCalledWith("ep-server-token"); - expect(mockOps.fetchData).toHaveBeenCalledWith( - ["ep-product", "prod-123"], - expect.any(Function) - ); - expect(result.providedData).toEqual([ - { name: "epProduct", data: mockProduct }, - ]); - }); - - it("returns empty when no serverToken", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue(undefined), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - const result = epProductGetServerInfo( - { productId: "prod-123" }, - mockOps - ); - - expect(result).toEqual({}); - expect(mockOps.fetchData).not.toHaveBeenCalled(); - }); - - it("returns empty when no productId", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue("server-token-abc"), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - const result = epProductGetServerInfo({}, mockOps); - - expect(result).toEqual({}); - expect(mockOps.fetchData).not.toHaveBeenCalled(); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-provider-ssr.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-provider-ssr.test.ts deleted file mode 100644 index 995a63c6fb..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-provider-ssr.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - epProviderGetServerInfo, -} from "../ep-provider-server-info"; -import initElasticPathClient from "../../client"; - -describe("epProviderGetServerInfo", () => { - const mockOps = { - readContext: jest.fn(), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - it("provides ep-server-token and ep-host contexts when serverToken is present", () => { - const result = epProviderGetServerInfo( - { serverToken: "my-server-token", host: "https://useast.api.elasticpath.com" }, - mockOps - ); - - expect(result).toEqual({ - providedContexts: [ - { contextKey: "ep-server-token", value: "my-server-token" }, - { contextKey: "ep-host", value: "https://useast.api.elasticpath.com" }, - ], - }); - }); - - it("returns empty object when serverToken is absent", () => { - const result = epProviderGetServerInfo({}, mockOps); - expect(result).toEqual({}); - }); - - it("returns empty object when serverToken is empty string", () => { - const result = epProviderGetServerInfo( - { serverToken: "" }, - mockOps - ); - expect(result).toEqual({}); - }); -}); - -describe("initElasticPathClient with serverToken", () => { - it("accepts a serverToken parameter and returns a client", () => { - const client = initElasticPathClient( - { clientId: "cid", host: "https://useast.api.elasticpath.com" }, - "pre-resolved-token" - ); - expect(client).toBeDefined(); - expect(typeof client.interceptors).toBe("object"); - }); - - it("works without serverToken (backward compatible)", () => { - const client = initElasticPathClient({ - clientId: "cid", - host: "https://useast.api.elasticpath.com", - }); - expect(client).toBeDefined(); - expect(typeof client.interceptors).toBe("object"); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-related-products-server-info.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-related-products-server-info.test.ts deleted file mode 100644 index 421c982221..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/ep-related-products-server-info.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - epRelatedProductsGetServerInfo, - fetchRelatedProductsForServer, -} from "../ep-related-products-server-info"; - -const mockFetch = jest.fn(); -(global as any).fetch = mockFetch; - -beforeEach(() => { - mockFetch.mockReset(); -}); - -const mockProducts = { - data: [{ id: "r1" }, { id: "r2" }], -}; - -describe("fetchRelatedProductsForServer", () => { - it("fetches products from EP catalog API", async () => { - mockFetch.mockResolvedValue({ - ok: true, - json: () => Promise.resolve(mockProducts), - }); - - const result = await fetchRelatedProductsForServer( - "prod-123", - "server-token", - "https://useast.api.elasticpath.com", - 4 - ); - - expect(mockFetch).toHaveBeenCalledTimes(1); - const [url, opts] = mockFetch.mock.calls[0]; - expect(url).toContain("/catalog/products"); - expect(opts.headers["Authorization"]).toBe("Bearer server-token"); - expect(result).toEqual(mockProducts); - }); -}); - -describe("epRelatedProductsGetServerInfo", () => { - it("returns providedData when serverToken and productId available", () => { - const mockOps = { - readContext: jest.fn((key: string) => { - if (key === "ep-server-token") return "token-abc"; - if (key === "ep-host") return "https://useast.api.elasticpath.com"; - return undefined; - }), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn().mockReturnValue(mockProducts), - }; - - const result = epRelatedProductsGetServerInfo( - { productId: "prod-123", maxProducts: 4 }, - mockOps - ); - - expect(mockOps.fetchData).toHaveBeenCalled(); - expect(result.providedData).toEqual([ - { name: "epRelatedProducts", data: mockProducts }, - ]); - }); - - it("returns empty when no serverToken", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue(undefined), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - const result = epRelatedProductsGetServerInfo( - { productId: "prod-123" }, - mockOps - ); - expect(result).toEqual({}); - }); - - it("returns empty when no productId", () => { - const mockOps = { - readContext: jest.fn().mockReturnValue("token"), - readDataEnv: jest.fn(), - readDataSelector: jest.fn(), - readDataSelectors: jest.fn(), - fetchData: jest.fn(), - }; - - const result = epRelatedProductsGetServerInfo({}, mockOps); - expect(result).toEqual({}); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/extract-ep-provider-config.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/extract-ep-provider-config.test.ts index 9661e003a1..f4b18ca822 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/extract-ep-provider-config.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/__tests__/extract-ep-provider-config.test.ts @@ -62,7 +62,6 @@ describe("extractEpProviderConfig", () => { expect(config).toEqual({ clientId: "oVC2dwzwVi0sCbov7voN63H8gami9do0TLm3GaVKAJ", host: "https://epcc-integration.global.ssl.fastly.net", - serverCartMode: true, }); }); @@ -84,7 +83,6 @@ describe("extractEpProviderConfig", () => { expect(config).toEqual({ clientId: "abc123", host: "https://useast.api.elasticpath.com", - serverCartMode: false, }); }); @@ -240,7 +238,6 @@ function E(r){ ).toEqual({ clientId: "b6ratpsgidekICtcXjPWPODbGHckKfXWNNXnTivqQR", host: "https://epcc-integration.global.ssl.fastly.net", - serverCartMode: true, }); expect(errorSpy).not.toHaveBeenCalled(); } finally { @@ -305,7 +302,6 @@ function E(r){ expect(extractEpProviderConfig(bundleWith(foreignCustom))).toEqual({ clientId: "EP_REAL_CLIENT_ID", host: "https://useast.api.elasticpath.com", - serverCartMode: true, }); expect(errorSpy).not.toHaveBeenCalled(); }); @@ -328,7 +324,6 @@ function E(r){ expect(extractEpProviderConfig(bundleWith(foreignClientIdFirst))).toEqual({ clientId: "EP_REAL_CLIENT_ID", host: "https://epcc-integration.global.ssl.fastly.net", - serverCartMode: true, }); // The commercetools host is rejected on the way past, but the storefront // works, so the operator must not be told anything is wrong. diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts index 048f61524d..6677d7e623 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts @@ -78,7 +78,7 @@ describe("createEpAuth adapter (PRD #273)", () => { expect(typeof session.commitCookies).toBe("function"); }); - it("providerProps() returns serverToken when authenticated session exists", async () => { + it("providerProps() never serializes the EP access token", async () => { const epAuth = createEpAuth({ clientId: EP_CLIENT_ID, host: EP_HOST, @@ -91,7 +91,13 @@ describe("createEpAuth adapter (PRD #273)", () => { headers: {}, }); - expect(session.providerProps()).toEqual({ serverToken: FAKE_TOKEN }); + // The session itself carries the token — the point is that + // providerProps(), which the catchall page hands to + // globalContextsProps and Plasmic serializes into page HTML, + // does not. + expect(session.session?.accessToken).toBe(FAKE_TOKEN); + expect(session.providerProps()).toEqual({}); + expect(JSON.stringify(session.providerProps())).not.toContain(FAKE_TOKEN); }); it("commitCookies() emits the better-auth Set-Cookie headers", async () => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts index a21b0cf682..bbb2c833af 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts @@ -349,9 +349,10 @@ export function createEpAuth(input: CreateEpAuthBetterInput): EpAuth { } return h; }, + // Never carries the EP access token: whatever this returns is + // serialized into the page HTML via globalContextsProps. providerProps() { - if (!sessionData) return {}; - return { serverToken: sessionData.accessToken }; + return {}; }, commitCookies(res) { for (const cookie of pendingSetCookies) { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/proxy-routes.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/proxy-routes.ts index a52cada19f..2c69e99ac3 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/proxy-routes.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/proxy-routes.ts @@ -183,7 +183,6 @@ export function createEpProxyRoutes(epAuth: EpAuth): EpProxyRoutes { accessToken: session.accessToken, host: session.host, clientId: session.clientId, - serverCartMode: false, cartId: sessionResult.cart?.id ?? undefined, accountId: sessionResult.user?.accountId ?? undefined, locale: session.locale, diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-list-server-info.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-list-server-info.ts deleted file mode 100644 index 6ee773488d..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-list-server-info.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Server-side data fetching for EPProductListProvider. - * - * Fetches paginated product list from EP catalog API during prepass. - */ - -export interface ProductListServerOptions { - page?: number; - pageSize?: number; - categoryId?: string; - search?: string; - sort?: string; -} - -export async function fetchProductListForServer( - serverToken: string, - host: string, - options: ProductListServerOptions -): Promise { - const { page = 0, pageSize = 12, categoryId, search, sort } = options; - - const params = new URLSearchParams({ - "include": "main_image", - "page[limit]": String(pageSize), - "page[offset]": String(page * pageSize), - }); - - if (categoryId) { - params.set("filter", `eq(category.id,${categoryId})`); - } - if (search) { - const existing = params.get("filter"); - const searchFilter = `eq(name,${search})`; - params.set("filter", existing ? `and(${existing},${searchFilter})` : searchFilter); - } - if (sort) { - params.set("sort", sort); - } - - const url = `${host}/catalog/products?${params.toString()}`; - const response = await fetch(url, { - headers: { - Authorization: `Bearer ${serverToken}`, - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - const text = await response.text(); - throw new Error(`EP product list fetch failed (${response.status}): ${text}`); - } - - return response.json(); -} - -export function epProductListGetServerInfo( - props: Record, - ops: any -): any { - const serverToken = ops.readContext("ep-server-token"); - const host = ops.readContext("ep-host") ?? "https://useast.api.elasticpath.com"; - - if (!serverToken) return {}; - - const options: ProductListServerOptions = { - page: props.page ?? 0, - pageSize: props.pageSize ?? 12, - categoryId: props.categoryId, - search: props.search, - sort: props.sort, - }; - - const cacheKey = [ - "ep-product-list", - options.categoryId ?? "", - options.search ?? "", - options.sort ?? "", - options.page, - options.pageSize, - ]; - - const data = ops.fetchData(cacheKey, () => - fetchProductListForServer(serverToken, host, options) - ); - - return { - providedData: [{ name: "epProductList", data }], - }; -} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-server-info.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-server-info.ts deleted file mode 100644 index 08d977b66e..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-product-server-info.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Server-side data fetching for EPProductProvider. - * - * Extracted from the component registration so it can be unit-tested - * without importing @plasmicapp/host. - */ - -export async function fetchProductForServer( - productId: string, - serverToken: string, - host: string -): Promise { - const url = `${host}/catalog/products/${productId}?include=main_image,files,component_products`; - const response = await fetch(url, { - headers: { - Authorization: `Bearer ${serverToken}`, - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - const text = await response.text(); - throw new Error(`EP product fetch failed (${response.status}): ${text}`); - } - - return response.json(); -} - -export function epProductGetServerInfo( - props: Record, - ops: any -): any { - const serverToken = ops.readContext("ep-server-token"); - const host = ops.readContext("ep-host") ?? "https://useast.api.elasticpath.com"; - const productId = props.productId; - - if (!serverToken || !productId) return {}; - - const product = ops.fetchData( - ["ep-product", productId], - () => fetchProductForServer(productId, serverToken, host) - ); - - return { - providedData: [{ name: "epProduct", data: product }], - }; -} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-provider-server-info.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-provider-server-info.ts deleted file mode 100644 index fd6633940c..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-provider-server-info.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * getServerInfo implementation for the EP Commerce Provider global context. - * - * Bridges the serverToken prop (injected via globalContextsProps by the - * consumer's page-level code) to child product components via providedContexts. - * Child components read the token via ops.readContext("ep-server-token") - * in their own getServerInfo implementations. - * - * Extracted from the registration meta so it can be unit-tested without - * importing @plasmicapp/host (which doesn't resolve in the jest environment). - */ - -export interface ServerInfo { - providedContexts?: Array<{ contextKey: string; value: any }>; - providedData?: Array<{ name: string; data: any }>; - children?: any; -} - -export function epProviderGetServerInfo( - props: Record, - _ops: any -): ServerInfo { - const serverToken = props.serverToken; - if (!serverToken) return {}; - - const host = props.host === "custom" ? props.customHost : props.host; - - return { - providedContexts: [ - { contextKey: "ep-server-token", value: serverToken }, - { contextKey: "ep-host", value: host }, - ], - }; -} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-related-products-server-info.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-related-products-server-info.ts deleted file mode 100644 index fec7eb5287..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-related-products-server-info.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Server-side data fetching for EPRelatedProductsProvider. - * - * Fetches related products from EP catalog API during prepass. - * Uses the same catalog endpoint with a limit parameter. - */ - -export async function fetchRelatedProductsForServer( - productId: string, - serverToken: string, - host: string, - maxProducts: number = 4 -): Promise { - const params = new URLSearchParams({ - "include": "main_image", - "page[limit]": String(maxProducts), - }); - - const url = `${host}/catalog/products?${params.toString()}`; - const response = await fetch(url, { - headers: { - Authorization: `Bearer ${serverToken}`, - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - const text = await response.text(); - throw new Error(`EP related products fetch failed (${response.status}): ${text}`); - } - - return response.json(); -} - -export function epRelatedProductsGetServerInfo( - props: Record, - ops: any -): any { - const serverToken = ops.readContext("ep-server-token"); - const host = ops.readContext("ep-host") ?? "https://useast.api.elasticpath.com"; - const productId = props.productId; - - if (!serverToken || !productId) return {}; - - const maxProducts = props.maxProducts ?? 4; - - const data = ops.fetchData( - ["ep-related-products", productId, maxProducts], - () => fetchRelatedProductsForServer(productId, serverToken, host, maxProducts) - ); - - return { - providedData: [{ name: "epRelatedProducts", data }], - }; -} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/extract-ep-provider-config.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/extract-ep-provider-config.ts index 427397bee8..9e2fb702e7 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/extract-ep-provider-config.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/extract-ep-provider-config.ts @@ -10,8 +10,8 @@ * :&&""in ?.: * * for every prop. We scan the server bundle modules and regex-extract the - * EP-Provider-specific props (clientId / host / customHost / serverCartMode), - * grouped per provider — see `propRegex` for how the grouping works. + * EP-Provider-specific props (clientId / host / customHost), grouped per + * provider — see `propRegex` for how the grouping works. * * This is intentionally narrow — it only reads the props the storefront needs * to resolve a server session. If Plasmic's codegen output changes shape in a @@ -30,8 +30,6 @@ export interface EpProviderBundleConfig { clientId: string; /** Resolved API host — `customHost` when `host === "custom"`, else `host` */ host: string; - /** `serverCartMode` flag from the EP Provider */ - serverCartMode: boolean; } type BundleModule = { @@ -110,12 +108,11 @@ interface ProviderCandidate { clientId: string; host: PropValue; customHost: PropValue; - serverCartMode: PropValue; } /** * One candidate per props identifier carrying a non-empty `clientId`. Reading - * all four props off the same identifier is what keeps a neighbouring + * all three props off the same identifier is what keeps a neighbouring * provider's host, clientId or customHost from being paired with EP's. * Candidates that aren't EP (another commerce provider also registers a * `clientId`) fail the host allowlist downstream. @@ -133,7 +130,6 @@ function collectProviderCandidates(code: string): ProviderCandidate[] { const customHosts = hostOccurrences.some((o) => o.value === "custom") ? firstByIdent(scanProp(code, "customHost")) : new Map(); - const serverCartModes = firstByIdent(scanProp(code, "serverCartMode")); const seen = new Set(); const candidates: ProviderCandidate[] = []; @@ -144,7 +140,6 @@ function collectProviderCandidates(code: string): ProviderCandidate[] { clientId: value, host: hosts.get(ident), customHost: customHosts.get(ident), - serverCartMode: serverCartModes.get(ident), }); } return candidates; @@ -214,7 +209,6 @@ export function extractEpProviderConfig( return { clientId: candidate.clientId, host: resolvedHost, - serverCartMode: candidate.serverCartMode === true, }; } } diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-add-item.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-add-item.test.tsx deleted file mode 100644 index 25ada5bac8..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-add-item.test.tsx +++ /dev/null @@ -1,257 +0,0 @@ -// @jest-environment jsdom -/** - * Tests for use-add-item hook fetcher. - * - * Why: useAddItem handles cart creation on first add, item validation via pure - * functions, building EP-specific cart data, and the add-to-cart API flow. - * Testing validates the full lifecycle including the locale parameter fix - * (previously missing provider.locale in normalizeCart call). - */ - -/* ---------- mock variables ---------- */ -const mockGetACart = jest.fn(); -const mockCreateACart = jest.fn(); -const mockManageCarts = jest.fn(); - -const mockGetCartId = jest.fn(); -const mockSetCartId = jest.fn(); -const mockNormalizeCart = jest.fn(); - -const mockValidateCartItem = jest.fn(); -const mockBuildCartItemData = jest.fn(); - -const mockGetEPClient = jest.fn().mockReturnValue("mock-client"); -const mockHandleAPIError = jest - .fn() - .mockReturnValue({ message: "test error" }); - -/* ---------- jest.mock calls ---------- */ -jest.mock("@epcc-sdk/sdks-shopper", () => ({ - getACart: (...a: unknown[]) => mockGetACart(...a), - createACart: (...a: unknown[]) => mockCreateACart(...a), - manageCarts: (...a: unknown[]) => mockManageCarts(...a), -})); - -jest.mock("../../utils", () => ({ - normalizeCart: (...a: unknown[]) => mockNormalizeCart(...a), -})); - -jest.mock("../cart-session", () => ({ - getCartIdFromSession: () => Promise.resolve(mockGetCartId()), - setCartIdInSession: async (...a: unknown[]) => mockSetCartId(...a), -})); - -jest.mock("../utils/cartDataBuilder", () => ({ - validateCartItem: (...a: unknown[]) => mockValidateCartItem(...a), - buildCartItemData: (...a: unknown[]) => mockBuildCartItemData(...a), -})); - -jest.mock("../../utils/errorHandling", () => ({ - handleAPIError: (...a: unknown[]) => mockHandleAPIError(...a), -})); - -jest.mock("../../utils/getEPClient", () => ({ - getEPClient: (...a: unknown[]) => mockGetEPClient(...a), -})); - -jest.mock("../../utils/logger", () => ({ - createLogger: () => ({ - debug: jest.fn(), - info: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - }), -})); - -jest.mock("../use-cart", () => ({ - __esModule: true, - default: jest.fn(), -})); - -jest.mock("@plasmicpkgs/commerce", () => ({ - useAddItem: jest.fn(), -})); - -/* ---------- code under test ---------- */ -const { handler } = require("../use-add-item") as typeof import("../use-add-item"); - -/* ---------- helpers ---------- */ -const mockProvider = { locale: "en-US", client: "mock-client" }; -const validItem = { - productId: "prod-123", - variantId: "var-456", - quantity: 2, -}; - -function callFetcher(item = validItem) { - return handler.fetcher({ - input: item, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); -} - -/* ---------- tests ---------- */ -describe("useAddItem handler.fetcher", () => { - beforeEach(() => { - jest.clearAllMocks(); - mockValidateCartItem.mockReturnValue({ isValid: true }); - mockBuildCartItemData.mockReturnValue({ - type: "cart_item", - id: "prod-123", - quantity: 2, - }); - mockGetCartId.mockReturnValue("cart-abc"); - mockManageCarts.mockResolvedValue({}); - mockGetACart.mockResolvedValue({ - data: { - data: { id: "cart-abc" }, - included: { items: [] }, - }, - }); - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - }); - - it("validates cart item before proceeding", async () => { - await callFetcher(); - - expect(mockValidateCartItem).toHaveBeenCalledWith(validItem); - }); - - it("returns undefined when validation fails", async () => { - mockValidateCartItem.mockReturnValue({ - isValid: false, - errorMessage: "Missing productId", - }); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockManageCarts).not.toHaveBeenCalled(); - }); - - it("creates cart if no cartId cookie exists", async () => { - mockGetCartId.mockReturnValue(undefined); - mockCreateACart.mockResolvedValue({ - data: { data: { id: "new-cart-789" } }, - }); - - await callFetcher(); - - expect(mockCreateACart).toHaveBeenCalledWith({ - client: "mock-client", - body: { - data: { name: "Cart", description: "Shopping cart" }, - }, - }); - }); - - it("sets cartId cookie after creating cart", async () => { - mockGetCartId.mockReturnValue(undefined); - mockCreateACart.mockResolvedValue({ - data: { data: { id: "new-cart-789" } }, - }); - - await callFetcher(); - - expect(mockSetCartId).toHaveBeenCalledWith("new-cart-789"); - }); - - it("uses existing cartId when cookie is present", async () => { - mockGetCartId.mockReturnValue("existing-cart"); - - await callFetcher(); - - expect(mockCreateACart).not.toHaveBeenCalled(); - expect(mockManageCarts).toHaveBeenCalledWith( - expect.objectContaining({ - path: { cartID: "existing-cart" }, - }) - ); - }); - - it("builds cart item data with validated item", async () => { - await callFetcher(); - - expect(mockBuildCartItemData).toHaveBeenCalledWith(validItem); - }); - - it("calls manageCarts with correct cart ID and built data", async () => { - mockBuildCartItemData.mockReturnValue({ - type: "cart_item", - id: "prod-123", - quantity: 2, - }); - - await callFetcher(); - - expect(mockManageCarts).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc" }, - body: { - data: { type: "cart_item", id: "prod-123", quantity: 2 }, - }, - }); - }); - - it("fetches updated cart with items included after add", async () => { - await callFetcher(); - - expect(mockGetACart).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc" }, - query: { include: ["items"] }, - }); - }); - - it("returns normalized cart after successful add", async () => { - mockNormalizeCart.mockReturnValue({ - id: "cart-abc", - lineItems: [{ id: "item-1" }], - }); - - const result = await callFetcher(); - - expect(result).toEqual({ - id: "cart-abc", - lineItems: [{ id: "item-1" }], - }); - }); - - it("passes locale from provider to normalizeCart", async () => { - await callFetcher(); - - expect(mockNormalizeCart).toHaveBeenCalledWith(expect.anything(), "en-US"); - }); - - it("returns undefined when cart creation returns no data", async () => { - mockGetCartId.mockReturnValue(undefined); - mockCreateACart.mockResolvedValue({ data: null }); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockManageCarts).not.toHaveBeenCalled(); - }); - - it("returns undefined on API error during add", async () => { - mockManageCarts.mockRejectedValue(new Error("API failure")); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockHandleAPIError).toHaveBeenCalledWith( - expect.any(Error), - "adding item to cart" - ); - }); - - it("returns undefined when cart response data is falsy after add", async () => { - mockGetACart.mockResolvedValue({ data: null }); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-cart.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-cart.test.tsx deleted file mode 100644 index a00eeed4d9..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-cart.test.tsx +++ /dev/null @@ -1,231 +0,0 @@ -// @jest-environment jsdom -/** - * Tests for use-cart hook fetcher. - * - * Why: useCart is the foundational cart hook — every mutation hook (add, update, - * remove) depends on it for cache invalidation via mutate(). Testing the fetcher - * validates cart creation, retrieval, cookie management, locale passthrough to - * normalizeCart, and error recovery. - */ - -/* ---------- mock variables (declared before jest.mock) ---------- */ -const mockGetACart = jest.fn(); -const mockCreateACart = jest.fn(); - -const mockGetCartId = jest.fn(); -const mockSetCartId = jest.fn(); - -const mockNormalizeCart = jest.fn(); -const mockGetEPClient = jest.fn().mockReturnValue("mock-client"); -const mockHandleAPIError = jest - .fn() - .mockReturnValue({ message: "test error" }); - -/* ---------- jest.mock calls ---------- */ -jest.mock("@epcc-sdk/sdks-shopper", () => ({ - getACart: (...a: unknown[]) => mockGetACart(...a), - createACart: (...a: unknown[]) => mockCreateACart(...a), -})); - -jest.mock("../../utils", () => ({ - normalizeCart: (...a: unknown[]) => mockNormalizeCart(...a), -})); - -jest.mock("../cart-session", () => ({ - getCartIdFromSession: () => Promise.resolve(mockGetCartId()), - setCartIdInSession: async (...a: unknown[]) => mockSetCartId(...a), -})); - -jest.mock("../cart-session", () => ({ - getCartIdFromSession: () => Promise.resolve(mockGetCartId()), - setCartIdInSession: async (...a: unknown[]) => mockSetCartId(...a), -})); - -jest.mock("../../utils/errorHandling", () => ({ - handleAPIError: (...a: unknown[]) => mockHandleAPIError(...a), -})); - -jest.mock("../../utils/getEPClient", () => ({ - getEPClient: (...a: unknown[]) => mockGetEPClient(...a), -})); - -jest.mock("../../utils/logger", () => ({ - createLogger: () => ({ - debug: jest.fn(), - info: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - }), -})); - -jest.mock("@plasmicpkgs/commerce", () => ({ - useCart: jest.fn(), -})); - -/* ---------- code under test (after mocks) ---------- */ -const { handler } = require("../use-cart") as typeof import("../use-cart"); - -/* ---------- helpers ---------- */ -const mockProvider = { locale: "en-US", client: "mock-client" }; - -function makeCartResponse(cartId: string, items: unknown[] = []) { - return { - data: { - data: { - id: cartId, - meta: { - display_price: { - without_tax: { amount: 1000, currency: "USD" }, - }, - timestamps: { created_at: "2026-01-01T00:00:00Z" }, - }, - }, - included: { items }, - }, - }; -} - -function callFetcher() { - return handler.fetcher({ - input: {}, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); -} - -/* ---------- tests ---------- */ -describe("useCart handler.fetcher", () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it("fetches existing cart when cartId cookie exists", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - const cartResp = makeCartResponse("cart-abc"); - mockGetACart.mockResolvedValue(cartResp); - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - - const result = await callFetcher(); - - expect(mockGetACart).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc" }, - query: { include: ["items"] }, - headers: { "Accept-Language": "en-US" }, - }); - expect(result).toEqual({ id: "cart-abc", lineItems: [] }); - }); - - it("passes locale from provider to normalizeCart", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - const cartResp = makeCartResponse("cart-abc"); - mockGetACart.mockResolvedValue(cartResp); - mockNormalizeCart.mockReturnValue({ id: "cart-abc" }); - - await callFetcher(); - - expect(mockNormalizeCart).toHaveBeenCalledWith(cartResp.data, "en-US"); - }); - - it("sends X-Moltin-Currency + Accept-Language when the provider sets a currency", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - mockGetACart.mockResolvedValue(makeCartResponse("cart-abc")); - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - - await handler.fetcher({ - input: {}, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: { locale: "en-GB", currency: "GBP", client: "mock-client" }, - }); - - expect(mockGetACart).toHaveBeenCalledWith( - expect.objectContaining({ - headers: { "Accept-Language": "en-GB", "X-Moltin-Currency": "GBP" }, - }) - ); - }); - - it("creates new cart when no cartId cookie exists", async () => { - mockGetCartId.mockReturnValue(undefined); - const createResp = { - data: { data: { id: "new-cart-123" } }, - }; - mockCreateACart.mockResolvedValue(createResp); - mockNormalizeCart.mockReturnValue({ id: "new-cart-123", lineItems: [] }); - - const result = await callFetcher(); - - expect(mockCreateACart).toHaveBeenCalledWith({ - client: "mock-client", - body: { - data: { name: "Cart", description: "Shopping cart" }, - }, - }); - expect(result).toEqual({ id: "new-cart-123", lineItems: [] }); - }); - - it("sets cartId cookie after creating new cart", async () => { - mockGetCartId.mockReturnValue(undefined); - mockCreateACart.mockResolvedValue({ - data: { data: { id: "new-cart-456" } }, - }); - mockNormalizeCart.mockReturnValue({ id: "new-cart-456" }); - - await callFetcher(); - - expect(mockSetCartId).toHaveBeenCalledWith("new-cart-456"); - }); - - it("returns undefined on API error", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - mockGetACart.mockRejectedValue(new Error("Network failure")); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockHandleAPIError).toHaveBeenCalledWith( - expect.any(Error), - "getting cart" - ); - }); - - it("does not create a new cart when existing cart fetch succeeds", async () => { - mockGetCartId.mockReturnValue("cart-existing"); - mockGetACart.mockResolvedValue(makeCartResponse("cart-existing")); - mockNormalizeCart.mockReturnValue({ id: "cart-existing" }); - - await callFetcher(); - - expect(mockCreateACart).not.toHaveBeenCalled(); - }); - - it("returns null when new cart response data is falsy", async () => { - mockGetCartId.mockReturnValue(undefined); - mockCreateACart.mockResolvedValue({ data: null }); - - const result = await callFetcher(); - - expect(result).toBeNull(); - }); - - it("returns null when existing cart response data is falsy", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - mockGetACart.mockResolvedValue({ data: undefined }); - - const result = await callFetcher(); - - expect(result).toBeNull(); - }); - - it("uses getEPClient to extract SDK client from provider", async () => { - mockGetCartId.mockReturnValue("cart-abc"); - mockGetACart.mockResolvedValue(makeCartResponse("cart-abc")); - mockNormalizeCart.mockReturnValue({ id: "cart-abc" }); - - await callFetcher(); - - expect(mockGetEPClient).toHaveBeenCalledWith(mockProvider); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-remove-item.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-remove-item.test.tsx deleted file mode 100644 index 9411993c0e..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-remove-item.test.tsx +++ /dev/null @@ -1,205 +0,0 @@ -// @jest-environment jsdom -/** - * Tests for use-remove-item hook fetcher. - * - * Why: useRemoveItem uses deleteACartItem (DELETE endpoint) rather than - * setting quantity to zero — a common gotcha with the EP API. Testing - * validates correct API call shape, cart refresh after deletion, cookie - * cleanup on 404 errors, and guard conditions (missing cartId/itemId). - */ - -/* ---------- mock variables ---------- */ -const mockGetACart = jest.fn(); -const mockDeleteACartItem = jest.fn(); - -const mockGetCartId = jest.fn(); -const mockNormalizeCart = jest.fn(); -const mockSetCartId = jest.fn(); - -const mockGetEPClient = jest.fn().mockReturnValue("mock-client"); -const mockHandleAPIError = jest - .fn() - .mockReturnValue({ message: "test error" }); - -/* ---------- jest.mock calls ---------- */ -jest.mock("@epcc-sdk/sdks-shopper", () => ({ - getACart: (...a: unknown[]) => mockGetACart(...a), - deleteACartItem: (...a: unknown[]) => mockDeleteACartItem(...a), -})); - -jest.mock("../../utils", () => ({ - normalizeCart: (...a: unknown[]) => mockNormalizeCart(...a), -})); - -jest.mock("../cart-session", () => ({ - getCartIdFromSession: () => Promise.resolve(mockGetCartId()), - setCartIdInSession: async (...a: unknown[]) => mockSetCartId(...a), -})); - -jest.mock("../../utils/errorHandling", () => ({ - handleAPIError: (...a: unknown[]) => mockHandleAPIError(...a), -})); - -jest.mock("../../utils/getEPClient", () => ({ - getEPClient: (...a: unknown[]) => mockGetEPClient(...a), -})); - -jest.mock("../../utils/logger", () => ({ - createLogger: () => ({ - debug: jest.fn(), - info: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - }), -})); - -jest.mock("../use-cart", () => ({ - __esModule: true, - default: jest.fn(), -})); - -jest.mock("@plasmicpkgs/commerce", () => ({ - useRemoveItem: jest.fn(), - ValidationError: class ValidationError extends Error { - constructor({ message }: { message: string }) { - super(message); - this.name = "ValidationError"; - } - }, -})); - -/* ---------- code under test ---------- */ -const { handler } = require("../use-remove-item") as typeof import("../use-remove-item"); - -/* ---------- helpers ---------- */ -const mockProvider = { locale: "en-US", client: "mock-client" }; - -function callFetcher(itemId = "item-123") { - return handler.fetcher({ - input: { itemId }, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); -} - -/* ---------- tests ---------- */ -describe("useRemoveItem handler.fetcher", () => { - beforeEach(() => { - jest.clearAllMocks(); - mockGetCartId.mockReturnValue("cart-abc"); - mockDeleteACartItem.mockResolvedValue({}); - mockGetACart.mockResolvedValue({ - data: { - data: { id: "cart-abc" }, - included: { items: [] }, - }, - }); - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - }); - - it("deletes cart item via deleteACartItem API", async () => { - await callFetcher("item-456"); - - expect(mockDeleteACartItem).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc", cartitemID: "item-456" }, - }); - }); - - it("fetches updated cart with items included after removal", async () => { - await callFetcher(); - - expect(mockGetACart).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc" }, - query: { include: ["items"] }, - }); - }); - - it("returns normalized cart after successful removal", async () => { - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - - const result = await callFetcher(); - - expect(result).toEqual({ id: "cart-abc", lineItems: [] }); - }); - - it("passes locale from provider to normalizeCart", async () => { - await callFetcher(); - - expect(mockNormalizeCart).toHaveBeenCalledWith(expect.anything(), "en-US"); - }); - - it("returns undefined when no cartId cookie", async () => { - mockGetCartId.mockReturnValue(undefined); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockDeleteACartItem).not.toHaveBeenCalled(); - }); - - it("returns undefined when no itemId", async () => { - const result = await handler.fetcher({ - input: { itemId: "" }, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); - - expect(result).toBeUndefined(); - expect(mockDeleteACartItem).not.toHaveBeenCalled(); - }); - - it("removes cart cookie when updated cart has no data", async () => { - mockGetACart.mockResolvedValue({ data: null }); - - await callFetcher(); - - expect(mockSetCartId).toHaveBeenCalled(); - }); - - it("returns undefined when updated cart has no data", async () => { - mockGetACart.mockResolvedValue({ data: null }); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - }); - - it("returns undefined on API error", async () => { - mockDeleteACartItem.mockRejectedValue(new Error("Server error")); - - const result = await callFetcher(); - - expect(result).toBeUndefined(); - expect(mockHandleAPIError).toHaveBeenCalledWith( - expect.any(Error), - "removing item from cart" - ); - }); - - it("removes cart cookie on 404 error", async () => { - const error404 = Object.assign(new Error("Not found"), { status: 404 }); - mockDeleteACartItem.mockRejectedValue(error404); - - await callFetcher(); - - expect(mockSetCartId).toHaveBeenCalled(); - }); - - it("does not remove cart cookie on non-404 error", async () => { - mockDeleteACartItem.mockRejectedValue(new Error("Server error")); - - await callFetcher(); - - expect(mockSetCartId).not.toHaveBeenCalled(); - }); - - it("uses getEPClient to extract SDK client from provider", async () => { - await callFetcher(); - - expect(mockGetEPClient).toHaveBeenCalledWith(mockProvider); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-update-item.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-update-item.test.tsx deleted file mode 100644 index fd5ad65283..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/__tests__/use-update-item.test.tsx +++ /dev/null @@ -1,260 +0,0 @@ -// @jest-environment jsdom -/** - * Tests for use-update-item hook fetcher. - * - * Why: useUpdateItem handles quantity changes with debouncing, delegates to - * removeItem when quantity drops below 1, validates non-integer quantities, - * passes location for multi-location inventory, and cleans up cart cookies - * on 404 errors. Testing ensures these branching paths work correctly. - */ - -/* ---------- mock variables ---------- */ -const mockGetACart = jest.fn(); -const mockUpdateACartItem = jest.fn(); - -const mockGetCartId = jest.fn(); -const mockNormalizeCart = jest.fn(); -const mockSetCartId = jest.fn(); - -const mockRemoveItemFetcher = jest.fn(); -const mockGetEPClient = jest.fn().mockReturnValue("mock-client"); -const mockHandleAPIError = jest - .fn() - .mockReturnValue({ message: "test error" }); - -/* ---------- jest.mock calls ---------- */ -jest.mock("@epcc-sdk/sdks-shopper", () => ({ - getACart: (...a: unknown[]) => mockGetACart(...a), - updateACartItem: (...a: unknown[]) => mockUpdateACartItem(...a), -})); - -jest.mock("../../utils", () => ({ - normalizeCart: (...a: unknown[]) => mockNormalizeCart(...a), -})); - -jest.mock("../cart-session", () => ({ - getCartIdFromSession: () => Promise.resolve(mockGetCartId()), - setCartIdInSession: async (...a: unknown[]) => mockSetCartId(...a), -})); - -jest.mock("../use-remove-item", () => ({ - handler: { - fetchOptions: { url: "" }, - fetcher: (...a: unknown[]) => mockRemoveItemFetcher(...a), - }, -})); - -jest.mock("../../utils/errorHandling", () => ({ - handleAPIError: (...a: unknown[]) => mockHandleAPIError(...a), -})); - -jest.mock("../../utils/getEPClient", () => ({ - getEPClient: (...a: unknown[]) => mockGetEPClient(...a), -})); - -jest.mock("../../utils/logger", () => ({ - createLogger: () => ({ - debug: jest.fn(), - info: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - }), -})); - -jest.mock("../use-cart", () => ({ - __esModule: true, - default: jest.fn(), -})); - -// ValidationError must be a real class so `throw new ValidationError(...)` works -jest.mock("@plasmicpkgs/commerce", () => ({ - useUpdateItem: jest.fn(), - ValidationError: class ValidationError extends Error { - constructor({ message }: { message: string }) { - super(message); - this.name = "ValidationError"; - } - }, -})); - -/* ---------- code under test ---------- */ -const { handler } = require("../use-update-item") as typeof import("../use-update-item"); - -/* ---------- helpers ---------- */ -const mockProvider = { locale: "en-US", client: "mock-client" }; - -function callFetcher( - item: Record = { quantity: 3 }, - itemId = "item-123" -) { - return handler.fetcher({ - input: { item, itemId }, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); -} - -/* ---------- tests ---------- */ -describe("useUpdateItem handler.fetcher", () => { - beforeEach(() => { - jest.clearAllMocks(); - mockGetCartId.mockReturnValue("cart-abc"); - mockUpdateACartItem.mockResolvedValue({}); - mockGetACart.mockResolvedValue({ - data: { - data: { id: "cart-abc" }, - included: { items: [{ id: "item-123", quantity: 3 }] }, - }, - }); - mockNormalizeCart.mockReturnValue({ id: "cart-abc", lineItems: [] }); - }); - - it("updates cart item with new quantity", async () => { - await callFetcher({ quantity: 5 }); - - expect(mockUpdateACartItem).toHaveBeenCalledWith({ - client: "mock-client", - path: { cartID: "cart-abc", cartitemID: "item-123" }, - body: { - data: { id: "item-123", quantity: 5 }, - }, - }); - }); - - it("delegates to removeItem handler when quantity is 0", async () => { - mockRemoveItemFetcher.mockResolvedValue({ - id: "cart-abc", - lineItems: [], - }); - - await callFetcher({ quantity: 0 }); - - expect(mockRemoveItemFetcher).toHaveBeenCalled(); - expect(mockUpdateACartItem).not.toHaveBeenCalled(); - }); - - it("delegates to removeItem handler when quantity is negative", async () => { - mockRemoveItemFetcher.mockResolvedValue({ - id: "cart-abc", - lineItems: [], - }); - - await callFetcher({ quantity: -1 }); - - expect(mockRemoveItemFetcher).toHaveBeenCalled(); - expect(mockUpdateACartItem).not.toHaveBeenCalled(); - }); - - it("throws ValidationError for non-integer quantity", async () => { - await expect(callFetcher({ quantity: 2.5 })).rejects.toThrow( - "The item quantity has to be a valid integer" - ); - }); - - it("returns undefined when no cartId cookie", async () => { - mockGetCartId.mockReturnValue(undefined); - - const result = await callFetcher({ quantity: 3 }); - - expect(result).toBeUndefined(); - expect(mockUpdateACartItem).not.toHaveBeenCalled(); - }); - - it("returns undefined when no itemId", async () => { - const result = await handler.fetcher({ - input: { item: { quantity: 3 }, itemId: "" }, - options: handler.fetchOptions, - fetch: jest.fn(), - provider: mockProvider, - }); - - expect(result).toBeUndefined(); - }); - - it("returns undefined when quantity is undefined", async () => { - const result = await callFetcher({}, "item-123"); - - expect(result).toBeUndefined(); - }); - - it("includes location in update body when present", async () => { - await callFetcher({ quantity: 2, location: "warehouse-east" }); - - expect(mockUpdateACartItem).toHaveBeenCalledWith( - expect.objectContaining({ - body: { - data: { - id: "item-123", - quantity: 2, - location: "warehouse-east", - }, - }, - }) - ); - }); - - it("omits location from update body when not present", async () => { - await callFetcher({ quantity: 2 }); - - const callBody = mockUpdateACartItem.mock.calls[0][0].body.data; - expect(callBody).not.toHaveProperty("location"); - }); - - it("returns normalized cart after successful update", async () => { - mockNormalizeCart.mockReturnValue({ - id: "cart-abc", - lineItems: [{ id: "item-123", quantity: 5 }], - }); - - const result = await callFetcher({ quantity: 5 }); - - expect(result).toEqual({ - id: "cart-abc", - lineItems: [{ id: "item-123", quantity: 5 }], - }); - }); - - it("passes locale from provider to normalizeCart", async () => { - await callFetcher({ quantity: 3 }); - - expect(mockNormalizeCart).toHaveBeenCalledWith(expect.anything(), "en-US"); - }); - - it("returns undefined on API error", async () => { - mockUpdateACartItem.mockRejectedValue(new Error("Server error")); - - const result = await callFetcher({ quantity: 3 }); - - expect(result).toBeUndefined(); - expect(mockHandleAPIError).toHaveBeenCalledWith( - expect.any(Error), - "updating cart item" - ); - }); - - it("removes cart cookie on 404 error", async () => { - const error404 = Object.assign(new Error("Not found"), { status: 404 }); - mockUpdateACartItem.mockRejectedValue(error404); - - await callFetcher({ quantity: 3 }); - - expect(mockSetCartId).toHaveBeenCalled(); - }); - - it("does not remove cart cookie on non-404 error", async () => { - mockUpdateACartItem.mockRejectedValue(new Error("Server error")); - - await callFetcher({ quantity: 3 }); - - expect(mockSetCartId).not.toHaveBeenCalled(); - }); - - it("returns undefined when response data is falsy", async () => { - mockGetACart.mockResolvedValue({ data: null }); - - const result = await callFetcher({ quantity: 3 }); - - expect(result).toBeUndefined(); - }); -}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/index.ts b/plasmicpkgs/commerce-providers/elastic-path/src/cart/index.ts deleted file mode 100644 index 2fd13813fc..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as useCart } from './use-cart' -export { default as useAddItem } from './use-add-item' diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-add-item.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-add-item.tsx deleted file mode 100644 index 72f4bda8b7..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-add-item.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { createACart, getACart, manageCarts, BundleConfiguration } from "@epcc-sdk/sdks-shopper"; -import type { MutationHook } from "@plasmicpkgs/commerce"; -import { useAddItem, UseAddItem } from "@plasmicpkgs/commerce"; -import { useCallback } from "react"; -import type { AddItemHook } from "../types/cart"; -import { normalizeCart } from "../utils"; -import { - getCartIdFromSession, - setCartIdInSession, -} from "./cart-session"; -import useCart from "./use-cart"; -import { buildCartItemData, validateCartItem } from "./utils/cartDataBuilder"; -import type { ExtendedCartItem } from "./utils/cartDataBuilder"; -import { handleAPIError } from "../utils/errorHandling"; -import { getEPClient } from "../utils/getEPClient"; -import { createLogger } from "../utils/logger"; - -const log = createLogger("useAddItem"); - -// Note: ExtendedCartItem is now imported from cartDataBuilder utils - -/** - * @deprecated Use `useAddItem` from `shopper-context/use-add-item.ts` instead. - * The new hook posts to `/api/cart/items` via server routes with httpOnly - * cookies, removing the need for client-side EP credentials. - */ -export default useAddItem as UseAddItem; - -export const handler: MutationHook = { - fetchOptions: { - url: "", - }, - async fetcher({ input: item, options, fetch, provider }) { - // Cast item to our extended type - const extendedItem = item as ExtendedCartItem; - - // Validate cart item using pure function - const validation = validateCartItem(extendedItem); - if (!validation.isValid) { - log.error("Cart item validation failed", { errorMessage: validation.errorMessage } as Record); - return undefined; - } - - let cartId = await getCartIdFromSession(); - - try { - // Create cart if doesn't exist - if (!cartId) { - const response = await createACart({ - client: getEPClient(provider), - body: { - data: { - name: "Cart", - description: "Shopping cart", - }, - }, - }); - if (response.data && response.data.data.id) { - cartId = response.data.data.id; - await setCartIdInSession(cartId); - } - } - - if (!cartId) { - return undefined; - } - - // Build cart item data using pure function - const cartData = buildCartItemData(extendedItem); - - await manageCarts({ - client: getEPClient(provider), - path: { cartID: cartId }, - body: { - data: cartData, - }, - }); - - // Get the updated cart - const cartResponse = await getACart({ - client: getEPClient(provider), - path: { cartID: cartId }, - query: { - include: ["items"], - }, - }); - - return cartResponse.data - ? normalizeCart(cartResponse.data, provider!.locale) - : undefined; - } catch (error) { - const standardError = handleAPIError(error, "adding item to cart"); - log.error("Error adding item to cart", { error: standardError.message } as Record); - return undefined; - } - }, - useHook: - ({ fetch }) => - () => { - const { mutate } = useCart(); - return useCallback( - async function addItem(input) { - const data = await fetch({ input }); - await mutate(data, false); - return data; - }, - [fetch, mutate] - ); - }, -}; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-cart.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-cart.tsx deleted file mode 100644 index dd3f91b03c..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-cart.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { createACart, getACart } from "@epcc-sdk/sdks-shopper"; -import { - SWRHook, - UseCart, - useCart as useCommerceCart, -} from "@plasmicpkgs/commerce"; -import { useMemo } from "react"; -import { GetCartHook } from "../types/cart"; -import { normalizeCart } from "../utils"; -import { - getCartIdFromSession, - setCartIdInSession, -} from "./cart-session"; -import { handleAPIError } from "../utils/errorHandling"; -import { getEPClient } from "../utils/getEPClient"; -import { buildCartReadHeaders } from "../utils/cart-read-headers"; -import { createLogger } from "../utils/logger"; - -const log = createLogger("useCart"); - -/** - * @deprecated Use `useCart` from `shopper-context/use-cart.ts` instead. - * The new hook fetches cart data via server routes (`/api/cart`) with httpOnly - * cookies, removing the need for client-side EP credentials. - */ -export default useCommerceCart as UseCart; - -export const handler: SWRHook = { - fetchOptions: { - url: "", - }, - async fetcher({ input, options, fetch, provider }) { - const cartId = await getCartIdFromSession(); - let activeCart; - - // Re-price the cart for the active locale/currency at read time. Headers - // are omitted when the provider doesn't supply a value (policy stays in - // the storefront). - const headers = buildCartReadHeaders({ - locale: provider?.locale, - currency: (provider as { currency?: string })?.currency, - }); - - try { - if (cartId) { - // Get existing cart with items included - const response = await getACart({ - client: getEPClient(provider), - path: { cartID: cartId }, - query: { - include: ["items"], - }, - headers, - }); - activeCart = response.data; - - if (activeCart) { - // Items are included in the response - return normalizeCart(activeCart, provider!.locale); - } - } else { - // Create new cart - const response = await createACart({ - client: getEPClient(provider), - body: { - data: { - name: "Cart", - description: "Shopping cart", - }, - }, - }); - activeCart = response.data; - if (activeCart && activeCart.data.id) { - await setCartIdInSession(activeCart.data.id); - // New cart has no items - return normalizeCart(activeCart, provider!.locale); - } - } - } catch (error) { - // If cart not found or error, clear cookie and create new cart - const standardError = handleAPIError(error, "getting cart"); - log.error("Error getting cart", { error: standardError.message } as Record); - return undefined; - } - - return null; - }, - useHook: - ({ useData }) => - (input) => { - const response = useData({ - swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, - }); - return useMemo( - () => - Object.create(response, { - isEmpty: { - get() { - return (response.data?.lineItems.length ?? 0) <= 0; - }, - enumerable: true, - }, - }), - [response] - ); - }, -}; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-remove-item.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-remove-item.tsx deleted file mode 100644 index 57ee5be631..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-remove-item.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { getACart, deleteACartItem } from "@epcc-sdk/sdks-shopper"; -import type { - HookFetcherContext, - MutationHook, - MutationHookContext, -} from "@plasmicpkgs/commerce"; -import { - UseRemoveItem, - ValidationError, - useRemoveItem, -} from "@plasmicpkgs/commerce"; -import { useCallback } from "react"; -import type { Cart, LineItem, RemoveItemHook } from "../types/cart"; -import { normalizeCart } from "../utils"; -import { getCartIdFromSession, setCartIdInSession } from "./cart-session"; -import useCart from "./use-cart"; -import { handleAPIError } from "../utils/errorHandling"; -import { getEPClient } from "../utils/getEPClient"; -import { createLogger } from "../utils/logger"; - -const log = createLogger("useRemoveItem"); - -export type RemoveItemFn = T extends LineItem - ? (input?: RemoveItemActionInput) => Promise - : (input: RemoveItemActionInput) => Promise; - -export type RemoveItemActionInput = T extends LineItem - ? Partial - : RemoveItemHook["actionInput"]; - -/** - * @deprecated Use `useRemoveItem` from `shopper-context/use-remove-item.ts` instead. - * The new hook sends DELETE to `/api/cart/items/:id` via server routes with - * httpOnly cookies, removing the need for client-side EP credentials. - */ -export default useRemoveItem as UseRemoveItem; - -export const handler: MutationHook = { - fetchOptions: { - url: "", - }, - async fetcher({ - input: { itemId }, - options, - fetch, - provider, - }: HookFetcherContext) { - const cartId = await getCartIdFromSession(); - if (!itemId || !cartId) { - return undefined; - } - - try { - await deleteACartItem({ - client: getEPClient(provider), - path: { - cartID: cartId, - cartitemID: itemId, - }, - }); - - // Get updated cart with items - const response = await getACart({ - client: getEPClient(provider), - path: { cartID: cartId }, - query: { - include: ["items"], - }, - }); - - if (response.data) { - return normalizeCart(response.data, provider!.locale); - } else { - await setCartIdInSession(""); - return undefined; - } - } catch (error) { - const standardError = handleAPIError(error, "removing item from cart"); - log.error("Error removing item from cart", { error: standardError.message } as Record); - // If cart not found (404), clear the session cartId so next - // operation creates a fresh cart. - if ((error as Record)?.status === 404) { - await setCartIdInSession(""); - } - return undefined; - } - }, - useHook: - ({ fetch }: MutationHookContext) => - (ctx: { item?: T } = {}) => { - const { item } = ctx; - const { mutate } = useCart(); - const removeItem: RemoveItemFn = async (input) => { - const itemId = input?.id ?? item?.id; - - if (!itemId) { - throw new ValidationError({ - message: "Invalid input used for this operation", - }); - } - - const data = await fetch({ input: { itemId } }); - await mutate(data, false); - return data; - }; - - return useCallback(removeItem as RemoveItemFn, [fetch, mutate]); - }, -}; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-update-item.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-update-item.tsx deleted file mode 100644 index a58bef8ce1..0000000000 --- a/plasmicpkgs/commerce-providers/elastic-path/src/cart/use-update-item.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { getACart, updateACartItem } from "@epcc-sdk/sdks-shopper"; -import type { MutationHook, MutationHookContext } from "@plasmicpkgs/commerce"; -import { - UseUpdateItem, - ValidationError, - useUpdateItem, -} from "@plasmicpkgs/commerce"; -import debounce from "debounce"; -import { useCallback } from "react"; -import type { CartItemBody, LineItem, UpdateItemHook } from "../types/cart"; -import { DEFAULT_DEBOUNCE_MS } from "../const"; -import { normalizeCart } from "../utils"; -import { getCartIdFromSession, setCartIdInSession } from "./cart-session"; -import useCart from "./use-cart"; -import { handler as removeItemHandler } from "./use-remove-item"; -import { handleAPIError } from "../utils/errorHandling"; -import { getEPClient } from "../utils/getEPClient"; -import { createLogger } from "../utils/logger"; - -const log = createLogger("useUpdateItem"); - -export type UpdateItemActionInput = T extends LineItem - ? Partial - : UpdateItemHook["actionInput"]; - -/** - * @deprecated Use `useUpdateItem` from `shopper-context/use-update-item.ts` instead. - * The new hook sends PUT to `/api/cart/items/:id` via server routes with - * httpOnly cookies, removing the need for client-side EP credentials. - */ -export default useUpdateItem as UseUpdateItem; - -export const handler: MutationHook = { - fetchOptions: { - url: "", - }, - async fetcher({ input: { item, itemId }, options, fetch, provider }) { - if (Number.isInteger(item.quantity)) { - // Also allow the update hook to remove an item if the quantity is lower than 1 - if (item.quantity! < 1) { - return removeItemHandler.fetcher?.({ - options: removeItemHandler.fetchOptions, - input: { itemId }, - fetch, - provider, - }); - } - } else if (item.quantity) { - throw new ValidationError({ - message: "The item quantity has to be a valid integer", - }); - } - - const cartId = await getCartIdFromSession(); - if (!cartId || !itemId || !item.quantity) { - return undefined; - } - - try { - // Build update data — include location if present so EP validates - // stock against the correct inventory pool - const updateData: Record = { - id: itemId, - quantity: item.quantity, - }; - // EP uses location slug for multi-location inventory validation - const itemWithLocation = item as { quantity?: number; location?: string }; - if (itemWithLocation.location) { - updateData.location = itemWithLocation.location; - } - - await updateACartItem({ - client: getEPClient(provider), - path: { - cartID: cartId, - cartitemID: itemId, - }, - body: { - data: updateData, - }, - }); - - // Get updated cart with items - const response = await getACart({ - client: getEPClient(provider), - path: { cartID: cartId }, - query: { - include: ["items"], - }, - }); - - if (response.data) { - const items = response.data.included?.items || []; - return normalizeCart(response.data, provider!.locale); - } else { - return undefined; - } - } catch (error) { - const standardError = handleAPIError(error, "updating cart item"); - log.error("Error updating cart item", { error: standardError.message } as Record); - // If cart not found (404), clear the session's cartId so next - // operation creates a fresh cart. - if ((error as Record)?.status === 404) { - await setCartIdInSession(""); - } - return undefined; - } - }, - useHook: - ({ fetch }: MutationHookContext) => - ( - ctx: { - item?: T; - wait?: number; - } = {} - ) => { - const { item } = ctx; - const { mutate } = useCart() as { mutate: (data: unknown, revalidate: boolean) => Promise }; - - return useCallback( - debounce(async (input: UpdateItemActionInput) => { - const itemId = input.id ?? item?.id; - if (!itemId || input.quantity == null) { - throw new ValidationError({ - message: "Invalid input used for this operation", - }); - } - - const inputWithLocation = input as UpdateItemActionInput & { location?: string }; - const data = await fetch({ - input: { - item: { - quantity: input.quantity, - ...(inputWithLocation.location && { - location: inputWithLocation.location, - }), - } as Partial, - itemId, - }, - }); - await mutate(data, false); - return data; - }, ctx.wait ?? DEFAULT_DEBOUNCE_MS), - [fetch, mutate] - ); - }, -}; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx index 5aab5d746a..2e6b6dce86 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx @@ -6,11 +6,11 @@ import registerComponent, { CodeComponentMeta, } from "@plasmicapp/host/registerComponent"; import React, { useMemo, useState } from "react"; -import useCart from "../../cart/use-cart"; -import { DEFAULT_CURRENCY_CODE } from "../../const"; import { Registerable } from "../../registerable"; -import type { CheckoutCartData } from "../../shopper-context/use-checkout-cart"; -import { formatCurrency } from "../../utils/formatCurrency"; +import { + useCheckoutCart, + type CheckoutCartData, +} from "../../shopper-context/use-checkout-cart"; import { createLogger } from "../../utils/logger"; import { MOCK_CHECKOUT_CART_DATA } from "../../utils/design-time-data"; @@ -27,9 +27,9 @@ interface EPCheckoutCartSummaryProps { onExpandedChange?: (expanded: boolean) => void; previewState?: PreviewState; /** - * Optional external cart data from useCheckoutCart() server-route hook. - * When provided, skips the internal EP SDK cart fetch entirely. - * This is a code-only prop — not exposed in Plasmic Studio meta. + * Optional external cart data from useCheckoutCart(). When provided, + * skips the internal cart fetch entirely. This is a code-only prop — + * not exposed in Plasmic Studio meta. */ cartData?: CheckoutCartData; } @@ -132,7 +132,7 @@ function EPCheckoutCartSummaryInternal( previewState = "auto", } = props; - const { data: cart } = useCart(); + const { data: cart } = useCheckoutCart(); const inEditor = !!usePlasmicCanvasContext(); const [internalExpanded, setInternalExpanded] = useState(true); @@ -144,51 +144,10 @@ function EPCheckoutCartSummaryInternal( onExpandedChange?.(next); }; - const cartData = useMemo(() => { - if (!cart) return null; - const currencyCode = cart.currency?.code ?? DEFAULT_CURRENCY_CODE; - const items = cart.lineItems.map((item: any) => ({ - id: item.id, - name: item.name ?? "", - quantity: item.quantity ?? 1, - price: item.variant?.price ?? item.price ?? 0, - formattedPrice: formatCurrency( - item.variant?.price ?? item.price ?? 0, - currencyCode - ), - imageUrl: item.variant?.image?.url ?? "", - sku: item.variant?.sku ?? item.sku ?? "", - options: item.options ?? [], - })); - - const subtotal = cart.subtotalPrice ?? 0; - const total = cart.totalPrice ?? 0; - const tax = (cart as any).taxTotal ?? 0; - const shipping = (cart as any).shippingTotal ?? 0; - - return { - id: cart.id, - items, - itemCount: items.reduce( - (sum: number, i: any) => sum + (i.quantity ?? 1), - 0 - ), - subtotal, - tax, - shipping, - total, - formattedSubtotal: formatCurrency(subtotal, currencyCode), - formattedTax: formatCurrency(tax, currencyCode), - formattedShipping: formatCurrency(shipping, currencyCode), - formattedTotal: formatCurrency(total, currencyCode), - currencyCode, - showImages, - hasPromo: false, - promoCode: null as string | null, - promoDiscount: 0, - formattedPromoDiscount: null as string | null, - }; - }, [cart, showImages]); + const cartData = useMemo( + () => (cart ? { ...cart, showImages } : null), + [cart, showImages] + ); const useMock = previewState === "withItems" || diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/client.ts b/plasmicpkgs/commerce-providers/elastic-path/src/client.ts index 26fbc3b069..d0ff9ce6d2 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/client.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/client.ts @@ -7,40 +7,30 @@ import { ElasticPathCredentials } from './provider'; * The SDK's default storage adapters write to either localStorage or a * regular cookie — both of which leak credentials into JS-readable storage * (the localStorage adapter writes `_store_ep_credentials`; the cookie - * adapter writes a non-HttpOnly cookie). Neither matches our auth model: - * EP credentials live in better-auth's HttpOnly JWE `session_data` cookie - * and reach the SDK via the `serverToken` prop on EPCommerceProvider. + * adapter writes a non-HttpOnly cookie). A memory adapter keeps the + * storage tier inside the JS heap instead. * - * Using a memory adapter for ALL paths (preloaded when `serverToken` is - * known, empty otherwise) keeps the storage tier inside the JS heap. When - * empty, the SDK auto-mints an anonymous token and caches it in memory - * for the lifetime of the page — never written to localStorage. - * - * The trade-off: a CLIENT-side mint may still happen when serverToken - * isn't set yet (e.g., a brief gap during hydration). That mint is a - * network round-trip but leaves no persistent client-side trace. The - * better-auth session cookie remains the authoritative shopper identity. + * Starting empty, the SDK auto-mints its own anonymous token from the + * public clientId and caches it in memory for the lifetime of the page. + * This client serves catalog reads only; cart and checkout run through + * the server routes, where the better-auth session cookie is the + * authoritative shopper identity. */ -function memoryStorageAdapter(initial?: string) { - let current: string | undefined = initial && initial.length > 0 ? initial : undefined; +function memoryStorageAdapter() { + let current: string | undefined; return { get: () => current, set: (t?: string) => { current = t; }, }; } -const initElasticPathClient = (creds: ElasticPathCredentials, serverToken?: string) => { +const initElasticPathClient = (creds: ElasticPathCredentials) => { const config = { baseUrl: creds.host || "https://euwest.api.elasticpath.com", }; const authOpts = { clientId: creds.clientId, - // Always in-memory. NEVER localStorage. The serverToken (when - // present) is the better-auth session's anonymous EP access token, - // sourced from the `serverToken` prop on the global-context - // CommerceProvider component (set via globalContextsProps in the - // RSC catchall page). - storage: memoryStorageAdapter(serverToken), + storage: memoryStorageAdapter(), }; // Configure the SDK's GLOBAL singleton too. Some package-internal diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/elastic-path.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/elastic-path.tsx index 0c9f89c3ef..a6f5fb5230 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/elastic-path.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/elastic-path.tsx @@ -15,10 +15,9 @@ export const useCommerce = () => useCoreCommerce(); export const getCommerceProvider = ( creds: ElasticPathCredentials, locale: string, - serverToken?: string, currency?: string, currencyDisplay: "symbol" | "code" = "symbol" ) => getCoreCommerceProvider( - getElasticPathProvider(creds, locale, serverToken, currency, currencyDisplay) + getElasticPathProvider(creds, locale, currency, currencyDisplay) ); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/build-ep-ctx.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/build-ep-ctx.test.ts index a7ed4a816c..28fb5c8248 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/build-ep-ctx.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/build-ep-ctx.test.ts @@ -24,7 +24,7 @@ const makePrefetchedData = () => ({ }); describe("buildEpCtx", () => { - it("returns clientId, host, and serverCartMode resolved from the Plasmic bundle", () => { + it("returns clientId and host resolved from the Plasmic bundle", () => { const ctx = buildEpCtx(makePrefetchedData(), { session: { accessToken: "tok-abc" }, }); @@ -33,7 +33,6 @@ describe("buildEpCtx", () => { expect.objectContaining({ clientId: "cid-abc", host: "https://epcc-integration.global.ssl.fastly.net", - serverCartMode: true, accessToken: "tok-abc", }) ); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/cart-mutations.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/cart-mutations.test.ts index d9ed56e8d8..da8199b06e 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/cart-mutations.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/cart-mutations.test.ts @@ -41,7 +41,6 @@ const SESSION_BASE = { accessToken: "tok", host: "https://api.ep.com", clientId: "cid", - serverCartMode: false, }; const CART_RESPONSE = { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getCart.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getCart.test.ts index 4d5bd2de0c..ecd1d13b9c 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getCart.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getCart.test.ts @@ -18,7 +18,6 @@ const SESSION_BASE = { accessToken: "tok", host: "https://api.ep.com", clientId: "cid", - serverCartMode: false, }; beforeEach(() => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProduct.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProduct.test.ts index 7ff29682d3..73f5a3cba3 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProduct.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProduct.test.ts @@ -27,7 +27,6 @@ const TEST_SESSION = { accessToken: "token-abc", host: "https://api.test.elasticpath.com", clientId: "client-xyz", - serverCartMode: false, }; beforeEach(() => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProductList.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProductList.test.ts index 2ce7cc8251..b4c45b323b 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProductList.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getProductList.test.ts @@ -19,7 +19,6 @@ const SESSION = { accessToken: "tok", host: "https://api.ep.com", clientId: "cid", - serverCartMode: false, }; beforeEach(() => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getRelatedProducts.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getRelatedProducts.test.ts index 9140a8a059..0c3dbe4256 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getRelatedProducts.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/getRelatedProducts.test.ts @@ -19,7 +19,6 @@ const SESSION = { accessToken: "tok", host: "https://api.ep.com", clientId: "cid", - serverCartMode: false, }; beforeEach(() => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/place-order.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/place-order.test.ts index fa7ab00804..7842c2c7bd 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/place-order.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/place-order.test.ts @@ -28,7 +28,6 @@ const SESSION_BASE = { accessToken: "tok", host: "https://api.ep.com", clientId: "cid", - serverCartMode: false, }; const ORDER_RESPONSE = (amount: number) => ({ diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/session-context.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/session-context.test.ts index 82a97fbec7..6a1cd4f1a8 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/session-context.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/__tests__/session-context.test.ts @@ -30,7 +30,7 @@ describe("browser-bundle safety — module loads without async_hooks", () => { // running; ep.* functions just fail-soft because they read undefined). expect(mod.getCurrentEpSession()).toBeUndefined(); const result = mod.withEpSession( - { accessToken: "tok", host: "h", clientId: "c", serverCartMode: false }, + { accessToken: "tok", host: "h", clientId: "c" }, () => "ran" ); expect(result).toBe("ran"); @@ -44,7 +44,6 @@ describe("withEpSession / getCurrentEpSession", () => { accessToken: "tok-1", host: "https://api.ep.com", clientId: "cid-1", - serverCartMode: false, }; const observed = await withEpSession(session, async () => { @@ -66,13 +65,11 @@ describe("withEpSession / getCurrentEpSession", () => { accessToken: "tok-A", host: "https://api.ep.com", clientId: "cid-A", - serverCartMode: false, }; const sessionB: any = { accessToken: "tok-B", host: "https://api.ep.com", clientId: "cid-B", - serverCartMode: false, }; // Force interleaving: each callback yields to the event loop multiple diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/build-ep-ctx.ts b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/build-ep-ctx.ts index 425ce3d3ab..6168f8425f 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/build-ep-ctx.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/ep-server-functions/build-ep-ctx.ts @@ -27,7 +27,6 @@ export interface EpCtx { accessToken: string; host: string; clientId: string; - serverCartMode: boolean; cartId?: string; accountId?: string; locale?: string; @@ -54,7 +53,6 @@ export function buildEpCtx( accessToken: opts.session.accessToken ?? "", host: config.host, clientId: config.clientId, - serverCartMode: config.serverCartMode, cartId: opts.session.cartId, accountId: opts.session.accountId, locale: opts.session.locale, diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/provider.ts b/plasmicpkgs/commerce-providers/elastic-path/src/provider.ts index be399b5ac0..4e1cfa08d6 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/provider.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/provider.ts @@ -1,30 +1,12 @@ import type { Client } from "@epcc-sdk/sdks-shopper"; -import { - Fetcher, - MutationHook, - SearchProductsHook, - SWRHook, -} from "@plasmicpkgs/commerce"; -import { handler as useAddItem } from "./cart/use-add-item"; -import { handler as useCart } from "./cart/use-cart"; -import { handler as useRemoveItem } from "./cart/use-remove-item"; -import { handler as useUpdateItem } from "./cart/use-update-item"; +import { Fetcher } from "@plasmicpkgs/commerce"; import { ELASTICPATH_CART_COOKIE } from "./const"; import { handler as useProduct } from "./product/use-product"; import { handler as useSearch } from "./product/use-search"; import { handler as useBrands } from "./site/use-brands"; import { handler as useCategories } from "./site/use-categories"; -// import { handler as useBrands } from "./site/use-brands"; -// import { handler as useCategories } from "./site/use-categories"; -import { useMemo } from "react"; import initElasticPathClient from "./client"; import { createLogger } from "./utils/logger"; -import { - AddItemHook, - GetCartHook, - RemoveItemHook, - UpdateItemHook, -} from "./types/cart"; export interface ElasticPathCredentials { clientId: string; @@ -51,23 +33,16 @@ const createFetcher = (creds: ElasticPathCredentials): Fetcher => { export const getElasticPathProvider = ( creds: ElasticPathCredentials, locale: string, - serverToken?: string, currency?: string, currencyDisplay: "symbol" | "code" = "symbol" ) => { - const client = initElasticPathClient(creds, serverToken); + const client = initElasticPathClient(creds); return { locale, currency, currencyDisplay, cartCookie: ELASTICPATH_CART_COOKIE, - cart: { - useCart, - useAddItem, - useRemoveItem, - useUpdateItem, - }, fetcher: createFetcher(creds), // Required by commerce package interface client, // Pass the Elastic Path client for direct SDK usage products: { useProduct, useSearch }, @@ -84,12 +59,6 @@ export type ElasticPathProvider = { cartCookie: string; fetcher: Fetcher; // Required by commerce package interface client: Client; - cart: { - useCart: typeof useCart; - useAddItem: typeof useAddItem; - useRemoveItem: typeof useRemoveItem; - useUpdateItem: typeof useUpdateItem; - }; products: { useSearch: typeof useSearch; useProduct: typeof useProduct; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx index 8d7e5a2116..24142a1b69 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx @@ -1,39 +1,45 @@ /** @jest-environment jsdom */ import React from "react"; import { render, screen } from "@testing-library/react"; -import { CommerceProviderComponent } from "./registerCommerceProvider"; +import { + CommerceProviderComponent, + commerceProviderMeta, +} from "./registerCommerceProvider"; describe("CommerceProviderComponent", () => { - it("shows error message when no clientId and serverCartMode is off", () => { + it("renders children without a clientId", () => { render( - child - - ); - expect( - screen.getByText(/Please set your Elastic Path Client ID/) - ).toBeTruthy(); - expect(screen.queryByText("child")).toBeNull(); - }); - - it("renders children in serverCartMode without clientId", () => { - render( - server-cart-child ); expect(screen.getByText("server-cart-child")).toBeTruthy(); - expect( - screen.queryByText(/Please set your Elastic Path Client ID/) - ).toBeNull(); }); - it("renders children in serverCartMode when clientId is undefined", () => { + it("renders children when clientId is undefined", () => { render( - + no-creds ); expect(screen.getByText("no-creds")).toBeTruthy(); }); }); + +describe("commerceProviderMeta", () => { + // Registered props on a hostless package are append-only: removing one + // makes updateHostlessPackage throw and takes down hostless publishing + // for every package. Retired props stay registered and hidden. + it.each(["serverToken", "serverCartMode"])( + "keeps the retired %s prop registered and hidden", + (propName) => { + const prop = commerceProviderMeta.props[propName]; + expect(prop).toBeDefined(); + expect(prop.hidden()).toBe(true); + } + ); + + it("declares no getServerInfo bridge", () => { + expect(commerceProviderMeta.getServerInfo).toBeUndefined(); + }); +}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx index 471502c645..b3430bcce2 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx @@ -1,15 +1,11 @@ import { GlobalContextMeta } from "@plasmicapp/host"; import registerGlobalContext from "@plasmicapp/host/registerGlobalContext"; -import { - CartActionsProvider, - globalActionsRegistrations, -} from "@plasmicpkgs/commerce"; +import { globalActionsRegistrations } from "@plasmicpkgs/commerce"; import React from "react"; import { getCommerceProvider } from "./elastic-path"; import { ElasticPathCredentials } from "./provider"; import { Registerable } from "./registerable"; import { ServerCartActionsProvider } from "./shopper-context/ServerCartActionsProvider"; -import { epProviderGetServerInfo } from "./auth/ep-provider-server-info"; interface CommerceProviderProps extends ElasticPathCredentials { children?: React.ReactNode; @@ -17,8 +13,6 @@ interface CommerceProviderProps extends ElasticPathCredentials { currency?: string; currencyDisplay?: "symbol" | "code"; customHost?: string; - serverCartMode?: boolean; - serverToken?: string; } const globalContextName = "plasmic-commerce-elastic-path-provider"; @@ -73,23 +67,23 @@ export const commerceProviderMeta: any = { "How money renders across cart line prices and totals: a currency symbol or its ISO code prefix.", advanced: true, }, + // Retired props. Registered props on a hostless package are + // append-only — removing one makes updateHostlessPackage throw and + // takes down hostless publishing for every package, not just this + // one. Both are hidden and ignored by the component. serverCartMode: { type: "boolean", - displayName: "Server Cart Mode", - description: - "When enabled, cart operations use server routes instead of client-side EP SDK. No client ID is needed for cart operations.", - advanced: true, - defaultValue: false, + hidden: () => true, + description: "Retired. Cart operations always use server routes.", }, serverToken: { type: "string", hidden: () => true, description: - "Server-resolved EP access token. Set programmatically via session.providerProps(), never shown in Studio.", + "Retired. The shopper's EP access token never reaches the browser.", }, }, ...{ globalActions: globalActionsRegistrations }, - getServerInfo: epProviderGetServerInfo, importPath: "@elasticpath/plasmic-ep-commerce-elastic-path", importName: "CommerceProviderComponent", }; @@ -103,23 +97,15 @@ export function CommerceProviderComponent(props: CommerceProviderProps) { locale = "en-US", currency, currencyDisplay = "symbol", - serverCartMode = false, - serverToken, } = props; if (!clientId) { - if (serverCartMode) { - return ( - - {children} - - ); - } + // Cart and checkout run through the server routes, which don't need + // a client ID — only the catalog reads do. return ( -
- Please set your Elastic Path Client ID in the Elastic Path Provider - settings. -
+ + {children} + ); } @@ -131,19 +117,15 @@ export function CommerceProviderComponent(props: CommerceProviderProps) { ); const CommerceProvider = React.useMemo( - () => getCommerceProvider(creds, locale, serverToken, currency, currencyDisplay), - [creds, locale, serverToken, currency, currencyDisplay] + () => getCommerceProvider(creds, locale, currency, currencyDisplay), + [creds, locale, currency, currencyDisplay] ); - const ActionsProvider = serverCartMode - ? ServerCartActionsProvider - : CartActionsProvider; - return ( - + {children} - + ); } diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx index aa3242a60b..02490d57d1 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx @@ -12,11 +12,11 @@ interface ServerCartActions extends GlobalActionDict { /** * Provides global cart actions (addItem, updateItem, removeItem) using - * server-route hooks from shopper-context instead of the deprecated - * client-side EP SDK hooks. + * server-route hooks from shopper-context. * - * Drop-in replacement for CartActionsProvider from @plasmicpkgs/commerce - * when serverCartMode is enabled. + * Replaces CartActionsProvider from @plasmicpkgs/commerce, which resolves + * its hooks off `provider.cart` and drives them from the browser. Cart + * mutations need the shopper's credentials, which never leave the server. */ export function ServerCartActionsProvider( props: React.PropsWithChildren<{ globalContextName: string }> From efce78ee97cd6e9afc523f44562e5488c683f91a Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 13:07:47 +0100 Subject: [PATCH 2/8] chore(ep-commerce): trim comments and point the example app at local packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The example resolved every Plasmic/EP dependency from the registry, so it was exercising a stale snapshot — EP commerce 0.1.0 against 0.2.0 source, loader-nextjs 2.0.2 against 2.0.21. file: links keep it on current source. --- examples/ep-commerce-app-router/package.json | 12 ++++++------ .../__tests__/create-ep-auth-adapter.test.ts | 4 ---- .../src/auth/ep-plugin/create-ep-auth-better.ts | 3 +-- .../elastic-path/src/client.ts | 17 ++++------------- .../src/registerCommerceProvider.test.tsx | 3 --- .../src/registerCommerceProvider.tsx | 8 ++------ .../ServerCartActionsProvider.tsx | 9 +++------ 7 files changed, 16 insertions(+), 40 deletions(-) diff --git a/examples/ep-commerce-app-router/package.json b/examples/ep-commerce-app-router/package.json index 82bb9931a1..40241811d6 100644 --- a/examples/ep-commerce-app-router/package.json +++ b/examples/ep-commerce-app-router/package.json @@ -8,13 +8,13 @@ "start": "next start" }, "dependencies": { - "@elasticpath/plasmic-ep-commerce-elastic-path": "*", - "@elasticpath/plasmic-mcp-registry": "*", + "@elasticpath/plasmic-ep-commerce-elastic-path": "file:../../plasmicpkgs/commerce-providers/elastic-path", + "@elasticpath/plasmic-mcp-registry": "file:../../packages/plasmic-mcp-registry", "@epcc-sdk/sdks-shopper": "^0.1.0", - "@plasmicapp/loader-nextjs": "*", - "@plasmicapp/nextjs-app-router": "*", - "@plasmicapp/host": "*", - "@plasmicpkgs/commerce": "*", + "@plasmicapp/loader-nextjs": "file:../../packages/loader-nextjs", + "@plasmicapp/nextjs-app-router": "file:../../packages/nextjs-app-router", + "@plasmicapp/host": "file:../../packages/host", + "@plasmicpkgs/commerce": "file:../../plasmicpkgs/commerce-providers/commerce", "next": "^15.5.9", "react": "^19", "react-dom": "^19" diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts index 6677d7e623..6b0569043a 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/create-ep-auth-adapter.test.ts @@ -91,10 +91,6 @@ describe("createEpAuth adapter (PRD #273)", () => { headers: {}, }); - // The session itself carries the token — the point is that - // providerProps(), which the catchall page hands to - // globalContextsProps and Plasmic serializes into page HTML, - // does not. expect(session.session?.accessToken).toBe(FAKE_TOKEN); expect(session.providerProps()).toEqual({}); expect(JSON.stringify(session.providerProps())).not.toContain(FAKE_TOKEN); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts index bbb2c833af..b9f21e4877 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/create-ep-auth-better.ts @@ -349,8 +349,7 @@ export function createEpAuth(input: CreateEpAuthBetterInput): EpAuth { } return h; }, - // Never carries the EP access token: whatever this returns is - // serialized into the page HTML via globalContextsProps. + // Serialized into page HTML via globalContextsProps. providerProps() { return {}; }, diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/client.ts b/plasmicpkgs/commerce-providers/elastic-path/src/client.ts index d0ff9ce6d2..ccce8799c0 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/client.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/client.ts @@ -2,19 +2,10 @@ import { createShopperClient, configureClient } from "@epcc-sdk/sdks-shopper"; import { ElasticPathCredentials } from './provider'; /** - * In-memory StorageAdapter for the EP shopper SDK. - * - * The SDK's default storage adapters write to either localStorage or a - * regular cookie — both of which leak credentials into JS-readable storage - * (the localStorage adapter writes `_store_ep_credentials`; the cookie - * adapter writes a non-HttpOnly cookie). A memory adapter keeps the - * storage tier inside the JS heap instead. - * - * Starting empty, the SDK auto-mints its own anonymous token from the - * public clientId and caches it in memory for the lifetime of the page. - * This client serves catalog reads only; cart and checkout run through - * the server routes, where the better-auth session cookie is the - * authoritative shopper identity. + * The SDK's default storage adapters write credentials to localStorage or + * a non-HttpOnly cookie. Keeping them in the JS heap instead means the + * anonymous token the SDK mints for catalog reads leaves no persistent + * client-side trace. */ function memoryStorageAdapter() { let current: string | undefined; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx index 24142a1b69..610be90452 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.test.tsx @@ -27,9 +27,6 @@ describe("CommerceProviderComponent", () => { }); describe("commerceProviderMeta", () => { - // Registered props on a hostless package are append-only: removing one - // makes updateHostlessPackage throw and takes down hostless publishing - // for every package. Retired props stay registered and hidden. it.each(["serverToken", "serverCartMode"])( "keeps the retired %s prop registered and hidden", (propName) => { diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx index b3430bcce2..bba5c3bbc4 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/registerCommerceProvider.tsx @@ -67,10 +67,8 @@ export const commerceProviderMeta: any = { "How money renders across cart line prices and totals: a currency symbol or its ISO code prefix.", advanced: true, }, - // Retired props. Registered props on a hostless package are - // append-only — removing one makes updateHostlessPackage throw and - // takes down hostless publishing for every package, not just this - // one. Both are hidden and ignored by the component. + // Retired, but hostless prop schemas are append-only: removing one + // breaks hostless publishing for every package. serverCartMode: { type: "boolean", hidden: () => true, @@ -100,8 +98,6 @@ export function CommerceProviderComponent(props: CommerceProviderProps) { } = props; if (!clientId) { - // Cart and checkout run through the server routes, which don't need - // a client ID — only the catalog reads do. return ( {children} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx index 02490d57d1..2c9f2ac979 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/shopper-context/ServerCartActionsProvider.tsx @@ -11,12 +11,9 @@ interface ServerCartActions extends GlobalActionDict { } /** - * Provides global cart actions (addItem, updateItem, removeItem) using - * server-route hooks from shopper-context. - * - * Replaces CartActionsProvider from @plasmicpkgs/commerce, which resolves - * its hooks off `provider.cart` and drives them from the browser. Cart - * mutations need the shopper's credentials, which never leave the server. + * Replaces CartActionsProvider from @plasmicpkgs/commerce, which drives + * its hooks from the browser. Cart mutations need the shopper's + * credentials, which never leave the server. */ export function ServerCartActionsProvider( props: React.PropsWithChildren<{ globalContextName: string }> From 6d644742e5a859f7928e388dc2ab0fb54d1bd1ff Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 13:54:47 +0100 Subject: [PATCH 3/8] fix(ep-commerce): split inline type import for tsdx's TypeScript 3.9 tsdx bundles typescript@3.9.10, which predates inline type specifiers in import statements. tsc and both test suites run a modern TypeScript, so this only surfaced at build time. --- examples/ep-commerce-app-router/yarn.lock | 1203 +++++++++++++++-- .../composable/EPCheckoutCartSummary.tsx | 6 +- 2 files changed, 1089 insertions(+), 120 deletions(-) diff --git a/examples/ep-commerce-app-router/yarn.lock b/examples/ep-commerce-app-router/yarn.lock index bc5f1db886..7d0d6693da 100644 --- a/examples/ep-commerce-app-router/yarn.lock +++ b/examples/ep-commerce-app-router/yarn.lock @@ -2,27 +2,119 @@ # yarn lockfile v1 -"@elasticpath/plasmic-ep-commerce-elastic-path@*": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@elasticpath/plasmic-ep-commerce-elastic-path/-/plasmic-ep-commerce-elastic-path-0.0.3.tgz#005a9253fbbb40da4089d6c6a70f2717e7127c2d" - integrity sha512-xRWXxHCdmqfZAJbl83EIOOiPMP7WwlCcORqjLL2K7xhbX+TKC3+5hAfyjTtCmrsmKXtUOibxZAAJmn25PQbcIQ== - dependencies: - "@epcc-sdk/sdks-shopper" "^0.0.40" +"@algolia/autocomplete-core@^1.17.7": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz#bbed371e56aeea4a31a3af239f16733e1b8aedca" + integrity sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.9" + "@algolia/autocomplete-shared" "1.19.9" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz#f799737d13bf0c4ec8421619c7107fa05c836535" + integrity sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w== + dependencies: + "@algolia/autocomplete-shared" "1.19.9" + +"@algolia/autocomplete-shared@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz#c5b05e23c71027e4e45a301f286593dffdcdfbdf" + integrity sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A== + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@better-auth/core@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/core/-/core-1.6.27.tgz#663709cbf090c741c3616dc8ef4d101c6e499bdd" + integrity sha512-A6/mQW4AT2kSHCRZDh9+k8jPUqnCUUCymzBgIroK0l60wLioMtJdcmZiTwrAn6KVUw+4XWw64MgaRn7LOie3wg== + dependencies: + "@opentelemetry/semantic-conventions" "^1.39.0" + "@standard-schema/spec" "^1.1.0" + zod "^4.3.6" + +"@better-auth/drizzle-adapter@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/drizzle-adapter/-/drizzle-adapter-1.6.27.tgz#27c532e63b75802647d1d515aeb16c1c62541d6e" + integrity sha512-BDJ02ra/fji/ah3aIpxjjNOu/JQVex0UisxS4S0vGZZyiAs+DL24mn3/iovyD5dWB3u3NaGg1n8zpTOntiIXcg== + +"@better-auth/kysely-adapter@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/kysely-adapter/-/kysely-adapter-1.6.27.tgz#603b5f79982cda0f1e366300789e322a2732478b" + integrity sha512-aavv7W4+b3QVObYo166baplWvwocCk8ORDxRqQ9ytzVl/waiUpSXAOtDHdXZHFsoVHFVPtEzyEq0Tqr3Qvvfig== + +"@better-auth/memory-adapter@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/memory-adapter/-/memory-adapter-1.6.27.tgz#9440db35cdbc4d149bdc7ae4c4adb3399c536c2f" + integrity sha512-p4NB37MdaVFkxkpLEAKjORgTPhaOAPu1M2zgQXiTJJ3F6Uq3Y1YcCgoz+VxJu0TQfxibCsJD/dZlJMVgf+CF7A== + +"@better-auth/mongo-adapter@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/mongo-adapter/-/mongo-adapter-1.6.27.tgz#15c3b3cad66ce804de4138a1eee5e2bd5a96d9e8" + integrity sha512-IOYbJMIjEC//f+JpFlmIQjh6x1R/rGAfdzlojFk6HeAJqbsELuMcI+27dIoesbfHLF/icTrSpZtK986XhJrCfA== + +"@better-auth/prisma-adapter@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/prisma-adapter/-/prisma-adapter-1.6.27.tgz#35662028582c154e600b1e286cb1ddbabeaff34b" + integrity sha512-v7DXVyaFbkrfLoiFDtcVF7BkEZgFa/DgEGE7XjrAXmMACa5pjDvb7lm8W5X+/qgIbQP04eThhgFQ6EWOsjr8OQ== + +"@better-auth/telemetry@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@better-auth/telemetry/-/telemetry-1.6.27.tgz#cbdd54df91b937078a250d76a7579216860389ed" + integrity sha512-aYrSiVWQfua8w5YX8X1cM6ca48EdS0t5k+CvYXIsruaNIpR1DXMe1DOD0M5FWAVABnlCf9joyHXbFRSIZSNY/A== + +"@better-auth/utils@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.4.2.tgz#265a37e2ceef035e6968a851b13400d1b044e070" + integrity sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A== + dependencies: + "@noble/hashes" "^2.0.1" + +"@better-auth/utils@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.5.0.tgz#753b2c3421c7745023dea964c5bafb00297cba96" + integrity sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA== + dependencies: + "@noble/hashes" "^2.0.1" + +"@better-fetch/fetch@1.3.1", "@better-fetch/fetch@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@better-fetch/fetch/-/fetch-1.3.1.tgz#04a0d289de818a0b436bfda48e70b2b19227cc19" + integrity sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g== + +"@elasticpath/catalog-search-instantsearch-adapter@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@elasticpath/catalog-search-instantsearch-adapter/-/catalog-search-instantsearch-adapter-0.1.0.tgz#185b740c2feef75caf34d4813d7bc9b2dbbb8875" + integrity sha512-ZXqahz0Mb8J+zE8uj2KrrpNuUAhFW+qfJ1jcrWnmwx6r2CyqWfShjR5MusUolqjI7LVgOWvIeqYTSX+LDTBCkQ== + dependencies: + vitest "^3.2.4" + +"@elasticpath/plasmic-ep-commerce-elastic-path@file:../../plasmicpkgs/commerce-providers/elastic-path": + version "0.2.0" + dependencies: + "@algolia/autocomplete-core" "^1.17.7" + "@elasticpath/catalog-search-instantsearch-adapter" "0.1.0" + "@epcc-sdk/sdks-shopper" "^0.1.0" "@hookform/resolvers" "^3.3.2" "@plasmicpkgs/commerce" "0.0.232" "@stripe/react-stripe-js" "^2.4.0" "@stripe/stripe-js" "^2.4.0" "@types/react" "^18.0.27" + better-auth "^1.6.9" debounce "^2.0.0" + instantsearch.js "^4.75.6" js-cookie "^3.0.5" qs "^6.11.0" - react-hook-form "^7.48.2" + react-instantsearch "^7.13.6" + react-instantsearch-nextjs "^0.3.17" + stripe "^14.0.0" zod "^3.22.4" -"@elasticpath/plasmic-mcp-registry@*": +"@elasticpath/plasmic-mcp-registry@file:../../packages/plasmic-mcp-registry": version "0.2.1" - resolved "https://registry.yarnpkg.com/@elasticpath/plasmic-mcp-registry/-/plasmic-mcp-registry-0.2.1.tgz#37c0b32f49fb29ab896cf5a0f52eb98540f9ea6f" - integrity sha512-9ay2wvUxPIUemVMstvesNqMxii3519YzaE6SEeGFUCYGfo4xm5yxENPxVvUuGS5UqYXIxdadEOhjp/uacWQe7A== "@emnapi/runtime@^1.7.0": version "1.10.0" @@ -31,19 +123,142 @@ dependencies: tslib "^2.4.0" -"@epcc-sdk/sdks-shopper@^0.0.40": - version "0.0.40" - resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.0.40.tgz#15b18bc558677a1fc845c4ac47be89c2bbb957ee" - integrity sha512-N7a9O0E5s5lPx++SYTJ/hKWIqZ5cwF+WObPwycEsTk4RErT2QzLviy3vaCByMafS3Oj4rlsrcrBq6eQIDkv5rg== +"@epcc-sdk/sdks-shopper@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.1.0.tgz#df2dc6f3877913b44e994756c0cbaf87f17b3b96" + integrity sha512-H3nUiVO1keCoKEVKfdC8OcUzrwkxu9iAoI8+P11NwWmMGePklJPIQpdvwB2aB8I7h275TGNlsjFhWv5CW8zx4Q== dependencies: "@hey-api/client-fetch" "0.6.0" -"@epcc-sdk/sdks-shopper@^0.0.42": - version "0.0.42" - resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.0.42.tgz#f5c9b5a7e0b9230a11e600d115bbe8ed1de2405d" - integrity sha512-Z6c7kZkDYSutL0jj3nI5HJlUDOZUhNBzn5zXFA+QYvjzOxYr5p01yBpyvN+GOkdotLJiDdCQHqk87qu3jhgxDg== - dependencies: - "@hey-api/client-fetch" "0.6.0" +"@esbuild/aix-ppc64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz#bf6e10303bcf2e7c686975fa52f937ec2728d8bc" + integrity sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ== + +"@esbuild/android-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz#0c6246bc8d2c4d172aac2db3fb1190d72bd65504" + integrity sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A== + +"@esbuild/android-arm@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz#2d84ece6a4e2684d92be26ee13d42757d831c381" + integrity sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg== + +"@esbuild/android-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz#fc38d4d6358d8dc1cf53f09f7589fe436eb64801" + integrity sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q== + +"@esbuild/darwin-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz#f83afeeac1d7dac01c7a2fd012b3e451a0591fcc" + integrity sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw== + +"@esbuild/darwin-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz#510147c055a795588dbbe14fd6b1b8ad0a2f30de" + integrity sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw== + +"@esbuild/freebsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz#093b9200ecf0b115ba4e5e248a7485c9c5f8bd5e" + integrity sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw== + +"@esbuild/freebsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz#0be22b6df925d213e841ea87123af5df80b0faf7" + integrity sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg== + +"@esbuild/linux-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz#1bdbc651cda9ba9995c53ed9c71ceaa65094762d" + integrity sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug== + +"@esbuild/linux-arm@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz#beb12ad72b84f72d28488cc1b8ee9f7eb141d753" + integrity sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w== + +"@esbuild/linux-ia32@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz#b81f9d55529b45c206a46a138214b1aa6879696b" + integrity sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ== + +"@esbuild/linux-loong64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz#598667241a04c99b76ed6ef940ac50038c419f98" + integrity sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ== + +"@esbuild/linux-mips64el@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz#1c51eb9cea903f53d97b5af3b1841db70f5596ca" + integrity sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA== + +"@esbuild/linux-ppc64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz#63dd61f17ceb31a81227f413feac8a71bc2c51f2" + integrity sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ== + +"@esbuild/linux-riscv64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz#3763b08fde5cf25ab1facb8e7752edfe45fbfc27" + integrity sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA== + +"@esbuild/linux-s390x@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz#1a137ff293a82906eb3176385bd7e8e0e5cfb7cb" + integrity sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg== + +"@esbuild/linux-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz#268b36211c146ca54f8fe12c578a8d6ef8979485" + integrity sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ== + +"@esbuild/netbsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz#22571ad951d62bb6accc82d8d1fad5c8c1ac0ba1" + integrity sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw== + +"@esbuild/netbsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz#42fcc57297eb0a0ca3f5fc475291f4c1a3f7c0de" + integrity sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw== + +"@esbuild/openbsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz#9eb32af104ac3dacf4edca01f596664aab0c73ef" + integrity sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ== + +"@esbuild/openbsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz#febed2402d6088225e91f20fb4ce2522ad0a4efd" + integrity sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw== + +"@esbuild/openharmony-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz#85641c3d466428bfbccea5f21c26836663fef5ce" + integrity sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q== + +"@esbuild/sunos-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz#a736f9d8962481045fc4c3e54f5479f22c870fb4" + integrity sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g== + +"@esbuild/win32-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz#ee5ab40fad186201b652a33f8a5eb149e9e42532" + integrity sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ== + +"@esbuild/win32-ia32@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz#c40d28a6d99a127da6711f2afd74b11cb63b06a7" + integrity sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA== + +"@esbuild/win32-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz#b21affb804cc167c133d95f45b3a1dc1323b9a87" + integrity sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g== "@hey-api/client-fetch@0.6.0": version "0.6.0" @@ -202,6 +417,16 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8" integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw== +"@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@napi-rs/lzma-linux-x64-gnu@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz#e57d4306966078662038094fb38eb9146dc3aea9" + integrity sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ== + "@next/env@15.5.15": version "15.5.15" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.5.15.tgz#24b29b94852da52dd8e10f3ea0382a3ddb8733a6" @@ -247,128 +472,136 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.15.tgz#d2ad3b9506c761ed07297acaeb00fb2c694c41f8" integrity sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA== -"@plasmicapp/data-sources-context@0.1.23": - version "0.1.23" - resolved "https://registry.yarnpkg.com/@plasmicapp/data-sources-context/-/data-sources-context-0.1.23.tgz#7888d6ba33ba0c02509203368f230fdd431a14dc" - integrity sha512-F006Wr7s/RD4uCORY9EXYDYKgNUDxhY9qpUgT7a0Nyp9s6rw5qEZbcuMrM8Miy90DK3H5AfSuWaOl1+/pjxKZA== +"@noble/ciphers@^2.1.1": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-2.3.0.tgz#3bcea439b4c90f1cd32c8f7d647d1aebedc4d4d9" + integrity sha512-Clu/xdfgVTf9o7ngLOURaxePwR0j8sjclKEtVij10/jGulwFsPWCvvRgG/XjUVf8Nei+jLG6uwyXzUTGY1DQrw== -"@plasmicapp/host@*", "@plasmicapp/host@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@plasmicapp/host/-/host-2.0.1.tgz#92d8d1c9c7ae1f246cb33a10e90f80e2c05557e6" - integrity sha512-ghYXBzHihKemrq7RDmwGoUQrBMMba+biMfOLZFeXCm+S9cIXNM93KCk5rEst/pkwSt4Z9KOEqGAV1tTJqg7JHQ== +"@noble/hashes@^2.0.1": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-2.3.0.tgz#505fd39c3134a37e67c8c4e6c6049a496154879c" + integrity sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ== + +"@opentelemetry/semantic-conventions@^1.39.0": + version "1.43.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz#f3f467e36c27332f0e735ec86cdcd78dd6f27865" + integrity sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg== + +"@plasmicapp/data-sources-context@0.1.25": + version "0.1.25" + resolved "https://registry.yarnpkg.com/@plasmicapp/data-sources-context/-/data-sources-context-0.1.25.tgz#c8b74048a81ba6b400d34226b11091c04132b1cc" + integrity sha512-wCU+uxslvoPns/gWdUd615v1yBS9rVjyWmcc0qEhiEKCk8qHh0adc0e4hxbf34A4la0EaKj93B0iXw69m7GH+A== + +"@plasmicapp/host@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@plasmicapp/host/-/host-2.0.15.tgz#4c8cc970695b8b174c8a2413fde125154e092261" + integrity sha512-nTzXEg6wJQpYwOiZwrBkx+OHNktkcbzvRTte1WosBMU8pwO59jWehZqxUlPMArEQIjX/HPAbLNVm8FeMd4MQWQ== dependencies: - "@plasmicapp/query" "0.1.84" + "@plasmicapp/query" "0.1.87" csstype "^3.1.2" window-or-global "^1.0.1" -"@plasmicapp/isomorphic-unfetch@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@plasmicapp/isomorphic-unfetch/-/isomorphic-unfetch-1.0.3.tgz#baa334f5190d49461c26b1aa3fda073f5cfa7e33" - integrity sha512-cJtPOCf2/FWlFB42Q/n0MK/C47NSZr+YQJbCvQwvyjOrOgOQ4gJ/+gkr4avpMa7UPMa8qLovDAuaR+5k+hMlZQ== +"@plasmicapp/host@file:../../packages/host": + version "2.0.15" dependencies: - unfetch "^4.2.0" + "@plasmicapp/query" "0.1.87" + csstype "^3.1.2" + window-or-global "^1.0.1" -"@plasmicapp/loader-core@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-core/-/loader-core-2.0.0.tgz#6b5acd3ad6e4d7e6755ecffa007263b7765f6b8e" - integrity sha512-D32IfOr2P8UcwU5LHXzgED+ST9C0SjRQaEunsGNo5GcOJ7SpITdheKnHXoO8rhq7elzPU3nBBN0AbwYWZg/xcg== +"@plasmicapp/loader-core@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-core/-/loader-core-2.0.4.tgz#f88b5e54c78353dfe7b7c487c3500c6a36f29afd" + integrity sha512-tpwxUxolJDCwoKDxn4yUcVHcf7Ct1KggamFosQetjG79JaQXnRmGG34sQJt8txZqARqaY8Zdp0v+negh9qTYUg== dependencies: - "@plasmicapp/isomorphic-unfetch" "1.0.3" - "@plasmicapp/loader-fetcher" "2.0.0" + "@plasmicapp/loader-fetcher" "2.0.4" -"@plasmicapp/loader-edge@1.0.76": - version "1.0.76" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-edge/-/loader-edge-1.0.76.tgz#db94977502f1327daf8477bfcbf5f6971b82dcbe" - integrity sha512-wgEfDILDn0OnvR0U0T8th8/G8iE8KMnB19xtt5I2zHx2Vp4UsCSGnpDVOQGPJm4GViaui1x5Tjd57hQuPfge/Q== +"@plasmicapp/loader-edge@1.0.81": + version "1.0.81" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-edge/-/loader-edge-1.0.81.tgz#7ee092477e9cb81aa887823284f84b669945ac4c" + integrity sha512-sFOjQUunIgCutFOe47W6t+MVi5r9QsEnGG4/B6lasn4pfotpwBRoCLgIMy3nnty4VwzMvSym6JOzRNenHC4OPQ== dependencies: - "@plasmicapp/loader-splits" "1.0.70" + "@plasmicapp/loader-splits" "1.0.75" -"@plasmicapp/loader-fetcher@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-fetcher/-/loader-fetcher-2.0.0.tgz#379caefea6059f6070a469085f5f926d7ca0e83f" - integrity sha512-Rbx5RNPRokfy6MSXF0rE7V3BJnw6pwVUCHg3wPSuI4fysHXEC7/WnikF9E+wxLWWOFSmkR8WN6/pFGxcLFbd2A== - dependencies: - "@plasmicapp/isomorphic-unfetch" "1.0.3" +"@plasmicapp/loader-fetcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-fetcher/-/loader-fetcher-2.0.4.tgz#5127ed7da2def7d5008e1e166867c5a889af85ad" + integrity sha512-idfTtTuRirDVomG8oe1YXpR92Rng48x3aeAzAGBps3va820PXuxkuobfEX0b7XgkwmL0N7J4lRsyoUnqWXJ+nQ== -"@plasmicapp/loader-nextjs@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-nextjs/-/loader-nextjs-2.0.2.tgz#462d459624cc19fddc7824a57b8f1d28c1b7e598" - integrity sha512-IPM80x7cfzhOi8IVubV8oyCzqMjafCJ63Jq5Bt8m5XVApTcxXIuI0fS/5fKgOElXbrE9qorN1wznPW87+vQrPg== - dependencies: - "@plasmicapp/loader-core" "2.0.0" - "@plasmicapp/loader-edge" "1.0.76" - "@plasmicapp/loader-react" "2.0.2" - "@plasmicapp/nextjs-app-router" "1.0.22" - "@plasmicapp/watcher" "1.0.84" +"@plasmicapp/loader-nextjs@file:../../packages/loader-nextjs": + version "2.0.21" + dependencies: + "@plasmicapp/loader-core" "2.0.4" + "@plasmicapp/loader-edge" "1.0.81" + "@plasmicapp/loader-react" "2.0.18" + "@plasmicapp/watcher" "1.0.86" server-only "0.0.1" -"@plasmicapp/loader-react@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-react/-/loader-react-2.0.2.tgz#d8fe1482a4bb787c4c38298b08f8495adc78d7a5" - integrity sha512-pQqzYRnBUT6rxzwlppOiApBhu2mdFRLbHsVRA8VN0rnoL1dGeWQQX0pV37RTnZFkA/BzKQYAsddawWxJH5wUyA== - dependencies: - "@plasmicapp/data-sources-context" "0.1.23" - "@plasmicapp/host" "2.0.1" - "@plasmicapp/loader-core" "2.0.0" - "@plasmicapp/loader-fetcher" "2.0.0" - "@plasmicapp/loader-splits" "1.0.70" - "@plasmicapp/prepass" "1.0.24" - "@plasmicapp/query" "0.1.84" +"@plasmicapp/loader-react@2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-react/-/loader-react-2.0.18.tgz#b900a94165d00d6a259c44e85acc21243ec9f832" + integrity sha512-zVAIUgustPjWEduwpyLY8Jv+O1paxtWm4sah9N7mMzABpHwflaGQ2cNa+Poiv6F68m+sVJXs5tGivj8xNwwnXA== + dependencies: + "@plasmicapp/data-sources-context" "0.1.25" + "@plasmicapp/host" "2.0.15" + "@plasmicapp/loader-core" "2.0.4" + "@plasmicapp/loader-fetcher" "2.0.4" + "@plasmicapp/loader-splits" "1.0.75" + "@plasmicapp/prepass" "1.0.27" + "@plasmicapp/query" "0.1.87" pascalcase "^1.0.0" server-only "0.0.1" -"@plasmicapp/loader-splits@1.0.70": - version "1.0.70" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-splits/-/loader-splits-1.0.70.tgz#7dd89bd2877f731430f286af579153af0f4003cd" - integrity sha512-iS2IIrWmmCgh0qhyaHliTj6D0q4vQebsWEiATLblGaIF4cUyOZO8KAeBG/MWiT8HNyvCE/nimFbwaI7yd2ZfBA== +"@plasmicapp/loader-splits@1.0.75": + version "1.0.75" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-splits/-/loader-splits-1.0.75.tgz#8fbe6778d5caccb39f7ae1544246a863b0a146b4" + integrity sha512-MLG2CjR3/XGlnTWvxBz0QjAnvL4RZOKKWbreoxVRpTBChO3Uh1BORNis+NqITiS05U3OQlT7UUEv6cgi9lHVHg== dependencies: json-logic-js "^2.0.2" -"@plasmicapp/nextjs-app-router@*", "@plasmicapp/nextjs-app-router@1.0.22": - version "1.0.22" - resolved "https://registry.yarnpkg.com/@plasmicapp/nextjs-app-router/-/nextjs-app-router-1.0.22.tgz#fb0c9f279ed1669d037159b77ff149347f87c8af" - integrity sha512-PwxE4c6e0jbARKwkPvyksUBSzHmUnk5ZnCq+QZgPujVOYOWnmqpYj0GBrX2dl7jNp9RwQebOwHLWNcEbH9ixPw== +"@plasmicapp/nextjs-app-router@file:../../packages/nextjs-app-router": + version "1.0.29" dependencies: - "@plasmicapp/prepass" "1.0.24" - "@plasmicapp/query" "0.1.84" + "@plasmicapp/prepass" "1.0.27" + "@plasmicapp/query" "0.1.87" cross-port-killer "1.4.0" cross-spawn "^7.0.3" get-port "^7.0.0" node-html-parser "^6.1.5" yargs "^17.7.2" -"@plasmicapp/prepass@1.0.24": - version "1.0.24" - resolved "https://registry.yarnpkg.com/@plasmicapp/prepass/-/prepass-1.0.24.tgz#ba1f720b0aada99711b49553980714018a20b856" - integrity sha512-v9meFetG2cF1KNBlHXQ0mqJMQp73n4wiZ1C+4Hwg/sjCr34g5h/h4AF1MHKCeBZi5LiNSy6MMmgi7pp6GdA7kg== +"@plasmicapp/prepass@1.0.27": + version "1.0.27" + resolved "https://registry.yarnpkg.com/@plasmicapp/prepass/-/prepass-1.0.27.tgz#b890771ca10a11f645af962b581780d4e21b35c8" + integrity sha512-5XyT78LjJR+u0jXo2dMsWsTIKFDlp8m1pllHNv9i5Z4iR26MdKVuY7XOPfszwZBWz9wgQsLRjR07huo+BuHSQg== dependencies: - "@plasmicapp/query" "0.1.84" + "@plasmicapp/query" "0.1.87" "@plasmicapp/react-ssr-prepass" "^2.0.9" -"@plasmicapp/query@0.1.84": - version "0.1.84" - resolved "https://registry.yarnpkg.com/@plasmicapp/query/-/query-0.1.84.tgz#d7ad0a411243ea972d1e88049e8f47faf9f6763b" - integrity sha512-mOgXmccl82cSSX4DMOGisCUYb9+pPSPsQqUJ0OfTkrTz+bsNbluTjIGIFwGtvQZiBXMP2c7/MGrxtqXtt/qzLw== +"@plasmicapp/query@0.1.87": + version "0.1.87" + resolved "https://registry.yarnpkg.com/@plasmicapp/query/-/query-0.1.87.tgz#5179bd931d6ee54d7bbe7f47d845e0f81ab936ea" + integrity sha512-4M4QvE9IE8DtVv/LuEruGkMLo3bPhTZIwrYpQpcaXj6FQCL2G5XdhjhcH6JzSW2LxqjhyC+2xDLlZKUAzYqpvw== dependencies: - swr "^1.0.0" + swr "^1.3.0" "@plasmicapp/react-ssr-prepass@^2.0.9": version "2.0.9" resolved "https://registry.yarnpkg.com/@plasmicapp/react-ssr-prepass/-/react-ssr-prepass-2.0.9.tgz#1cfdd8d4c0e90fd4fed7d7204f70c44914871d31" integrity sha512-HO932uH/Y4otaDmjwzJbCLlokxNAdtU9VhDVUZUuVbzh0DhWaNyn/MINCu1oeZ4a6MIjdXFIm/U2VaxNxHYdsw== -"@plasmicapp/watcher@1.0.84": - version "1.0.84" - resolved "https://registry.yarnpkg.com/@plasmicapp/watcher/-/watcher-1.0.84.tgz#8275b3b10cdee8e049784b218a4c36e64ea4d5db" - integrity sha512-bPkCkp2q6kEqAAxh/sk/pL2iX40v46lK1QZKzgb9BQZL7idafz+nmYj8bobz0BaRQdFHb8f72Uie+CnwOB1rNw== +"@plasmicapp/watcher@1.0.86": + version "1.0.86" + resolved "https://registry.yarnpkg.com/@plasmicapp/watcher/-/watcher-1.0.86.tgz#d183d329aad85bbd663aa3bda96cf656dcea3d86" + integrity sha512-PDlJ2k1ecx9CvAj9WyBGCxcifo7l5VtrVSKXe3rl9hvhrYzmbsZNBjzBywzsTlRCEX0P8js9qQlO5WNknwg/Kw== dependencies: socket.io-client "^4.1.2" -"@plasmicpkgs/commerce@*": - version "0.0.242" - resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.242.tgz#8f84f4c4447510d4623b811fe83e82bb8a8e3c04" - integrity sha512-1zY/ZEMkUktoddyrQkBPE+oNSgJ271yjuVd38gqlJsYCteN/a6iKo6leMm9iu67iKjTzmBPneFEnyBCZ4Va13w== +"@plasmicpkgs/commerce@0.0.232": + version "0.0.232" + resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.232.tgz#1f32f70cc00eab79a076fd3c477d79c19ad0fd18" + integrity sha512-uUY+4PngY/cBQ7qldXwQbd/f/n9jo94TkbCWubMxDAMtv0sJolZoQXrIGVXKZuhuJTtI7ChJMqDnpsG4LJehig== dependencies: + "@types/react" "^18.0.27" "@vercel/fetch" "^6.2.0" debounce "^1.2.1" js-cookie "^3.0.1" @@ -376,12 +609,9 @@ react-hook-form "^7.28.0" swr "^1.2.2" -"@plasmicpkgs/commerce@0.0.232": - version "0.0.232" - resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.232.tgz#1f32f70cc00eab79a076fd3c477d79c19ad0fd18" - integrity sha512-uUY+4PngY/cBQ7qldXwQbd/f/n9jo94TkbCWubMxDAMtv0sJolZoQXrIGVXKZuhuJTtI7ChJMqDnpsG4LJehig== +"@plasmicpkgs/commerce@file:../../plasmicpkgs/commerce-providers/commerce": + version "0.0.256" dependencies: - "@types/react" "^18.0.27" "@vercel/fetch" "^6.2.0" debounce "^1.2.1" js-cookie "^3.0.1" @@ -389,11 +619,141 @@ react-hook-form "^7.28.0" swr "^1.2.2" +"@rollup/rollup-android-arm-eabi@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz#2b86c8fff13a065845ddb65f64d814499ace020f" + integrity sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg== + +"@rollup/rollup-android-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz#af217357ecc06ae5e4f54ef34ee72b1e37f8dbc3" + integrity sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A== + +"@rollup/rollup-darwin-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz#e9d0adba06e39b632fc8e880100ff06547eda80b" + integrity sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw== + +"@rollup/rollup-darwin-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz#eff983a29db7d8ea7f733f1ce430fc64e159a5e6" + integrity sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A== + +"@rollup/rollup-freebsd-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz#abe1399a70e819034f492d05dbcc97964310bb57" + integrity sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ== + +"@rollup/rollup-freebsd-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz#b2e0f8c24a362ac7112be3d5549c6940597e0168" + integrity sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg== + +"@rollup/rollup-linux-arm-gnueabihf@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz#a5f2a7e7eb719254a6800db18e9f369d3c623439" + integrity sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA== + +"@rollup/rollup-linux-arm-musleabihf@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz#390c86c797695af87c38d6f005222d920b5bfa22" + integrity sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ== + +"@rollup/rollup-linux-arm64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz#1fea78609a15813cda98d93fe8d987c87017f572" + integrity sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ== + +"@rollup/rollup-linux-arm64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz#3b50031c9916517576098f6e11b38a13147dc463" + integrity sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g== + +"@rollup/rollup-linux-loong64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz#b403255546099a4300b17d976ee1776224c090e5" + integrity sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA== + +"@rollup/rollup-linux-loong64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz#5900610e59c66ee594539c6590566dbfda7082b1" + integrity sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ== + +"@rollup/rollup-linux-ppc64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz#a892cc8b8414bc8ae0b267816b5e384e5d321ff2" + integrity sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w== + +"@rollup/rollup-linux-ppc64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz#d9e60d568b7db4df2196fb2411b0c6918b2360cc" + integrity sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w== + +"@rollup/rollup-linux-riscv64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz#5b3141ab43afbd9e50f639e562e94ed256d201cf" + integrity sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ== + +"@rollup/rollup-linux-riscv64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz#b0fe751015bc3822f9004884eaba5e5cdfde7aa6" + integrity sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA== + +"@rollup/rollup-linux-s390x-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz#0cb323e850509e1b9bf6d241328a98b0e12e2916" + integrity sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA== + +"@rollup/rollup-linux-x64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz#1e7470123e7a8ba8c160a7a043447472d5549542" + integrity sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw== + +"@rollup/rollup-linux-x64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz#19df9a17d20ff3c17bd8e9cc2553563ae0aa0580" + integrity sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA== + +"@rollup/rollup-openbsd-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz#31c3ca1bd00e80f309a1d0cb8da4bdf59cb2dfa3" + integrity sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ== + +"@rollup/rollup-openharmony-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz#84561a14381caecb7652e158d10551a5edc0a6fc" + integrity sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ== + +"@rollup/rollup-win32-arm64-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz#bc532edb20cd39c0b53eee2dfae43b52c2e3be1e" + integrity sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw== + +"@rollup/rollup-win32-ia32-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz#a6f51492976c9fc19801be298df2f76a3cbebf7a" + integrity sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ== + +"@rollup/rollup-win32-x64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz#ae60710b0868b2fe731d9f7c341fa49cbf8e8629" + integrity sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw== + +"@rollup/rollup-win32-x64-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz#c3a265fe0f9af4fb63bad86d3829386bc5da0026" + integrity sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q== + "@socket.io/component-emitter@~3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== +"@standard-schema/spec@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + "@stripe/react-stripe-js@^2.4.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-2.9.0.tgz#1f1a9a3d5eab8ca144e060df1e9fd855a7658aca" @@ -413,6 +773,13 @@ dependencies: tslib "^2.8.0" +"@swc/helpers@0.5.18": + version "0.5.18" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.18.tgz#feeeabea0d10106ee25aaf900165df911ab6d3b1" + integrity sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ== + dependencies: + tslib "^2.8.0" + "@types/async-retry@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.2.1.tgz#fa9ac165907a8ee78f4924f4e393b656c65b5bb4" @@ -425,6 +792,39 @@ dependencies: "@types/retry" "*" +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/dom-speech-recognition@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz#e326761a04b4a49c0eec2ac7948afc1c6aa12baa" + integrity sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw== + +"@types/estree@1.0.9", "@types/estree@^1.0.0": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/google.maps@^3.55.12": + version "3.65.5" + resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.65.5.tgz#4d5bfd538b98378e7e551c8b30969d624e6b45c6" + integrity sha512-oR9Hq/WaKGzIguZEwoCuyQ0ofDhCbefmS9RrjLUZ5scMziwTE6xA90drJYt2ZsyUCYmCqnxQcDpfGqeRE/Zgog== + +"@types/hogan.js@^3.0.0": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/hogan.js/-/hogan.js-3.0.5.tgz#09f5b916ad88e1975b093ab7a25a37ffc0418be5" + integrity sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA== + "@types/lru-cache@4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-4.1.1.tgz#b2d87a5e3df8d4b18ca426c5105cd701c2306d40" @@ -455,11 +855,23 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.5.tgz#6a31f820c1077c3f8ce44f9e203e68a176e8f59e" integrity sha512-Bq7G3AErwe5A/Zki5fdD3O6+0zDChhg671NfPjtIcbtzDNZTv4NPKMRFr7gtYPG7y+B8uTiNK4Ngd9T0FTar6Q== +"@types/node@>=8.1.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.2.0.tgz#5a4875a862fda8fdc57de8faa579bb81ecba1685" + integrity sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg== + dependencies: + undici-types "~8.3.0" + "@types/prop-types@*": version "15.7.15" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== +"@types/qs@^6.5.3": + version "6.15.1" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" + integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== + "@types/react-dom@18.2.12": version "18.2.12" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.12.tgz#58479c463d1e0b7f1ee7cd80e09186189f9ec32d" @@ -528,6 +940,67 @@ agentkeepalive "^4.2.1" debug "^4.3.3" +"@vitest/expect@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.7.tgz#70a34158383d008c3bf5d802e2643317f09df6d8" + integrity sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.7" + "@vitest/utils" "3.2.7" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.7.tgz#331be944cb783c642dd42bd743411aca24ea0466" + integrity sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA== + dependencies: + "@vitest/spy" "3.2.7" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.2.7", "@vitest/pretty-format@^3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.7.tgz#2a7b593f8e007e9d8ef7e7343aa30ec73fdeaf29" + integrity sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.7.tgz#c0c080228189f1fa6cda40f59be09d746b0aca51" + integrity sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA== + dependencies: + "@vitest/utils" "3.2.7" + pathe "^2.0.3" + strip-literal "^3.0.0" + +"@vitest/snapshot@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.7.tgz#a3a7e1950ce99ec4cf02395e20ddca403b6c818e" + integrity sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g== + dependencies: + "@vitest/pretty-format" "3.2.7" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.7.tgz#ca7fbee44019523ca450395d9a2284ce9ece1f31" + integrity sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.7.tgz#302c8126211ac4dfea87b3b5085c098d6d22e89e" + integrity sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw== + dependencies: + "@vitest/pretty-format" "3.2.7" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + "@zeit/dns-cached-resolve@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@zeit/dns-cached-resolve/-/dns-cached-resolve-2.1.2.tgz#2c2e33d682d67f94341c9a06ac0e2a8f14ff035f" @@ -539,6 +1012,11 @@ async-retry "1.2.3" lru-cache "5.1.1" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + agentkeepalive@^4.2.1: version "4.6.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" @@ -546,6 +1024,13 @@ agentkeepalive@^4.2.1: dependencies: humanize-ms "^1.2.1" +algoliasearch-helper@3.29.3: + version "3.29.3" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz#dc21f119320acbdd5890a21021846b5730d11e03" + integrity sha512-gVOMbbPVrCO3Xs+B+BLAIGFqIQow6qHMTYCEeBqLQB9m4ZmKUqMwkEumlal2iyyezHEd4Y0FvFTLbCRutCutIQ== + dependencies: + "@algolia/events" "^4.0.1" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -558,6 +1043,11 @@ ansi-styles@^4.0.0: dependencies: color-convert "^2.0.1" +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + async-retry@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" @@ -577,11 +1067,49 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +better-auth@^1.6.9: + version "1.6.27" + resolved "https://registry.yarnpkg.com/better-auth/-/better-auth-1.6.27.tgz#ece594ec2971c01dda9741cbaee74879c39ab5c9" + integrity sha512-x3jyxpAiBSsMO/DaXMFSVwM8bTqnYZlCKsZxBV43zL3ZtsGa/CzeUuNKxPT2Lsz7ahTBY90Ku1tibN6nRpVEbw== + dependencies: + "@better-auth/core" "1.6.27" + "@better-auth/drizzle-adapter" "1.6.27" + "@better-auth/kysely-adapter" "1.6.27" + "@better-auth/memory-adapter" "1.6.27" + "@better-auth/mongo-adapter" "1.6.27" + "@better-auth/prisma-adapter" "1.6.27" + "@better-auth/telemetry" "1.6.27" + "@better-auth/utils" "0.4.2" + "@better-fetch/fetch" "1.3.1" + "@noble/ciphers" "^2.1.1" + "@noble/hashes" "^2.0.1" + better-call "1.4.0" + defu "^6.1.4" + jose "^6.1.3" + kysely "^0.28.17 || ^0.29.0" + nanostores "^1.1.1" + zod "^4.3.6" + +better-call@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/better-call/-/better-call-1.4.0.tgz#e581bbbaf65f9ee8ab07bb994e81c3de36a36408" + integrity sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA== + dependencies: + "@better-auth/utils" "^0.5.0" + "@better-fetch/fetch" "^1.3.1" + rou3 "^0.9.1" + set-cookie-parser "^3.1.2" + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -603,6 +1131,22 @@ caniuse-lite@^1.0.30001579: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz#31e97d1bfec332b3f2d7eea7781460c97629b3bf" integrity sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ== +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +check-error@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" + integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -681,13 +1225,23 @@ debounce@^2.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-2.2.0.tgz#f895fa2fbdb579a0f0d3dcf5dde19657e50eaad5" integrity sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw== -debug@^4.3.3, debug@~4.4.1: +debug@^4.3.3, debug@^4.4.1, debug@~4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +defu@^6.1.4: + version "6.1.7" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23" + integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -773,6 +1327,11 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -790,11 +1349,60 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" +"esbuild@^0.27.0 || ^0.28.0": + version "0.28.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.2.tgz#0f43bd1bad955b72d24e2261e3abe5957ccf0816" + integrity sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.28.2" + "@esbuild/android-arm" "0.28.2" + "@esbuild/android-arm64" "0.28.2" + "@esbuild/android-x64" "0.28.2" + "@esbuild/darwin-arm64" "0.28.2" + "@esbuild/darwin-x64" "0.28.2" + "@esbuild/freebsd-arm64" "0.28.2" + "@esbuild/freebsd-x64" "0.28.2" + "@esbuild/linux-arm" "0.28.2" + "@esbuild/linux-arm64" "0.28.2" + "@esbuild/linux-ia32" "0.28.2" + "@esbuild/linux-loong64" "0.28.2" + "@esbuild/linux-mips64el" "0.28.2" + "@esbuild/linux-ppc64" "0.28.2" + "@esbuild/linux-riscv64" "0.28.2" + "@esbuild/linux-s390x" "0.28.2" + "@esbuild/linux-x64" "0.28.2" + "@esbuild/netbsd-arm64" "0.28.2" + "@esbuild/netbsd-x64" "0.28.2" + "@esbuild/openbsd-arm64" "0.28.2" + "@esbuild/openbsd-x64" "0.28.2" + "@esbuild/openharmony-arm64" "0.28.2" + "@esbuild/sunos-x64" "0.28.2" + "@esbuild/win32-arm64" "0.28.2" + "@esbuild/win32-ia32" "0.28.2" + "@esbuild/win32-x64" "0.28.2" + escalade@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +expect-type@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.4.0.tgz#24edf7f0cc69a44d008567ba4594ab96f3c3a3d6" + integrity sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA== + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + form-data@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -806,6 +1414,11 @@ form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -874,6 +1487,19 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg== + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + +htm@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" + integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -881,6 +1507,34 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +instantsearch-ui-components@0.35.1: + version "0.35.1" + resolved "https://registry.yarnpkg.com/instantsearch-ui-components/-/instantsearch-ui-components-0.35.1.tgz#4ecfb3b02415d228d4c963fa46ce61d22d6e977e" + integrity sha512-n8sCod1pOeaMMZzzqoK3MNFYqyw3IjWXP97zwXyjPFhbx+B7SEN+pmFmALdOagm2K2qzTcFF08ZlA13Xm8I6rg== + dependencies: + "@swc/helpers" "0.5.18" + markdown-to-jsx "^7.7.15" + +instantsearch.js@4.111.1, instantsearch.js@^4.75.6: + version "4.111.1" + resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-4.111.1.tgz#ec12045872f48eb65788edd24cd668d40cf9808f" + integrity sha512-DMuvb2koPHhe5PTGMGbWI5t+i9OHWLKny5312vygdYvUvVygnsZ6axtMXfz7FDtjAgkBRm675R5sGkGjF9o/sQ== + dependencies: + "@algolia/events" "^4.0.1" + "@swc/helpers" "0.5.18" + "@types/dom-speech-recognition" "^0.0.1" + "@types/google.maps" "^3.55.12" + "@types/hogan.js" "^3.0.0" + "@types/qs" "^6.5.3" + algoliasearch-helper "3.29.3" + hogan.js "^3.0.2" + htm "^3.0.0" + instantsearch-ui-components "0.35.1" + preact "^10.10.0" + qs "^6.5.1" + react ">= 0.14.0" + search-insights "^2.17.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -891,6 +1545,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +jose@^6.1.3: + version "6.2.8" + resolved "https://registry.yarnpkg.com/jose/-/jose-6.2.8.tgz#39c1459fe5eac84eb39b1623b8077dcf9ca6c506" + integrity sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ== + js-cookie@^3.0.1, js-cookie@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" @@ -901,11 +1560,21 @@ js-cookie@^3.0.1, js-cookie@^3.0.5: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + json-logic-js@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/json-logic-js/-/json-logic-js-2.0.5.tgz#55f0c687dd6f56b02ccdcfdd64171ed998ab5499" integrity sha512-rTT2+lqcuUmj4DgWfmzupZqQDA64AdmYqizzMPWj3DxGdfFNsxPpcNVSaTj4l8W2tG/+hg7/mQhxjU3aPacO6g== +"kysely@^0.28.17 || ^0.29.0": + version "0.29.5" + resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.29.5.tgz#c07a51700a4b4db53c60bd373e6e098f919fccae" + integrity sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -918,6 +1587,11 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== + lru-cache@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -925,6 +1599,18 @@ lru-cache@5.1.1: dependencies: yallist "^3.0.2" +magic-string@^0.30.17: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +markdown-to-jsx@^7.7.15: + version "7.7.17" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.17.tgz#6e997d6aa4dbe2e69c423c65745541846777483c" + integrity sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -942,16 +1628,31 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== + ms@^2.0.0, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoid@^3.3.17: + version "3.3.18" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" + integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== + nanoid@^3.3.6: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanostores@^1.1.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/nanostores/-/nanostores-1.4.2.tgz#686199c31502e86df450ece2c810411a51b18329" + integrity sha512-Wxv8Roefr2nqtiRG0bnaFlpYqpIVtOEeJZHaH+4nGgOK1/7n6OHOuHCb/bhqrNQgZM8fyd0s1PqhdrJc9Ib44g== + next@^15.5.9: version "15.5.15" resolved "https://registry.yarnpkg.com/next/-/next-15.5.15.tgz#b25a59a232bd992a83da045fa289ee803c23c836" @@ -981,6 +1682,13 @@ node-html-parser@^6.1.5: css-select "^5.1.0" he "1.2.0" +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -1008,11 +1716,26 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -picocolors@^1.0.0: +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== +picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" + integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== + postcss@8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" @@ -1022,6 +1745,20 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.5.6: + version "8.5.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620" + integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== + dependencies: + nanoid "^3.3.17" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +preact@^10.10.0: + version "10.29.8" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.29.8.tgz#fc85b82dc2474e245b1430b51781d417361f5fc3" + integrity sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q== + prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -1038,6 +1775,14 @@ qs@^6.11.0: dependencies: side-channel "^1.1.0" +qs@^6.5.1: + version "6.15.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== + dependencies: + es-define-property "^1.0.1" + side-channel "^1.1.1" + react-dom@^19: version "19.2.5" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.5.tgz#b8768b10837d0b8e9ca5b9e2d58dff3d880ea25e" @@ -1045,16 +1790,46 @@ react-dom@^19: dependencies: scheduler "^0.27.0" -react-hook-form@^7.28.0, react-hook-form@^7.48.2: +react-hook-form@^7.28.0: version "7.73.1" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.73.1.tgz#ddd1a27cae48f6095529f6e2e0c581daaca5462a" integrity sha512-VAfVYOPcx3piiEVQy95vyFmBwbVUsP/AUIN+mpFG8h11yshDd444nn0VyfaGWSRnhOLVgiDu7HIuBtAIzxn9dA== +react-instantsearch-core@7.44.1: + version "7.44.1" + resolved "https://registry.yarnpkg.com/react-instantsearch-core/-/react-instantsearch-core-7.44.1.tgz#7f5ff6e935dd1a697e4ba266c28a38b9a610c7ae" + integrity sha512-2pb73h7TqNzHDtcLAPcvxUOiG9Wt0hayNCiJJ+yCUs9Vw5S1n2PxdDnEaU/CvkkqT/RLcimnVQDmyf6yfNiMsA== + dependencies: + "@swc/helpers" "0.5.18" + algoliasearch-helper "3.29.3" + instantsearch.js "4.111.1" + use-sync-external-store "^1.0.0" + +react-instantsearch-nextjs@^0.3.17: + version "0.3.21" + resolved "https://registry.yarnpkg.com/react-instantsearch-nextjs/-/react-instantsearch-nextjs-0.3.21.tgz#718f70437a18d27c78440ebea7a4312605e3451a" + integrity sha512-GDhi7jabacahXjqkkwQN0Lq3FaW3pwIMz6ac5GeOqJkqqfEFAluUuNHgkjGOT+MVPnVmpnbQyRgOxUSL8SXYVQ== + +react-instantsearch@^7.13.6: + version "7.44.1" + resolved "https://registry.yarnpkg.com/react-instantsearch/-/react-instantsearch-7.44.1.tgz#aff88aa8ae7403827ab46be2e49f563e00a80385" + integrity sha512-nS5ko45HwzSbSCdL2MLrzui9YkBps+6r1DECjmIPx3BHiOicv0JpFnuxc4azXJKEuDig8p1QXc8JvqexUzpOXA== + dependencies: + "@swc/helpers" "0.5.18" + instantsearch-ui-components "0.35.1" + instantsearch.js "4.111.1" + react-instantsearch-core "7.44.1" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +"react@>= 0.14.0": + version "19.2.8" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d" + integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw== + react@^19: version "19.2.5" resolved "https://registry.yarnpkg.com/react/-/react-19.2.5.tgz#c888ab8b8ef33e2597fae8bdb2d77edbdb42858b" @@ -1075,11 +1850,56 @@ retry@0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +rollup@^4.43.0: + version "4.62.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.62.4.tgz#96d2e62070f0b0ac63424edd0c93a7fb864ef069" + integrity sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg== + dependencies: + "@types/estree" "1.0.9" + optionalDependencies: + "@napi-rs/lzma-linux-x64-gnu" "1.5.1" + "@rollup/rollup-android-arm-eabi" "4.62.4" + "@rollup/rollup-android-arm64" "4.62.4" + "@rollup/rollup-darwin-arm64" "4.62.4" + "@rollup/rollup-darwin-x64" "4.62.4" + "@rollup/rollup-freebsd-arm64" "4.62.4" + "@rollup/rollup-freebsd-x64" "4.62.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.62.4" + "@rollup/rollup-linux-arm-musleabihf" "4.62.4" + "@rollup/rollup-linux-arm64-gnu" "4.62.4" + "@rollup/rollup-linux-arm64-musl" "4.62.4" + "@rollup/rollup-linux-loong64-gnu" "4.62.4" + "@rollup/rollup-linux-loong64-musl" "4.62.4" + "@rollup/rollup-linux-ppc64-gnu" "4.62.4" + "@rollup/rollup-linux-ppc64-musl" "4.62.4" + "@rollup/rollup-linux-riscv64-gnu" "4.62.4" + "@rollup/rollup-linux-riscv64-musl" "4.62.4" + "@rollup/rollup-linux-s390x-gnu" "4.62.4" + "@rollup/rollup-linux-x64-gnu" "4.62.4" + "@rollup/rollup-linux-x64-musl" "4.62.4" + "@rollup/rollup-openbsd-x64" "4.62.4" + "@rollup/rollup-openharmony-arm64" "4.62.4" + "@rollup/rollup-win32-arm64-msvc" "4.62.4" + "@rollup/rollup-win32-ia32-msvc" "4.62.4" + "@rollup/rollup-win32-x64-gnu" "4.62.4" + "@rollup/rollup-win32-x64-msvc" "4.62.4" + fsevents "~2.3.2" + +rou3@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/rou3/-/rou3-0.9.2.tgz#4deea937ad3b9df79bb0b09ffc97c616db56c0e4" + integrity sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ== + scheduler@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== +search-insights@^2.17.2: + version "2.17.3" + resolved "https://registry.yarnpkg.com/search-insights/-/search-insights-2.17.3.tgz#8faea5d20507bf348caba0724e5386862847b661" + integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== + semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" @@ -1090,6 +1910,11 @@ server-only@0.0.1: resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e" integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== +set-cookie-parser@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz#f4e490298759d756a68eabcbcd0fc9261ad0fee0" + integrity sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw== + sharp@^0.34.3: version "0.34.5" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0" @@ -1136,7 +1961,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel-list@^1.0.0: +side-channel-list@^1.0.0, side-channel-list@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== @@ -1176,6 +2001,22 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + socket.io-client@^4.1.2: version "4.8.3" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.3.tgz#62717edd46a318c918125b57e92dc7f8bb71c34c" @@ -1194,11 +2035,21 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.4.1" -source-map-js@^1.0.2: +source-map-js@^1.0.2, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.9.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1215,6 +2066,21 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-literal@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.1.0.tgz#222b243dd2d49c0bcd0de8906adbd84177196032" + integrity sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg== + dependencies: + js-tokens "^9.0.1" + +stripe@^14.0.0: + version "14.25.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-14.25.0.tgz#65924510465924d2688a2b4d7f9cbfd8548cf9b9" + integrity sha512-wQS3GNMofCXwH8TSje8E1SE8zr6ODiGtHQgPtO95p9Mb4FhKC9jvXR2NUTpZ9ZINlckJcFidCmaTFV4P6vsb9g== + dependencies: + "@types/node" ">=8.1.0" + qs "^6.11.0" + styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -1222,11 +2088,44 @@ styled-jsx@5.1.6: dependencies: client-only "0.0.1" -swr@^1.0.0, swr@^1.2.2: +swr@^1.2.2, swr@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.14, tinyglobby@^0.2.15: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tinypool@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" + integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== + tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" @@ -1242,10 +2141,69 @@ undici-types@~7.19.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.19.2.tgz#1b67fc26d0f157a0cba3a58a5b5c1e2276b8ba2a" integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +use-sync-external-store@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== + +vite-node@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" + integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== + dependencies: + cac "^6.7.14" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": + version "7.3.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.6.tgz#0547a395e68d3746e9a505f1fd4469fe09b49cc4" + integrity sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg== + dependencies: + esbuild "^0.27.0 || ^0.28.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^3.2.4: + version "3.2.7" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.7.tgz#1944b6ed013a25fd26a73d18e1af92c10a57af6c" + integrity sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.7" + "@vitest/mocker" "3.2.7" + "@vitest/pretty-format" "^3.2.7" + "@vitest/runner" "3.2.7" + "@vitest/snapshot" "3.2.7" + "@vitest/spy" "3.2.7" + "@vitest/utils" "3.2.7" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.1" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" + why-is-node-running "^2.3.0" which@^2.0.1: version "2.0.2" @@ -1254,6 +2212,14 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + window-or-global@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" @@ -1310,3 +2276,8 @@ zod@^3.22.4: version "3.25.76" resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== + +zod@^4.3.6: + version "4.4.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx b/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx index 2e6b6dce86..c492d45ab6 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx +++ b/plasmicpkgs/commerce-providers/elastic-path/src/checkout/composable/EPCheckoutCartSummary.tsx @@ -7,10 +7,8 @@ import registerComponent, { } from "@plasmicapp/host/registerComponent"; import React, { useMemo, useState } from "react"; import { Registerable } from "../../registerable"; -import { - useCheckoutCart, - type CheckoutCartData, -} from "../../shopper-context/use-checkout-cart"; +import { useCheckoutCart } from "../../shopper-context/use-checkout-cart"; +import type { CheckoutCartData } from "../../shopper-context/use-checkout-cart"; import { createLogger } from "../../utils/logger"; import { MOCK_CHECKOUT_CART_DATA } from "../../utils/design-time-data"; From a513b7c760c546aabdc9f07fd8398d790a0492d2 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 14:10:16 +0100 Subject: [PATCH 4/8] fix(ep-commerce): stop /get-session handing the EP token to the browser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit better-auth's /get-session returns the whole session record, and this package keeps the shopper's EP access token on it. Mounting better-auth's toNextJsHandler directly therefore handed that token to any same-origin script for the cost of one fetch — the same exposure the serverToken prop created, in pull form rather than push. createEpAuthRoutes wraps the handler and strips epAccessToken, epClientId and epHost from that response. epCartId stays: it is not a credential, and EPCheckoutProvider and EPPromoCodeInput read it. Also corrects the README's cookie and route tables, which described ep_token / ep_account / ep_cart cookies the app never sets and a PATCH cart route that is actually PUT. --- .../app/api/ep/[...path]/route.ts | 7 +- .../elastic-path/CHANGELOG.md | 14 +++ .../commerce-providers/elastic-path/README.md | 44 ++++--- .../elastic-path/build-server.mjs | 2 +- .../ep-plugin/__tests__/auth-routes.test.ts | 118 ++++++++++++++++++ .../src/auth/ep-plugin/auth-routes.ts | 77 ++++++++++++ .../elastic-path/src/auth/index.ts | 1 + .../elastic-path/src/server.ts | 5 +- 8 files changed, 247 insertions(+), 21 deletions(-) create mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts create mode 100644 plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts diff --git a/examples/ep-commerce-app-router/app/api/ep/[...path]/route.ts b/examples/ep-commerce-app-router/app/api/ep/[...path]/route.ts index 59b3b14f8e..b3c18ce36c 100644 --- a/examples/ep-commerce-app-router/app/api/ep/[...path]/route.ts +++ b/examples/ep-commerce-app-router/app/api/ep/[...path]/route.ts @@ -9,13 +9,14 @@ * POST /api/ep/ep/cart → set epCartId on session * POST /api/ep/ep/account/login → persist account fields * POST /api/ep/ep/account/logout → strip account fields - * GET /api/ep/get-session → read current session + * GET /api/ep/get-session → read current session, minus the + * shopper's EP credentials * * The legacy `withEpProviderHeaders` wrapper is no longer needed — the * `resolveConfig` callback inside `lib/ep-auth.ts` pulls clientId/host * from the Plasmic loader bundle on every request. */ -import { toNextJsHandler } from "better-auth/next-js"; +import { createEpAuthRoutes } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; import { epAuth } from "@/lib/ep-auth"; -export const { GET, POST } = toNextJsHandler(epAuth.handler); +export const { GET, POST } = createEpAuthRoutes(epAuth); diff --git a/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md index 666158813e..55fae72446 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md +++ b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md @@ -32,6 +32,20 @@ the public `clientId`. `session.providerProps()` into `PlasmicClientRootProvider`. `providerProps()` now returns `{}`. +**Mount the auth handler with `createEpAuthRoutes`**, not better-auth's +`toNextJsHandler`: + +```ts +// app/api/ep/[...path]/route.ts +export const { GET, POST } = createEpAuthRoutes(epAuth); +``` + +better-auth's `/get-session` returns the whole session record, and this package +keeps the shopper's EP access token on it — so the raw handler hands that token +to any same-origin script for the cost of one fetch. `createEpAuthRoutes` strips +`epAccessToken`, `epClientId` and `epHost` from that response. `epCartId` stays: +it is not a credential, and the checkout components read it. + `serverToken` and `serverCartMode` remain in the registered prop schema, hidden and ignored. Registered props on a hostless package are append-only; removing one breaks hostless publishing for every package. Everywhere else the flag is diff --git a/plasmicpkgs/commerce-providers/elastic-path/README.md b/plasmicpkgs/commerce-providers/elastic-path/README.md index 921bdc8d8e..c12f7c525b 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/README.md +++ b/plasmicpkgs/commerce-providers/elastic-path/README.md @@ -40,10 +40,10 @@ export const epAuth = createEpAuth({ ```ts // app/api/ep/[...path]/route.ts -import { toNextJsHandler } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; +import { createEpAuthRoutes } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; import { epAuth } from "@/lib/ep-auth"; -export const { GET, POST, PATCH, DELETE } = toNextJsHandler(epAuth); +export const { GET, POST } = createEpAuthRoutes(epAuth); ``` **Pages Router:** @@ -51,13 +51,13 @@ export const { GET, POST, PATCH, DELETE } = toNextJsHandler(epAuth); ```ts // pages/api/ep/[...path].ts import type { NextApiRequest, NextApiResponse } from "next"; -import { toNextJsHandler } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; +import { createEpAuthRoutes } from "@elasticpath/plasmic-ep-commerce-elastic-path/server"; import { epAuth } from "@/lib/ep-auth"; -const handlers = toNextJsHandler(epAuth); +const handlers = createEpAuthRoutes(epAuth); export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const method = req.method?.toUpperCase() as "GET" | "POST" | "PATCH" | "DELETE"; + const method = req.method?.toUpperCase() as "GET" | "POST"; const fn = handlers[method]; if (!fn) return res.status(405).end(); @@ -256,26 +256,40 @@ never localStorage, never a cookie. ### API Routes -The catch-all handler (`toNextJsHandler`) provides: +`createEpAuthRoutes(epAuth)` mounts the auth handler: + +| Method | Path | Description | +|--------|------|-------------| +| POST | `{basePath}/ep/anonymous` | Mint an anonymous session | +| POST | `{basePath}/ep/refresh` | Rotate the EP token | +| POST | `{basePath}/ep/cart` | Persist `epCartId` on the session | +| POST | `{basePath}/ep/account/login` | Persist account fields | +| GET | `{basePath}/get-session` | Read the session, minus EP credentials | + +`createCartRoutes(epAuth)` mounts the cart routes: | Method | Path | Description | |--------|------|-------------| | GET | `{basePath}/cart` | Get cart contents | | POST | `{basePath}/cart/items` | Add item to cart | -| PATCH | `{basePath}/cart/items/:id` | Update item quantity | +| PUT | `{basePath}/cart/items/:id` | Update item quantity | | DELETE | `{basePath}/cart/items/:id` | Remove item from cart | -Every response includes `accountStatus: "authenticated" | "expired" | "anonymous"`. +Mount the auth handler through `createEpAuthRoutes`, never better-auth's +`toNextJsHandler` directly: better-auth's `/get-session` returns the whole +session record, and this package keeps the shopper's EP access token on it. ### Cookie Architecture -| Cookie | Contents | Max-Age | Purpose | -|--------|----------|---------|---------| -| `ep_token` | base64 JSON (token + credentials) | 30 days | Implicit token, self-refreshes | -| `ep_account` | base64 JSON (account info) | Until expiry | Account auth (logged-in shopper) | -| `ep_cart` | Cart UUID string | 30 days | Cart identity | +| Cookie | Contents | Purpose | +|--------|----------|---------| +| `better-auth.session_token` | Signed session id | Session identity | +| `better-auth.session_data` | JWE — EP access token, client id, host, cart id | Everything the server needs to act as the shopper | -All cookies: `HttpOnly; SameSite=Lax; Path=/`. `Secure` in production. +Both are `HttpOnly; SameSite=Lax; Path=/`, `Secure` in production. The EP +access token, the account fields and the cart id all live inside the encrypted +`session_data` payload — there is no separate `ep_token`, `ep_account` or +`ep_cart` cookie. ### Server-Side Rendering @@ -295,7 +309,7 @@ The API follows [Better Auth](https://better-auth.com/) conventions: |-------------|-------------| | `createEpAuth()` | `betterAuth()` | | `epAuth.api.getSession(req)` | `auth.api.getSession(req)` | -| `toNextJsHandler(epAuth)` | `toNextJsHandler(auth)` | +| `createEpAuthRoutes(epAuth)` | `toNextJsHandler(auth)` | | `session.user` / `session.session` | `session.user` / `session.session` | ## Studio Server Queries (SSR) diff --git a/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs b/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs index 0ce8c33502..8163eaeb09 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs +++ b/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs @@ -84,7 +84,7 @@ export type { StripeAdapterConfig } from "./checkout/session/adapters/stripe-ada export { createClientCredentialsTokenResolver } from "./auth/ep-plugin/client-credentials-resolver"; export type { ClientCredentialsResolverConfig, ClientCredentialsTokenResolver } from "./auth/ep-plugin/client-credentials-resolver"; export type { SessionRequest, SessionResponse, SessionHandlerContext, EPCredentials, AdapterRegistry, SessionStore, PaymentAdapter, CustomAttributeAllowList } from "./checkout/session/types"; -export { createEpAuth, createBetterEpAuth, extractEpProviderConfig, epPlugin, epAuthMiddleware, createCartRoutes, createEpProxyRoutes, enforceOriginGate, isTrustedOrigin, passesOriginGate, assertProductionSecret, resolveAuthSecret, DEFAULT_HOST_ALLOWLIST, isAllowedEpHost } from "./auth"; +export { createEpAuth, createBetterEpAuth, extractEpProviderConfig, epPlugin, epAuthMiddleware, createEpAuthRoutes, createCartRoutes, createEpProxyRoutes, enforceOriginGate, isTrustedOrigin, passesOriginGate, assertProductionSecret, resolveAuthSecret, DEFAULT_HOST_ALLOWLIST, isAllowedEpHost } from "./auth"; export type { EpAuth, EpAuthConfig, EpSession, EpProviderBundleConfig, ExtractEpProviderConfigOptions, EpPluginOptions, EpProxyRoutes } from "./auth"; export { epGetProduct, epGetCart, epGetProductList, epGetRelatedProducts, epAddCartItem, epApplyCartAdjustment, epUpdateCartItem, epRemoveCartItem, epPlaceOrder, addCustomCartItem, CART_ADJUSTMENT_KINDS, registerEpCustomFunctions, buildEpCtx, withEpSession, getCurrentEpSession } from "./ep-server-functions"; export type { EpGetProductInput, EpGetCartInput, EpGetProductListInput, EpGetRelatedProductsInput, EpAddCartItemInput, EpApplyCartAdjustmentInput, EpUpdateCartItemInput, EpRemoveCartItemInput, EpPlaceOrderInput, EpPlaceOrderAddress, EpPlaceOrderResult, AddCustomCartItemInput, CartAdjustmentKind, BuildEpCtxSessionInput, EpCtx, EpSessionContext, EpServerAuth } from "./ep-server-functions"; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts new file mode 100644 index 0000000000..f630df09a5 --- /dev/null +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts @@ -0,0 +1,118 @@ +import { describe, expect, it, vi } from "vitest"; + +const handlerCalls: Request[] = []; +let nextResponse: Response; + +vi.mock("better-auth/next-js", () => ({ + toNextJsHandler: () => ({ + GET: async (request: Request) => { + handlerCalls.push(request); + return nextResponse; + }, + POST: async (request: Request) => { + handlerCalls.push(request); + return nextResponse; + }, + }), +})); + +import { createEpAuthRoutes } from "../auth-routes"; + +const SESSION_BODY = { + session: { + id: "sess-1", + token: "opaque-session-token", + epAccessToken: "e1978208e412a8cc33be0f2706e72409d00f6758", + epClientId: "public-client-id", + epHost: "https://api.test.elasticpath.com", + epCartId: "63b53d4f-d88a-48b3-b416-8cb1470aad8d", + }, + user: { id: "anon-1" }, +}; + +function jsonResponse(body: unknown, init?: ResponseInit) { + return new Response(JSON.stringify(body), { + status: 200, + headers: { "Content-Type": "application/json" }, + ...init, + }); +} + +const routes = () => createEpAuthRoutes({} as any); + +describe("createEpAuthRoutes", () => { + it("strips the EP access token from /get-session", async () => { + nextResponse = jsonResponse(SESSION_BODY); + + const res = await routes().GET( + new Request("http://localhost:3456/api/ep/get-session") + ); + const body = await res.json(); + + expect(body.session.epAccessToken).toBeUndefined(); + expect(body.session.epClientId).toBeUndefined(); + expect(body.session.epHost).toBeUndefined(); + expect(JSON.stringify(body)).not.toContain(SESSION_BODY.session.epAccessToken); + }); + + it("keeps epCartId and the rest of the session", async () => { + nextResponse = jsonResponse(SESSION_BODY); + + const res = await routes().GET( + new Request("http://localhost:3456/api/ep/get-session") + ); + const body = await res.json(); + + expect(body.session.epCartId).toBe(SESSION_BODY.session.epCartId); + expect(body.session.id).toBe("sess-1"); + expect(body.user).toEqual({ id: "anon-1" }); + }); + + it("leaves non-get-session routes untouched", async () => { + nextResponse = jsonResponse(SESSION_BODY); + + const res = await routes().POST( + new Request("http://localhost:3456/api/ep/ep/anonymous", { + method: "POST", + }) + ); + const body = await res.json(); + + expect(body.session.epAccessToken).toBe(SESSION_BODY.session.epAccessToken); + }); + + it("preserves Set-Cookie headers through redaction", async () => { + nextResponse = jsonResponse(SESSION_BODY, { + headers: { + "Content-Type": "application/json", + "Set-Cookie": "better-auth.session_token=abc; HttpOnly; Path=/", + }, + }); + + const res = await routes().GET( + new Request("http://localhost:3456/api/ep/get-session") + ); + + expect(res.headers.get("Set-Cookie")).toContain("better-auth.session_token"); + }); + + it("passes through a null session without throwing", async () => { + nextResponse = jsonResponse({ session: null, user: null }); + + const res = await routes().GET( + new Request("http://localhost:3456/api/ep/get-session") + ); + + expect(await res.json()).toEqual({ session: null, user: null }); + }); + + it("passes through a non-JSON body untouched", async () => { + nextResponse = new Response("not json", { status: 200 }); + + const res = await routes().GET( + new Request("http://localhost:3456/api/ep/get-session") + ); + + expect(await res.text()).toBe("not json"); + }); +}); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts new file mode 100644 index 0000000000..d79d2a716e --- /dev/null +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts @@ -0,0 +1,77 @@ +/** + * Mounts the EP auth handler, redacting credentials from `/get-session`. + * + * // app/api/ep/[...path]/route.ts + * import { createEpAuthRoutes } from + * "@elasticpath/plasmic-ep-commerce-elastic-path/server"; + * import { epAuth } from "@/lib/ep-auth"; + * + * export const { GET, POST } = createEpAuthRoutes(epAuth); + * + * better-auth's `/get-session` returns the whole session record, and this + * package stores the shopper's EP access token on it. Mounting + * better-auth's `toNextJsHandler` directly therefore hands that token to + * any same-origin script for the cost of one fetch — the same exposure + * the `serverToken` prop used to create, in pull form rather than push. + * + * `epCartId` survives: it is not a credential, and the checkout + * components read it from here. + */ +import { toNextJsHandler } from "better-auth/next-js"; +import type { EpAuth } from "./create-ep-auth-better"; + +const REDACTED_FIELDS = ["epAccessToken", "epClientId", "epHost"]; + +function redactSessionPayload(payload: any): any { + if (!payload || typeof payload !== "object") return payload; + const session = payload.session; + if (!session || typeof session !== "object") return payload; + + const kept: Record = {}; + for (const key of Object.keys(session)) { + if (REDACTED_FIELDS.indexOf(key) === -1) kept[key] = session[key]; + } + return { ...payload, session: kept }; +} + +function isGetSession(request: Request): boolean { + try { + return new URL(request.url).pathname.endsWith("/get-session"); + } catch { + return false; + } +} + +function withRedaction( + handler: (request: Request) => Promise +): (request: Request) => Promise { + return async (request: Request) => { + const response = await handler(request); + if (!isGetSession(request) || !response.ok) return response; + + const cloned = response.clone(); + let payload: any; + try { + payload = await cloned.json(); + } catch { + return response; + } + + return new Response(JSON.stringify(redactSessionPayload(payload)), { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); + }; +} + +export function createEpAuthRoutes(epAuth: EpAuth): { + GET: (request: Request) => Promise; + POST: (request: Request) => Promise; +} { + const handler = toNextJsHandler(epAuth.handler); + return { + GET: withRedaction(handler.GET), + POST: withRedaction(handler.POST), + }; +} diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/index.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/index.ts index 595ee8c974..080c8eb45a 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/index.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/index.ts @@ -20,6 +20,7 @@ export type { CreateEpAuthBetterInput as EpAuthConfig, } from "./ep-plugin/create-ep-auth-better"; export { epAuthMiddleware } from "./ep-plugin/middleware"; +export { createEpAuthRoutes } from "./ep-plugin/auth-routes"; export { createCartRoutes } from "../cart/server-routes"; export type { CartRoutes } from "../cart/server-routes"; export { createEpProxyRoutes } from "./ep-plugin/proxy-routes"; diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/server.ts b/plasmicpkgs/commerce-providers/elastic-path/src/server.ts index 0be893aae4..f91b164681 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/server.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/server.ts @@ -51,14 +51,15 @@ export type { } from "./checkout/session/types"; // Auth — better-auth-backed (PRD #273). Mount the handler via -// `toNextJsHandler` from `better-auth/next-js`, NOT a helper exported -// from this package. +// `createEpAuthRoutes`, not better-auth's `toNextJsHandler` directly: +// the raw handler's /get-session returns the shopper's EP access token. export { createEpAuth, createBetterEpAuth, extractEpProviderConfig, epPlugin, epAuthMiddleware, + createEpAuthRoutes, createCartRoutes, createEpProxyRoutes, enforceOriginGate, From abbe293384b87720cc5e31e6589ba0c054dfd124 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 15:53:43 +0100 Subject: [PATCH 5/8] fix(ep-commerce): withhold the whole session by allowlist, on every auth route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review found the /get-session redaction was too narrow in two ways. Every endpoint on the auth handler returns the session record, not just /get-session — /ep/anonymous, /ep/refresh, /ep/account/login, /ep/account/logout and /ep/cart all did too. /ep/refresh is the sharpest: it rotates the EP token and returns the new value, and /ep/anonymous needs no cookie at all. Redaction now applies to every response and the path check is gone. The denylist also missed epAccountToken, the account-management credential set on the session at login and strictly stronger than the anonymous token. The session is now filtered to an allowlist, so a field added later is withheld by default. The better-auth session id is withheld too: it lives in an HttpOnly cookie so that scripts cannot read it. Drops a copied Content-Length that would overstate the rebuilt body. The example app goes back to registry versions; a README records how to point it at local source for testing unreleased changes, and the package README now documents that `next dev` serializes the session into the page source. --- examples/ep-commerce-app-router/README.md | 45 + examples/ep-commerce-app-router/package.json | 12 +- examples/ep-commerce-app-router/yarn.lock | 1203 ++--------------- .../elastic-path/CHANGELOG.md | 17 +- .../commerce-providers/elastic-path/README.md | 42 +- .../ep-plugin/__tests__/auth-routes.test.ts | 139 +- .../src/auth/ep-plugin/auth-routes.ts | 52 +- 7 files changed, 334 insertions(+), 1176 deletions(-) create mode 100644 examples/ep-commerce-app-router/README.md diff --git a/examples/ep-commerce-app-router/README.md b/examples/ep-commerce-app-router/README.md new file mode 100644 index 0000000000..09f3451079 --- /dev/null +++ b/examples/ep-commerce-app-router/README.md @@ -0,0 +1,45 @@ +# EP Commerce storefront (App Router) + +Reference storefront for `@elasticpath/plasmic-ep-commerce-elastic-path`. It +mirrors a real consumer install: the Plasmic and Elastic Path packages resolve +from the registry, not from this monorepo. + +## Running it + +```bash +cp .env.local.example .env.local # fill in EP_CLIENT_ID, CHECKOUT_SESSION_SECRET, … +yarn install +yarn dev # http://localhost:3456 +``` + +The port matters. `lib/ep-auth.ts` defaults `baseURL` to `http://localhost:3456`, +and the origin gate rejects cart mutations from an origin that isn't trusted. To +serve elsewhere, set `NEXT_PUBLIC_BASE_URL`. + +`plasmic-init.ts` points `host` at the Plasmic instance serving the project, so +that instance has to be reachable — a local `platform/wab` on `:3003` for local +development. + +## Testing an unreleased package change + +Registry versions can only ever exercise what has shipped. To run this app +against working-tree changes to the package, point the dependency at the local +source and rebuild it first: + +```bash +# in plasmicpkgs/commerce-providers/elastic-path +yarn start # tsdx watch — a full `yarn build` takes ~28 minutes +node build-server.mjs # only needed for the /server entry (esbuild, seconds) + +# here +yarn add file:../../plasmicpkgs/commerce-providers/elastic-path +rm -rf .next # Next caches across node_modules changes +``` + +Revert the `package.json` and `yarn.lock` changes before committing — this app +is meant to reflect what a customer installs. + +> Under `next dev`, Next's RSC debug instrumentation serializes server-component +> locals — including the EP session and its access token — into the page source. +> That does not happen in `next build` output. Don't run a dev server on a shared +> host or against production Elastic Path credentials. diff --git a/examples/ep-commerce-app-router/package.json b/examples/ep-commerce-app-router/package.json index 40241811d6..82bb9931a1 100644 --- a/examples/ep-commerce-app-router/package.json +++ b/examples/ep-commerce-app-router/package.json @@ -8,13 +8,13 @@ "start": "next start" }, "dependencies": { - "@elasticpath/plasmic-ep-commerce-elastic-path": "file:../../plasmicpkgs/commerce-providers/elastic-path", - "@elasticpath/plasmic-mcp-registry": "file:../../packages/plasmic-mcp-registry", + "@elasticpath/plasmic-ep-commerce-elastic-path": "*", + "@elasticpath/plasmic-mcp-registry": "*", "@epcc-sdk/sdks-shopper": "^0.1.0", - "@plasmicapp/loader-nextjs": "file:../../packages/loader-nextjs", - "@plasmicapp/nextjs-app-router": "file:../../packages/nextjs-app-router", - "@plasmicapp/host": "file:../../packages/host", - "@plasmicpkgs/commerce": "file:../../plasmicpkgs/commerce-providers/commerce", + "@plasmicapp/loader-nextjs": "*", + "@plasmicapp/nextjs-app-router": "*", + "@plasmicapp/host": "*", + "@plasmicpkgs/commerce": "*", "next": "^15.5.9", "react": "^19", "react-dom": "^19" diff --git a/examples/ep-commerce-app-router/yarn.lock b/examples/ep-commerce-app-router/yarn.lock index 7d0d6693da..bc5f1db886 100644 --- a/examples/ep-commerce-app-router/yarn.lock +++ b/examples/ep-commerce-app-router/yarn.lock @@ -2,119 +2,27 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@^1.17.7": - version "1.19.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz#bbed371e56aeea4a31a3af239f16733e1b8aedca" - integrity sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.19.9" - "@algolia/autocomplete-shared" "1.19.9" - -"@algolia/autocomplete-plugin-algolia-insights@1.19.9": - version "1.19.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz#f799737d13bf0c4ec8421619c7107fa05c836535" - integrity sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w== - dependencies: - "@algolia/autocomplete-shared" "1.19.9" - -"@algolia/autocomplete-shared@1.19.9": - version "1.19.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz#c5b05e23c71027e4e45a301f286593dffdcdfbdf" - integrity sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A== - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@better-auth/core@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/core/-/core-1.6.27.tgz#663709cbf090c741c3616dc8ef4d101c6e499bdd" - integrity sha512-A6/mQW4AT2kSHCRZDh9+k8jPUqnCUUCymzBgIroK0l60wLioMtJdcmZiTwrAn6KVUw+4XWw64MgaRn7LOie3wg== - dependencies: - "@opentelemetry/semantic-conventions" "^1.39.0" - "@standard-schema/spec" "^1.1.0" - zod "^4.3.6" - -"@better-auth/drizzle-adapter@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/drizzle-adapter/-/drizzle-adapter-1.6.27.tgz#27c532e63b75802647d1d515aeb16c1c62541d6e" - integrity sha512-BDJ02ra/fji/ah3aIpxjjNOu/JQVex0UisxS4S0vGZZyiAs+DL24mn3/iovyD5dWB3u3NaGg1n8zpTOntiIXcg== - -"@better-auth/kysely-adapter@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/kysely-adapter/-/kysely-adapter-1.6.27.tgz#603b5f79982cda0f1e366300789e322a2732478b" - integrity sha512-aavv7W4+b3QVObYo166baplWvwocCk8ORDxRqQ9ytzVl/waiUpSXAOtDHdXZHFsoVHFVPtEzyEq0Tqr3Qvvfig== - -"@better-auth/memory-adapter@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/memory-adapter/-/memory-adapter-1.6.27.tgz#9440db35cdbc4d149bdc7ae4c4adb3399c536c2f" - integrity sha512-p4NB37MdaVFkxkpLEAKjORgTPhaOAPu1M2zgQXiTJJ3F6Uq3Y1YcCgoz+VxJu0TQfxibCsJD/dZlJMVgf+CF7A== - -"@better-auth/mongo-adapter@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/mongo-adapter/-/mongo-adapter-1.6.27.tgz#15c3b3cad66ce804de4138a1eee5e2bd5a96d9e8" - integrity sha512-IOYbJMIjEC//f+JpFlmIQjh6x1R/rGAfdzlojFk6HeAJqbsELuMcI+27dIoesbfHLF/icTrSpZtK986XhJrCfA== - -"@better-auth/prisma-adapter@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/prisma-adapter/-/prisma-adapter-1.6.27.tgz#35662028582c154e600b1e286cb1ddbabeaff34b" - integrity sha512-v7DXVyaFbkrfLoiFDtcVF7BkEZgFa/DgEGE7XjrAXmMACa5pjDvb7lm8W5X+/qgIbQP04eThhgFQ6EWOsjr8OQ== - -"@better-auth/telemetry@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@better-auth/telemetry/-/telemetry-1.6.27.tgz#cbdd54df91b937078a250d76a7579216860389ed" - integrity sha512-aYrSiVWQfua8w5YX8X1cM6ca48EdS0t5k+CvYXIsruaNIpR1DXMe1DOD0M5FWAVABnlCf9joyHXbFRSIZSNY/A== - -"@better-auth/utils@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.4.2.tgz#265a37e2ceef035e6968a851b13400d1b044e070" - integrity sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A== - dependencies: - "@noble/hashes" "^2.0.1" - -"@better-auth/utils@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@better-auth/utils/-/utils-0.5.0.tgz#753b2c3421c7745023dea964c5bafb00297cba96" - integrity sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA== - dependencies: - "@noble/hashes" "^2.0.1" - -"@better-fetch/fetch@1.3.1", "@better-fetch/fetch@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@better-fetch/fetch/-/fetch-1.3.1.tgz#04a0d289de818a0b436bfda48e70b2b19227cc19" - integrity sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g== - -"@elasticpath/catalog-search-instantsearch-adapter@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@elasticpath/catalog-search-instantsearch-adapter/-/catalog-search-instantsearch-adapter-0.1.0.tgz#185b740c2feef75caf34d4813d7bc9b2dbbb8875" - integrity sha512-ZXqahz0Mb8J+zE8uj2KrrpNuUAhFW+qfJ1jcrWnmwx6r2CyqWfShjR5MusUolqjI7LVgOWvIeqYTSX+LDTBCkQ== - dependencies: - vitest "^3.2.4" - -"@elasticpath/plasmic-ep-commerce-elastic-path@file:../../plasmicpkgs/commerce-providers/elastic-path": - version "0.2.0" - dependencies: - "@algolia/autocomplete-core" "^1.17.7" - "@elasticpath/catalog-search-instantsearch-adapter" "0.1.0" - "@epcc-sdk/sdks-shopper" "^0.1.0" +"@elasticpath/plasmic-ep-commerce-elastic-path@*": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@elasticpath/plasmic-ep-commerce-elastic-path/-/plasmic-ep-commerce-elastic-path-0.0.3.tgz#005a9253fbbb40da4089d6c6a70f2717e7127c2d" + integrity sha512-xRWXxHCdmqfZAJbl83EIOOiPMP7WwlCcORqjLL2K7xhbX+TKC3+5hAfyjTtCmrsmKXtUOibxZAAJmn25PQbcIQ== + dependencies: + "@epcc-sdk/sdks-shopper" "^0.0.40" "@hookform/resolvers" "^3.3.2" "@plasmicpkgs/commerce" "0.0.232" "@stripe/react-stripe-js" "^2.4.0" "@stripe/stripe-js" "^2.4.0" "@types/react" "^18.0.27" - better-auth "^1.6.9" debounce "^2.0.0" - instantsearch.js "^4.75.6" js-cookie "^3.0.5" qs "^6.11.0" - react-instantsearch "^7.13.6" - react-instantsearch-nextjs "^0.3.17" - stripe "^14.0.0" + react-hook-form "^7.48.2" zod "^3.22.4" -"@elasticpath/plasmic-mcp-registry@file:../../packages/plasmic-mcp-registry": +"@elasticpath/plasmic-mcp-registry@*": version "0.2.1" + resolved "https://registry.yarnpkg.com/@elasticpath/plasmic-mcp-registry/-/plasmic-mcp-registry-0.2.1.tgz#37c0b32f49fb29ab896cf5a0f52eb98540f9ea6f" + integrity sha512-9ay2wvUxPIUemVMstvesNqMxii3519YzaE6SEeGFUCYGfo4xm5yxENPxVvUuGS5UqYXIxdadEOhjp/uacWQe7A== "@emnapi/runtime@^1.7.0": version "1.10.0" @@ -123,142 +31,19 @@ dependencies: tslib "^2.4.0" -"@epcc-sdk/sdks-shopper@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.1.0.tgz#df2dc6f3877913b44e994756c0cbaf87f17b3b96" - integrity sha512-H3nUiVO1keCoKEVKfdC8OcUzrwkxu9iAoI8+P11NwWmMGePklJPIQpdvwB2aB8I7h275TGNlsjFhWv5CW8zx4Q== +"@epcc-sdk/sdks-shopper@^0.0.40": + version "0.0.40" + resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.0.40.tgz#15b18bc558677a1fc845c4ac47be89c2bbb957ee" + integrity sha512-N7a9O0E5s5lPx++SYTJ/hKWIqZ5cwF+WObPwycEsTk4RErT2QzLviy3vaCByMafS3Oj4rlsrcrBq6eQIDkv5rg== dependencies: "@hey-api/client-fetch" "0.6.0" -"@esbuild/aix-ppc64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz#bf6e10303bcf2e7c686975fa52f937ec2728d8bc" - integrity sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ== - -"@esbuild/android-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz#0c6246bc8d2c4d172aac2db3fb1190d72bd65504" - integrity sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A== - -"@esbuild/android-arm@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz#2d84ece6a4e2684d92be26ee13d42757d831c381" - integrity sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg== - -"@esbuild/android-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz#fc38d4d6358d8dc1cf53f09f7589fe436eb64801" - integrity sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q== - -"@esbuild/darwin-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz#f83afeeac1d7dac01c7a2fd012b3e451a0591fcc" - integrity sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw== - -"@esbuild/darwin-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz#510147c055a795588dbbe14fd6b1b8ad0a2f30de" - integrity sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw== - -"@esbuild/freebsd-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz#093b9200ecf0b115ba4e5e248a7485c9c5f8bd5e" - integrity sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw== - -"@esbuild/freebsd-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz#0be22b6df925d213e841ea87123af5df80b0faf7" - integrity sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg== - -"@esbuild/linux-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz#1bdbc651cda9ba9995c53ed9c71ceaa65094762d" - integrity sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug== - -"@esbuild/linux-arm@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz#beb12ad72b84f72d28488cc1b8ee9f7eb141d753" - integrity sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w== - -"@esbuild/linux-ia32@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz#b81f9d55529b45c206a46a138214b1aa6879696b" - integrity sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ== - -"@esbuild/linux-loong64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz#598667241a04c99b76ed6ef940ac50038c419f98" - integrity sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ== - -"@esbuild/linux-mips64el@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz#1c51eb9cea903f53d97b5af3b1841db70f5596ca" - integrity sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA== - -"@esbuild/linux-ppc64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz#63dd61f17ceb31a81227f413feac8a71bc2c51f2" - integrity sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ== - -"@esbuild/linux-riscv64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz#3763b08fde5cf25ab1facb8e7752edfe45fbfc27" - integrity sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA== - -"@esbuild/linux-s390x@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz#1a137ff293a82906eb3176385bd7e8e0e5cfb7cb" - integrity sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg== - -"@esbuild/linux-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz#268b36211c146ca54f8fe12c578a8d6ef8979485" - integrity sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ== - -"@esbuild/netbsd-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz#22571ad951d62bb6accc82d8d1fad5c8c1ac0ba1" - integrity sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw== - -"@esbuild/netbsd-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz#42fcc57297eb0a0ca3f5fc475291f4c1a3f7c0de" - integrity sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw== - -"@esbuild/openbsd-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz#9eb32af104ac3dacf4edca01f596664aab0c73ef" - integrity sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ== - -"@esbuild/openbsd-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz#febed2402d6088225e91f20fb4ce2522ad0a4efd" - integrity sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw== - -"@esbuild/openharmony-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz#85641c3d466428bfbccea5f21c26836663fef5ce" - integrity sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q== - -"@esbuild/sunos-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz#a736f9d8962481045fc4c3e54f5479f22c870fb4" - integrity sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g== - -"@esbuild/win32-arm64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz#ee5ab40fad186201b652a33f8a5eb149e9e42532" - integrity sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ== - -"@esbuild/win32-ia32@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz#c40d28a6d99a127da6711f2afd74b11cb63b06a7" - integrity sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA== - -"@esbuild/win32-x64@0.28.2": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz#b21affb804cc167c133d95f45b3a1dc1323b9a87" - integrity sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g== +"@epcc-sdk/sdks-shopper@^0.0.42": + version "0.0.42" + resolved "https://registry.yarnpkg.com/@epcc-sdk/sdks-shopper/-/sdks-shopper-0.0.42.tgz#f5c9b5a7e0b9230a11e600d115bbe8ed1de2405d" + integrity sha512-Z6c7kZkDYSutL0jj3nI5HJlUDOZUhNBzn5zXFA+QYvjzOxYr5p01yBpyvN+GOkdotLJiDdCQHqk87qu3jhgxDg== + dependencies: + "@hey-api/client-fetch" "0.6.0" "@hey-api/client-fetch@0.6.0": version "0.6.0" @@ -417,16 +202,6 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8" integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw== -"@jridgewell/sourcemap-codec@^1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@napi-rs/lzma-linux-x64-gnu@1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz#e57d4306966078662038094fb38eb9146dc3aea9" - integrity sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ== - "@next/env@15.5.15": version "15.5.15" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.5.15.tgz#24b29b94852da52dd8e10f3ea0382a3ddb8733a6" @@ -472,136 +247,128 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.15.tgz#d2ad3b9506c761ed07297acaeb00fb2c694c41f8" integrity sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA== -"@noble/ciphers@^2.1.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-2.3.0.tgz#3bcea439b4c90f1cd32c8f7d647d1aebedc4d4d9" - integrity sha512-Clu/xdfgVTf9o7ngLOURaxePwR0j8sjclKEtVij10/jGulwFsPWCvvRgG/XjUVf8Nei+jLG6uwyXzUTGY1DQrw== +"@plasmicapp/data-sources-context@0.1.23": + version "0.1.23" + resolved "https://registry.yarnpkg.com/@plasmicapp/data-sources-context/-/data-sources-context-0.1.23.tgz#7888d6ba33ba0c02509203368f230fdd431a14dc" + integrity sha512-F006Wr7s/RD4uCORY9EXYDYKgNUDxhY9qpUgT7a0Nyp9s6rw5qEZbcuMrM8Miy90DK3H5AfSuWaOl1+/pjxKZA== -"@noble/hashes@^2.0.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-2.3.0.tgz#505fd39c3134a37e67c8c4e6c6049a496154879c" - integrity sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ== - -"@opentelemetry/semantic-conventions@^1.39.0": - version "1.43.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz#f3f467e36c27332f0e735ec86cdcd78dd6f27865" - integrity sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg== - -"@plasmicapp/data-sources-context@0.1.25": - version "0.1.25" - resolved "https://registry.yarnpkg.com/@plasmicapp/data-sources-context/-/data-sources-context-0.1.25.tgz#c8b74048a81ba6b400d34226b11091c04132b1cc" - integrity sha512-wCU+uxslvoPns/gWdUd615v1yBS9rVjyWmcc0qEhiEKCk8qHh0adc0e4hxbf34A4la0EaKj93B0iXw69m7GH+A== - -"@plasmicapp/host@2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@plasmicapp/host/-/host-2.0.15.tgz#4c8cc970695b8b174c8a2413fde125154e092261" - integrity sha512-nTzXEg6wJQpYwOiZwrBkx+OHNktkcbzvRTte1WosBMU8pwO59jWehZqxUlPMArEQIjX/HPAbLNVm8FeMd4MQWQ== +"@plasmicapp/host@*", "@plasmicapp/host@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@plasmicapp/host/-/host-2.0.1.tgz#92d8d1c9c7ae1f246cb33a10e90f80e2c05557e6" + integrity sha512-ghYXBzHihKemrq7RDmwGoUQrBMMba+biMfOLZFeXCm+S9cIXNM93KCk5rEst/pkwSt4Z9KOEqGAV1tTJqg7JHQ== dependencies: - "@plasmicapp/query" "0.1.87" + "@plasmicapp/query" "0.1.84" csstype "^3.1.2" window-or-global "^1.0.1" -"@plasmicapp/host@file:../../packages/host": - version "2.0.15" +"@plasmicapp/isomorphic-unfetch@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@plasmicapp/isomorphic-unfetch/-/isomorphic-unfetch-1.0.3.tgz#baa334f5190d49461c26b1aa3fda073f5cfa7e33" + integrity sha512-cJtPOCf2/FWlFB42Q/n0MK/C47NSZr+YQJbCvQwvyjOrOgOQ4gJ/+gkr4avpMa7UPMa8qLovDAuaR+5k+hMlZQ== dependencies: - "@plasmicapp/query" "0.1.87" - csstype "^3.1.2" - window-or-global "^1.0.1" + unfetch "^4.2.0" -"@plasmicapp/loader-core@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-core/-/loader-core-2.0.4.tgz#f88b5e54c78353dfe7b7c487c3500c6a36f29afd" - integrity sha512-tpwxUxolJDCwoKDxn4yUcVHcf7Ct1KggamFosQetjG79JaQXnRmGG34sQJt8txZqARqaY8Zdp0v+negh9qTYUg== +"@plasmicapp/loader-core@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-core/-/loader-core-2.0.0.tgz#6b5acd3ad6e4d7e6755ecffa007263b7765f6b8e" + integrity sha512-D32IfOr2P8UcwU5LHXzgED+ST9C0SjRQaEunsGNo5GcOJ7SpITdheKnHXoO8rhq7elzPU3nBBN0AbwYWZg/xcg== dependencies: - "@plasmicapp/loader-fetcher" "2.0.4" + "@plasmicapp/isomorphic-unfetch" "1.0.3" + "@plasmicapp/loader-fetcher" "2.0.0" -"@plasmicapp/loader-edge@1.0.81": - version "1.0.81" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-edge/-/loader-edge-1.0.81.tgz#7ee092477e9cb81aa887823284f84b669945ac4c" - integrity sha512-sFOjQUunIgCutFOe47W6t+MVi5r9QsEnGG4/B6lasn4pfotpwBRoCLgIMy3nnty4VwzMvSym6JOzRNenHC4OPQ== +"@plasmicapp/loader-edge@1.0.76": + version "1.0.76" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-edge/-/loader-edge-1.0.76.tgz#db94977502f1327daf8477bfcbf5f6971b82dcbe" + integrity sha512-wgEfDILDn0OnvR0U0T8th8/G8iE8KMnB19xtt5I2zHx2Vp4UsCSGnpDVOQGPJm4GViaui1x5Tjd57hQuPfge/Q== dependencies: - "@plasmicapp/loader-splits" "1.0.75" + "@plasmicapp/loader-splits" "1.0.70" -"@plasmicapp/loader-fetcher@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-fetcher/-/loader-fetcher-2.0.4.tgz#5127ed7da2def7d5008e1e166867c5a889af85ad" - integrity sha512-idfTtTuRirDVomG8oe1YXpR92Rng48x3aeAzAGBps3va820PXuxkuobfEX0b7XgkwmL0N7J4lRsyoUnqWXJ+nQ== - -"@plasmicapp/loader-nextjs@file:../../packages/loader-nextjs": - version "2.0.21" +"@plasmicapp/loader-fetcher@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-fetcher/-/loader-fetcher-2.0.0.tgz#379caefea6059f6070a469085f5f926d7ca0e83f" + integrity sha512-Rbx5RNPRokfy6MSXF0rE7V3BJnw6pwVUCHg3wPSuI4fysHXEC7/WnikF9E+wxLWWOFSmkR8WN6/pFGxcLFbd2A== dependencies: - "@plasmicapp/loader-core" "2.0.4" - "@plasmicapp/loader-edge" "1.0.81" - "@plasmicapp/loader-react" "2.0.18" - "@plasmicapp/watcher" "1.0.86" + "@plasmicapp/isomorphic-unfetch" "1.0.3" + +"@plasmicapp/loader-nextjs@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-nextjs/-/loader-nextjs-2.0.2.tgz#462d459624cc19fddc7824a57b8f1d28c1b7e598" + integrity sha512-IPM80x7cfzhOi8IVubV8oyCzqMjafCJ63Jq5Bt8m5XVApTcxXIuI0fS/5fKgOElXbrE9qorN1wznPW87+vQrPg== + dependencies: + "@plasmicapp/loader-core" "2.0.0" + "@plasmicapp/loader-edge" "1.0.76" + "@plasmicapp/loader-react" "2.0.2" + "@plasmicapp/nextjs-app-router" "1.0.22" + "@plasmicapp/watcher" "1.0.84" server-only "0.0.1" -"@plasmicapp/loader-react@2.0.18": - version "2.0.18" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-react/-/loader-react-2.0.18.tgz#b900a94165d00d6a259c44e85acc21243ec9f832" - integrity sha512-zVAIUgustPjWEduwpyLY8Jv+O1paxtWm4sah9N7mMzABpHwflaGQ2cNa+Poiv6F68m+sVJXs5tGivj8xNwwnXA== - dependencies: - "@plasmicapp/data-sources-context" "0.1.25" - "@plasmicapp/host" "2.0.15" - "@plasmicapp/loader-core" "2.0.4" - "@plasmicapp/loader-fetcher" "2.0.4" - "@plasmicapp/loader-splits" "1.0.75" - "@plasmicapp/prepass" "1.0.27" - "@plasmicapp/query" "0.1.87" +"@plasmicapp/loader-react@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-react/-/loader-react-2.0.2.tgz#d8fe1482a4bb787c4c38298b08f8495adc78d7a5" + integrity sha512-pQqzYRnBUT6rxzwlppOiApBhu2mdFRLbHsVRA8VN0rnoL1dGeWQQX0pV37RTnZFkA/BzKQYAsddawWxJH5wUyA== + dependencies: + "@plasmicapp/data-sources-context" "0.1.23" + "@plasmicapp/host" "2.0.1" + "@plasmicapp/loader-core" "2.0.0" + "@plasmicapp/loader-fetcher" "2.0.0" + "@plasmicapp/loader-splits" "1.0.70" + "@plasmicapp/prepass" "1.0.24" + "@plasmicapp/query" "0.1.84" pascalcase "^1.0.0" server-only "0.0.1" -"@plasmicapp/loader-splits@1.0.75": - version "1.0.75" - resolved "https://registry.yarnpkg.com/@plasmicapp/loader-splits/-/loader-splits-1.0.75.tgz#8fbe6778d5caccb39f7ae1544246a863b0a146b4" - integrity sha512-MLG2CjR3/XGlnTWvxBz0QjAnvL4RZOKKWbreoxVRpTBChO3Uh1BORNis+NqITiS05U3OQlT7UUEv6cgi9lHVHg== +"@plasmicapp/loader-splits@1.0.70": + version "1.0.70" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-splits/-/loader-splits-1.0.70.tgz#7dd89bd2877f731430f286af579153af0f4003cd" + integrity sha512-iS2IIrWmmCgh0qhyaHliTj6D0q4vQebsWEiATLblGaIF4cUyOZO8KAeBG/MWiT8HNyvCE/nimFbwaI7yd2ZfBA== dependencies: json-logic-js "^2.0.2" -"@plasmicapp/nextjs-app-router@file:../../packages/nextjs-app-router": - version "1.0.29" +"@plasmicapp/nextjs-app-router@*", "@plasmicapp/nextjs-app-router@1.0.22": + version "1.0.22" + resolved "https://registry.yarnpkg.com/@plasmicapp/nextjs-app-router/-/nextjs-app-router-1.0.22.tgz#fb0c9f279ed1669d037159b77ff149347f87c8af" + integrity sha512-PwxE4c6e0jbARKwkPvyksUBSzHmUnk5ZnCq+QZgPujVOYOWnmqpYj0GBrX2dl7jNp9RwQebOwHLWNcEbH9ixPw== dependencies: - "@plasmicapp/prepass" "1.0.27" - "@plasmicapp/query" "0.1.87" + "@plasmicapp/prepass" "1.0.24" + "@plasmicapp/query" "0.1.84" cross-port-killer "1.4.0" cross-spawn "^7.0.3" get-port "^7.0.0" node-html-parser "^6.1.5" yargs "^17.7.2" -"@plasmicapp/prepass@1.0.27": - version "1.0.27" - resolved "https://registry.yarnpkg.com/@plasmicapp/prepass/-/prepass-1.0.27.tgz#b890771ca10a11f645af962b581780d4e21b35c8" - integrity sha512-5XyT78LjJR+u0jXo2dMsWsTIKFDlp8m1pllHNv9i5Z4iR26MdKVuY7XOPfszwZBWz9wgQsLRjR07huo+BuHSQg== +"@plasmicapp/prepass@1.0.24": + version "1.0.24" + resolved "https://registry.yarnpkg.com/@plasmicapp/prepass/-/prepass-1.0.24.tgz#ba1f720b0aada99711b49553980714018a20b856" + integrity sha512-v9meFetG2cF1KNBlHXQ0mqJMQp73n4wiZ1C+4Hwg/sjCr34g5h/h4AF1MHKCeBZi5LiNSy6MMmgi7pp6GdA7kg== dependencies: - "@plasmicapp/query" "0.1.87" + "@plasmicapp/query" "0.1.84" "@plasmicapp/react-ssr-prepass" "^2.0.9" -"@plasmicapp/query@0.1.87": - version "0.1.87" - resolved "https://registry.yarnpkg.com/@plasmicapp/query/-/query-0.1.87.tgz#5179bd931d6ee54d7bbe7f47d845e0f81ab936ea" - integrity sha512-4M4QvE9IE8DtVv/LuEruGkMLo3bPhTZIwrYpQpcaXj6FQCL2G5XdhjhcH6JzSW2LxqjhyC+2xDLlZKUAzYqpvw== +"@plasmicapp/query@0.1.84": + version "0.1.84" + resolved "https://registry.yarnpkg.com/@plasmicapp/query/-/query-0.1.84.tgz#d7ad0a411243ea972d1e88049e8f47faf9f6763b" + integrity sha512-mOgXmccl82cSSX4DMOGisCUYb9+pPSPsQqUJ0OfTkrTz+bsNbluTjIGIFwGtvQZiBXMP2c7/MGrxtqXtt/qzLw== dependencies: - swr "^1.3.0" + swr "^1.0.0" "@plasmicapp/react-ssr-prepass@^2.0.9": version "2.0.9" resolved "https://registry.yarnpkg.com/@plasmicapp/react-ssr-prepass/-/react-ssr-prepass-2.0.9.tgz#1cfdd8d4c0e90fd4fed7d7204f70c44914871d31" integrity sha512-HO932uH/Y4otaDmjwzJbCLlokxNAdtU9VhDVUZUuVbzh0DhWaNyn/MINCu1oeZ4a6MIjdXFIm/U2VaxNxHYdsw== -"@plasmicapp/watcher@1.0.86": - version "1.0.86" - resolved "https://registry.yarnpkg.com/@plasmicapp/watcher/-/watcher-1.0.86.tgz#d183d329aad85bbd663aa3bda96cf656dcea3d86" - integrity sha512-PDlJ2k1ecx9CvAj9WyBGCxcifo7l5VtrVSKXe3rl9hvhrYzmbsZNBjzBywzsTlRCEX0P8js9qQlO5WNknwg/Kw== +"@plasmicapp/watcher@1.0.84": + version "1.0.84" + resolved "https://registry.yarnpkg.com/@plasmicapp/watcher/-/watcher-1.0.84.tgz#8275b3b10cdee8e049784b218a4c36e64ea4d5db" + integrity sha512-bPkCkp2q6kEqAAxh/sk/pL2iX40v46lK1QZKzgb9BQZL7idafz+nmYj8bobz0BaRQdFHb8f72Uie+CnwOB1rNw== dependencies: socket.io-client "^4.1.2" -"@plasmicpkgs/commerce@0.0.232": - version "0.0.232" - resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.232.tgz#1f32f70cc00eab79a076fd3c477d79c19ad0fd18" - integrity sha512-uUY+4PngY/cBQ7qldXwQbd/f/n9jo94TkbCWubMxDAMtv0sJolZoQXrIGVXKZuhuJTtI7ChJMqDnpsG4LJehig== +"@plasmicpkgs/commerce@*": + version "0.0.242" + resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.242.tgz#8f84f4c4447510d4623b811fe83e82bb8a8e3c04" + integrity sha512-1zY/ZEMkUktoddyrQkBPE+oNSgJ271yjuVd38gqlJsYCteN/a6iKo6leMm9iu67iKjTzmBPneFEnyBCZ4Va13w== dependencies: - "@types/react" "^18.0.27" "@vercel/fetch" "^6.2.0" debounce "^1.2.1" js-cookie "^3.0.1" @@ -609,9 +376,12 @@ react-hook-form "^7.28.0" swr "^1.2.2" -"@plasmicpkgs/commerce@file:../../plasmicpkgs/commerce-providers/commerce": - version "0.0.256" +"@plasmicpkgs/commerce@0.0.232": + version "0.0.232" + resolved "https://registry.yarnpkg.com/@plasmicpkgs/commerce/-/commerce-0.0.232.tgz#1f32f70cc00eab79a076fd3c477d79c19ad0fd18" + integrity sha512-uUY+4PngY/cBQ7qldXwQbd/f/n9jo94TkbCWubMxDAMtv0sJolZoQXrIGVXKZuhuJTtI7ChJMqDnpsG4LJehig== dependencies: + "@types/react" "^18.0.27" "@vercel/fetch" "^6.2.0" debounce "^1.2.1" js-cookie "^3.0.1" @@ -619,141 +389,11 @@ react-hook-form "^7.28.0" swr "^1.2.2" -"@rollup/rollup-android-arm-eabi@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz#2b86c8fff13a065845ddb65f64d814499ace020f" - integrity sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg== - -"@rollup/rollup-android-arm64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz#af217357ecc06ae5e4f54ef34ee72b1e37f8dbc3" - integrity sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A== - -"@rollup/rollup-darwin-arm64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz#e9d0adba06e39b632fc8e880100ff06547eda80b" - integrity sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw== - -"@rollup/rollup-darwin-x64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz#eff983a29db7d8ea7f733f1ce430fc64e159a5e6" - integrity sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A== - -"@rollup/rollup-freebsd-arm64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz#abe1399a70e819034f492d05dbcc97964310bb57" - integrity sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ== - -"@rollup/rollup-freebsd-x64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz#b2e0f8c24a362ac7112be3d5549c6940597e0168" - integrity sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg== - -"@rollup/rollup-linux-arm-gnueabihf@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz#a5f2a7e7eb719254a6800db18e9f369d3c623439" - integrity sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA== - -"@rollup/rollup-linux-arm-musleabihf@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz#390c86c797695af87c38d6f005222d920b5bfa22" - integrity sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ== - -"@rollup/rollup-linux-arm64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz#1fea78609a15813cda98d93fe8d987c87017f572" - integrity sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ== - -"@rollup/rollup-linux-arm64-musl@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz#3b50031c9916517576098f6e11b38a13147dc463" - integrity sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g== - -"@rollup/rollup-linux-loong64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz#b403255546099a4300b17d976ee1776224c090e5" - integrity sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA== - -"@rollup/rollup-linux-loong64-musl@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz#5900610e59c66ee594539c6590566dbfda7082b1" - integrity sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ== - -"@rollup/rollup-linux-ppc64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz#a892cc8b8414bc8ae0b267816b5e384e5d321ff2" - integrity sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w== - -"@rollup/rollup-linux-ppc64-musl@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz#d9e60d568b7db4df2196fb2411b0c6918b2360cc" - integrity sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w== - -"@rollup/rollup-linux-riscv64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz#5b3141ab43afbd9e50f639e562e94ed256d201cf" - integrity sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ== - -"@rollup/rollup-linux-riscv64-musl@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz#b0fe751015bc3822f9004884eaba5e5cdfde7aa6" - integrity sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA== - -"@rollup/rollup-linux-s390x-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz#0cb323e850509e1b9bf6d241328a98b0e12e2916" - integrity sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA== - -"@rollup/rollup-linux-x64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz#1e7470123e7a8ba8c160a7a043447472d5549542" - integrity sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw== - -"@rollup/rollup-linux-x64-musl@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz#19df9a17d20ff3c17bd8e9cc2553563ae0aa0580" - integrity sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA== - -"@rollup/rollup-openbsd-x64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz#31c3ca1bd00e80f309a1d0cb8da4bdf59cb2dfa3" - integrity sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ== - -"@rollup/rollup-openharmony-arm64@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz#84561a14381caecb7652e158d10551a5edc0a6fc" - integrity sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ== - -"@rollup/rollup-win32-arm64-msvc@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz#bc532edb20cd39c0b53eee2dfae43b52c2e3be1e" - integrity sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw== - -"@rollup/rollup-win32-ia32-msvc@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz#a6f51492976c9fc19801be298df2f76a3cbebf7a" - integrity sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ== - -"@rollup/rollup-win32-x64-gnu@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz#ae60710b0868b2fe731d9f7c341fa49cbf8e8629" - integrity sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw== - -"@rollup/rollup-win32-x64-msvc@4.62.4": - version "4.62.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz#c3a265fe0f9af4fb63bad86d3829386bc5da0026" - integrity sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q== - "@socket.io/component-emitter@~3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== -"@standard-schema/spec@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" - integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== - "@stripe/react-stripe-js@^2.4.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-2.9.0.tgz#1f1a9a3d5eab8ca144e060df1e9fd855a7658aca" @@ -773,13 +413,6 @@ dependencies: tslib "^2.8.0" -"@swc/helpers@0.5.18": - version "0.5.18" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.18.tgz#feeeabea0d10106ee25aaf900165df911ab6d3b1" - integrity sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ== - dependencies: - tslib "^2.8.0" - "@types/async-retry@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.2.1.tgz#fa9ac165907a8ee78f4924f4e393b656c65b5bb4" @@ -792,39 +425,6 @@ dependencies: "@types/retry" "*" -"@types/chai@^5.2.2": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" - integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== - dependencies: - "@types/deep-eql" "*" - assertion-error "^2.0.1" - -"@types/deep-eql@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" - integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== - -"@types/dom-speech-recognition@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz#e326761a04b4a49c0eec2ac7948afc1c6aa12baa" - integrity sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw== - -"@types/estree@1.0.9", "@types/estree@^1.0.0": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" - integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== - -"@types/google.maps@^3.55.12": - version "3.65.5" - resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.65.5.tgz#4d5bfd538b98378e7e551c8b30969d624e6b45c6" - integrity sha512-oR9Hq/WaKGzIguZEwoCuyQ0ofDhCbefmS9RrjLUZ5scMziwTE6xA90drJYt2ZsyUCYmCqnxQcDpfGqeRE/Zgog== - -"@types/hogan.js@^3.0.0": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/hogan.js/-/hogan.js-3.0.5.tgz#09f5b916ad88e1975b093ab7a25a37ffc0418be5" - integrity sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA== - "@types/lru-cache@4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-4.1.1.tgz#b2d87a5e3df8d4b18ca426c5105cd701c2306d40" @@ -855,23 +455,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.5.tgz#6a31f820c1077c3f8ce44f9e203e68a176e8f59e" integrity sha512-Bq7G3AErwe5A/Zki5fdD3O6+0zDChhg671NfPjtIcbtzDNZTv4NPKMRFr7gtYPG7y+B8uTiNK4Ngd9T0FTar6Q== -"@types/node@>=8.1.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-26.2.0.tgz#5a4875a862fda8fdc57de8faa579bb81ecba1685" - integrity sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg== - dependencies: - undici-types "~8.3.0" - "@types/prop-types@*": version "15.7.15" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== -"@types/qs@^6.5.3": - version "6.15.1" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" - integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== - "@types/react-dom@18.2.12": version "18.2.12" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.12.tgz#58479c463d1e0b7f1ee7cd80e09186189f9ec32d" @@ -940,67 +528,6 @@ agentkeepalive "^4.2.1" debug "^4.3.3" -"@vitest/expect@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.7.tgz#70a34158383d008c3bf5d802e2643317f09df6d8" - integrity sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/spy" "3.2.7" - "@vitest/utils" "3.2.7" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/mocker@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.7.tgz#331be944cb783c642dd42bd743411aca24ea0466" - integrity sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA== - dependencies: - "@vitest/spy" "3.2.7" - estree-walker "^3.0.3" - magic-string "^0.30.17" - -"@vitest/pretty-format@3.2.7", "@vitest/pretty-format@^3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.7.tgz#2a7b593f8e007e9d8ef7e7343aa30ec73fdeaf29" - integrity sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.7.tgz#c0c080228189f1fa6cda40f59be09d746b0aca51" - integrity sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA== - dependencies: - "@vitest/utils" "3.2.7" - pathe "^2.0.3" - strip-literal "^3.0.0" - -"@vitest/snapshot@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.7.tgz#a3a7e1950ce99ec4cf02395e20ddca403b6c818e" - integrity sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g== - dependencies: - "@vitest/pretty-format" "3.2.7" - magic-string "^0.30.17" - pathe "^2.0.3" - -"@vitest/spy@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.7.tgz#ca7fbee44019523ca450395d9a2284ce9ece1f31" - integrity sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ== - dependencies: - tinyspy "^4.0.3" - -"@vitest/utils@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.7.tgz#302c8126211ac4dfea87b3b5085c098d6d22e89e" - integrity sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw== - dependencies: - "@vitest/pretty-format" "3.2.7" - loupe "^3.1.4" - tinyrainbow "^2.0.0" - "@zeit/dns-cached-resolve@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@zeit/dns-cached-resolve/-/dns-cached-resolve-2.1.2.tgz#2c2e33d682d67f94341c9a06ac0e2a8f14ff035f" @@ -1012,11 +539,6 @@ async-retry "1.2.3" lru-cache "5.1.1" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - agentkeepalive@^4.2.1: version "4.6.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" @@ -1024,13 +546,6 @@ agentkeepalive@^4.2.1: dependencies: humanize-ms "^1.2.1" -algoliasearch-helper@3.29.3: - version "3.29.3" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz#dc21f119320acbdd5890a21021846b5730d11e03" - integrity sha512-gVOMbbPVrCO3Xs+B+BLAIGFqIQow6qHMTYCEeBqLQB9m4ZmKUqMwkEumlal2iyyezHEd4Y0FvFTLbCRutCutIQ== - dependencies: - "@algolia/events" "^4.0.1" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1043,11 +558,6 @@ ansi-styles@^4.0.0: dependencies: color-convert "^2.0.1" -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - async-retry@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" @@ -1067,49 +577,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -better-auth@^1.6.9: - version "1.6.27" - resolved "https://registry.yarnpkg.com/better-auth/-/better-auth-1.6.27.tgz#ece594ec2971c01dda9741cbaee74879c39ab5c9" - integrity sha512-x3jyxpAiBSsMO/DaXMFSVwM8bTqnYZlCKsZxBV43zL3ZtsGa/CzeUuNKxPT2Lsz7ahTBY90Ku1tibN6nRpVEbw== - dependencies: - "@better-auth/core" "1.6.27" - "@better-auth/drizzle-adapter" "1.6.27" - "@better-auth/kysely-adapter" "1.6.27" - "@better-auth/memory-adapter" "1.6.27" - "@better-auth/mongo-adapter" "1.6.27" - "@better-auth/prisma-adapter" "1.6.27" - "@better-auth/telemetry" "1.6.27" - "@better-auth/utils" "0.4.2" - "@better-fetch/fetch" "1.3.1" - "@noble/ciphers" "^2.1.1" - "@noble/hashes" "^2.0.1" - better-call "1.4.0" - defu "^6.1.4" - jose "^6.1.3" - kysely "^0.28.17 || ^0.29.0" - nanostores "^1.1.1" - zod "^4.3.6" - -better-call@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/better-call/-/better-call-1.4.0.tgz#e581bbbaf65f9ee8ab07bb994e81c3de36a36408" - integrity sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA== - dependencies: - "@better-auth/utils" "^0.5.0" - "@better-fetch/fetch" "^1.3.1" - rou3 "^0.9.1" - set-cookie-parser "^3.1.2" - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -1131,22 +603,6 @@ caniuse-lite@^1.0.30001579: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz#31e97d1bfec332b3f2d7eea7781460c97629b3bf" integrity sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ== -chai@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" - integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -check-error@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" - integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== - client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -1225,23 +681,13 @@ debounce@^2.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-2.2.0.tgz#f895fa2fbdb579a0f0d3dcf5dde19657e50eaad5" integrity sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw== -debug@^4.3.3, debug@^4.4.1, debug@~4.4.1: +debug@^4.3.3, debug@~4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -defu@^6.1.4: - version "6.1.7" - resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23" - integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1327,11 +773,6 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -1349,60 +790,11 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -"esbuild@^0.27.0 || ^0.28.0": - version "0.28.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.2.tgz#0f43bd1bad955b72d24e2261e3abe5957ccf0816" - integrity sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.28.2" - "@esbuild/android-arm" "0.28.2" - "@esbuild/android-arm64" "0.28.2" - "@esbuild/android-x64" "0.28.2" - "@esbuild/darwin-arm64" "0.28.2" - "@esbuild/darwin-x64" "0.28.2" - "@esbuild/freebsd-arm64" "0.28.2" - "@esbuild/freebsd-x64" "0.28.2" - "@esbuild/linux-arm" "0.28.2" - "@esbuild/linux-arm64" "0.28.2" - "@esbuild/linux-ia32" "0.28.2" - "@esbuild/linux-loong64" "0.28.2" - "@esbuild/linux-mips64el" "0.28.2" - "@esbuild/linux-ppc64" "0.28.2" - "@esbuild/linux-riscv64" "0.28.2" - "@esbuild/linux-s390x" "0.28.2" - "@esbuild/linux-x64" "0.28.2" - "@esbuild/netbsd-arm64" "0.28.2" - "@esbuild/netbsd-x64" "0.28.2" - "@esbuild/openbsd-arm64" "0.28.2" - "@esbuild/openbsd-x64" "0.28.2" - "@esbuild/openharmony-arm64" "0.28.2" - "@esbuild/sunos-x64" "0.28.2" - "@esbuild/win32-arm64" "0.28.2" - "@esbuild/win32-ia32" "0.28.2" - "@esbuild/win32-x64" "0.28.2" - escalade@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -expect-type@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.4.0.tgz#24edf7f0cc69a44d008567ba4594ab96f3c3a3d6" - integrity sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA== - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - form-data@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -1414,11 +806,6 @@ form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -1487,19 +874,6 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hogan.js@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" - integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg== - dependencies: - mkdirp "0.3.0" - nopt "1.0.10" - -htm@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" - integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -1507,34 +881,6 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -instantsearch-ui-components@0.35.1: - version "0.35.1" - resolved "https://registry.yarnpkg.com/instantsearch-ui-components/-/instantsearch-ui-components-0.35.1.tgz#4ecfb3b02415d228d4c963fa46ce61d22d6e977e" - integrity sha512-n8sCod1pOeaMMZzzqoK3MNFYqyw3IjWXP97zwXyjPFhbx+B7SEN+pmFmALdOagm2K2qzTcFF08ZlA13Xm8I6rg== - dependencies: - "@swc/helpers" "0.5.18" - markdown-to-jsx "^7.7.15" - -instantsearch.js@4.111.1, instantsearch.js@^4.75.6: - version "4.111.1" - resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-4.111.1.tgz#ec12045872f48eb65788edd24cd668d40cf9808f" - integrity sha512-DMuvb2koPHhe5PTGMGbWI5t+i9OHWLKny5312vygdYvUvVygnsZ6axtMXfz7FDtjAgkBRm675R5sGkGjF9o/sQ== - dependencies: - "@algolia/events" "^4.0.1" - "@swc/helpers" "0.5.18" - "@types/dom-speech-recognition" "^0.0.1" - "@types/google.maps" "^3.55.12" - "@types/hogan.js" "^3.0.0" - "@types/qs" "^6.5.3" - algoliasearch-helper "3.29.3" - hogan.js "^3.0.2" - htm "^3.0.0" - instantsearch-ui-components "0.35.1" - preact "^10.10.0" - qs "^6.5.1" - react ">= 0.14.0" - search-insights "^2.17.2" - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -1545,11 +891,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jose@^6.1.3: - version "6.2.8" - resolved "https://registry.yarnpkg.com/jose/-/jose-6.2.8.tgz#39c1459fe5eac84eb39b1623b8077dcf9ca6c506" - integrity sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ== - js-cookie@^3.0.1, js-cookie@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" @@ -1560,21 +901,11 @@ js-cookie@^3.0.1, js-cookie@^3.0.5: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - json-logic-js@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/json-logic-js/-/json-logic-js-2.0.5.tgz#55f0c687dd6f56b02ccdcfdd64171ed998ab5499" integrity sha512-rTT2+lqcuUmj4DgWfmzupZqQDA64AdmYqizzMPWj3DxGdfFNsxPpcNVSaTj4l8W2tG/+hg7/mQhxjU3aPacO6g== -"kysely@^0.28.17 || ^0.29.0": - version "0.29.5" - resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.29.5.tgz#c07a51700a4b4db53c60bd373e6e098f919fccae" - integrity sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -1587,11 +918,6 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^3.1.0, loupe@^3.1.4: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" - integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== - lru-cache@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -1599,18 +925,6 @@ lru-cache@5.1.1: dependencies: yallist "^3.0.2" -magic-string@^0.30.17: - version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" - integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -markdown-to-jsx@^7.7.15: - version "7.7.17" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.17.tgz#6e997d6aa4dbe2e69c423c65745541846777483c" - integrity sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ== - math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -1628,31 +942,16 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== - ms@^2.0.0, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.17: - version "3.3.18" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" - integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== - nanoid@^3.3.6: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== -nanostores@^1.1.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/nanostores/-/nanostores-1.4.2.tgz#686199c31502e86df450ece2c810411a51b18329" - integrity sha512-Wxv8Roefr2nqtiRG0bnaFlpYqpIVtOEeJZHaH+4nGgOK1/7n6OHOuHCb/bhqrNQgZM8fyd0s1PqhdrJc9Ib44g== - next@^15.5.9: version "15.5.15" resolved "https://registry.yarnpkg.com/next/-/next-15.5.15.tgz#b25a59a232bd992a83da045fa289ee803c23c836" @@ -1682,13 +981,6 @@ node-html-parser@^6.1.5: css-select "^5.1.0" he "1.2.0" -nopt@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -1716,26 +1008,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" - integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== - -picocolors@^1.0.0, picocolors@^1.1.1: +picocolors@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" - integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== - postcss@8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" @@ -1745,20 +1022,6 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.5.6: - version "8.5.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620" - integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== - dependencies: - nanoid "^3.3.17" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -preact@^10.10.0: - version "10.29.8" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.29.8.tgz#fc85b82dc2474e245b1430b51781d417361f5fc3" - integrity sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q== - prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -1775,14 +1038,6 @@ qs@^6.11.0: dependencies: side-channel "^1.1.0" -qs@^6.5.1: - version "6.15.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" - integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== - dependencies: - es-define-property "^1.0.1" - side-channel "^1.1.1" - react-dom@^19: version "19.2.5" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.5.tgz#b8768b10837d0b8e9ca5b9e2d58dff3d880ea25e" @@ -1790,46 +1045,16 @@ react-dom@^19: dependencies: scheduler "^0.27.0" -react-hook-form@^7.28.0: +react-hook-form@^7.28.0, react-hook-form@^7.48.2: version "7.73.1" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.73.1.tgz#ddd1a27cae48f6095529f6e2e0c581daaca5462a" integrity sha512-VAfVYOPcx3piiEVQy95vyFmBwbVUsP/AUIN+mpFG8h11yshDd444nn0VyfaGWSRnhOLVgiDu7HIuBtAIzxn9dA== -react-instantsearch-core@7.44.1: - version "7.44.1" - resolved "https://registry.yarnpkg.com/react-instantsearch-core/-/react-instantsearch-core-7.44.1.tgz#7f5ff6e935dd1a697e4ba266c28a38b9a610c7ae" - integrity sha512-2pb73h7TqNzHDtcLAPcvxUOiG9Wt0hayNCiJJ+yCUs9Vw5S1n2PxdDnEaU/CvkkqT/RLcimnVQDmyf6yfNiMsA== - dependencies: - "@swc/helpers" "0.5.18" - algoliasearch-helper "3.29.3" - instantsearch.js "4.111.1" - use-sync-external-store "^1.0.0" - -react-instantsearch-nextjs@^0.3.17: - version "0.3.21" - resolved "https://registry.yarnpkg.com/react-instantsearch-nextjs/-/react-instantsearch-nextjs-0.3.21.tgz#718f70437a18d27c78440ebea7a4312605e3451a" - integrity sha512-GDhi7jabacahXjqkkwQN0Lq3FaW3pwIMz6ac5GeOqJkqqfEFAluUuNHgkjGOT+MVPnVmpnbQyRgOxUSL8SXYVQ== - -react-instantsearch@^7.13.6: - version "7.44.1" - resolved "https://registry.yarnpkg.com/react-instantsearch/-/react-instantsearch-7.44.1.tgz#aff88aa8ae7403827ab46be2e49f563e00a80385" - integrity sha512-nS5ko45HwzSbSCdL2MLrzui9YkBps+6r1DECjmIPx3BHiOicv0JpFnuxc4azXJKEuDig8p1QXc8JvqexUzpOXA== - dependencies: - "@swc/helpers" "0.5.18" - instantsearch-ui-components "0.35.1" - instantsearch.js "4.111.1" - react-instantsearch-core "7.44.1" - react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react@>= 0.14.0": - version "19.2.8" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d" - integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw== - react@^19: version "19.2.5" resolved "https://registry.yarnpkg.com/react/-/react-19.2.5.tgz#c888ab8b8ef33e2597fae8bdb2d77edbdb42858b" @@ -1850,56 +1075,11 @@ retry@0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -rollup@^4.43.0: - version "4.62.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.62.4.tgz#96d2e62070f0b0ac63424edd0c93a7fb864ef069" - integrity sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg== - dependencies: - "@types/estree" "1.0.9" - optionalDependencies: - "@napi-rs/lzma-linux-x64-gnu" "1.5.1" - "@rollup/rollup-android-arm-eabi" "4.62.4" - "@rollup/rollup-android-arm64" "4.62.4" - "@rollup/rollup-darwin-arm64" "4.62.4" - "@rollup/rollup-darwin-x64" "4.62.4" - "@rollup/rollup-freebsd-arm64" "4.62.4" - "@rollup/rollup-freebsd-x64" "4.62.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.62.4" - "@rollup/rollup-linux-arm-musleabihf" "4.62.4" - "@rollup/rollup-linux-arm64-gnu" "4.62.4" - "@rollup/rollup-linux-arm64-musl" "4.62.4" - "@rollup/rollup-linux-loong64-gnu" "4.62.4" - "@rollup/rollup-linux-loong64-musl" "4.62.4" - "@rollup/rollup-linux-ppc64-gnu" "4.62.4" - "@rollup/rollup-linux-ppc64-musl" "4.62.4" - "@rollup/rollup-linux-riscv64-gnu" "4.62.4" - "@rollup/rollup-linux-riscv64-musl" "4.62.4" - "@rollup/rollup-linux-s390x-gnu" "4.62.4" - "@rollup/rollup-linux-x64-gnu" "4.62.4" - "@rollup/rollup-linux-x64-musl" "4.62.4" - "@rollup/rollup-openbsd-x64" "4.62.4" - "@rollup/rollup-openharmony-arm64" "4.62.4" - "@rollup/rollup-win32-arm64-msvc" "4.62.4" - "@rollup/rollup-win32-ia32-msvc" "4.62.4" - "@rollup/rollup-win32-x64-gnu" "4.62.4" - "@rollup/rollup-win32-x64-msvc" "4.62.4" - fsevents "~2.3.2" - -rou3@^0.9.1: - version "0.9.2" - resolved "https://registry.yarnpkg.com/rou3/-/rou3-0.9.2.tgz#4deea937ad3b9df79bb0b09ffc97c616db56c0e4" - integrity sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ== - scheduler@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== -search-insights@^2.17.2: - version "2.17.3" - resolved "https://registry.yarnpkg.com/search-insights/-/search-insights-2.17.3.tgz#8faea5d20507bf348caba0724e5386862847b661" - integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== - semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" @@ -1910,11 +1090,6 @@ server-only@0.0.1: resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e" integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== -set-cookie-parser@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz#f4e490298759d756a68eabcbcd0fc9261ad0fee0" - integrity sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw== - sharp@^0.34.3: version "0.34.5" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0" @@ -1961,7 +1136,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel-list@^1.0.0, side-channel-list@^1.0.1: +side-channel-list@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== @@ -2001,22 +1176,6 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -side-channel@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" - integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.4" - side-channel-list "^1.0.1" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - socket.io-client@^4.1.2: version "4.8.3" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.3.tgz#62717edd46a318c918125b57e92dc7f8bb71c34c" @@ -2035,21 +1194,11 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.4.1" -source-map-js@^1.0.2, source-map-js@^1.2.1: +source-map-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.9.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" - integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -2066,21 +1215,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-literal@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.1.0.tgz#222b243dd2d49c0bcd0de8906adbd84177196032" - integrity sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg== - dependencies: - js-tokens "^9.0.1" - -stripe@^14.0.0: - version "14.25.0" - resolved "https://registry.yarnpkg.com/stripe/-/stripe-14.25.0.tgz#65924510465924d2688a2b4d7f9cbfd8548cf9b9" - integrity sha512-wQS3GNMofCXwH8TSje8E1SE8zr6ODiGtHQgPtO95p9Mb4FhKC9jvXR2NUTpZ9ZINlckJcFidCmaTFV4P6vsb9g== - dependencies: - "@types/node" ">=8.1.0" - qs "^6.11.0" - styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -2088,44 +1222,11 @@ styled-jsx@5.1.6: dependencies: client-only "0.0.1" -swr@^1.2.2, swr@^1.3.0: +swr@^1.0.0, swr@^1.2.2: version "1.3.0" resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinyglobby@^0.2.14, tinyglobby@^0.2.15: - version "0.2.17" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" - integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.4" - -tinypool@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" - integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" - integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== - tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" @@ -2141,69 +1242,10 @@ undici-types@~7.19.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.19.2.tgz#1b67fc26d0f157a0cba3a58a5b5c1e2276b8ba2a" integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== -undici-types@~8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" - integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== - -use-sync-external-store@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" - integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== - -vite-node@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" - integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== - dependencies: - cac "^6.7.14" - debug "^4.4.1" - es-module-lexer "^1.7.0" - pathe "^2.0.3" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" - -"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": - version "7.3.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.6.tgz#0547a395e68d3746e9a505f1fd4469fe09b49cc4" - integrity sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg== - dependencies: - esbuild "^0.27.0 || ^0.28.0" - fdir "^6.5.0" - picomatch "^4.0.3" - postcss "^8.5.6" - rollup "^4.43.0" - tinyglobby "^0.2.15" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^3.2.4: - version "3.2.7" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.7.tgz#1944b6ed013a25fd26a73d18e1af92c10a57af6c" - integrity sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/expect" "3.2.7" - "@vitest/mocker" "3.2.7" - "@vitest/pretty-format" "^3.2.7" - "@vitest/runner" "3.2.7" - "@vitest/snapshot" "3.2.7" - "@vitest/spy" "3.2.7" - "@vitest/utils" "3.2.7" - chai "^5.2.0" - debug "^4.4.1" - expect-type "^1.2.1" - magic-string "^0.30.17" - pathe "^2.0.3" - picomatch "^4.0.2" - std-env "^3.9.0" - tinybench "^2.9.0" - tinyexec "^0.3.2" - tinyglobby "^0.2.14" - tinypool "^1.1.1" - tinyrainbow "^2.0.0" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" - vite-node "3.2.4" - why-is-node-running "^2.3.0" +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== which@^2.0.1: version "2.0.2" @@ -2212,14 +1254,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - window-or-global@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" @@ -2276,8 +1310,3 @@ zod@^3.22.4: version "3.25.76" resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== - -zod@^4.3.6: - version "4.4.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" - integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== diff --git a/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md index 55fae72446..b96d495c8b 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md +++ b/plasmicpkgs/commerce-providers/elastic-path/CHANGELOG.md @@ -40,11 +40,18 @@ now returns `{}`. export const { GET, POST } = createEpAuthRoutes(epAuth); ``` -better-auth's `/get-session` returns the whole session record, and this package -keeps the shopper's EP access token on it — so the raw handler hands that token -to any same-origin script for the cost of one fetch. `createEpAuthRoutes` strips -`epAccessToken`, `epClientId` and `epHost` from that response. `epCartId` stays: -it is not a credential, and the checkout components read it. +Every endpoint on the auth handler returns the session record, and the session +carries the shopper's EP credentials — the anonymous access token on all of +them, plus the account-management token once a shopper logs in. The raw handler +hands those to any same-origin script for the cost of one fetch; `/ep/refresh` +returns a freshly rotated token and `/ep/anonymous` needs no cookie at all. + +`createEpAuthRoutes` filters the session on every response down to an allowlist: +`id`, `userId`, `expiresAt`, `createdAt`, `updatedAt`, `epCartId`, `epExpires`. +A field added to the session later is withheld by default. `epCartId` is kept +because the checkout components read it and it is not a credential; the +better-auth session id is not, because it lives in an HttpOnly cookie +specifically so scripts cannot read it. `serverToken` and `serverCartMode` remain in the registered prop schema, hidden and ignored. Registered props on a hostless package are append-only; removing diff --git a/plasmicpkgs/commerce-providers/elastic-path/README.md b/plasmicpkgs/commerce-providers/elastic-path/README.md index c12f7c525b..d380d2e7f7 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/README.md +++ b/plasmicpkgs/commerce-providers/elastic-path/README.md @@ -56,21 +56,38 @@ import { epAuth } from "@/lib/ep-auth"; const handlers = createEpAuthRoutes(epAuth); +export const config = { api: { bodyParser: false } }; + export default async function handler(req: NextApiRequest, res: NextApiResponse) { const method = req.method?.toUpperCase() as "GET" | "POST"; const fn = handlers[method]; if (!fn) return res.status(405).end(); - const response = await fn({ - url: `http://localhost${req.url}`, - cookies: req.cookies as Record, - headers: req.headers as Record, - json: () => Promise.resolve(req.body), - }); + // The handlers take a WHATWG Request, so rebuild one from the Node req. + const url = `${process.env.NEXT_PUBLIC_BASE_URL ?? "http://localhost:3000"}${req.url}`; + const body = + method === "GET" + ? undefined + : await new Promise((resolve) => { + let raw = ""; + req.on("data", (chunk) => (raw += chunk)); + req.on("end", () => resolve(raw)); + }); + + const response = await fn( + new Request(url, { + method, + headers: req.headers as Record, + body, + }) + ); - // Forward response headers (Set-Cookie for token refresh) - response.headers.forEach((value, key) => res.setHeader(key, value)); - res.status(response.status).json(await response.json()); + // Set-Cookie must be forwarded as a list — setHeader would collapse it. + res.setHeader("Set-Cookie", response.headers.getSetCookie()); + response.headers.forEach((value, key) => { + if (key.toLowerCase() !== "set-cookie") res.setHeader(key, value); + }); + res.status(response.status).send(await response.text()); } ``` @@ -254,6 +271,13 @@ Browser-side catalog reads go through the Elastic Path SDK client, which mints its own anonymous token from the public `clientId` and holds it in memory — never localStorage, never a cookie. +**`next dev` is an exception.** Next's RSC debug instrumentation serializes a +server component's local variables — including the EP session — into the flight +payload, so the access token is readable in the page source under `next dev`. +It is absent from `next build` output, and nothing this package does can +suppress it. Treat a dev server as carrying a live shopper credential: don't +run one on a shared host or against production Elastic Path credentials. + ### API Routes `createEpAuthRoutes(epAuth)` mounts the auth handler: diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts index f630df09a5..3c4897525e 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/auth-routes.test.ts @@ -1,33 +1,35 @@ import { describe, expect, it, vi } from "vitest"; -const handlerCalls: Request[] = []; let nextResponse: Response; vi.mock("better-auth/next-js", () => ({ toNextJsHandler: () => ({ - GET: async (request: Request) => { - handlerCalls.push(request); - return nextResponse; - }, - POST: async (request: Request) => { - handlerCalls.push(request); - return nextResponse; - }, + GET: async () => nextResponse, + POST: async () => nextResponse, }), })); import { createEpAuthRoutes } from "../auth-routes"; +const ACCESS_TOKEN = "e1978208e412a8cc33be0f2706e72409d00f6758"; +const ACCOUNT_TOKEN = "account-management-token"; +const CART_ID = "63b53d4f-d88a-48b3-b416-8cb1470aad8d"; + const SESSION_BODY = { session: { id: "sess-1", - token: "opaque-session-token", - epAccessToken: "e1978208e412a8cc33be0f2706e72409d00f6758", + userId: "anon-1", + token: "better-auth-session-id", + expiresAt: "2026-08-13T14:00:00.000Z", + epAccessToken: ACCESS_TOKEN, epClientId: "public-client-id", epHost: "https://api.test.elasticpath.com", - epCartId: "63b53d4f-d88a-48b3-b416-8cb1470aad8d", + epAccountToken: ACCOUNT_TOKEN, + epAccountId: "acct-1", + epCartId: CART_ID, + epExpires: 1786630149, }, - user: { id: "anon-1" }, + user: { id: "anon-1", email: "anon-1@anonymous.local" }, }; function jsonResponse(body: unknown, init?: ResponseInit) { @@ -39,69 +41,112 @@ function jsonResponse(body: unknown, init?: ResponseInit) { } const routes = () => createEpAuthRoutes({} as any); +const req = (path: string, method = "GET") => + new Request(`http://localhost:3456${path}`, { method }); + +// Every endpoint on this handler returns the session record, so the +// redaction is handler-wide rather than scoped to /get-session. +const SESSION_RETURNING_ROUTES = [ + ["GET", "/api/ep/get-session"], + ["POST", "/api/ep/ep/anonymous"], + ["POST", "/api/ep/ep/refresh"], + ["POST", "/api/ep/ep/account/login"], + ["POST", "/api/ep/ep/account/logout"], + ["POST", "/api/ep/ep/cart"], +] as const; describe("createEpAuthRoutes", () => { - it("strips the EP access token from /get-session", async () => { - nextResponse = jsonResponse(SESSION_BODY); + it.each(SESSION_RETURNING_ROUTES)( + "withholds EP credentials from %s %s", + async (method, path) => { + nextResponse = jsonResponse(SESSION_BODY); + const handler = method === "GET" ? routes().GET : routes().POST; + + const res = await handler(req(path, method)); + const text = await res.text(); + + expect(text).not.toContain(ACCESS_TOKEN); + expect(text).not.toContain(ACCOUNT_TOKEN); + + const session = JSON.parse(text).session; + expect(session.epAccessToken).toBeUndefined(); + expect(session.epAccountToken).toBeUndefined(); + expect(session.epClientId).toBeUndefined(); + expect(session.epHost).toBeUndefined(); + } + ); + + it("withholds unknown session fields by default", async () => { + nextResponse = jsonResponse({ + session: { id: "sess-1", epSomeFutureCredential: "secret" }, + }); - const res = await routes().GET( - new Request("http://localhost:3456/api/ep/get-session") - ); - const body = await res.json(); + const res = await routes().GET(req("/api/ep/get-session")); - expect(body.session.epAccessToken).toBeUndefined(); - expect(body.session.epClientId).toBeUndefined(); - expect(body.session.epHost).toBeUndefined(); - expect(JSON.stringify(body)).not.toContain(SESSION_BODY.session.epAccessToken); + expect(await res.text()).not.toContain("secret"); }); - it("keeps epCartId and the rest of the session", async () => { + it("keeps the fields the checkout components read", async () => { nextResponse = jsonResponse(SESSION_BODY); - const res = await routes().GET( - new Request("http://localhost:3456/api/ep/get-session") - ); + const res = await routes().GET(req("/api/ep/get-session")); const body = await res.json(); - expect(body.session.epCartId).toBe(SESSION_BODY.session.epCartId); + expect(body.session.epCartId).toBe(CART_ID); expect(body.session.id).toBe("sess-1"); - expect(body.user).toEqual({ id: "anon-1" }); + expect(body.session.epExpires).toBe(1786630149); + expect(body.user).toEqual(SESSION_BODY.user); }); - it("leaves non-get-session routes untouched", async () => { + it("withholds the better-auth session id, which lives in an HttpOnly cookie", async () => { nextResponse = jsonResponse(SESSION_BODY); - const res = await routes().POST( - new Request("http://localhost:3456/api/ep/ep/anonymous", { - method: "POST", - }) - ); - const body = await res.json(); + const res = await routes().GET(req("/api/ep/get-session")); + + expect((await res.json()).session.token).toBeUndefined(); + }); + + it("preserves multiple Set-Cookie headers", async () => { + const headers = new Headers({ "Content-Type": "application/json" }); + headers.append("Set-Cookie", "better-auth.session_token=a; HttpOnly; Path=/"); + headers.append("Set-Cookie", "better-auth.session_data=b; HttpOnly; Path=/"); + nextResponse = jsonResponse(SESSION_BODY, { headers }); + + const res = await routes().GET(req("/api/ep/get-session")); - expect(body.session.epAccessToken).toBe(SESSION_BODY.session.epAccessToken); + expect((res.headers as any).getSetCookie()).toHaveLength(2); }); - it("preserves Set-Cookie headers through redaction", async () => { + it("drops a stale Content-Length rather than overstating the body", async () => { + const body = JSON.stringify(SESSION_BODY); nextResponse = jsonResponse(SESSION_BODY, { headers: { "Content-Type": "application/json", - "Set-Cookie": "better-auth.session_token=abc; HttpOnly; Path=/", + "Content-Length": String(body.length), }, }); - const res = await routes().GET( - new Request("http://localhost:3456/api/ep/get-session") + const res = await routes().GET(req("/api/ep/get-session")); + const declared = res.headers.get("content-length"); + + expect(declared === null || Number(declared) === (await res.text()).length).toBe( + true ); + }); - expect(res.headers.get("Set-Cookie")).toContain("better-auth.session_token"); + it("passes through a non-2xx response untouched", async () => { + nextResponse = jsonResponse({ error: "nope" }, { status: 401 }); + + const res = await routes().GET(req("/api/ep/get-session")); + + expect(res.status).toBe(401); + expect(await res.json()).toEqual({ error: "nope" }); }); it("passes through a null session without throwing", async () => { nextResponse = jsonResponse({ session: null, user: null }); - const res = await routes().GET( - new Request("http://localhost:3456/api/ep/get-session") - ); + const res = await routes().GET(req("/api/ep/get-session")); expect(await res.json()).toEqual({ session: null, user: null }); }); @@ -109,9 +154,7 @@ describe("createEpAuthRoutes", () => { it("passes through a non-JSON body untouched", async () => { nextResponse = new Response("not json", { status: 200 }); - const res = await routes().GET( - new Request("http://localhost:3456/api/ep/get-session") - ); + const res = await routes().GET(req("/api/ep/get-session")); expect(await res.text()).toBe("not json"); }); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts index d79d2a716e..83ec1f0225 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/auth-routes.ts @@ -1,5 +1,5 @@ /** - * Mounts the EP auth handler, redacting credentials from `/get-session`. + * Mounts the EP auth handler, redacting credentials from every response. * * // app/api/ep/[...path]/route.ts * import { createEpAuthRoutes } from @@ -8,19 +8,32 @@ * * export const { GET, POST } = createEpAuthRoutes(epAuth); * - * better-auth's `/get-session` returns the whole session record, and this - * package stores the shopper's EP access token on it. Mounting - * better-auth's `toNextJsHandler` directly therefore hands that token to - * any same-origin script for the cost of one fetch — the same exposure - * the `serverToken` prop used to create, in pull form rather than push. + * Every endpoint on this handler returns the session record, and the + * session carries the shopper's EP credentials — the anonymous access + * token on all of them, plus the account-management token once a shopper + * logs in. Mounting better-auth's `toNextJsHandler` directly therefore + * hands those to any same-origin script for the cost of one fetch. + * `/ep/refresh` is the sharpest: it rotates the token and returns the new + * value, and `/ep/anonymous` needs no cookie at all. * - * `epCartId` survives: it is not a credential, and the checkout - * components read it from here. + * The session is filtered to an allowlist rather than stripped of known + * credential fields, so a field added to the session later is withheld by + * default instead of leaking until someone notices. */ import { toNextJsHandler } from "better-auth/next-js"; import type { EpAuth } from "./create-ep-auth-better"; -const REDACTED_FIELDS = ["epAccessToken", "epClientId", "epHost"]; +// `token` is deliberately absent: it is the better-auth session id, which +// lives in an HttpOnly cookie precisely so scripts cannot read it. +const SESSION_ALLOWLIST = [ + "id", + "userId", + "expiresAt", + "createdAt", + "updatedAt", + "epCartId", + "epExpires", +]; function redactSessionPayload(payload: any): any { if (!payload || typeof payload !== "object") return payload; @@ -28,26 +41,18 @@ function redactSessionPayload(payload: any): any { if (!session || typeof session !== "object") return payload; const kept: Record = {}; - for (const key of Object.keys(session)) { - if (REDACTED_FIELDS.indexOf(key) === -1) kept[key] = session[key]; + for (const key of SESSION_ALLOWLIST) { + if (key in session) kept[key] = session[key]; } return { ...payload, session: kept }; } -function isGetSession(request: Request): boolean { - try { - return new URL(request.url).pathname.endsWith("/get-session"); - } catch { - return false; - } -} - function withRedaction( handler: (request: Request) => Promise ): (request: Request) => Promise { return async (request: Request) => { const response = await handler(request); - if (!isGetSession(request) || !response.ok) return response; + if (!response.ok) return response; const cloned = response.clone(); let payload: any; @@ -57,10 +62,15 @@ function withRedaction( return response; } + // Rebuilding shrinks the body, so a copied Content-Length would + // overstate it — a truncated read rather than an error. + const headers = new Headers(response.headers); + headers.delete("content-length"); + return new Response(JSON.stringify(redactSessionPayload(payload)), { status: response.status, statusText: response.statusText, - headers: response.headers, + headers, }); }; } From 07c911bab4d332a58613f8f3925a9e24b693392e Mon Sep 17 00:00:00 2001 From: Robert Field Date: Thu, 13 Aug 2026 18:42:46 +0100 Subject: [PATCH 6/8] fix(ep-commerce): make the session token independent of the readable user id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round-two review found the allowlist withheld `session.token` while keeping fields that spell it out: `buildAnonymousSnapshot` derived id, userId, user.id and user.email from the same random value the token used, so `session.id` minus its prefix was the token. The comment and CHANGELOG claimed a protection the code did not deliver. Giving the token its own value makes the claim true and stops the cookie's non-secret half being derivable from data the storefront can read. Also from that review: the example pinned `*`, which resolved to 0.0.3 — a version with no `/server` subpath at all, so none of its imports could resolve. Dependencies now carry real ranges. The app needs 0.2.1 for `createEpAuthRoutes` and the README says so rather than implying `yarn install` works today. `yarn dev` now serves 3456. `lib/ep-auth.ts` defaults `baseURL` there, so the previous bare `next dev` produced an app on 3000 whose origin was untrusted — silently failing cart writes, which is what the README warns about. --- examples/ep-commerce-app-router/README.md | 11 +++++++--- examples/ep-commerce-app-router/package.json | 14 ++++++------ .../ep-plugin/__tests__/ep-anonymous.test.ts | 22 +++++++++++++++++++ .../src/auth/ep-plugin/ep-plugin.ts | 5 ++++- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/examples/ep-commerce-app-router/README.md b/examples/ep-commerce-app-router/README.md index 09f3451079..a0f1621af9 100644 --- a/examples/ep-commerce-app-router/README.md +++ b/examples/ep-commerce-app-router/README.md @@ -4,6 +4,10 @@ Reference storefront for `@elasticpath/plasmic-ep-commerce-elastic-path`. It mirrors a real consumer install: the Plasmic and Elastic Path packages resolve from the registry, not from this monorepo. +> **Requires an unreleased package version.** This app uses +> `createEpAuthRoutes`, added in 0.2.1. Until that publishes, `yarn install` +> cannot resolve the dependency — use the local-source workflow below. + ## Running it ```bash @@ -12,9 +16,10 @@ yarn install yarn dev # http://localhost:3456 ``` -The port matters. `lib/ep-auth.ts` defaults `baseURL` to `http://localhost:3456`, -and the origin gate rejects cart mutations from an origin that isn't trusted. To -serve elsewhere, set `NEXT_PUBLIC_BASE_URL`. +`yarn dev` serves 3456 deliberately. `lib/ep-auth.ts` defaults `baseURL` to +`http://localhost:3456`, and the origin gate rejects cart mutations from an +origin that isn't trusted — so a different port means silently failing writes. +To serve elsewhere, set `NEXT_PUBLIC_BASE_URL` to match. `plasmic-init.ts` points `host` at the Plasmic instance serving the project, so that instance has to be reachable — a local `platform/wab` on `:3003` for local diff --git a/examples/ep-commerce-app-router/package.json b/examples/ep-commerce-app-router/package.json index 82bb9931a1..8425e74512 100644 --- a/examples/ep-commerce-app-router/package.json +++ b/examples/ep-commerce-app-router/package.json @@ -3,18 +3,18 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev -p 3456", "build": "next build", "start": "next start" }, "dependencies": { - "@elasticpath/plasmic-ep-commerce-elastic-path": "*", - "@elasticpath/plasmic-mcp-registry": "*", + "@elasticpath/plasmic-ep-commerce-elastic-path": "^0.2.1", + "@elasticpath/plasmic-mcp-registry": "^0.2.1", "@epcc-sdk/sdks-shopper": "^0.1.0", - "@plasmicapp/loader-nextjs": "*", - "@plasmicapp/nextjs-app-router": "*", - "@plasmicapp/host": "*", - "@plasmicpkgs/commerce": "*", + "@plasmicapp/loader-nextjs": "^2.0.22", + "@plasmicapp/nextjs-app-router": "^1.0.30", + "@plasmicapp/host": "^2.0.16", + "@plasmicpkgs/commerce": "^0.0.257", "next": "^15.5.9", "react": "^19", "react-dom": "^19" diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/ep-anonymous.test.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/ep-anonymous.test.ts index dd23a874ad..aca29fdc10 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/ep-anonymous.test.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/__tests__/ep-anonymous.test.ts @@ -193,4 +193,26 @@ describe("/ep/anonymous endpoint (PRD #273)", () => { ); expect(String(calledInit.body)).toContain(`client_id=${EP_CLIENT_ID}`); }); + + it("does not derive the session token from the readable user id", async () => { + const auth = betterAuth({ + secret: SECRET, + baseURL: "http://localhost", + basePath: "/api/ep", + plugins: [epPlugin({ clientId: EP_CLIENT_ID, host: EP_HOST })], + }); + + const result = await (auth.api as any).epAnonymous({ + body: {}, + asResponse: true, + }); + const { session, user } = await result.json(); + + // user.id and user.email are handed to the storefront; the session token + // is the cookie's non-secret half. Deriving one from the other would + // publish it. + expect(session.token).not.toContain(user.id.replace("anon-", "")); + expect(session.id).not.toContain(session.token); + expect(user.email).not.toContain(session.token); + }); }); diff --git a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/ep-plugin.ts b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/ep-plugin.ts index 3e21689828..1da6142667 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/ep-plugin.ts +++ b/plasmicpkgs/commerce-providers/elastic-path/src/auth/ep-plugin/ep-plugin.ts @@ -117,7 +117,10 @@ function buildAnonymousSnapshot( const session = { id: `sess-${anonymousId}`, userId: user.id, - token: anonymousId, + // Independent of anonymousId: the user id and email are readable by the + // storefront, and deriving the cookie's session token from them would + // publish it. + token: generateAnonymousId(), expiresAt: new Date((now + tokenData.expires_in) * 1000), ipAddress: null, userAgent: null, From 9ddb5ab8fe41b7c67111944f5621029ff82bfd74 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Fri, 14 Aug 2026 09:33:46 +0100 Subject: [PATCH 7/8] fix(ep-commerce): pin the example at ^0.3.0, not ^0.2.1 This release carries breaking changes, so it is 0.3.0. A caret range on a 0.x version pins the minor, so ^0.2.1 resolves to >=0.2.1 <0.3.0 and would have excluded the release that adds createEpAuthRoutes. --- examples/ep-commerce-app-router/README.md | 2 +- examples/ep-commerce-app-router/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ep-commerce-app-router/README.md b/examples/ep-commerce-app-router/README.md index a0f1621af9..69ac5cb90d 100644 --- a/examples/ep-commerce-app-router/README.md +++ b/examples/ep-commerce-app-router/README.md @@ -5,7 +5,7 @@ mirrors a real consumer install: the Plasmic and Elastic Path packages resolve from the registry, not from this monorepo. > **Requires an unreleased package version.** This app uses -> `createEpAuthRoutes`, added in 0.2.1. Until that publishes, `yarn install` +> `createEpAuthRoutes`, added in 0.3.0. Until 0.3.0 publishes, `yarn install` > cannot resolve the dependency — use the local-source workflow below. ## Running it diff --git a/examples/ep-commerce-app-router/package.json b/examples/ep-commerce-app-router/package.json index 8425e74512..9d7c6f80f8 100644 --- a/examples/ep-commerce-app-router/package.json +++ b/examples/ep-commerce-app-router/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "@elasticpath/plasmic-ep-commerce-elastic-path": "^0.2.1", + "@elasticpath/plasmic-ep-commerce-elastic-path": "^0.3.0", "@elasticpath/plasmic-mcp-registry": "^0.2.1", "@epcc-sdk/sdks-shopper": "^0.1.0", "@plasmicapp/loader-nextjs": "^2.0.22", From f68aa4aa1e5646307d4eaa7d669f06c2df219a94 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Fri, 14 Aug 2026 13:17:30 +0100 Subject: [PATCH 8/8] fix(ep-commerce): resolve next/server from the ESM server entry Next ships no "exports" map, so Node's ESM resolver cannot resolve the bare specifier `next/server` that esbuild emits when `next` is externalised. The package's exports map sends `import` to dist/server.mjs, so any consumer loading /server through ESM fails: Cannot find module '.../node_modules/next/server' imported from .../plasmic-ep-commerce-elastic-path/dist/server.mjs Did you mean to import "next/server.js"? Rewrite the specifier to the file itself in the ESM output only; CJS keeps the bare specifier, which require() resolves fine. This was latent because a stale example lockfile pinned Next 15.5.15, whose route graph loads the package through require(). A clean install today gets 15.5.23 and loads it through import. #397 recorded it as unconfirmed. --- .../commerce-providers/elastic-path/build-server.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs b/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs index 8163eaeb09..30b6d47505 100644 --- a/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs +++ b/plasmicpkgs/commerce-providers/elastic-path/build-server.mjs @@ -42,6 +42,17 @@ for (const [format, outfile] of [ }); } +// Next ships no "exports" map, so Node's ESM resolver cannot resolve a bare +// `next/server` — only CJS lookup can, which makes `import ".../server"` fail +// on a clean install. Point the ESM build at the file itself. CJS is left +// alone: `require("next/server")` resolves fine. +const esmPath = "dist/server.mjs"; +const esm = readFileSync(esmPath, "utf8").replace( + /(from\s*|import\(\s*)(["'])next\/([A-Za-z0-9-]+)\2/g, + (_m, lead, q, sub) => `${lead}${q}next/${sub}.js${q}` +); +writeFileSync(esmPath, esm); + // Generate declaration file by re-exporting from tsdx-generated .d.ts files. // tsc would try to type-check all transitive sources, which may fail on // third-party type mismatches. Since tsdx already produced correct .d.ts