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';