Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/shared-cookie-self-contained-types.md
Original file line number Diff line number Diff line change
@@ -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.
5 changes: 5 additions & 0 deletions .changeset/testing-cypress-preserve-types-reference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/testing': patch
---

Preserve the `/// <reference types="cypress" />` 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`.
4 changes: 2 additions & 2 deletions packages/clerk-js/src/core/auth/getCookieDomain.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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<CookieAttributes, 'sameSite' | 'secure'>,
) {
// only compute it once per session to avoid unnecessary cookie ops
if (cachedETLDPlusOne) {
Expand Down
56 changes: 54 additions & 2 deletions packages/shared/src/cookie.ts
Original file line number Diff line number Diff line change
@@ -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.
*
Expand All @@ -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);
},
/**
Expand All @@ -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);
},
};
Expand Down
2 changes: 1 addition & 1 deletion packages/testing/src/cypress/agent-task.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// <reference types="cypress" />
/// <reference types="cypress" preserve="true" />
import { type CreateAgentTaskParams, createAgentTestingTask as _createAgentTestingTask } from '../common';

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/testing/src/cypress/custom-commands.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// <reference types="cypress" />
/// <reference types="cypress" preserve="true" />
import type { Clerk, SignOutOptions } from '@clerk/shared/types';

import type { ClerkSignInParams } from '../common';
Expand Down
2 changes: 1 addition & 1 deletion packages/testing/src/cypress/setup.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// <reference types="cypress" />
/// <reference types="cypress" preserve="true" />
import type { ClerkSetupOptions } from '../common';
import { fetchEnvVars } from '../common';

Expand Down
2 changes: 1 addition & 1 deletion packages/testing/src/cypress/setupClerkTestingToken.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// <reference types="cypress" />
/// <reference types="cypress" preserve="true" />
import type { SetupClerkTestingTokenOptions } from '../common';
import { ERROR_MISSING_FRONTEND_API_URL, TESTING_TOKEN_PARAM } from '../common';

Expand Down
Loading