Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@alessiofrittoli/web-utils

alessiofrittoli660MIT1.12.0TypeScript support: included

Common TypeScript web utilities

web-utilities, typed-map, map, string-utilities, web-storage-api, browser-api-utilities

readme

Web Utils 🛠️

NPM Latest Version Coverage Status Socket Status NPM Monthly Downloads Dependencies

GitHub Sponsor

Common TypeScript web utilities

Table of Contents


Getting started

Run the following command to start using web-utils in your projects:

npm i @alessiofrittoli/web-utils

or using pnpm

pnpm i @alessiofrittoli/web-utils

API Reference

Array utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/arrays'

arrayUnique

Removes duplicate values from an array.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
array T[] The input array.

<summary style="cursor:pointer">Returns</summary>

Type: T[]

The filtered array.


<summary style="cursor:pointer">Usage</summary>
Removes duplicates from array
const pointer = {}
console.log( arrayUnique( [ pointer, 'b', pointer, 'c', 'b' ] ) )
// Outputs: [ {}, 'b', 'c' ]

arrayObjectUnique

Removes duplicate entries from an array referencing an object key.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
array T[] An array of objects.
property keyof T The Object property to refer to.

<summary style="cursor:pointer">Returns</summary>

Type: T[]

The filtered array.


<summary style="cursor:pointer">Usage</summary>
Removes duplicates from array with the same propery value
const arr = [
  { id: 1, name: 'a' },
  { id: 2, name: 'b' },
  { id: 1, name: 'c' }, // duplicate `id`
  { id: 3, name: 'd' },
  { id: 4, name: 'a' }, // duplicate `name`
]

console.log( arrayObjectUnique( arr, 'id' ) )
// Outputs: [
//     { id: 1, name: 'a' },
//     { id: 2, name: 'b' },
//     { id: 3, name: 'd' },
//     { id: 4, name: 'a' },
// ]


console.log( arrayObjectUnique( arr, 'name' ) )
// Outputs: [
//     { id: 1, name: 'a' },
//     { id: 2, name: 'b' },
//     { id: 1, name: 'c' },
//     { id: 3, name: 'd' },
// ]

listToArray

Convert a stringified Array to Array object.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
string string An array of objects.

<summary style="cursor:pointer">Returns</summary>

Type: string[]

The converted stringified Array to Array object.


<summary style="cursor:pointer">Usage</summary>
Basic usage
console.log( listToArray( '1,2, 3, 4' ).map( Number ) )
// Outputs: [ 1, 2, 3, 4 ]

chunkInto

Split Array into chunks.

<summary style="cursor:pointer">Type Parameters</summary>
Parameter Default Description
T unknown[] The input array type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
array T[] The original Array.
options ChunkIntoOptions An object defining split criteria.
options.size number Will split the given Array in a way to ensure each chunk length is, whenever possible, equal to the given value.
options.count number Will split the given Array in a way to ensure n chunks as the given value.

<summary style="cursor:pointer">Returns</summary>

Type: T[]

An Array of chunks.


<summary style="cursor:pointer">Usage</summary>
Basic usage
console.log( chunkInto( [ 1, 2, 3, 4, 5 ], { count: 2 } ) )
// Output: [ [ 1, 2, 3 ], [ 4, 5 ] ]

console.log( chunkInto( [ 1, 2, 3, 4, 5 ], { size: 2 } ) )
// Output: [ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]

Blob utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/blob'

downloadBlob

Create and download a blob object.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
filename string The download file name.
data BodyInit The download file data.
init ResponseInit (Optional) The ResponseInit object.

<summary style="cursor:pointer">Usage</summary>
Download file from HTTP Response
fetch( ... )
  .then( response => response.formData() )
  .then( async data => {
    await Promise.all(
      Array.from( data.entries() )
        .map( async ( [, file ] ) => {
          if ( ! ( file instanceof File ) ) return
          await downloadBlob( file.name, file )
        } )
    )
  } )
  .catch( error => {
    console.error( error )
  } )

Dom utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/dom'

blockScroll

Prevent Element Overflow.

It calculates the scrollbar width and the resulting value is applied to the target element right padding-right to prevent width grows.

It also applies the --scrollbar-size CSS variable that can be used to apply a padding-right to the position fixed elements inside the target.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Default Description
target HTMLElement Document.documentElement (Optional) The target Element.

<summary style="cursor:pointer">Usage</summary>
Block Document HTML scroll when a popup is opened
const openPopUpHandler = () => {
  blockScroll()
  // ... handle popup
}
.modal-wrapper {
  position      : fixed;
  inset         : 0;
  padding-right : var( --scrollbar-size, 0 );
}

Block scroll of a specific HTMLElement
const element = document.querySelector( '.css-selector' )

if ( element ) {
  blockScroll( element )
}

restoreScroll

Restore Element Overflow.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Default Description
target HTMLElement Document.documentElement (Optional) The target Element.

<summary style="cursor:pointer">Usage</summary>
Restore Document HTML scroll when a popup is closed
const closePopUpHandler = () => {
  // ... handle close
  restoreScroll()
}

Restore scroll of a specific HTMLElement
const element = document.querySelector( '.css-selector' )

if ( element ) {
  restoreScroll( element )
}

Generators utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/generators'

isGeneratorFunction

Check if a function is a GeneratorFunction or AsyncGeneratorFunction.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The function to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is GeneratorFunction | AsyncGeneratorFunction

  • true if the given reference is a GeneratorFunction or AsyncGeneratorFunction.
  • false otherwise.

isDefaultGeneratorFunction

Check if a function is a GeneratorFunction.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The function to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is GeneratorFunction

  • true if the given reference is a GeneratorFunction.
  • false otherwise.

isAsyncGeneratorFunction

Check if a function is an AsyncGeneratorFunction.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The function to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is AsyncGeneratorFunction

  • true if the given reference is an AsyncGeneratorFunction.
  • false otherwise.

isGeneratorObject<T>

Check if reference is a Generator or AsyncGenerator.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The reference to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is Generator<T> | AsyncGenerator<T>

  • true if the given reference is a Generator or AsyncGenerator.
  • false otherwise.

isDefaultGeneratorObject<T>

Check if reference is a Generator.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The reference to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is Generator<T>

  • true if the given reference is a Generator.
  • false otherwise.

isAsyncGeneratorObject<T>

Check if reference is an AsyncGenerator.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
reference unknown The reference to check.

<summary style="cursor:pointer">Returns</summary>

Type: reference is AsyncGenerator<T>

  • true if the given reference is an AsyncGenerator.
  • false otherwise.

Map utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/map'

Interface TypedMap<T, P, K>

A type-safe extension of the Map class that enforces key-value relationships based on a provided type.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Type Default Description
T Record<string, unknown> unknown The object type defining the key-value relationships.
P boolean true Defines whether the Map.get() method should return a possibily undefined value.
K keyof T keyof T Internal - The subset of keys in T that are allowed in the Map.

getTypedMap<T, P, K>

Creates a new instance of a type-safe Map with the given type.

<summary style="cursor:pointer">Type parameters</summary>

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
iterable Iterable<readonly [ K, T[ K ] ]> | null Initial Map constructor iterable object.

<summary style="cursor:pointer">Returns</summary>

Type: TypedMap<T, P, K>

A new instance of a type-safe Map.


<summary style="cursor:pointer">Usage</summary>
Basic usage
interface User
{
  name      : string
  age       : number
  isActive  : boolean
}

const user = getTypedMap<User>( [
  [ 'name',     'Foo' ],
  [ 'age',      27 ],
  [ 'isActive', true ],
] )

console.log( user.get( 'name' ) ) // type: `string | undefined`
console.log( user.get( 'age' ) ) // type: `number | undefined`
console.log( user.get( 'isActive' ) ) // type: `boolean | undefined`

Respect the given type
interface User
{
  name      : string
  age       : number
  isActive  : boolean
  banned?   : boolean
}

const user = getTypedMap<User, false>( [
  [ 'name',     'Foo' ],
  [ 'age',      27 ],
  [ 'isActive', true ],
] )

console.log( user.get( 'name' ) ) // type: `string`
console.log( user.get( 'age' ) ) // type: `number`
console.log( user.get( 'isActive' ) ) // type: `boolean`
console.log( user.get( 'banned' ) ) // type: `boolean | undefined`

Promises utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/promises'

sleep

Await a void Promise that resolves after the given time.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
time number The sleep time in milliseconds after the Promise get resolved.

<summary style="cursor:pointer">Returns</summary>

Type: Promise<void>

A new Promise which get resolved after the specified time.


<summary style="cursor:pointer">Usage</summary>
const fn = async () => {
  // ...
  await sleep( 2000 )
  // ...
}

Strings utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/strings'

ucFirst

Make first letter uppercase.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input string The input string to convert.

<summary style="cursor:pointer">Returns</summary>

Type: string

The processed string.


<summary style="cursor:pointer">Usage</summary>
console.log( ucFirst( 'String value' ) ) // Outputs: 'String value'
console.log( ucFirst( 'string value' ) ) // Outputs: 'String value'

lcFirst

Make first letter lowercase.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input string The input string to convert.

<summary style="cursor:pointer">Returns</summary>

Type: string

The processed string.


<summary style="cursor:pointer">Usage</summary>
console.log( lcFirst( 'String value' ) ) // Outputs: 'string value'
console.log( lcFirst( 'string value' ) ) // Outputs: 'string value'

toCamelCase

Convert string to camelCase.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input string The input string to convert.

<summary style="cursor:pointer">Returns</summary>

Type: string

The converted string to camelCase.


<summary style="cursor:pointer">Usage</summary>
console.log( toCamelCase( 'font-family' ) ) // Outputs: 'fontFamily'
console.log( toCamelCase( 'background-color' ) ) // Outputs: 'backgroundColor'
console.log( toCamelCase( '-webkit-align-content' ) ) // Outputs: 'WebkitAlignContent'
console.log( toCamelCase( 'some value' ) ) // Outputs: 'someValue'
console.log( toCamelCase( 'some_value' ) ) // Outputs: 'someValue'
console.log( toCamelCase( 'some value_with mixed_Cases' ) ) // Outputs: 'someValueWithMixedCases'
console.log( toCamelCase( '-string@with#special$characters' ) ) // Outputs: 'StringWithSpecialCharacters'

toKebabCase

Convert string to kebab-case string.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input string The input string to convert.

<summary style="cursor:pointer">Returns</summary>

Type: string

The converted string to kebab-case.


<summary style="cursor:pointer">Usage</summary>
console.log( toKebabCase( 'fontFamily' ) ) // Outputs: 'font-family'
console.log( toKebabCase( 'backgroundColor' ) ) // Outputs: 'background-color'
console.log( toKebabCase( 'string with spaces' ) ) // Outputs: 'string-with-spaces'
console.log( toKebabCase( 'string_with_underscores' ) ) // Outputs: 'string-with-underscores'
console.log( toKebabCase( 'WebkitAlignContent' ) ) // Outputs: '-webkit-align-content'
console.log( toKebabCase( 'some value_with mixed_Cases' ) ) // Outputs: 'some-value-with-mixed-cases'
console.log( toKebabCase( '-string@with#special$characters' ) ) // Outputs: '-string-with-special-characters

stringifyValue

Stringify value.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input any The value to stringify.

<summary style="cursor:pointer">Returns</summary>

Type: string

The stringified input.


<summary style="cursor:pointer">Usage</summary>
console.log( stringifyValue( new Date( 'Sat, 20 Apr 2025 16:20:00 GMT' ) ) )
// Outputs: '2025-04-20T16:20:00.000Z'

console.log( stringifyValue( null ) )
// Outputs: 'null'

console.log( stringifyValue( { prop: 'value', prop2: true } ) )
// Outputs: '{"prop":"value","prop2":true}'

console.log( stringifyValue( [ 1, 2, true, null, () => {} ] ) )
// Outputs: '[1,2,true,null,null]'

console.log( stringifyValue(
  new Map( [
    [ 'key', 'value' ],
    [ 'key2', 'value' ],
  ] )
) )
// Outputs: '[["key","value"],["key2","value"]]'

console.log( stringifyValue(
  new Headers( {
    key   : 'value',
    key2  : 'value',
  } )
) )
// Outputs: '[["key","value"],["key2","value"]]'

console.log( stringifyValue( true ) ) // Outputs: 'true'
console.log( stringifyValue( false ) ) // Outputs: 'false'
console.log( stringifyValue( 0 ) ) // Outputs: '0'
console.log( stringifyValue( 420 ) ) // Outputs: '420'

console.log( stringifyValue( undefined ) ) // Outputs: ''
console.log( stringifyValue( () => {} ) ) // Outputs: ''
console.log( stringifyValue( new Promise<void>( resolve => resolve() ) ) ) // Outputs: ''

parseValue

Parse stringified value.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T The expected returned value type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
input string The value to parse.

<summary style="cursor:pointer">Returns</summary>

Type: T | undefined

  • The parsed input.
  • undefined if no input or empty string is given.

<summary style="cursor:pointer">Usage</summary>
console.log( parseValue<Date>( stringifyValue( new Date() ) ) )
// Outputs: current Date object.

console.log( parseValue<number>( '12345' ) ) // Outputs: 12345
console.log( parseValue() ) // Outputs: undefined
console.log( parseValue( ' ' ) ) // Outputs: undefined

console.log( parseValue<true>( stringifyValue( true ) ) )
// Outputs: true

console.log( parseValue( stringifyValue( { key: 'value' } ) ) )
// Outputs: { key: 'value' }

console.log( parseValue( stringifyValue( [ 1, 2, 3, 4, 5 ] ) ) )
// Outputs: [ 1, 2, 3, 4, 5 ]

console.log( parseValue( 'String value' ) ) // Outputs: 'String value'

Types utilities

⚠️ Docs coming soon


Validation utilities

⚠️ Docs coming soon


Browser API utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/browser-api'
getMediaMatches

Safely executes window.matchMedia() in server and browser environments.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
query string The Media Query string to check.

<summary style="cursor:pointer">Returns</summary>

Type: boolean

  • false if window is not defined or if the document currently doesn't matches the given query.
  • true otherwise.

<summary style="cursor:pointer">Usage</summary>
Check if current device is landscape oriented
console.log( ! getMediaMatches( '(orientation:portrait)' ) )

openBrowserPopUp

Opens a webpage in a browser PopUp.

The openBrowserPopUp uses Window.open() under the hood, but provides default options to make your work easier.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Default Description
options OpenBrowserPopUpOptions - An object defining custom PopUp options.
options.url UrlInput - The URL or path of the resource to be loaded. See UrlInput for more info about accepted formats.
options.width number 600 The PopUp width.
options.height number 800 The PopUp height.
options.context string - A string, without whitespace, specifying the name of the browsing context the resource is being loaded into.
options.features OptionsFeatures - Additional custom PopUp features.

<summary style="cursor:pointer">Returns</summary>

Type: WindowProxy | null

  • a WindowProxy object is returned if the browser successfully opens the new browsing context.
  • null is returned if the browser fails to open the new browsing context, for example because it was blocked by a browser popup blocker.

<summary style="cursor:pointer">Usage</summary>
Re-focus a previously opened popup
let windowProxy: WindowProxy | null = null

const clickHandler = () => {
  if ( windowProxy && ! windowProxy.closed ) {
    return windowProxy.focus()
  }

  windowProxy = openBrowserPopUp( {
    url     : {
      pathname  : '/',
      query     : { key: 'value' }
    },
  } )
}

Re-use a popup
const clickHandler = () => {
  openBrowserPopUp( {
    context : 'some-context-name',
    url     : {
      pathname  : '/',
      query     : { key: 'value' }
    },
  } )
}


const clickHandler2 = () => {
  openBrowserPopUp( {
    context : 'some-context-name',
    url     : '/other-path',
  } )
}

Device utilities

Importing the utilitites
import { ... } from '@alessiofrittoli/web-utils'
// or
import { ... } from '@alessiofrittoli/web-utils/device'
isPortrait

Check if device is in portrait orientation.

<summary style="cursor:pointer">Returns</summary>

Type: boolean

  • true if the device is in portrait orientation when this function is executed.
  • false otherwise.

<summary style="cursor:pointer">Usage</summary>
Check if current device is landscape oriented
console.log( ! isPortrait() )

Storage utilities

<summary style="cursor:pointer">Importing the class</summary>
import { Cookie } from '@alessiofrittoli/web-utils'
// or
import { Cookie } from '@alessiofrittoli/web-utils/storage/Cookie'

<summary style="cursor:pointer">Importing enum and types</summary>
import { Priority, SameSite } from '@alessiofrittoli/web-utils'
// or
import { Priority, SameSite } from '@alessiofrittoli/web-utils/storage/Cookie'

import type { RawCookie, ParsedCookie, ParsedCookieMap } from '@alessiofrittoli/web-utils'
// or
import type { RawCookie, ParsedCookie, ParsedCookieMap } from '@alessiofrittoli/web-utils/storage/Cookie'

<summary style="cursor:pointer">Enumerators</summary>
Priority Enum

The Cookie Priority.

Constant Value Description
Low Low Low priority.
Medium Medium Medium priority (default).
High High High priority.

SameSite Enum

Controls whether or not a cookie is sent with cross-site requests, providing some protection against cross-site request forgery attacks (CSRF).

Constant Value Description
Strict Strict The browser sends the cookie only for same-site requests.
Lax Lax The cookie is not sent on cross-site requests, such as on requests to load images or frames, but is sent when a user is navigating to the origin site from an external site.
None None The browser sends the cookie with both cross-site and same-site requests.

<summary style="cursor:pointer">Types</summary>
RawCookie<K, V>

Interface representing Cookie properties before it get parsed.

<summary style="cursor:pointer">Properties</summary>
Property Type Description
name K The Cookie name.
value V The Cookie value.
domain string Defines the host to which the cookie will be sent.
expires string | number | Date Indicates the maximum lifetime of the cookie.
httpOnly boolean Forbids JavaScript from accessing the cookie, for example, through the Document.cookie property.
maxAge number Indicates the number of seconds until the cookie expires. If set, expires is ignored.
partitioned boolean Indicates that the cookie should be stored using partitioned storage.
path string Indicates the path that must exist in the requested URL for the browser to send the Cookie header.
sameSite SameSite Controls whether or not a cookie is sent with cross-site requests, providing some protection against cross-site request forgery attacks (CSRF).
secure boolean Indicates that the cookie is sent to the server only when a request is made with the https: scheme.
priority Priority Defines the Cookie priority.

ParsedCookie<K, V>

Interface representing Cookie properties after it get parsed.

<summary style="cursor:pointer">Properties</summary>
Property Type Description
expires Date Indicates the maximum lifetime of the cookie.

ParsedCookieMap<K, V>

Map representation of a parsed Cookie.


<summary style="cursor:pointer">Static methods</summary>

Parse the given cookie parameters to a Cookie Map.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
K The typed cookie name.
V The type of the cookie value.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
options RawCookie<K, V> | ParsedCookieMap<K, V> The cookie options or a parsed Cookie Map.

<summary style="cursor:pointer">Returns</summary>

Type: ParsedCookieMap<K, V>

The parsed Cookie Map.


<summary style="cursor:pointer">Usage</summary>
const cookie = Cookie.parse( {
  name        : 'cookiename',
  value       : { test: 'value' },
  path        : '/specific-path',
  priority    : Priority.High,
  expires     : Date.now() + 20 * 60 * 1000,
  domain      : 'example.com',
  secure      : true,
  httpOnly    : true,
  sameSite    : SameSite.Lax,
  maxAge      : Date.now() + 30 * 60 * 1000,
  partitioned : true,
} )

Stringify a Cookie ready to be stored.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
K The typed cookie name.
V The type of the cookie value.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
options RawCookie<K, V> | ParsedCookieMap<K, V> The cookie options or a parsed Cookie Map.

<summary style="cursor:pointer">Returns</summary>

Type: string

The stringified Cookie ready to be stored.


<summary style="cursor:pointer">Usage</summary>
document.cookie = (
  Cookie.toString( {
    name        : 'cookiename',
    value       : { test: 'value' },
    path        : '/specific-path',
    priority    : Priority.High,
    expires     : Date.now() + 20 * 60 * 1000,
    domain      : 'example.com',
    secure      : true,
    httpOnly    : false,
    sameSite    : SameSite.Lax,
    maxAge      : Date.now() + 30 * 60 * 1000,
    partitioned : true,
  } )
)

Parse a cookie string to a Cookie Map.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
K The typed cookie name.
V The expected cookie value type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
cookie string The cookie string.

<summary style="cursor:pointer">Returns</summary>

Type: ParsedCookieMap<K, V> | null

The parsed Cookie Map or null if parsing fails.


<summary style="cursor:pointer">Usage</summary>
const cookies = (
  document.cookie.split( '; ' )
    .map( Cookie.fromString )
    .filter( Boolean )
)

Parse a cookie list string to a Map of cookies.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T A Record o key-value pairs (key: cookie name, value: expected cookie value type).
K Internal.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
list string The cookie list string.

<summary style="cursor:pointer">Returns</summary>

Type: TypedMap<{ [P in K]: ParsedCookieMap<P, T[P]>; }>

The Map of parsed cookies indexed by the Cookie name.


<summary style="cursor:pointer">Usage</summary>
Defining custom types
/** On-site stubbed cookie names. */
enum CookieName
{
  COOKIE_1 = 'cookie-1',
  COOKIE_2 = 'cookie-2',
}

interface Cookie1
{
  test: 'value'
}

interface Cookie2
{
  test: boolean
}

type CookiesMap = {
  [ CookieName.COOKIE_1 ]: Cookie1
  [ CookieName.COOKIE_2 ]: Cookie2
}

const cookies     = Cookie.fromListString<CookiesMap>( document.cookie )
const cookie      = cookies.get( CookieName.COOKIE_1 ) // `ParsedCookieMap<CookieName.COOKIE_1, Cookie1> | undefined`
const cookieValue = cookie?.get( 'value' ) // `Cookie1 | undefined`

const { headers } = request
const cookielist  = headers.get( 'Cookie' )

if ( cookielist ) {
  const cookies     = Cookie.fromListString<CookiesMap>( cookielist )
  const cookie      = cookies.get( CookieName.COOKIE_2 ) // `ParsedCookieMap<CookieName.COOKIE_2, Cookie2> | undefined`
  const cookieValue = cookie?.get( 'value' ) // `Cookie2 | undefined`
}

Get a cookie by cookie name from Document.cookie.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T The expected type for the Cookie value.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
name string The name of the cookie.

<summary style="cursor:pointer">Returns</summary>

Type: ParsedCookieMap<typeof name, T> | undefined

  • The found parsed cookie.
  • undefined if no cookie has been found in Document.cookie.

<summary style="cursor:pointer">Usage</summary>
const cookie  = Cookie.get<string>( 'access_token' )
const value   = cookie?.get( 'value' ) // `string | undefined`

Get a Map of all cookies found in Document.cookie.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T A Record o key-value pairs (key: cookie name, value: expected cookie value type).

<summary style="cursor:pointer">Returns</summary>

Type: TypedMap<{ [P in K]: ParsedCookieMap<P, T[P]>; }>

The Map of parsed cookies indexed by the Cookie name.


<summary style="cursor:pointer">Usage</summary>
const cookies = Cookie.getAll()
const cookie  = cookies.get( 'somecookie' )

Set a cookie to Document.cookie.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
K The typed cookie name.
V The cookie value type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
options RawCookie<K, V> | ParsedCookieMap<K, V> The cookie options or a parsed Cookie Map.

<summary style="cursor:pointer">Returns</summary>

Type: ParsedCookieMap<K, V> | false

  • The set Cookie Map if successful.
  • false on failure.

<summary style="cursor:pointer">Usage</summary>
const cookieOptions: RawCookie = {
  name        : 'cookiename',
  value       : { test: 'value' },
  path        : '/specific-path',
  priority    : Priority.High,
  expires     : Date.now() + 20 * 60 * 1000,
  domain      : 'example.com',
  secure      : true,
  httpOnly    : false,
  sameSite    : SameSite.Lax,
  maxAge      : Date.now() + 30 * 60 * 1000,
  partitioned : true,
}

Cookie.set( cookieOptions )
// or
Cookie.set( Coookie.parse( cookieOptions ) )

Delete a cookie by cookie name from Document.cookie.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
name string The cookie name to delete.

<summary style="cursor:pointer">Returns</summary>

Type: boolean

  • true on successfull.
  • false on failure.

<summary style="cursor:pointer">Usage</summary>
Cookie.delete( 'some_cookie' )

LocalStorage Class

A browser-compatible implementation of localStorage.

<summary style="cursor:pointer">Importing the class</summary>
import { LocalStorage } from '@alessiofrittoli/web-utils'
// or
import { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'

<summary style="cursor:pointer">Static methods</summary>
LocalStorage.key()

Get storage item name by item numeric index.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
index number The item index in the storage.

<summary style="cursor:pointer">Returns</summary>

Type: string | null

  • The name of the nth key.
  • null if n is greater than or equal to the number of key/value pairs.

<summary style="cursor:pointer">Usage</summary>
console.log( LocalStorage.key( 0 ) ) // Outputs: first item name if any.

LocalStorage.getLength()

Get the number of key/value pairs.

<summary style="cursor:pointer">Returns</summary>

Type: number

The number of key/value pairs.


<summary style="cursor:pointer">Usage</summary>
console.log( LocalStorage.getLength() )

LocalStorage.get<T>()

Get the current value associated with the given key, or undefined if the given key does not exist.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T The expected item value type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
key string The item name.

<summary style="cursor:pointer">Returns</summary>

Type: T | undefined

  • The current value associated with the given key.
  • undefined if the given key does not exist.

<summary style="cursor:pointer">Usage</summary>
LocalStorage.get<Date>( 'expiration' )

LocalStorage.set<T>()

Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.

Dispatches a storage event on Window objects holding an equivalent Storage object.

If a nullish or empty string value is provided, the LocalStorage.delete() method is invoked.

<summary style="cursor:pointer">Type parameters</summary>
Parameter Description
T The item value type.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
key string The item name.
value T The item value.

<summary style="cursor:pointer">Throws</summary>

Type: DOMException

A "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.)


<summary style="cursor:pointer">Usage</summary>
LocalStorage.set<Date>( 'expiration', new Date() )

LocalStorage.delete()

Removes the key/value pair with the given key, if a key/value pair with the given key exists.

Dispatches a storage event on Window objects holding an equivalent Storage object.

<summary style="cursor:pointer">Parameters</summary>
Parameter Type Description
key string The item name.

<summary style="cursor:pointer">Usage</summary>
LocalStorage.delete( 'expiration' )

LocalStorage.clear()

Removes all key/value pairs, if there are any.

Dispatches a storage event on Window objects holding an equivalent Storage object.

<summary style="cursor:pointer">Usage</summary>
LocalStorage.clear()

SessionStorage Class

A browser-compatible implementation of sessionStorage.

Same API References of LocalStorage Class is applied to the SessionStorage Class.

Please, refer to LocalStorage Class static methods API Reference for more informations.

<summary style="cursor:pointer">Importing the class</summary>
import { SessionStorage } from '@alessiofrittoli/web-utils'
// or
import { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'

Development

Install depenendencies

npm install

or using pnpm

pnpm i

Build the source code

Run the following command to test and build code for distribution.

pnpm build

ESLint

warnings / errors check.

pnpm lint

Jest

Run all the defined test suites by running the following:

# Run tests and watch file changes.
pnpm test:watch

# Run tests in a CI environment.
pnpm test:ci

Run tests with coverage.

An HTTP server is then started to serve coverage files from ./coverage folder.

⚠️ You may see a blank page the first time you run this command. Simply refresh the browser to see the updates.

test:coverage:serve

Contributing

Contributions are truly welcome!

Please refer to the Contributing Doc for more information on how to start contributing to this project.

Help keep this project up to date with GitHub Sponsor.

GitHub Sponsor


Security

If you believe you have found a security vulnerability, we encourage you to responsibly disclose this and NOT open a public issue. We will investigate all legitimate reports. Email `security@alessiofrittoli.it` to disclose any security vulnerabilities.

Made with ☕

avatar
Alessio Frittoli
https://alessiofrittoli.it | info@alessiofrittoli.it