@entur/utils 1.0.0-alpha.0 → 1.0.0-next.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.esm.js","sources":["../src/useDebounce.ts","../src/useRandomId.ts","../src/useOnMount.ts","../src/mergeRefs.ts","../src/useForceUpdate.ts","../src/useOnClickOutside.ts","../src/useOnEscape.ts","../src/useWindowDimensions.ts","../src/ConditionalWrapper.tsx","../src/warnAboutMissingStyles.ts","../src/getNodeText.ts","../src/consentUtils.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: any[]) => any>(\n callBack: T,\n debounceTime: number,\n) {\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const debouncedFunc = (...args: any[]) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callBack(...args);\n }, debounceTime);\n };\n\n return debouncedFunc as T;\n}\n","import React from 'react';\n\nexport const useRandomId = (prefix?: string): string => {\n const ref = React.useRef(String(Math.random()).substring(2));\n return `${prefix}-${ref.current}`;\n};\n","import React from 'react';\n\nexport function useOnMount(callback: () => void): void {\n const hasRun = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!hasRun.current) {\n hasRun.current = true;\n callback();\n }\n }, [callback]);\n}\n","export const mergeRefs = <T extends HTMLElement>(\n ...refs: (\n | React.MutableRefObject<T>\n | React.ForwardedRef<T>\n | ((node: T | null) => void)\n | undefined\n )[]\n) => {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) ref.current = node;\n }\n };\n};\n","import { useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [_, setValue] = useState(0);\n return () => setValue(value => value + 1);\n};\n","import React, { useEffect } from 'react';\n\nexport const useOnClickOutside = (\n refs: (React.RefObject<HTMLElement> | React.MutableRefObject<any>)[],\n handler: () => void,\n) => {\n useEffect(() => {\n const listener = (event: Event) => {\n // If the ref contains the clicked element, then the click is not outside\n if (refs.some(ref => elementContainsEventTarget(ref.current, event))) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [refs, handler]);\n};\n\nconst elementContainsEventTarget = (\n element: HTMLElement | null,\n event: Event,\n) => {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains ? true : false;\n }\n\n return false;\n};\n","import React, { useEffect } from 'react';\n\nexport const useOnEscape = (\n ref: React.RefObject<any> | React.MutableRefObject<any>,\n handler: () => void,\n) => {\n useEffect(() => {\n const runIfKeyIsEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') handler();\n };\n\n const currentRef = ref.current;\n currentRef?.addEventListener('keydown', runIfKeyIsEscape);\n\n return () => currentRef?.removeEventListener('keydown', runIfKeyIsEscape);\n }, [ref, handler]);\n};\n","// from https://stackoverflow.com/questions/36862334/get-viewport-window-height-in-reactjs\nimport { useState, useEffect } from 'react';\n\ntype WindowDimensions = {\n width: number | undefined;\n height: number | undefined;\n};\n\nconst getWindowDimensions = () => {\n if (typeof window === 'undefined')\n return { width: undefined, height: undefined };\n\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n};\n\nexport const useWindowDimensions = (): WindowDimensions => {\n const [windowDimensions, setWindowDimensions] = useState(\n getWindowDimensions(),\n );\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }\n }, []);\n\n return windowDimensions;\n};\n","import React from 'react';\n\ntype ConditionalWrapperType = {\n condition: boolean;\n wrapper: any;\n children: any;\n};\n\nexport const ConditionalWrapper = ({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperType) => (condition ? wrapper(children) : <>{children}</>);\n","import warning from 'tiny-warning';\n\nconst packagesToCheck: Set<string> = new Set();\nlet checkTimeoutId: number;\n\nfunction checkAndWarn() {\n const missingImports = Array.from(packagesToCheck)\n .filter(\n namespace =>\n parseInt(\n window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(`--eds-${namespace}`),\n ) !== 1,\n )\n .sort();\n\n // Finally, we warn about those pesky imports\n const singleMissingImport = missingImports.length === 1;\n warning(\n missingImports.length === 0,\n `You are missing ${\n singleMissingImport\n ? 'a CSS import'\n : `${missingImports.length} CSS imports`\n }!\n\nPlease add the following CSS import${\n singleMissingImport ? '' : 's'\n } somewhere in your app:\n\n${missingImports\n .map(namespace => `\\t@import '@entur/${namespace}/dist/styles.css';`)\n .join('\\n')}\n`,\n );\n}\n\n/** Warns the developer if they have forgotten to include styles */\nexport function warnAboutMissingStyles(...namespaces: string[]): void {\n // We skip this check in production, and when we build static sites\n if (\n !__DEV__ ||\n typeof window === 'undefined' ||\n (typeof process !== 'undefined' && process?.env?.TEST === 'true')\n ) {\n return;\n }\n // First, let's clear earlier calls to setTimeout\n window.clearTimeout(checkTimeoutId);\n\n // Next, let's add all namespaces to the set of packages to check\n namespaces.forEach(namespace => packagesToCheck.add(namespace));\n\n // Finally. let's trigger a run of the checker.\n checkTimeoutId = window.setTimeout(checkAndWarn, 1000);\n}\n","// with inspiration from https://stackoverflow.com/questions/50428910/get-text-content-from-node-in-react\nexport const getNodeText = (\n node: React.ReactNode | string | number | string[] | number[],\n): string => {\n if (node === null || node === undefined) return '';\n if (['string', 'number'].includes(typeof node)) return node.toString();\n if (node instanceof Array) return node.map(getNodeText).join('').trim();\n if (typeof node === 'object')\n // @ts-expect-error props does exist for react nodes\n return getNodeText(node.props?.children ?? '').trim();\n return 'unknown';\n};\n","import { fontSizes, lineHeights, shadows, space } from '@entur/tokens';\nimport { ConsentDetails } from './types';\n\nexport const CMP_INITIALIZE_EVENT = 'UC_UI_INITIALIZED';\nexport const CONSENT_UPDATED_EVENT = 'UC_CONSENT';\nconst CMP_SHADOW_ROOT_ID = 'usercentrics-cmp-ui';\n\ntype Consents =\n | {\n id: string;\n name: string;\n consentGiven: boolean;\n category: string;\n }[]\n | undefined;\n\nconst acceptAllConsents = () => window.__ucCmp.acceptAllConsents();\nconst denyAllConsents = () => window.__ucCmp.denyAllConsents();\nconst updateServicesConsents = (serviceConsents: {\n id: string;\n consent: boolean;\n}) => window.__ucCmp.updateServicesConsents(serviceConsents);\nconst changeLanguage = (language: string) =>\n window.__ucCmp.changeLanguage(language);\nconst showCookieBanner = () => window.__ucCmp.showFirstLayer();\nconst hideCookieBanner = () => window.__ucCmp.closeCmp();\n\nasync function styleCookieBanner() {\n await waitForElementWithId(CMP_SHADOW_ROOT_ID);\n const cmpElement = document.getElementById(\n CMP_SHADOW_ROOT_ID,\n ) as HTMLElement | null;\n console.log('cmp', cmpElement);\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(cmpStyleSheet);\n cmpElement?.shadowRoot?.adoptedStyleSheets.push(sheet);\n}\n\nfunction formatConsentEvent(\n event: Event & { detail?: ConsentDetails },\n): Consents {\n return Object.entries(event?.detail?.services ?? {}).map(service => {\n return {\n id: service[0],\n name: service[1].name,\n consentGiven: service[1].consent?.given ?? false,\n category: service[1].category,\n };\n });\n}\n\nexport const cookieBanner = {\n acceptAllConsents,\n denyAllConsents,\n updateServicesConsents,\n changeLanguage,\n showCookieBanner,\n hideCookieBanner,\n eventListner: {\n CONSENT_UPDATED_EVENT,\n CMP_INITIALIZE_EVENT,\n },\n formatConsentEvent,\n};\n\nif (typeof window !== 'undefined') styleCookieBanner();\n\n/** Utils */\n\n// Returns true when element with id is available in the DOM\nexport async function waitForElementWithId(selector: string) {\n return new Promise(resolve => {\n const observer = new MutationObserver((_, observer) => {\n const element = document.querySelector('#' + selector);\n if (element) {\n observer.disconnect();\n resolve(true);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n}\n\n/** Stylesheet for CookieBanner */\n\nexport const cmpStyleSheet = `\n .cmp-wrapper.cmp-wrapper.cmp-wrapper { \n width: 100%;\n\n .cmp:not(.second) {\n padding: ${space.rem.large}rem calc((100dvw - 54rem) / 2);\n border-radius: unset;\n box-shadow: ${shadows.cardShadow};\n\n .language-selector-menu {\n right: calc((100dvw - 64rem) / 2);\n }\n } \n\n .privacy-title {\n font-size: ${fontSizes.rem.extraLarge2}rem;\n }\n .privacy-text {\n font-size: ${fontSizes.rem.large}rem;\n line-height: ${lineHeights.rem.large}rem;\n }\n\n\n .buttons-row {\n justify-content: flex-end;\n }\n\n button[data-action=\"consent\"] {\n flex-grow: unset;\n flex-basis: unset;\n width: fit-content;\n min-width: 9.5rem;\n height: 3rem;\n cursor: pointer;\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 500;\n \n &[data-action-type=\"accept\"] {\n background-color: var(--components-button-primary-contrast-default);\n color: var(--components-button-primary-contrast-text);\n\n &:hover {\n background-color: var(--components-button-primary-contrast-hover);\n }\n }\n \n &[data-action-type=\"more\"],\n &[data-action-type=\"deny\"] {\n background-color: transparent;\n color: var(--components-button-secondary-contrast-text);\n border: 2px solid var(--components-button-secondary-contrast-border);\n\n &:hover {\n background-color: var(--components-button-secondary-contrast-hover);\n }\n }\n }\n\n .poweredBy {\n display: none;\n }\n }\n`;\n"],"names":["useDebounce","callBack","debounceTime","timeoutRef","useRef","useEffect","current","clearTimeout","debouncedFunc","args","setTimeout","useRandomId","prefix","ref","React","String","Math","random","substring","useOnMount","callback","hasRun","mergeRefs","refs","node","useForceUpdate","useState","setValue","value","useOnClickOutside","handler","listener","event","some","elementContainsEventTarget","document","addEventListener","removeEventListener","element","contains","target","composed","composedPath","find","window","useOnEscape","runIfKeyIsEscape","key","currentRef","getWindowDimensions","width","undefined","height","innerWidth","innerHeight","useWindowDimensions","windowDimensions","setWindowDimensions","handleResize","ConditionalWrapper","condition","wrapper","children","createElement","Fragment","packagesToCheck","Set","checkTimeoutId","checkAndWarn","missingImports","Array","from","filter","namespace","parseInt","getComputedStyle","documentElement","getPropertyValue","sort","singleMissingImport","length","warning","map","join","warnAboutMissingStyles","process","env","TEST","namespaces","forEach","add","getNodeText","includes","toString","trim","props","CMP_INITIALIZE_EVENT","CONSENT_UPDATED_EVENT","CMP_SHADOW_ROOT_ID","acceptAllConsents","__ucCmp","denyAllConsents","updateServicesConsents","serviceConsents","changeLanguage","language","showCookieBanner","showFirstLayer","hideCookieBanner","closeCmp","styleCookieBanner","waitForElementWithId","cmpElement","getElementById","console","log","sheet","CSSStyleSheet","replaceSync","cmpStyleSheet","shadowRoot","adoptedStyleSheets","push","formatConsentEvent","Object","entries","detail","services","service","id","name","consentGiven","consent","given","category","cookieBanner","eventListner","selector","Promise","resolve","observer","MutationObserver","_","querySelector","disconnect","observe","body","childList","subtree","space","rem","large","shadows","cardShadow","fontSizes","extraLarge2","lineHeights"],"mappings":"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"}
1
+ {"version":3,"file":"utils.esm.js","sources":["../src/useDebounce.ts","../src/useRandomId.ts","../src/useOnMount.ts","../src/mergeRefs.ts","../src/useForceUpdate.ts","../src/useOnClickOutside.ts","../src/useOnEscape.ts","../src/useWindowDimensions.ts","../src/ConditionalWrapper.tsx","../src/warnAboutMissingStyles.ts","../src/getNodeText.ts","../src/useControllableProp.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: any[]) => any>(\n callBack: T,\n debounceTime: number,\n) {\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const debouncedFunc = (...args: any[]) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callBack(...args);\n }, debounceTime);\n };\n\n return debouncedFunc as T;\n}\n","import { useId } from 'react';\n\n/**\n * @deprecated Use `useId()` from React directly instead.\n * Will be removed in a future major version.\n *\n * ```diff\n * - import { useRandomId } from '@entur/utils';\n * - const id = useRandomId('eds-my-component');\n * + import { useId } from 'react';\n * + const id = `eds-my-component${useId()}`;\n * ```\n */\nexport const useRandomId = (prefix?: string): string => {\n const id = useId();\n return prefix ? `${prefix}${id}` : id;\n};\n","import React from 'react';\n\nexport function useOnMount(callback: () => void): void {\n const hasRun = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!hasRun.current) {\n hasRun.current = true;\n callback();\n }\n }, [callback]);\n}\n","export const mergeRefs = <T extends HTMLElement>(\n ...refs: (\n | React.MutableRefObject<T>\n | React.ForwardedRef<T>\n | ((node: T | null) => void)\n | undefined\n )[]\n) => {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) ref.current = node;\n }\n };\n};\n","import { useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [_, setValue] = useState(0);\n return () => setValue(value => value + 1);\n};\n","import React, { useEffect } from 'react';\n\nexport const useOnClickOutside = (\n refs: (React.RefObject<HTMLElement> | React.MutableRefObject<any>)[],\n handler: () => void,\n) => {\n useEffect(() => {\n const listener = (event: Event) => {\n // If the ref contains the clicked element, then the click is not outside\n if (refs.some(ref => elementContainsEventTarget(ref.current, event))) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [refs, handler]);\n};\n\nconst elementContainsEventTarget = (\n element: HTMLElement | null,\n event: Event,\n) => {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains;\n }\n\n return false;\n};\n","import React, { useEffect } from 'react';\n\nexport const useOnEscape = (\n ref: React.RefObject<any> | React.MutableRefObject<any>,\n handler: () => void,\n) => {\n useEffect(() => {\n const runIfKeyIsEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') handler();\n };\n\n const currentRef = ref.current;\n currentRef?.addEventListener('keydown', runIfKeyIsEscape);\n\n return () => currentRef?.removeEventListener('keydown', runIfKeyIsEscape);\n }, [ref, handler]);\n};\n","import { useSyncExternalStore } from 'react';\n\ntype WindowDimensions = {\n width: number | undefined;\n height: number | undefined;\n};\n\nconst subscribe = (callback: () => void) => {\n window.addEventListener('resize', callback);\n return () => window.removeEventListener('resize', callback);\n};\n\nlet cachedSnapshot: WindowDimensions = { width: undefined, height: undefined };\n\nconst getSnapshot = (): WindowDimensions => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n if (cachedSnapshot.width !== width || cachedSnapshot.height !== height) {\n cachedSnapshot = { width, height };\n }\n return cachedSnapshot;\n};\n\nconst serverSnapshot: WindowDimensions = {\n width: undefined,\n height: undefined,\n};\nconst getServerSnapshot = () => serverSnapshot;\n\nexport const useWindowDimensions = (): WindowDimensions => {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n};\n","type ConditionalWrapperType = {\n condition: boolean;\n wrapper: any;\n children: any;\n};\n\nexport const ConditionalWrapper = ({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperType) => (condition ? wrapper(children) : children);\n","import warning from 'tiny-warning';\n\nconst packagesToCheck: Set<string> = new Set();\nlet checkTimeoutId: number;\n\nfunction checkAndWarn() {\n const missingImports = Array.from(packagesToCheck)\n .filter(\n namespace =>\n parseInt(\n window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(`--eds-${namespace}`),\n ) !== 1,\n )\n .sort();\n\n // Finally, we warn about those pesky imports\n const singleMissingImport = missingImports.length === 1;\n warning(\n missingImports.length === 0,\n `You are missing ${\n singleMissingImport\n ? 'a CSS import'\n : `${missingImports.length} CSS imports`\n }!\n\nPlease add the following CSS import${\n singleMissingImport ? '' : 's'\n } somewhere in your app:\n\n${missingImports\n .map(namespace => `\\t@import '@entur/${namespace}/dist/styles.css';`)\n .join('\\n')}\n`,\n );\n}\n\n/** Warns the developer if they have forgotten to include styles */\nexport function warnAboutMissingStyles(...namespaces: string[]): void {\n // We skip this check in production, and when we build static sites\n if (\n typeof window === 'undefined' ||\n (typeof process !== 'undefined' && process?.env?.TEST === 'true') ||\n (typeof process !== 'undefined' && process?.env?.NODE_ENV === 'production')\n ) {\n return;\n }\n // First, let's clear earlier calls to setTimeout\n window.clearTimeout(checkTimeoutId);\n\n // Next, let's add all namespaces to the set of packages to check\n namespaces.forEach(namespace => packagesToCheck.add(namespace));\n\n // Finally. let's trigger a run of the checker.\n checkTimeoutId = window.setTimeout(checkAndWarn, 1000);\n}\n","// with inspiration from https://stackoverflow.com/questions/50428910/get-text-content-from-node-in-react\nexport const getNodeText = (\n node: React.ReactNode | string | number | string[] | number[],\n): string => {\n if (node === null || node === undefined) return '';\n if (['string', 'number'].includes(typeof node)) return node.toString();\n if (node instanceof Array) return node.map(getNodeText).join('').trim();\n if (typeof node === 'object')\n // @ts-expect-error props does exist for react nodes\n return getNodeText(node.props?.children ?? '').trim();\n return 'unknown';\n};\n","import { useEffect, useState } from 'react';\nexport type UseControllablePropType<T> = {\n prop?: T;\n updater?: (value?: T) => void;\n defaultValue: T;\n};\nexport function useControllableProp<T>({\n prop,\n updater = () => undefined,\n defaultValue,\n}: UseControllablePropType<T>): [T, (arg: T) => void] {\n const [internalState, setInternalState] = useState<T>(defaultValue);\n useEffect(() => {\n if (prop !== undefined) {\n setInternalState(prop);\n }\n }, [prop]);\n return prop === undefined\n ? [internalState, setInternalState]\n : [prop, updater];\n}\n"],"names":[],"mappings":";;AAEO,SAAS,YACd,UACA,cACA;AACA,QAAM,aAAa,OAAA;AAEnB,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,gBAAgB,IAAI,SAAgB;AACxC,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IACjC;AAEA,eAAW,UAAU,WAAW,MAAM;AACpC,eAAS,GAAG,IAAI;AAAA,IAClB,GAAG,YAAY;AAAA,EACjB;AAEA,SAAO;AACT;ACdO,MAAM,cAAc,CAAC,WAA4B;AACtD,QAAM,KAAK,MAAA;AACX,SAAO,SAAS,GAAG,MAAM,GAAG,EAAE,KAAK;AACrC;ACdO,SAAS,WAAW,UAA4B;AACrD,QAAM,SAAS,MAAM,OAAgB,KAAK;AAE1C,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,UAAU;AACjB,eAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACf;ACXO,MAAM,YAAY,IACpB,SAMA;AACH,SAAO,CAAC,SAAY;AAClB,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,IAAI;AAAA,MACV,WAAW,IAAK,KAAI,UAAU;AAAA,IAChC;AAAA,EACF;AACF;ACbO,MAAM,iBAAiB,MAAM;AAClC,QAAM,CAAC,GAAG,QAAQ,IAAI,SAAS,CAAC;AAChC,SAAO,MAAM,SAAS,CAAA,UAAS,QAAQ,CAAC;AAC1C;ACHO,MAAM,oBAAoB,CAC/B,MACA,YACG;AACH,YAAU,MAAM;AACd,UAAM,WAAW,CAAC,UAAiB;AAEjC,UAAI,KAAK,KAAK,CAAA,QAAO,2BAA2B,IAAI,SAAS,KAAK,CAAC,GAAG;AACpE;AAAA,MACF;AAEA,cAAA;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,QAAQ;AAC/C,aAAS,iBAAiB,cAAc,QAAQ;AAEhD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,QAAQ;AAClD,eAAS,oBAAoB,cAAc,QAAQ;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AACpB;AAEA,MAAM,6BAA6B,CACjC,SACA,UACG;AACH,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC1C,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,YAAY,MAAM,cAAc;AACxC,UAAM,WAAW,MAAM,aAAA,EAAe,KAAK,CAAA,WAAU;AACnD,UAAI,WAAW,QAAQ;AACrB,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,SAAS,MAAc;AAAA,IACxC,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AChDO,MAAM,cAAc,CACzB,KACA,YACG;AACH,YAAU,MAAM;AACd,UAAM,mBAAmB,CAAC,UAAyB;AACjD,UAAI,MAAM,QAAQ,SAAU,SAAA;AAAA,IAC9B;AAEA,UAAM,aAAa,IAAI;AACvB,gBAAY,iBAAiB,WAAW,gBAAgB;AAExD,WAAO,MAAM,YAAY,oBAAoB,WAAW,gBAAgB;AAAA,EAC1E,GAAG,CAAC,KAAK,OAAO,CAAC;AACnB;ACTA,MAAM,YAAY,CAAC,aAAyB;AAC1C,SAAO,iBAAiB,UAAU,QAAQ;AAC1C,SAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAC5D;AAEA,IAAI,iBAAmC,EAAE,OAAO,QAAW,QAAQ,OAAA;AAEnE,MAAM,cAAc,MAAwB;AAC1C,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,OAAO;AACtB,MAAI,eAAe,UAAU,SAAS,eAAe,WAAW,QAAQ;AACtE,qBAAiB,EAAE,OAAO,OAAA;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,MAAM,iBAAmC;AAAA,EACvC,OAAO;AAAA,EACP,QAAQ;AACV;AACA,MAAM,oBAAoB,MAAM;AAEzB,MAAM,sBAAsB,MAAwB;AACzD,SAAO,qBAAqB,WAAW,aAAa,iBAAiB;AACvE;ACzBO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,MAA+B,YAAY,QAAQ,QAAQ,IAAI;ACR/D,MAAM,sCAAmC,IAAA;AACzC,IAAI;AAEJ,SAAS,eAAe;AACtB,QAAM,iBAAiB,MAAM,KAAK,eAAe,EAC9C;AAAA,IACC,CAAA,cACE;AAAA,MACE,OACG,iBAAiB,SAAS,eAAe,EACzC,iBAAiB,SAAS,SAAS,EAAE;AAAA,IAAA,MACpC;AAAA,EAAA,EAET,KAAA;AAGH,QAAM,sBAAsB,eAAe,WAAW;AACtD;AAAA,IACE,eAAe,WAAW;AAAA,IAC1B,mBACE,sBACI,iBACA,GAAG,eAAe,MAAM,cAC9B;AAAA;AAAA,qCAGE,sBAAsB,KAAK,GAC7B;AAAA;AAAA,EAEF,eACC,IAAI,CAAA,cAAa,oBAAqB,SAAS,oBAAoB,EACnE,KAAK,IAAI,CAAC;AAAA;AAAA,EAAA;AAGb;AAGO,SAAS,0BAA0B,YAA4B;AAEpE,MACE,OAAO,WAAW,eACjB,OAAO,YAAY,eAAe,SAAS,KAAK,SAAS,UACzD,OAAO,YAAY,eAAe,SAAS,KAAK,aAAa,cAC9D;AACA;AAAA,EACF;AAEA,SAAO,aAAa,cAAc;AAGlC,aAAW,QAAQ,CAAA,cAAa,gBAAgB,IAAI,SAAS,CAAC;AAG9D,mBAAiB,OAAO,WAAW,cAAc,GAAI;AACvD;ACvDO,MAAM,cAAc,CACzB,SACW;AACX,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAO,IAAI,EAAG,QAAO,KAAK,SAAA;AAC5D,MAAI,gBAAgB,MAAO,QAAO,KAAK,IAAI,WAAW,EAAE,KAAK,EAAE,EAAE,KAAA;AACjE,MAAI,OAAO,SAAS;AAElB,WAAO,YAAY,KAAK,OAAO,YAAY,EAAE,EAAE,KAAA;AACjD,SAAO;AACT;ACLO,SAAS,oBAAuB;AAAA,EACrC;AAAA,EACA,UAAU,MAAM;AAAA,EAChB;AACF,GAAsD;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAY,YAAY;AAClE,YAAU,MAAM;AACd,QAAI,SAAS,QAAW;AACtB,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACT,SAAO,SAAS,SACZ,CAAC,eAAe,gBAAgB,IAChC,CAAC,MAAM,OAAO;AACpB;"}
package/package.json CHANGED
@@ -1,10 +1,24 @@
1
1
  {
2
2
  "name": "@entur/utils",
3
- "version": "1.0.0-alpha.0",
3
+ "version": "1.0.0-next.0",
4
4
  "license": "EUPL-1.2",
5
- "main": "dist/index.js",
5
+ "main": "dist/utils.cjs.js",
6
6
  "module": "dist/utils.esm.js",
7
7
  "typings": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/utils.esm.js",
12
+ "require": "./dist/utils.cjs.js",
13
+ "default": "./dist/utils.esm.js"
14
+ },
15
+ "./styles/layers": "./dist/layers.scss",
16
+ "./package.json": "./package.json",
17
+ "./dist/*": "./dist/*"
18
+ },
19
+ "sideEffects": [
20
+ "./dist/**/*.css"
21
+ ],
8
22
  "files": [
9
23
  "dist"
10
24
  ],
@@ -17,17 +31,27 @@
17
31
  "access": "public"
18
32
  },
19
33
  "scripts": {
20
- "start": "dts watch --noClean",
21
- "build": "dts build && cp src/*.scss dist",
22
- "lint": "dts lint src"
34
+ "start": "vite build --watch",
35
+ "build": "vite build && cp src/**/*.scss dist",
36
+ "test": "jest"
23
37
  },
24
38
  "peerDependencies": {
25
- "react": ">=16.8.0",
26
- "react-dom": ">=16.8.0"
39
+ "react": ">=18.0.0",
40
+ "react-dom": ">=18.0.0"
27
41
  },
28
42
  "dependencies": {
29
- "@entur/tokens": "^3.17.3",
30
43
  "tiny-warning": "^1.0.3"
31
44
  },
32
- "gitHead": "b653c119e54372ec210ed20aa99ded642f114c69"
45
+ "devDependencies": {
46
+ "@testing-library/jest-dom": "^5.17.0",
47
+ "@testing-library/react": "^16.3.0",
48
+ "@testing-library/user-event": "14.6.1",
49
+ "jest": "^29.0.0",
50
+ "jest-environment-jsdom": "^29.0.0",
51
+ "ts-jest": "^29.0.0",
52
+ "typescript": "^5.9.2",
53
+ "vite": "^7.3.2",
54
+ "vite-plugin-dts": "^4.5.4"
55
+ },
56
+ "gitHead": "0f435bdeec98cc3cea1db7434b13b1f771a39a18"
33
57
  }
@@ -1,33 +0,0 @@
1
- import { ConsentDetails } from './types';
2
- export declare const CMP_INITIALIZE_EVENT = "UC_UI_INITIALIZED";
3
- export declare const CONSENT_UPDATED_EVENT = "UC_CONSENT";
4
- type Consents = {
5
- id: string;
6
- name: string;
7
- consentGiven: boolean;
8
- category: string;
9
- }[] | undefined;
10
- declare function formatConsentEvent(event: Event & {
11
- detail?: ConsentDetails;
12
- }): Consents;
13
- export declare const cookieBanner: {
14
- acceptAllConsents: () => Promise<void>;
15
- denyAllConsents: () => Promise<void>;
16
- updateServicesConsents: (serviceConsents: {
17
- id: string;
18
- consent: boolean;
19
- }) => Promise<void>;
20
- changeLanguage: (language: string) => Promise<void>;
21
- showCookieBanner: () => Promise<void>;
22
- hideCookieBanner: () => Promise<void>;
23
- eventListner: {
24
- CONSENT_UPDATED_EVENT: string;
25
- CMP_INITIALIZE_EVENT: string;
26
- };
27
- formatConsentEvent: typeof formatConsentEvent;
28
- };
29
- /** Utils */
30
- export declare function waitForElementWithId(selector: string): Promise<unknown>;
31
- /** Stylesheet for CookieBanner */
32
- export declare const cmpStyleSheet: string;
33
- export {};
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
-
2
- 'use strict'
3
-
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./utils.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./utils.cjs.development.js')
8
- }
@@ -1,2 +0,0 @@
1
- export * from './variants';
2
- export * from './usercentrics';
@@ -1,71 +0,0 @@
1
- declare global {
2
- interface Window {
3
- __ucCmp: {
4
- acceptAllConsents: () => Promise<void>;
5
- changeLanguage: (language: string) => Promise<void>;
6
- denyAllConsents: () => Promise<void>;
7
- updateServicesConsents: (serviceConsents: {
8
- id: string;
9
- consent: boolean;
10
- }) => Promise<void>;
11
- closeCmp: () => Promise<void>;
12
- showFirstLayer: () => Promise<void>;
13
- };
14
- }
15
- }
16
- export type ConsentActionType = 'onAcceptAllServices' | 'onDenyAllServices' | 'onEssentialChange' | 'onInitialPageLoad' | 'onNonEURegion' | 'onSessionRestored' | 'onTcfStringChange' | 'onUpdateServices' | 'onMobileSessionRestore';
17
- type SettingType = 'TCF' | 'GDPR' | 'CCPA';
18
- type ConsentType = 'IMPLICIT' | 'EXPLICIT';
19
- export interface ConsentDetails {
20
- consent: ConsentData;
21
- services: Record<string, ServiceData>;
22
- categories: Record<string, CategoryData>;
23
- }
24
- interface ConsentData {
25
- status: 'ALL_ACCEPTED' | 'ALL_DENIED' | 'SOME_ACCEPTED' | 'SOME_DENIED';
26
- serviceIds?: string[];
27
- required: boolean;
28
- version: number;
29
- controllerId: string;
30
- language: string;
31
- createdAt: number;
32
- updatedAt: number;
33
- updatedBy: ConsentActionType;
34
- setting: SettingData;
35
- type: ConsentType;
36
- hash: string;
37
- gpcSignal?: boolean;
38
- isBot?: true;
39
- isOutsideEu?: true;
40
- }
41
- interface SettingData {
42
- id: string;
43
- type: SettingType;
44
- version: string;
45
- abVariant?: string;
46
- sandbox?: true;
47
- }
48
- interface ServiceData {
49
- name: string;
50
- version: string;
51
- category: string;
52
- essential: boolean;
53
- consent?: {
54
- given: boolean;
55
- type: 'IMPLICIT' | 'EXPLICIT';
56
- };
57
- gcm?: {
58
- analyticsStorage?: true;
59
- adStorage?: true;
60
- };
61
- subservices?: Record<string, ServiceData>;
62
- thirdCountryDataTransfer?: boolean;
63
- status?: 'added';
64
- }
65
- interface CategoryData {
66
- essential?: boolean;
67
- state: 'ALL_DENIED' | 'SOME_ACCEPTED' | 'ALL_ACCEPTED';
68
- dps: Record<string, boolean> | null;
69
- hidden?: boolean;
70
- }
71
- export {};