Skip to content

feat: [#1864] Implement Cookie Store API#2040

Open
TrevorBurnham wants to merge 1 commit intocapricorn86:masterfrom
TrevorBurnham:fix/1864-cookie-store-api
Open

feat: [#1864] Implement Cookie Store API#2040
TrevorBurnham wants to merge 1 commit intocapricorn86:masterfrom
TrevorBurnham:fix/1864-cookie-store-api

Conversation

@TrevorBurnham
Copy link
Copy Markdown
Contributor

@TrevorBurnham TrevorBurnham commented Jan 23, 2026

Resolves #1864 and #1893

Summary

Implements the Cookie Store API, providing a modern, Promise-based interface for managing cookies. Full integration with the existing CookieContainer infrastructure — cookies set via cookieStore are visible via document.cookie and vice versa.

Changes

New Files

  • packages/happy-dom/src/cookie-store/CookieStore.ts — Main implementation with get(), getAll(), set(), delete() methods
  • packages/happy-dom/src/cookie-store/ICookieStoreGetOptions.ts — Options for get()/getAll()
  • packages/happy-dom/src/cookie-store/ICookieStoreSetOptions.ts — Options for set()
  • packages/happy-dom/src/cookie-store/ICookieStoreDeleteOptions.ts — Options for delete() (spec-correct subset: name, domain, path, partitioned only)
  • packages/happy-dom/src/cookie-store/ICookieStoreItem.ts — Cookie item returned by get()/getAll()
  • packages/happy-dom/src/event/events/CookieChangeEvent.tsCookieChangeEvent with changed and deleted arrays
  • packages/happy-dom/src/event/events/ICookieChangeEventInit.ts — Init interface for CookieChangeEvent
  • packages/happy-dom/test/cookie-store/CookieStore.test.ts — Test suite (24 tests)

Modified Files

  • packages/happy-dom/src/PropertySymbol.ts — Added cookieStore symbol
  • packages/happy-dom/src/window/BrowserWindow.ts — Added CookieStore and CookieChangeEvent imports, properties, getters, and class exports
  • packages/happy-dom/src/index.ts — Added exports for CookieStore, CookieChangeEvent, and all interfaces

API

// Get a single cookie by name
const cookie = await cookieStore.get('name');
const cookie = await cookieStore.get({ name: 'name' });

// Get all cookies (optionally filtered by name or URL)
const cookies = await cookieStore.getAll();
const cookies = await cookieStore.getAll('name');
const cookies = await cookieStore.getAll({ url: '/path' });

// Set a cookie
await cookieStore.set('name', 'value');
await cookieStore.set({
  name: 'name',
  value: 'value',
  expires: Date.now() + 86400000,
  path: '/',
  domain: 'example.com',
  sameSite: 'lax'
});

// Delete a cookie
await cookieStore.delete('name');
await cookieStore.delete({ name: 'name', path: '/' });

// Listen for changes
cookieStore.addEventListener('change', (event) => {
  console.log('Changed:', event.changed);
  console.log('Deleted:', event.deleted);
});

Spec Compliance

  • [SecureContext]: secure flag is always set to true
  • Default sameSite is 'strict' per spec
  • value defaults to '' when omitted from the options object
  • delete() accepts its own options type (ICookieStoreDeleteOptions) without value, expires, or sameSite
  • getAll() with url option validates same-origin and throws SecurityError on cross-origin URLs
  • expires accepts both number (Unix ms) and Date objects
  • change event dispatches CookieChangeEvent with changed/deleted arrays on set() and delete()

Limitations

  • change event only fires for mutations via CookieStore methods, not for cookies set via document.cookie (would require adding an observer mechanism to CookieContainer)

@Spixmaster
Copy link
Copy Markdown

Was this done an LLM? Who on earth writes such pull request descriptions?

@TrevorBurnham
Copy link
Copy Markdown
Contributor Author

Yes, I used Claude Opus 4.5.

@Spixmaster
Copy link
Copy Markdown

Just out of interest, with https://github.com/copilot and Claude Opus 4.5 chosen?

@TrevorBurnham
Copy link
Copy Markdown
Contributor Author

In this case I believe I used Kiro, the agentic IDE created by AWS (my employer). Outside of work, though, I mostly use Claude Code. I find GitHub Copilot very useful for answering questions about repos, but rarely use it to generate code.

@TrevorBurnham TrevorBurnham force-pushed the fix/1864-cookie-store-api branch 2 times, most recently from b3cf81e to fb29634 Compare February 8, 2026 20:38
- Add CookieStore class with get(), getAll(), set(), delete() methods
- Add ICookieStoreGetOptions, ICookieStoreSetOptions, ICookieStoreItem interfaces
- Expose cookieStore property on window
- Export CookieStore class from window
- Add comprehensive test suite (22 tests)
- Integrate with existing cookie infrastructure (CookieContainer)
@TrevorBurnham TrevorBurnham force-pushed the fix/1864-cookie-store-api branch from fb29634 to 0392f16 Compare February 8, 2026 21:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

cookieStore is not defined

2 participants