@elementor/utils 4.0.0-573 → 4.0.0-597

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -63,6 +63,7 @@ declare const decodeString: <T = string>(value: string, fallback?: T) => string
63
63
 
64
64
  type UnknownObject = Record<string, unknown>;
65
65
  declare function hash(obj: UnknownObject): string;
66
+ declare function hashString(str: string, length?: number): string;
66
67
 
67
68
  type UseSearchStateResult = UseDebounceStateResult;
68
69
  declare function useSearchState({ localStorageKey }: {
@@ -81,4 +82,4 @@ declare const compareVersions: (a: string | number, b: string | number) => numbe
81
82
  declare const isVersionLessThan: (a: string | number, b: string | number) => boolean;
82
83
  declare const isVersionGreaterOrEqual: (a: string | number, b: string | number) => boolean;
83
84
 
84
- export { type CreateErrorParams, ElementorError, type ElementorErrorOptions, type UseDebounceStateOptions, type UseDebounceStateResult, type UseSearchStateResult, capitalize, compareVersions, createError, debounce, decodeString, encodeString, ensureError, generateUniqueId, hash, isVersionGreaterOrEqual, isVersionLessThan, throttle, useDebounceState, useSearchState };
85
+ export { type CreateErrorParams, ElementorError, type ElementorErrorOptions, type UseDebounceStateOptions, type UseDebounceStateResult, type UseSearchStateResult, capitalize, compareVersions, createError, debounce, decodeString, encodeString, ensureError, generateUniqueId, hash, hashString, isVersionGreaterOrEqual, isVersionLessThan, throttle, useDebounceState, useSearchState };
package/dist/index.d.ts CHANGED
@@ -63,6 +63,7 @@ declare const decodeString: <T = string>(value: string, fallback?: T) => string
63
63
 
64
64
  type UnknownObject = Record<string, unknown>;
65
65
  declare function hash(obj: UnknownObject): string;
66
+ declare function hashString(str: string, length?: number): string;
66
67
 
67
68
  type UseSearchStateResult = UseDebounceStateResult;
68
69
  declare function useSearchState({ localStorageKey }: {
@@ -81,4 +82,4 @@ declare const compareVersions: (a: string | number, b: string | number) => numbe
81
82
  declare const isVersionLessThan: (a: string | number, b: string | number) => boolean;
82
83
  declare const isVersionGreaterOrEqual: (a: string | number, b: string | number) => boolean;
83
84
 
84
- export { type CreateErrorParams, ElementorError, type ElementorErrorOptions, type UseDebounceStateOptions, type UseDebounceStateResult, type UseSearchStateResult, capitalize, compareVersions, createError, debounce, decodeString, encodeString, ensureError, generateUniqueId, hash, isVersionGreaterOrEqual, isVersionLessThan, throttle, useDebounceState, useSearchState };
85
+ export { type CreateErrorParams, ElementorError, type ElementorErrorOptions, type UseDebounceStateOptions, type UseDebounceStateResult, type UseSearchStateResult, capitalize, compareVersions, createError, debounce, decodeString, encodeString, ensureError, generateUniqueId, hash, hashString, isVersionGreaterOrEqual, isVersionLessThan, throttle, useDebounceState, useSearchState };
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ __export(index_exports, {
30
30
  ensureError: () => ensureError,
31
31
  generateUniqueId: () => generateUniqueId,
32
32
  hash: () => hash,
33
+ hashString: () => hashString,
33
34
  isVersionGreaterOrEqual: () => isVersionGreaterOrEqual,
34
35
  isVersionLessThan: () => isVersionLessThan,
35
36
  throttle: () => throttle,
@@ -202,6 +203,19 @@ function hash(obj) {
202
203
  function isPlainObject(value) {
203
204
  return !!value && typeof value === "object" && !Array.isArray(value);
204
205
  }
206
+ function hashString(str, length) {
207
+ let hashBasis = 5381;
208
+ let i = str.length;
209
+ while (i) {
210
+ hashBasis = hashBasis * 33 ^ str.charCodeAt(--i);
211
+ }
212
+ const result = (hashBasis >>> 0).toString(36);
213
+ if (length === void 0) {
214
+ return result;
215
+ }
216
+ const sliced = result.slice(-length);
217
+ return sliced.padStart(length, "0");
218
+ }
205
219
 
206
220
  // src/use-search-state.ts
207
221
  function useSearchState({ localStorageKey }) {
@@ -268,6 +282,7 @@ var isVersionGreaterOrEqual = (a, b) => {
268
282
  ensureError,
269
283
  generateUniqueId,
270
284
  hash,
285
+ hashString,
271
286
  isVersionGreaterOrEqual,
272
287
  isVersionLessThan,
273
288
  throttle,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors/elementor-error.ts","../src/errors/create-error.ts","../src/errors/ensure-error.ts","../src/use-debounce-state.ts","../src/debounce.ts","../src/throttle.ts","../src/encoding.ts","../src/hash.ts","../src/use-search-state.ts","../src/generate-unique-id.ts","../src/string-helpers.ts","../src/version.ts"],"sourcesContent":["export { ElementorError, createError, ensureError } from './errors';\nexport type { ElementorErrorOptions, CreateErrorParams } from './errors';\nexport { useDebounceState, type UseDebounceStateOptions, type UseDebounceStateResult } from './use-debounce-state';\nexport { debounce } from './debounce';\nexport { throttle } from './throttle';\nexport { encodeString, decodeString } from './encoding';\nexport { hash } from './hash';\nexport { useSearchState, type UseSearchStateResult } from './use-search-state';\nexport { generateUniqueId } from './generate-unique-id';\nexport { capitalize } from './string-helpers';\nexport { compareVersions, isVersionLessThan, isVersionGreaterOrEqual } from './version';\n","export type ElementorErrorOptions = {\n\tcause?: Error[ 'cause' ];\n\tcontext?: Record< string, unknown > | null;\n\tcode: string;\n};\n\nexport class ElementorError extends Error {\n\treadonly context: ElementorErrorOptions[ 'context' ];\n\treadonly code: ElementorErrorOptions[ 'code' ];\n\n\tconstructor( message: string, { code, context = null, cause = null }: ElementorErrorOptions ) {\n\t\tsuper( message, { cause } );\n\t\tthis.context = context;\n\t\tthis.code = code;\n\t}\n}\n","import { ElementorError, type ElementorErrorOptions } from './elementor-error';\n\nexport type CreateErrorParams = {\n\tcode: ElementorErrorOptions[ 'code' ];\n\tmessage: string;\n};\n\nexport const createError = < T extends ElementorErrorOptions[ 'context' ] >( { code, message }: CreateErrorParams ) => {\n\treturn class extends ElementorError {\n\t\tconstructor( { cause, context }: { cause?: ElementorErrorOptions[ 'cause' ]; context?: T } = {} ) {\n\t\t\tsuper( message, { cause, code, context } );\n\t\t}\n\t};\n};\n","export const ensureError = ( error: unknown ) => {\n\tif ( error instanceof Error ) {\n\t\treturn error;\n\t}\n\n\tlet message: string;\n\tlet cause: unknown = null;\n\n\ttry {\n\t\tmessage = JSON.stringify( error );\n\t} catch ( e ) {\n\t\tcause = e;\n\t\tmessage = 'Unable to stringify the thrown value';\n\t}\n\treturn new Error( `Unexpected non-error thrown: ${ message }`, { cause } );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type * as React from 'react';\n\nimport { debounce } from './debounce';\n\nexport type UseDebounceStateOptions = {\n\tdelay?: number;\n\tinitialValue?: string;\n};\n\nexport type UseDebounceStateResult = {\n\tdebouncedValue: string;\n\tinputValue: string;\n\thandleChange: ( val: string ) => void;\n\tsetInputValue: React.Dispatch< React.SetStateAction< string > >;\n};\n\nexport function useDebounceState( options: UseDebounceStateOptions = {} ): UseDebounceStateResult {\n\tconst { delay = 300, initialValue = '' } = options;\n\n\tconst [ debouncedValue, setDebouncedValue ] = useState( initialValue );\n\tconst [ inputValue, setInputValue ] = useState( initialValue );\n\n\tconst runRef = useRef< ReturnType< typeof debounce > | null >( null );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\trunRef.current?.cancel?.();\n\t\t};\n\t}, [] );\n\n\tconst debouncedSetValue = useCallback(\n\t\t( val: string ) => {\n\t\t\trunRef.current?.cancel?.();\n\t\t\trunRef.current = debounce( () => {\n\t\t\t\tsetDebouncedValue( val );\n\t\t\t}, delay );\n\t\t\trunRef.current();\n\t\t},\n\t\t[ delay ]\n\t);\n\n\tconst handleChange = ( val: string ) => {\n\t\tsetInputValue( val );\n\t\tdebouncedSetValue( val );\n\t};\n\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t\tsetInputValue,\n\t};\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce< TArgs extends any[] >( fn: ( ...args: TArgs ) => void, wait: number ) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\n\t\t\ttimer = null;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle< TArgs extends any[] >(\n\tfn: ( ...args: TArgs ) => void,\n\twait: number,\n\tshouldExecuteIgnoredCalls: boolean = false\n) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\tlet ignoredExecution: boolean = false;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tif ( timer ) {\n\t\t\tignoredExecution = true;\n\t\t\treturn;\n\t\t}\n\n\t\tfn( ...args );\n\n\t\ttimer = setTimeout( () => {\n\t\t\ttimer = null;\n\n\t\t\tif ( ignoredExecution && shouldExecuteIgnoredCalls ) {\n\t\t\t\tfn( ...args );\n\t\t\t}\n\n\t\t\tignoredExecution = false;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","export const encodeString = ( value: string ): string => {\n\tconst binary = Array.from( new TextEncoder().encode( value ), ( b ) => String.fromCharCode( b ) ).join( '' );\n\treturn btoa( binary );\n};\n\nexport const decodeString = < T = string >( value: string, fallback?: T ): string | T => {\n\ttry {\n\t\tconst binary = atob( value );\n\t\tconst bytes = new Uint8Array( Array.from( binary, ( char ) => char.charCodeAt( 0 ) ) );\n\t\treturn new TextDecoder().decode( bytes );\n\t} catch {\n\t\treturn fallback !== undefined ? fallback : '';\n\t}\n};\n","type UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nexport function hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { useDebounceState, type UseDebounceStateResult } from './use-debounce-state';\n\nexport type UseSearchStateResult = UseDebounceStateResult;\n\nexport function useSearchState( { localStorageKey }: { localStorageKey?: string } ) {\n\tconst getInitialSearchValue = () => {\n\t\tif ( localStorageKey ) {\n\t\t\tconst storedValue = localStorage.getItem( localStorageKey );\n\t\t\tif ( storedValue ) {\n\t\t\t\tlocalStorage.removeItem( localStorageKey );\n\t\t\t\treturn storedValue;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\tconst { debouncedValue, inputValue, handleChange } = useDebounceState( {\n\t\tdelay: 300,\n\t\tinitialValue: getInitialSearchValue(),\n\t} );\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t};\n}\n","export function generateUniqueId( prefix: string = '' ): string {\n\tconst prefixStr = prefix ? `${ prefix }-` : '';\n\n\treturn `${ prefixStr }${ Date.now() }-${ Math.random().toString( 36 ).substring( 2, 9 ) }`;\n}\n","export const capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n","export const compareVersions = ( a: string | number, b: string | number ): number => {\n\tconst aParts = String( a || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\tconst bParts = String( b || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\n\tfor ( let i = 0; i < Math.max( aParts.length, bParts.length ); i++ ) {\n\t\tconst aVal = aParts[ i ] || 0;\n\t\tconst bVal = bParts[ i ] || 0;\n\t\tif ( aVal !== bVal ) {\n\t\t\treturn aVal - bVal;\n\t\t}\n\t}\n\treturn 0;\n};\n\nexport const isVersionLessThan = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) < 0;\n};\n\nexport const isVersionGreaterOrEqual = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) >= 0;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors/elementor-error.ts","../src/errors/create-error.ts","../src/errors/ensure-error.ts","../src/use-debounce-state.ts","../src/debounce.ts","../src/throttle.ts","../src/encoding.ts","../src/hash.ts","../src/use-search-state.ts","../src/generate-unique-id.ts","../src/string-helpers.ts","../src/version.ts"],"sourcesContent":["export { ElementorError, createError, ensureError } from './errors';\nexport type { ElementorErrorOptions, CreateErrorParams } from './errors';\nexport { useDebounceState, type UseDebounceStateOptions, type UseDebounceStateResult } from './use-debounce-state';\nexport { debounce } from './debounce';\nexport { throttle } from './throttle';\nexport { encodeString, decodeString } from './encoding';\nexport { hash, hashString } from './hash';\nexport { useSearchState, type UseSearchStateResult } from './use-search-state';\nexport { generateUniqueId } from './generate-unique-id';\nexport { capitalize } from './string-helpers';\nexport { compareVersions, isVersionLessThan, isVersionGreaterOrEqual } from './version';\n","export type ElementorErrorOptions = {\n\tcause?: Error[ 'cause' ];\n\tcontext?: Record< string, unknown > | null;\n\tcode: string;\n};\n\nexport class ElementorError extends Error {\n\treadonly context: ElementorErrorOptions[ 'context' ];\n\treadonly code: ElementorErrorOptions[ 'code' ];\n\n\tconstructor( message: string, { code, context = null, cause = null }: ElementorErrorOptions ) {\n\t\tsuper( message, { cause } );\n\t\tthis.context = context;\n\t\tthis.code = code;\n\t}\n}\n","import { ElementorError, type ElementorErrorOptions } from './elementor-error';\n\nexport type CreateErrorParams = {\n\tcode: ElementorErrorOptions[ 'code' ];\n\tmessage: string;\n};\n\nexport const createError = < T extends ElementorErrorOptions[ 'context' ] >( { code, message }: CreateErrorParams ) => {\n\treturn class extends ElementorError {\n\t\tconstructor( { cause, context }: { cause?: ElementorErrorOptions[ 'cause' ]; context?: T } = {} ) {\n\t\t\tsuper( message, { cause, code, context } );\n\t\t}\n\t};\n};\n","export const ensureError = ( error: unknown ) => {\n\tif ( error instanceof Error ) {\n\t\treturn error;\n\t}\n\n\tlet message: string;\n\tlet cause: unknown = null;\n\n\ttry {\n\t\tmessage = JSON.stringify( error );\n\t} catch ( e ) {\n\t\tcause = e;\n\t\tmessage = 'Unable to stringify the thrown value';\n\t}\n\treturn new Error( `Unexpected non-error thrown: ${ message }`, { cause } );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type * as React from 'react';\n\nimport { debounce } from './debounce';\n\nexport type UseDebounceStateOptions = {\n\tdelay?: number;\n\tinitialValue?: string;\n};\n\nexport type UseDebounceStateResult = {\n\tdebouncedValue: string;\n\tinputValue: string;\n\thandleChange: ( val: string ) => void;\n\tsetInputValue: React.Dispatch< React.SetStateAction< string > >;\n};\n\nexport function useDebounceState( options: UseDebounceStateOptions = {} ): UseDebounceStateResult {\n\tconst { delay = 300, initialValue = '' } = options;\n\n\tconst [ debouncedValue, setDebouncedValue ] = useState( initialValue );\n\tconst [ inputValue, setInputValue ] = useState( initialValue );\n\n\tconst runRef = useRef< ReturnType< typeof debounce > | null >( null );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\trunRef.current?.cancel?.();\n\t\t};\n\t}, [] );\n\n\tconst debouncedSetValue = useCallback(\n\t\t( val: string ) => {\n\t\t\trunRef.current?.cancel?.();\n\t\t\trunRef.current = debounce( () => {\n\t\t\t\tsetDebouncedValue( val );\n\t\t\t}, delay );\n\t\t\trunRef.current();\n\t\t},\n\t\t[ delay ]\n\t);\n\n\tconst handleChange = ( val: string ) => {\n\t\tsetInputValue( val );\n\t\tdebouncedSetValue( val );\n\t};\n\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t\tsetInputValue,\n\t};\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce< TArgs extends any[] >( fn: ( ...args: TArgs ) => void, wait: number ) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\n\t\t\ttimer = null;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle< TArgs extends any[] >(\n\tfn: ( ...args: TArgs ) => void,\n\twait: number,\n\tshouldExecuteIgnoredCalls: boolean = false\n) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\tlet ignoredExecution: boolean = false;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tif ( timer ) {\n\t\t\tignoredExecution = true;\n\t\t\treturn;\n\t\t}\n\n\t\tfn( ...args );\n\n\t\ttimer = setTimeout( () => {\n\t\t\ttimer = null;\n\n\t\t\tif ( ignoredExecution && shouldExecuteIgnoredCalls ) {\n\t\t\t\tfn( ...args );\n\t\t\t}\n\n\t\t\tignoredExecution = false;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","export const encodeString = ( value: string ): string => {\n\tconst binary = Array.from( new TextEncoder().encode( value ), ( b ) => String.fromCharCode( b ) ).join( '' );\n\treturn btoa( binary );\n};\n\nexport const decodeString = < T = string >( value: string, fallback?: T ): string | T => {\n\ttry {\n\t\tconst binary = atob( value );\n\t\tconst bytes = new Uint8Array( Array.from( binary, ( char ) => char.charCodeAt( 0 ) ) );\n\t\treturn new TextDecoder().decode( bytes );\n\t} catch {\n\t\treturn fallback !== undefined ? fallback : '';\n\t}\n};\n","/* eslint-disable no-bitwise */\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nexport function hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n\n// Inspired by:\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nexport function hashString( str: string, length?: number ): string {\n\tlet hashBasis = 5381;\n\n\tlet i = str.length;\n\twhile ( i ) {\n\t\thashBasis = ( hashBasis * 33 ) ^ str.charCodeAt( --i );\n\t}\n\n\t/* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n\t * integers. Since we want the results to be always positive, convert the\n\t * signed int to an unsigned by doing an unsigned bitshift. */\n\tconst result = ( hashBasis >>> 0 ).toString( 36 );\n\n\tif ( length === undefined ) {\n\t\treturn result;\n\t}\n\n\tconst sliced = result.slice( -length );\n\treturn sliced.padStart( length, '0' );\n}\n","import { useDebounceState, type UseDebounceStateResult } from './use-debounce-state';\n\nexport type UseSearchStateResult = UseDebounceStateResult;\n\nexport function useSearchState( { localStorageKey }: { localStorageKey?: string } ) {\n\tconst getInitialSearchValue = () => {\n\t\tif ( localStorageKey ) {\n\t\t\tconst storedValue = localStorage.getItem( localStorageKey );\n\t\t\tif ( storedValue ) {\n\t\t\t\tlocalStorage.removeItem( localStorageKey );\n\t\t\t\treturn storedValue;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\tconst { debouncedValue, inputValue, handleChange } = useDebounceState( {\n\t\tdelay: 300,\n\t\tinitialValue: getInitialSearchValue(),\n\t} );\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t};\n}\n","export function generateUniqueId( prefix: string = '' ): string {\n\tconst prefixStr = prefix ? `${ prefix }-` : '';\n\n\treturn `${ prefixStr }${ Date.now() }-${ Math.random().toString( 36 ).substring( 2, 9 ) }`;\n}\n","export const capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n","export const compareVersions = ( a: string | number, b: string | number ): number => {\n\tconst aParts = String( a || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\tconst bParts = String( b || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\n\tfor ( let i = 0; i < Math.max( aParts.length, bParts.length ); i++ ) {\n\t\tconst aVal = aParts[ i ] || 0;\n\t\tconst bVal = bParts[ i ] || 0;\n\t\tif ( aVal !== bVal ) {\n\t\t\treturn aVal - bVal;\n\t\t}\n\t}\n\treturn 0;\n};\n\nexport const isVersionLessThan = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) < 0;\n};\n\nexport const isVersionGreaterOrEqual = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) >= 0;\n};\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -162,6 +162,19 @@ function hash(obj) {
162
162
  function isPlainObject(value) {
163
163
  return !!value && typeof value === "object" && !Array.isArray(value);
164
164
  }
165
+ function hashString(str, length) {
166
+ let hashBasis = 5381;
167
+ let i = str.length;
168
+ while (i) {
169
+ hashBasis = hashBasis * 33 ^ str.charCodeAt(--i);
170
+ }
171
+ const result = (hashBasis >>> 0).toString(36);
172
+ if (length === void 0) {
173
+ return result;
174
+ }
175
+ const sliced = result.slice(-length);
176
+ return sliced.padStart(length, "0");
177
+ }
165
178
 
166
179
  // src/use-search-state.ts
167
180
  function useSearchState({ localStorageKey }) {
@@ -227,6 +240,7 @@ export {
227
240
  ensureError,
228
241
  generateUniqueId,
229
242
  hash,
243
+ hashString,
230
244
  isVersionGreaterOrEqual,
231
245
  isVersionLessThan,
232
246
  throttle,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/elementor-error.ts","../src/errors/create-error.ts","../src/errors/ensure-error.ts","../src/use-debounce-state.ts","../src/debounce.ts","../src/throttle.ts","../src/encoding.ts","../src/hash.ts","../src/use-search-state.ts","../src/generate-unique-id.ts","../src/string-helpers.ts","../src/version.ts"],"sourcesContent":["export type ElementorErrorOptions = {\n\tcause?: Error[ 'cause' ];\n\tcontext?: Record< string, unknown > | null;\n\tcode: string;\n};\n\nexport class ElementorError extends Error {\n\treadonly context: ElementorErrorOptions[ 'context' ];\n\treadonly code: ElementorErrorOptions[ 'code' ];\n\n\tconstructor( message: string, { code, context = null, cause = null }: ElementorErrorOptions ) {\n\t\tsuper( message, { cause } );\n\t\tthis.context = context;\n\t\tthis.code = code;\n\t}\n}\n","import { ElementorError, type ElementorErrorOptions } from './elementor-error';\n\nexport type CreateErrorParams = {\n\tcode: ElementorErrorOptions[ 'code' ];\n\tmessage: string;\n};\n\nexport const createError = < T extends ElementorErrorOptions[ 'context' ] >( { code, message }: CreateErrorParams ) => {\n\treturn class extends ElementorError {\n\t\tconstructor( { cause, context }: { cause?: ElementorErrorOptions[ 'cause' ]; context?: T } = {} ) {\n\t\t\tsuper( message, { cause, code, context } );\n\t\t}\n\t};\n};\n","export const ensureError = ( error: unknown ) => {\n\tif ( error instanceof Error ) {\n\t\treturn error;\n\t}\n\n\tlet message: string;\n\tlet cause: unknown = null;\n\n\ttry {\n\t\tmessage = JSON.stringify( error );\n\t} catch ( e ) {\n\t\tcause = e;\n\t\tmessage = 'Unable to stringify the thrown value';\n\t}\n\treturn new Error( `Unexpected non-error thrown: ${ message }`, { cause } );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type * as React from 'react';\n\nimport { debounce } from './debounce';\n\nexport type UseDebounceStateOptions = {\n\tdelay?: number;\n\tinitialValue?: string;\n};\n\nexport type UseDebounceStateResult = {\n\tdebouncedValue: string;\n\tinputValue: string;\n\thandleChange: ( val: string ) => void;\n\tsetInputValue: React.Dispatch< React.SetStateAction< string > >;\n};\n\nexport function useDebounceState( options: UseDebounceStateOptions = {} ): UseDebounceStateResult {\n\tconst { delay = 300, initialValue = '' } = options;\n\n\tconst [ debouncedValue, setDebouncedValue ] = useState( initialValue );\n\tconst [ inputValue, setInputValue ] = useState( initialValue );\n\n\tconst runRef = useRef< ReturnType< typeof debounce > | null >( null );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\trunRef.current?.cancel?.();\n\t\t};\n\t}, [] );\n\n\tconst debouncedSetValue = useCallback(\n\t\t( val: string ) => {\n\t\t\trunRef.current?.cancel?.();\n\t\t\trunRef.current = debounce( () => {\n\t\t\t\tsetDebouncedValue( val );\n\t\t\t}, delay );\n\t\t\trunRef.current();\n\t\t},\n\t\t[ delay ]\n\t);\n\n\tconst handleChange = ( val: string ) => {\n\t\tsetInputValue( val );\n\t\tdebouncedSetValue( val );\n\t};\n\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t\tsetInputValue,\n\t};\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce< TArgs extends any[] >( fn: ( ...args: TArgs ) => void, wait: number ) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\n\t\t\ttimer = null;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle< TArgs extends any[] >(\n\tfn: ( ...args: TArgs ) => void,\n\twait: number,\n\tshouldExecuteIgnoredCalls: boolean = false\n) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\tlet ignoredExecution: boolean = false;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tif ( timer ) {\n\t\t\tignoredExecution = true;\n\t\t\treturn;\n\t\t}\n\n\t\tfn( ...args );\n\n\t\ttimer = setTimeout( () => {\n\t\t\ttimer = null;\n\n\t\t\tif ( ignoredExecution && shouldExecuteIgnoredCalls ) {\n\t\t\t\tfn( ...args );\n\t\t\t}\n\n\t\t\tignoredExecution = false;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","export const encodeString = ( value: string ): string => {\n\tconst binary = Array.from( new TextEncoder().encode( value ), ( b ) => String.fromCharCode( b ) ).join( '' );\n\treturn btoa( binary );\n};\n\nexport const decodeString = < T = string >( value: string, fallback?: T ): string | T => {\n\ttry {\n\t\tconst binary = atob( value );\n\t\tconst bytes = new Uint8Array( Array.from( binary, ( char ) => char.charCodeAt( 0 ) ) );\n\t\treturn new TextDecoder().decode( bytes );\n\t} catch {\n\t\treturn fallback !== undefined ? fallback : '';\n\t}\n};\n","type UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nexport function hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { useDebounceState, type UseDebounceStateResult } from './use-debounce-state';\n\nexport type UseSearchStateResult = UseDebounceStateResult;\n\nexport function useSearchState( { localStorageKey }: { localStorageKey?: string } ) {\n\tconst getInitialSearchValue = () => {\n\t\tif ( localStorageKey ) {\n\t\t\tconst storedValue = localStorage.getItem( localStorageKey );\n\t\t\tif ( storedValue ) {\n\t\t\t\tlocalStorage.removeItem( localStorageKey );\n\t\t\t\treturn storedValue;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\tconst { debouncedValue, inputValue, handleChange } = useDebounceState( {\n\t\tdelay: 300,\n\t\tinitialValue: getInitialSearchValue(),\n\t} );\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t};\n}\n","export function generateUniqueId( prefix: string = '' ): string {\n\tconst prefixStr = prefix ? `${ prefix }-` : '';\n\n\treturn `${ prefixStr }${ Date.now() }-${ Math.random().toString( 36 ).substring( 2, 9 ) }`;\n}\n","export const capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n","export const compareVersions = ( a: string | number, b: string | number ): number => {\n\tconst aParts = String( a || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\tconst bParts = String( b || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\n\tfor ( let i = 0; i < Math.max( aParts.length, bParts.length ); i++ ) {\n\t\tconst aVal = aParts[ i ] || 0;\n\t\tconst bVal = bParts[ i ] || 0;\n\t\tif ( aVal !== bVal ) {\n\t\t\treturn aVal - bVal;\n\t\t}\n\t}\n\treturn 0;\n};\n\nexport const isVersionLessThan = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) < 0;\n};\n\nexport const isVersionGreaterOrEqual = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) >= 0;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors/elementor-error.ts","../src/errors/create-error.ts","../src/errors/ensure-error.ts","../src/use-debounce-state.ts","../src/debounce.ts","../src/throttle.ts","../src/encoding.ts","../src/hash.ts","../src/use-search-state.ts","../src/generate-unique-id.ts","../src/string-helpers.ts","../src/version.ts"],"sourcesContent":["export type ElementorErrorOptions = {\n\tcause?: Error[ 'cause' ];\n\tcontext?: Record< string, unknown > | null;\n\tcode: string;\n};\n\nexport class ElementorError extends Error {\n\treadonly context: ElementorErrorOptions[ 'context' ];\n\treadonly code: ElementorErrorOptions[ 'code' ];\n\n\tconstructor( message: string, { code, context = null, cause = null }: ElementorErrorOptions ) {\n\t\tsuper( message, { cause } );\n\t\tthis.context = context;\n\t\tthis.code = code;\n\t}\n}\n","import { ElementorError, type ElementorErrorOptions } from './elementor-error';\n\nexport type CreateErrorParams = {\n\tcode: ElementorErrorOptions[ 'code' ];\n\tmessage: string;\n};\n\nexport const createError = < T extends ElementorErrorOptions[ 'context' ] >( { code, message }: CreateErrorParams ) => {\n\treturn class extends ElementorError {\n\t\tconstructor( { cause, context }: { cause?: ElementorErrorOptions[ 'cause' ]; context?: T } = {} ) {\n\t\t\tsuper( message, { cause, code, context } );\n\t\t}\n\t};\n};\n","export const ensureError = ( error: unknown ) => {\n\tif ( error instanceof Error ) {\n\t\treturn error;\n\t}\n\n\tlet message: string;\n\tlet cause: unknown = null;\n\n\ttry {\n\t\tmessage = JSON.stringify( error );\n\t} catch ( e ) {\n\t\tcause = e;\n\t\tmessage = 'Unable to stringify the thrown value';\n\t}\n\treturn new Error( `Unexpected non-error thrown: ${ message }`, { cause } );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type * as React from 'react';\n\nimport { debounce } from './debounce';\n\nexport type UseDebounceStateOptions = {\n\tdelay?: number;\n\tinitialValue?: string;\n};\n\nexport type UseDebounceStateResult = {\n\tdebouncedValue: string;\n\tinputValue: string;\n\thandleChange: ( val: string ) => void;\n\tsetInputValue: React.Dispatch< React.SetStateAction< string > >;\n};\n\nexport function useDebounceState( options: UseDebounceStateOptions = {} ): UseDebounceStateResult {\n\tconst { delay = 300, initialValue = '' } = options;\n\n\tconst [ debouncedValue, setDebouncedValue ] = useState( initialValue );\n\tconst [ inputValue, setInputValue ] = useState( initialValue );\n\n\tconst runRef = useRef< ReturnType< typeof debounce > | null >( null );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\trunRef.current?.cancel?.();\n\t\t};\n\t}, [] );\n\n\tconst debouncedSetValue = useCallback(\n\t\t( val: string ) => {\n\t\t\trunRef.current?.cancel?.();\n\t\t\trunRef.current = debounce( () => {\n\t\t\t\tsetDebouncedValue( val );\n\t\t\t}, delay );\n\t\t\trunRef.current();\n\t\t},\n\t\t[ delay ]\n\t);\n\n\tconst handleChange = ( val: string ) => {\n\t\tsetInputValue( val );\n\t\tdebouncedSetValue( val );\n\t};\n\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t\tsetInputValue,\n\t};\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce< TArgs extends any[] >( fn: ( ...args: TArgs ) => void, wait: number ) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\n\t\t\ttimer = null;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle< TArgs extends any[] >(\n\tfn: ( ...args: TArgs ) => void,\n\twait: number,\n\tshouldExecuteIgnoredCalls: boolean = false\n) {\n\tlet timer: ReturnType< typeof setTimeout > | null = null;\n\tlet ignoredExecution: boolean = false;\n\n\tconst cancel = () => {\n\t\tif ( ! timer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( timer );\n\t\ttimer = null;\n\t};\n\n\tconst flush = ( ...args: TArgs ) => {\n\t\tcancel();\n\n\t\tfn( ...args );\n\t};\n\n\tconst run = ( ...args: TArgs ) => {\n\t\tif ( timer ) {\n\t\t\tignoredExecution = true;\n\t\t\treturn;\n\t\t}\n\n\t\tfn( ...args );\n\n\t\ttimer = setTimeout( () => {\n\t\t\ttimer = null;\n\n\t\t\tif ( ignoredExecution && shouldExecuteIgnoredCalls ) {\n\t\t\t\tfn( ...args );\n\t\t\t}\n\n\t\t\tignoredExecution = false;\n\t\t}, wait );\n\t};\n\n\tconst pending = () => !! timer;\n\n\trun.flush = flush;\n\trun.cancel = cancel;\n\trun.pending = pending;\n\n\treturn run;\n}\n","export const encodeString = ( value: string ): string => {\n\tconst binary = Array.from( new TextEncoder().encode( value ), ( b ) => String.fromCharCode( b ) ).join( '' );\n\treturn btoa( binary );\n};\n\nexport const decodeString = < T = string >( value: string, fallback?: T ): string | T => {\n\ttry {\n\t\tconst binary = atob( value );\n\t\tconst bytes = new Uint8Array( Array.from( binary, ( char ) => char.charCodeAt( 0 ) ) );\n\t\treturn new TextDecoder().decode( bytes );\n\t} catch {\n\t\treturn fallback !== undefined ? fallback : '';\n\t}\n};\n","/* eslint-disable no-bitwise */\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nexport function hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n\n// Inspired by:\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nexport function hashString( str: string, length?: number ): string {\n\tlet hashBasis = 5381;\n\n\tlet i = str.length;\n\twhile ( i ) {\n\t\thashBasis = ( hashBasis * 33 ) ^ str.charCodeAt( --i );\n\t}\n\n\t/* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n\t * integers. Since we want the results to be always positive, convert the\n\t * signed int to an unsigned by doing an unsigned bitshift. */\n\tconst result = ( hashBasis >>> 0 ).toString( 36 );\n\n\tif ( length === undefined ) {\n\t\treturn result;\n\t}\n\n\tconst sliced = result.slice( -length );\n\treturn sliced.padStart( length, '0' );\n}\n","import { useDebounceState, type UseDebounceStateResult } from './use-debounce-state';\n\nexport type UseSearchStateResult = UseDebounceStateResult;\n\nexport function useSearchState( { localStorageKey }: { localStorageKey?: string } ) {\n\tconst getInitialSearchValue = () => {\n\t\tif ( localStorageKey ) {\n\t\t\tconst storedValue = localStorage.getItem( localStorageKey );\n\t\t\tif ( storedValue ) {\n\t\t\t\tlocalStorage.removeItem( localStorageKey );\n\t\t\t\treturn storedValue;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\tconst { debouncedValue, inputValue, handleChange } = useDebounceState( {\n\t\tdelay: 300,\n\t\tinitialValue: getInitialSearchValue(),\n\t} );\n\treturn {\n\t\tdebouncedValue,\n\t\tinputValue,\n\t\thandleChange,\n\t};\n}\n","export function generateUniqueId( prefix: string = '' ): string {\n\tconst prefixStr = prefix ? `${ prefix }-` : '';\n\n\treturn `${ prefixStr }${ Date.now() }-${ Math.random().toString( 36 ).substring( 2, 9 ) }`;\n}\n","export const capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n","export const compareVersions = ( a: string | number, b: string | number ): number => {\n\tconst aParts = String( a || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\tconst bParts = String( b || '0.0.0' )\n\t\t.split( '.' )\n\t\t.map( Number );\n\n\tfor ( let i = 0; i < Math.max( aParts.length, bParts.length ); i++ ) {\n\t\tconst aVal = aParts[ i ] || 0;\n\t\tconst bVal = bParts[ i ] || 0;\n\t\tif ( aVal !== bVal ) {\n\t\t\treturn aVal - bVal;\n\t\t}\n\t}\n\treturn 0;\n};\n\nexport const isVersionLessThan = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) < 0;\n};\n\nexport const isVersionGreaterOrEqual = ( a: string | number, b: string | number ): boolean => {\n\treturn compareVersions( a, b ) >= 0;\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/utils",
3
3
  "description": "This package contains utility functions that are being used across the Elementor packages",
4
- "version": "4.0.0-573",
4
+ "version": "4.0.0-597",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
package/src/hash.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-bitwise */
1
2
  type UnknownObject = Record< string, unknown >;
2
3
 
3
4
  // Inspired by:
@@ -19,3 +20,26 @@ export function hash( obj: UnknownObject ): string {
19
20
  function isPlainObject( value: unknown ): value is UnknownObject {
20
21
  return !! value && typeof value === 'object' && ! Array.isArray( value );
21
22
  }
23
+
24
+ // Inspired by:
25
+ // https://github.com/darkskyapp/string-hash/blob/master/index.js
26
+ export function hashString( str: string, length?: number ): string {
27
+ let hashBasis = 5381;
28
+
29
+ let i = str.length;
30
+ while ( i ) {
31
+ hashBasis = ( hashBasis * 33 ) ^ str.charCodeAt( --i );
32
+ }
33
+
34
+ /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed
35
+ * integers. Since we want the results to be always positive, convert the
36
+ * signed int to an unsigned by doing an unsigned bitshift. */
37
+ const result = ( hashBasis >>> 0 ).toString( 36 );
38
+
39
+ if ( length === undefined ) {
40
+ return result;
41
+ }
42
+
43
+ const sliced = result.slice( -length );
44
+ return sliced.padStart( length, '0' );
45
+ }
package/src/index.ts CHANGED
@@ -4,7 +4,7 @@ export { useDebounceState, type UseDebounceStateOptions, type UseDebounceStateRe
4
4
  export { debounce } from './debounce';
5
5
  export { throttle } from './throttle';
6
6
  export { encodeString, decodeString } from './encoding';
7
- export { hash } from './hash';
7
+ export { hash, hashString } from './hash';
8
8
  export { useSearchState, type UseSearchStateResult } from './use-search-state';
9
9
  export { generateUniqueId } from './generate-unique-id';
10
10
  export { capitalize } from './string-helpers';