diff --git a/.changeset/shared-cookie-self-contained-types.md b/.changeset/shared-cookie-self-contained-types.md new file mode 100644 index 00000000000..49eec2e34c1 --- /dev/null +++ b/.changeset/shared-cookie-self-contained-types.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Ship a self-contained `CookieAttributes` interface from `@clerk/shared/cookie` and use it in `createCookieHandler`'s `set`/`remove` signatures. The published declarations previously referenced `Cookies.CookieAttributes` from js-cookie, which consumers could never resolve (the import was dropped from the declaration output and js-cookie ships no types), causing TS2503 errors under `skipLibCheck: false` and silently degrading the option types to `any` otherwise. diff --git a/.changeset/testing-cypress-preserve-types-reference.md b/.changeset/testing-cypress-preserve-types-reference.md new file mode 100644 index 00000000000..319ba7486be --- /dev/null +++ b/.changeset/testing-cypress-preserve-types-reference.md @@ -0,0 +1,5 @@ +--- +'@clerk/testing': patch +--- + +Preserve the `/// ` directive in the published `@clerk/testing/cypress` type declarations. TypeScript's declaration emit previously dropped it, so the shipped types relied on the global `Cypress` namespace without declaring the dependency and failed to type-check under `skipLibCheck: false`. diff --git a/packages/clerk-js/src/core/auth/getCookieDomain.ts b/packages/clerk-js/src/core/auth/getCookieDomain.ts index 42a1a4f0a39..35b1479d8dd 100644 --- a/packages/clerk-js/src/core/auth/getCookieDomain.ts +++ b/packages/clerk-js/src/core/auth/getCookieDomain.ts @@ -1,4 +1,4 @@ -import { createCookieHandler } from '@clerk/shared/cookie'; +import { type CookieAttributes, createCookieHandler } from '@clerk/shared/cookie'; /** * Determines the eTLD+1 domain, which is where we want the cookies to be set. @@ -19,7 +19,7 @@ const eTLDCookie = createCookieHandler('__clerk_test_etld'); export function getCookieDomain( hostname = window.location.hostname, cookieHandler = eTLDCookie, - cookieAttributes?: { sameSite?: string; secure?: boolean }, + cookieAttributes?: Pick, ) { // only compute it once per session to avoid unnecessary cookie ops if (cachedETLDPlusOne) { diff --git a/packages/shared/src/cookie.ts b/packages/shared/src/cookie.ts index 9e726ed2ea9..7f0224db275 100644 --- a/packages/shared/src/cookie.ts +++ b/packages/shared/src/cookie.ts @@ -1,5 +1,57 @@ import Cookies from 'js-cookie'; +/** + * Mirrors js-cookie's `CookieAttributes`. Defined locally so the published d.ts is + * self-contained: the bundler drops the js-cookie import from the declaration output + * and `@types/js-cookie` is only a devDependency, so consumers could never resolve + * the original reference. + */ +export interface CookieAttributes { + /** + * Define when the cookie will be removed. Value can be a Number + * which will be interpreted as days from time of creation or a + * Date instance. If omitted, the cookie becomes a session cookie. + */ + expires?: number | Date | undefined; + + /** + * Define the path where the cookie is available. Defaults to '/' + */ + path?: string | undefined; + + /** + * Define the domain where the cookie is available. Defaults to + * the domain of the page where the cookie was created. + */ + domain?: string | undefined; + + /** + * A Boolean indicating if the cookie transmission requires a + * secure protocol (https). Defaults to false. + */ + secure?: boolean | undefined; + + /** + * Asserts that a cookie must not be sent with cross-origin requests, + * providing some protection against cross-site request forgery + * attacks (CSRF) + */ + sameSite?: 'strict' | 'Strict' | 'lax' | 'Lax' | 'none' | 'None' | undefined; + + /** + * A Boolean indicating whether the cookie is partitioned per top-level + * site (CHIPS). js-cookie serializes it through the attribute passthrough; + * declared explicitly because Clerk sets it at several call sites. + */ + partitioned?: boolean | undefined; + + /** + * An attribute which will be serialized, conformably to RFC 6265 + * section 5.2. + */ + [property: string]: any; +} + /** * Creates helper methods for dealing with a specific cookie. * @@ -20,7 +72,7 @@ export function createCookieHandler(cookieName: string) { /** * Setting a cookie will use some defaults such as path being set to "/". */ - set(newValue: string, options: Cookies.CookieAttributes = {}): void { + set(newValue: string, options: CookieAttributes = {}): void { Cookies.set(cookieName, newValue, options); }, /** @@ -29,7 +81,7 @@ export function createCookieHandler(cookieName: string) { * * @see https://github.com/js-cookie/js-cookie#basic-usage */ - remove(cookieAttributes?: Cookies.CookieAttributes) { + remove(cookieAttributes?: CookieAttributes): void { Cookies.remove(cookieName, cookieAttributes); }, }; diff --git a/packages/testing/src/cypress/agent-task.ts b/packages/testing/src/cypress/agent-task.ts index 37c8df7bab6..15836171504 100644 --- a/packages/testing/src/cypress/agent-task.ts +++ b/packages/testing/src/cypress/agent-task.ts @@ -1,4 +1,4 @@ -/// +/// import { type CreateAgentTaskParams, createAgentTestingTask as _createAgentTestingTask } from '../common'; /** diff --git a/packages/testing/src/cypress/custom-commands.ts b/packages/testing/src/cypress/custom-commands.ts index ac95e9b0beb..b1aa4a893bf 100644 --- a/packages/testing/src/cypress/custom-commands.ts +++ b/packages/testing/src/cypress/custom-commands.ts @@ -1,4 +1,4 @@ -/// +/// import type { Clerk, SignOutOptions } from '@clerk/shared/types'; import type { ClerkSignInParams } from '../common'; diff --git a/packages/testing/src/cypress/setup.ts b/packages/testing/src/cypress/setup.ts index 0000160e9ac..05c900e779b 100644 --- a/packages/testing/src/cypress/setup.ts +++ b/packages/testing/src/cypress/setup.ts @@ -1,4 +1,4 @@ -/// +/// import type { ClerkSetupOptions } from '../common'; import { fetchEnvVars } from '../common'; diff --git a/packages/testing/src/cypress/setupClerkTestingToken.ts b/packages/testing/src/cypress/setupClerkTestingToken.ts index afc42b399bf..71522be346d 100644 --- a/packages/testing/src/cypress/setupClerkTestingToken.ts +++ b/packages/testing/src/cypress/setupClerkTestingToken.ts @@ -1,4 +1,4 @@ -/// +/// import type { SetupClerkTestingTokenOptions } from '../common'; import { ERROR_MISSING_FRONTEND_API_URL, TESTING_TOKEN_PARAM } from '../common';