From c70baf20965476d3ff07405de8de86c5ad6ef4d4 Mon Sep 17 00:00:00 2001 From: Maxim Schuwalow <16665913+mschuwalow@users.noreply.github.com> Date: Thu, 2 Feb 2023 18:02:01 +0100 Subject: [PATCH] [No Ticket] Format the code and add linting rules (#104) * [No Ticket] Format the code and add linting rules * readd comment --- .eslintrc.js | 25 --- .eslintrc.json | 59 ++++++ package-lock.json | 6 + package.json | 1 + src/config-validators/remove-invalid-pairs.ts | 2 +- src/enrichers/identifiers-nohash.ts | 4 +- src/enrichers/identifiers.ts | 8 +- src/enrichers/page.ts | 5 +- src/enrichers/people-verified.ts | 2 +- src/enrichers/privacy-config.ts | 2 +- src/events/error-pixel.ts | 8 +- src/events/event-bus.ts | 10 +- src/events/replayemitter.ts | 24 +-- src/handlers/call-handler.ts | 12 +- src/handlers/storage-handler.ts | 40 ++-- src/idex.ts | 22 +-- src/initializer.ts | 2 +- src/manager/decisions.ts | 4 +- src/manager/identifiers.ts | 2 +- src/minimal-live-connect.ts | 4 +- src/pixel/fiddler.ts | 6 +- src/pixel/sender.ts | 10 +- src/pixel/state.ts | 18 +- src/pixel/stringify.ts | 2 +- src/types.ts | 172 +++++++++--------- src/typings/window.d.ts | 10 +- src/utils/b64.ts | 6 +- src/utils/btoa.ts | 14 +- src/utils/email.ts | 10 +- src/utils/hash.ts | 8 +- src/utils/page.ts | 14 +- src/utils/pixel.ts | 2 +- src/utils/types.ts | 44 ++--- src/utils/ulid.ts | 31 +--- src/utils/url.ts | 18 +- src/utils/wrapping.ts | 4 +- test/it/helpers/browser.ts | 28 +-- test/it/helpers/mock-server.ts | 2 +- test/shared/utils/calls.ts | 10 +- test/shared/utils/storage.ts | 16 +- test/unit/handlers/storage-handler.spec.ts | 6 +- test/unit/idex/identity-resolver.spec.ts | 2 +- test/unit/utils/page.spec.ts | 4 +- 43 files changed, 347 insertions(+), 332 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 .eslintrc.json diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index d2d0eb48..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - root: true, - env: { - 'browser': true, - 'commonjs': true, - 'es6': true, - 'node': true, - 'mocha': true - }, - plugins: [ - 'wdio', - '@typescript-eslint' - ], - extends: [ - 'standard', - 'plugin:wdio/recommended', - 'plugin:@typescript-eslint/recommended' - ], - globals: {}, - rules: { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/member-delimiter-style": "error", - "@typescript-eslint/no-explicit-any": "error" - } -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..85df27e6 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,59 @@ +{ + "root": true, + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "node": true, + "mocha": true + }, + "plugins": [ + "wdio", + "@typescript-eslint", + "typescript-formatter" + ], + "extends": [ + "standard", + "plugin:wdio/recommended", + "plugin:@typescript-eslint/recommended" + ], + "globals": {}, + "rules": { + "semi": "off", // handled by typescript-formatter/format + "space-before-function-paren": "off", // handled by typescript-formatter/format + "indent": ["error", 2], + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "error", + "typescript-formatter/format": [ + "error", + { + "baseIndentSize": 0, + "indentSize": 2, + "tabSize": 2, + "newLineCharacter": "\n", + "convertTabsToSpaces": true, + "indentStyle": 2, + "trimTrailingWhitespace": true, + "insertSpaceAfterCommaDelimiter": true, + "insertSpaceAfterSemicolonInForStatements": true, + "insertSpaceBeforeAndAfterBinaryOperators": true, + "insertSpaceAfterConstructor": true, + "insertSpaceAfterKeywordsInControlFlowStatements": true, + "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true, + "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false, + "insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false, + "insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": true, + "insertSpaceAfterOpeningAndBeforeClosingEmptyBraces": false, + "insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": false, + "insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": false, + "insertSpaceAfterTypeAssertion": false, + "insertSpaceBeforeFunctionParenthesis": false, + "placeOpenBraceOnNewLineForFunctions": false, + "placeOpenBraceOnNewLineForControlBlocks": false, + "insertSpaceBeforeTypeAnnotation": false, + "indentMultiLineObjectLiteralBeginningOnBlankLine": false, + "semicolons": "remove" + } + ] + } +} diff --git a/package-lock.json b/package-lock.json index 28e40913..8427ed5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6294,6 +6294,12 @@ "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", "dev": true }, + "eslint-plugin-typescript-formatter": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-formatter/-/eslint-plugin-typescript-formatter-0.0.2.tgz", + "integrity": "sha512-BZsHPRmJikEnaoUyFZaV6BP48wu/6BmvZjc7YHy+HljSsF9XQZ6B7tK9a67iynI0Gqx7vsED5DGro5tUHnsh7Q==", + "dev": true + }, "eslint-plugin-wdio": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.21.0.tgz", diff --git a/package.json b/package.json index af33dd66..d285e009 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", + "eslint-plugin-typescript-formatter": "0.0.2", "eslint-plugin-wdio": "^7.18.0", "express": "^4.17.1", "fs-extra": "^9.0.1", diff --git a/src/config-validators/remove-invalid-pairs.ts b/src/config-validators/remove-invalid-pairs.ts index da9682df..3087a480 100644 --- a/src/config-validators/remove-invalid-pairs.ts +++ b/src/config-validators/remove-invalid-pairs.ts @@ -1,6 +1,6 @@ import { EventBus, LiveConnectConfig } from '../types' -export function removeInvalidPairs (config: LiveConnectConfig, eventBus: EventBus): LiveConnectConfig { +export function removeInvalidPairs(config: LiveConnectConfig, eventBus: EventBus): LiveConnectConfig { if (config && config.appId && config.distributorId) { const distributorId = config.distributorId delete config.distributorId diff --git a/src/enrichers/identifiers-nohash.ts b/src/enrichers/identifiers-nohash.ts index 70f7178d..893fb9ed 100644 --- a/src/enrichers/identifiers-nohash.ts +++ b/src/enrichers/identifiers-nohash.ts @@ -3,7 +3,7 @@ import { safeToString, isArray, trim } from '../utils/types' import { EventBus, RetrievedIdentifier, State } from '../types' import { MinimalStorageHandler } from '../handlers/storage-handler' -export function enrich (state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { +export function enrich(state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { try { return _parseIdentifiersToResolve(state, storageHandler) } catch (e) { @@ -12,7 +12,7 @@ export function enrich (state: State, storageHandler: MinimalStorageHandler, eve } } -function _parseIdentifiersToResolve (state: State, storageHandler: MinimalStorageHandler): State { +function _parseIdentifiersToResolve(state: State, storageHandler: MinimalStorageHandler): State { state.identifiersToResolve = state.identifiersToResolve || [] const cookieNames = isArray(state.identifiersToResolve) ? state.identifiersToResolve : safeToString(state.identifiersToResolve).split(',') const identifiers: RetrievedIdentifier[] = [] diff --git a/src/enrichers/identifiers.ts b/src/enrichers/identifiers.ts index dbe1743d..8ba82be6 100644 --- a/src/enrichers/identifiers.ts +++ b/src/enrichers/identifiers.ts @@ -3,7 +3,7 @@ import { safeToString, isString, isArray } from '../utils/types' import { EventBus, HashedEmail, State, RetrievedIdentifier } from '../types' import { MinimalStorageHandler } from '../handlers/storage-handler' -export function enrich (state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { +export function enrich(state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { try { return _getIdentifiers(_parseIdentifiersToResolve(state), storageHandler) } catch (e) { @@ -14,7 +14,7 @@ export function enrich (state: State, storageHandler: MinimalStorageHandler, eve } } -function _parseIdentifiersToResolve (state: State): string[] { +function _parseIdentifiersToResolve(state: State): string[] { let cookieNames: string[] = [] if (state.identifiersToResolve) { if (isArray(state.identifiersToResolve)) { @@ -29,7 +29,7 @@ function _parseIdentifiersToResolve (state: State): string[] { return cookieNames } -function _getIdentifiers (cookieNames: string[], storageHandler: MinimalStorageHandler): State { +function _getIdentifiers(cookieNames: string[], storageHandler: MinimalStorageHandler): State { const identifiers: RetrievedIdentifier[] = [] let hashes: HashedEmail[] = [] for (let i = 0; i < cookieNames.length; i++) { @@ -50,7 +50,7 @@ function _getIdentifiers (cookieNames: string[], storageHandler: MinimalStorageH } } -function _deduplicateHashes (hashes: HashedEmail[]): HashedEmail[] { +function _deduplicateHashes(hashes: HashedEmail[]): HashedEmail[] { const seen = new Set() const result: HashedEmail[] = [] for (let i = 0; i < hashes.length; i++) { diff --git a/src/enrichers/page.ts b/src/enrichers/page.ts index 10f77de3..012d14e2 100644 --- a/src/enrichers/page.ts +++ b/src/enrichers/page.ts @@ -1,12 +1,9 @@ import { State } from '../types' import { getPage, getReferrer, getContextElements } from '../utils/page' -/** - * @private - */ let _currentPage: State | null = null -export function enrich (state: State): State { +export function enrich(state: State): State { if (_currentPage) { return _currentPage } else { diff --git a/src/enrichers/people-verified.ts b/src/enrichers/people-verified.ts index d8f90df9..0cac78e3 100644 --- a/src/enrichers/people-verified.ts +++ b/src/enrichers/people-verified.ts @@ -2,7 +2,7 @@ import { PEOPLE_VERIFIED_LS_ENTRY } from '../utils/consts' import { EventBus, State } from '../types' import { MinimalStorageHandler } from '../handlers/storage-handler' -export function enrich (state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { +export function enrich(state: State, storageHandler: MinimalStorageHandler, eventBus: EventBus): State { try { return { peopleVerifiedId: state.peopleVerifiedId || storageHandler.getDataFromLocalStorage(PEOPLE_VERIFIED_LS_ENTRY) || undefined } } catch (e) { diff --git a/src/enrichers/privacy-config.ts b/src/enrichers/privacy-config.ts index 3d3096a9..682023fa 100644 --- a/src/enrichers/privacy-config.ts +++ b/src/enrichers/privacy-config.ts @@ -1,7 +1,7 @@ import { State } from '../types' import { isNonEmpty } from '../utils/types' -export function enrich (state: State): State { +export function enrich(state: State): State { if (isNonEmpty(state) && isNonEmpty(state.gdprApplies)) { const privacyMode = !!state.gdprApplies return { diff --git a/src/events/error-pixel.ts b/src/events/error-pixel.ts index bf2b2d9a..842e57f0 100644 --- a/src/events/error-pixel.ts +++ b/src/events/error-pixel.ts @@ -15,7 +15,7 @@ const _defaultReturn: State = { } } -function _asInt (field: unknown): number | undefined { +function _asInt(field: unknown): number | undefined { try { const intValue = (field as number) * 1 return isNaN(intValue) ? undefined : intValue @@ -24,7 +24,7 @@ function _asInt (field: unknown): number | undefined { } } -function _truncate (value: unknown): string | undefined { +function _truncate(value: unknown): string | undefined { try { if (isString(value) && value.length && value.length > MAX_ERROR_FIELD_LENGTH) { return `${value.substr(0, MAX_ERROR_FIELD_LENGTH)}...` @@ -35,7 +35,7 @@ function _truncate (value: unknown): string | undefined { } } -export function asErrorDetails (e: unknown): State { +export function asErrorDetails(e: unknown): State { if (isRecord(e)) { return { errorDetails: { @@ -52,7 +52,7 @@ export function asErrorDetails (e: unknown): State { } } -export function register (state: State, callHandler: CallHandler, eventBus: EventBus): void { +export function register(state: State, callHandler: CallHandler, eventBus: EventBus): void { try { const pixelSender = new PixelSender(state, callHandler, eventBus) diff --git a/src/events/event-bus.ts b/src/events/event-bus.ts index ce6f7565..aba03aab 100644 --- a/src/events/event-bus.ts +++ b/src/events/event-bus.ts @@ -4,7 +4,7 @@ import * as C from '../utils/consts' import { isFunction } from '../utils/types' import { EventBus } from '../types' -function initBus (size?: number): EventBus { +function initBus(size?: number): EventBus { if (typeof size === 'number' && size >= 0) { return new ReplayEmitter(size) } else { @@ -12,7 +12,7 @@ function initBus (size?: number): EventBus { } } -function extendBusIfNeeded (bus: EventBus) { +function extendBusIfNeeded(bus: EventBus) { if (isFunction(bus.emitErrorWithMessage) && isFunction(bus.emitError)) { return } @@ -27,11 +27,11 @@ function extendBusIfNeeded (bus: EventBus) { } } -export function LocalEventBus (size = 5) { +export function LocalEventBus(size = 5) { return initBus(size) } -export function GlobalEventBus (name: string, size: number, errorCallback: (error: unknown) => void): EventBus { +export function GlobalEventBus(name: string, size: number, errorCallback: (error: unknown) => void): EventBus { try { if (!window) { errorCallback(new Error('Bus can only be attached to the window, which is not present')) @@ -47,7 +47,7 @@ export function GlobalEventBus (name: string, size: number, errorCallback: (erro } } -export function getAvailableBus (name: string): EventBus { +export function getAvailableBus(name: string): EventBus { const eventBus = window[name].eventBus || window[C.EVENT_BUS_NAMESPACE] extendBusIfNeeded(eventBus) return eventBus diff --git a/src/events/replayemitter.ts b/src/events/replayemitter.ts index 02ae1a72..fed57648 100644 --- a/src/events/replayemitter.ts +++ b/src/events/replayemitter.ts @@ -3,14 +3,14 @@ import { ErrorDetails, EventBus } from '../types' import { isObject } from '../utils/types' interface EventHandler { - callback: (data: unknown) => void; - unbound: (data: unknown) => void; + callback: (data: unknown) => void + unbound: (data: unknown) => void } export class ReplayEmitter implements EventBus { - private h: Record; - private q: Record; - size: number; + private h: Record + private q: Record + size: number constructor (replaySize: number | string) { this.size = 5 @@ -25,7 +25,7 @@ export class ReplayEmitter implements EventBus { this.q = {} } - on void)> (name: string, callback: F, ctx?: ThisParameterType): this { + on void)>(name: string, callback: F, ctx?: ThisParameterType): this { const handler: EventHandler = { callback: callback.bind(ctx), unbound: callback @@ -41,7 +41,7 @@ export class ReplayEmitter implements EventBus { return this } - once void)> (name: string, callback: F, ctx?: ThisParameterType): this { + once void)>(name: string, callback: F, ctx?: ThisParameterType): this { const eventQueue = this.q[name] || [] if (eventQueue.length > 0) { callback.call(ctx, eventQueue[0]) @@ -57,7 +57,7 @@ export class ReplayEmitter implements EventBus { } } - emit (name: string, event: unknown): this { + emit(name: string, event: unknown): this { const evtArr = (this.h[name] || []).slice() let i = 0 const len = evtArr.length @@ -75,7 +75,7 @@ export class ReplayEmitter implements EventBus { return this } - off (name: string, callback: (event: unknown) => void): this { + off(name: string, callback: (event: unknown) => void): this { const handlers = this.h[name] const liveEvents = [] @@ -94,18 +94,18 @@ export class ReplayEmitter implements EventBus { return this } - emitErrorWithMessage (name: string, message: string, exception: unknown): this { + emitErrorWithMessage(name: string, message: string, exception: unknown): this { const wrappedError = wrapError(name, message, exception) return this.emit(C.ERRORS_PREFIX, wrappedError) } - emitError (name: string, exception: unknown): this { + emitError(name: string, exception: unknown): this { const wrappedError = wrapError(name, undefined, exception) return this.emit(C.ERRORS_PREFIX, wrappedError) } } -export function wrapError (name: string, message?: string, e?: unknown): ErrorDetails { +export function wrapError(name: string, message?: string, e?: unknown): ErrorDetails { if (isObject(e)) { let error: ErrorDetails if ('message' in e && typeof e.message === 'string') { diff --git a/src/handlers/call-handler.ts b/src/handlers/call-handler.ts index 6ec473f2..4087f824 100644 --- a/src/handlers/call-handler.ts +++ b/src/handlers/call-handler.ts @@ -7,11 +7,11 @@ interface WrappedExternalCallHandler { onSuccess: (responseText: string, response: unknown) => void, onError?: (error: unknown) => void, timeout?: number - ) => void; + ) => void pixelGet: ( - url: string, - onLoad?: () => void - ) => void; + url: string, + onLoad?: () => void + ) => void } export class CallHandler { @@ -28,7 +28,7 @@ export class CallHandler { wrapper.reportErrors() } - ajaxGet ( + ajaxGet( url: string, onSuccess: (responseText: string, response: unknown) => void, onError?: (error: unknown) => void, @@ -37,7 +37,7 @@ export class CallHandler { this.functions.ajaxGet(url, onSuccess, onError, timeout) } - pixelGet ( + pixelGet( url: string, onLoad?: () => void ): void { diff --git a/src/handlers/storage-handler.ts b/src/handlers/storage-handler.ts index 170481bf..e9ee5e87 100644 --- a/src/handlers/storage-handler.ts +++ b/src/handlers/storage-handler.ts @@ -4,25 +4,25 @@ import { EventBus, ExternalMinimalStorageHandler, ExternalStorageHandler } from import { WrappingContext } from '../utils/wrapping' interface WrappedExternalMinimalStorageHandler { - getCookie: (key: string) => string | null | undefined; - getDataFromLocalStorage: (key: string) => string | null | undefined; - localStorageIsEnabled: () => boolean | undefined; + getCookie: (key: string) => string | null | undefined + getDataFromLocalStorage: (key: string) => string | null | undefined + localStorageIsEnabled: () => boolean | undefined } interface WrappedExternalStorageHandler { - setCookie: (key: string, value: string, expires?: Date, sameSite?: string, domain?: string) => void; - setDataInLocalStorage: (key: string, value: string) => void; - removeDataFromLocalStorage: (key: string) => void; - findSimilarCookies: (substring: string) => string[] | undefined; + setCookie: (key: string, value: string, expires?: Date, sameSite?: string, domain?: string) => void + setDataInLocalStorage: (key: string, value: string) => void + removeDataFromLocalStorage: (key: string) => void + findSimilarCookies: (substring: string) => string[] | undefined } const noop = () => undefined -function wrapRead (wrapper: WrappingContext, storageStrategy: StorageStrategy, functionName: K) { +function wrapRead(wrapper: WrappingContext, storageStrategy: StorageStrategy, functionName: K) { return strEqualsIgnoreCase(storageStrategy, StorageStrategies.disabled) ? noop : wrapper.wrap(functionName) } -function wrapWrite (wrapper: WrappingContext, storageStrategy: StorageStrategy, functionName: K) { +function wrapWrite(wrapper: WrappingContext, storageStrategy: StorageStrategy, functionName: K) { return strEqualsIgnoreCase(storageStrategy, StorageStrategies.none) ? noop : wrapRead(wrapper, storageStrategy, functionName) } @@ -37,22 +37,22 @@ export class MinimalStorageHandler { } } - static make (storageStrategy: StorageStrategy, externalStorageHandler: ExternalMinimalStorageHandler, eventBus: EventBus): MinimalStorageHandler { + static make(storageStrategy: StorageStrategy, externalStorageHandler: ExternalMinimalStorageHandler, eventBus: EventBus): MinimalStorageHandler { const wrapper = new WrappingContext(externalStorageHandler, 'MinimalStorageHandler', eventBus) const handler = new MinimalStorageHandler(storageStrategy, wrapper) wrapper.reportErrors() return handler } - localStorageIsEnabled (): boolean { + localStorageIsEnabled(): boolean { return !!this.minimalFunctions.localStorageIsEnabled() } - getCookie (key: string): string | null { + getCookie(key: string): string | null { return this.minimalFunctions.getCookie(key) || null } - getDataFromLocalStorage (key: string): string | null { + getDataFromLocalStorage(key: string): string | null { return this.minimalFunctions.getDataFromLocalStorage(key) || null } } @@ -74,14 +74,14 @@ export class StorageHandler extends MinimalStorageHandler { } } - static make (storageStrategy: StorageStrategy, externalStorageHandler: ExternalMinimalStorageHandler, eventBus: EventBus): StorageHandler { + static make(storageStrategy: StorageStrategy, externalStorageHandler: ExternalMinimalStorageHandler, eventBus: EventBus): StorageHandler { const wrapper = new WrappingContext(externalStorageHandler, 'StorageHandler', eventBus) const handler = new StorageHandler(storageStrategy, wrapper) wrapper.reportErrors() return handler } - get (key: string): string | null { + get(key: string): string | null { if (strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.none) || strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.disabled)) { return null } else if (strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.localStorage)) { @@ -100,7 +100,7 @@ export class StorageHandler extends MinimalStorageHandler { } } - set (key: string, value: string, expires: Date, domain?: string): void { + set(key: string, value: string, expires: Date, domain?: string): void { if (strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.none) || strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.disabled)) { // pass } else if (strEqualsIgnoreCase(this.storageStrategy, StorageStrategies.localStorage)) { @@ -114,19 +114,19 @@ export class StorageHandler extends MinimalStorageHandler { } } - setCookie (key: string, value: string, expires?: Date, sameSite?: string, domain?: string): void { + setCookie(key: string, value: string, expires?: Date, sameSite?: string, domain?: string): void { this.functions.setCookie(key, value, expires, sameSite, domain) } - setDataInLocalStorage (key: string, value: string): void { + setDataInLocalStorage(key: string, value: string): void { this.functions.setDataInLocalStorage(key, value) } - removeDataFromLocalStorage (key: string): void { + removeDataFromLocalStorage(key: string): void { this.functions.removeDataFromLocalStorage(key) } - findSimilarCookies (substring: string): string[] { + findSimilarCookies(substring: string): string[] { return this.functions.findSimilarCookies(substring) || [] } } diff --git a/src/idex.ts b/src/idex.ts index 0065dd17..d0776165 100644 --- a/src/idex.ts +++ b/src/idex.ts @@ -7,14 +7,14 @@ import { StorageHandler } from './handlers/storage-handler' import { CallHandler } from './handlers/call-handler' interface Cache { - get: (key: unknown) => unknown; // null will be used to signal missing value - set: (key: unknown, value: unknown, expiration?: Date) => void; + get: (key: unknown) => unknown // null will be used to signal missing value + set: (key: unknown, value: unknown, expiration?: Date) => void } -function storageHandlerBackedCache (defaultExpirationHours: number, domain: string | undefined, storageHandler: StorageHandler, eventBus: EventBus): Cache { +function storageHandlerBackedCache(defaultExpirationHours: number, domain: string | undefined, storageHandler: StorageHandler, eventBus: EventBus): Cache { const IDEX_STORAGE_KEY = '__li_idex_cache' - function _cacheKey (rawKey: unknown) { + function _cacheKey(rawKey: unknown) { if (rawKey) { const suffix = base64UrlEncode(JSON.stringify(rawKey)) return `${IDEX_STORAGE_KEY}_${suffix}` @@ -102,7 +102,7 @@ export class IdentityResolver { }) } - static make (config: State, storageHandler: StorageHandler, calls: CallHandler, eventBus: EventBus): IdentityResolver { + static make(config: State, storageHandler: StorageHandler, calls: CallHandler, eventBus: EventBus): IdentityResolver { const nonNullConfig = config || {} const idexConfig = nonNullConfig.identityResolutionConfig || {} const expirationHours = idexConfig.expirationHours || DEFAULT_IDEX_EXPIRATION_HOURS @@ -112,11 +112,11 @@ export class IdentityResolver { return new IdentityResolver(nonNullConfig, calls, cache, eventBus) } - static makeNoCache (config: State, calls: CallHandler, eventBus: EventBus): IdentityResolver { + static makeNoCache(config: State, calls: CallHandler, eventBus: EventBus): IdentityResolver { return new IdentityResolver(config || {}, calls, noopCache, eventBus) } - private responseReceived ( + private responseReceived( additionalParams: ResolutionParams, successCallback: (result: unknown) => void ): ((responseText: string, response: unknown) => void) { @@ -138,7 +138,7 @@ export class IdentityResolver { } } - unsafeResolve (successCallback: (result: unknown) => void, errorCallback: () => void, additionalParams: ResolutionParams): void { + unsafeResolve(successCallback: (result: unknown) => void, errorCallback: () => void, additionalParams: ResolutionParams): void { const cachedValue = this.cache.get(additionalParams) if (cachedValue) { successCallback(cachedValue) @@ -152,13 +152,13 @@ export class IdentityResolver { } } - getUrl (additionalParams: Record): string { + getUrl(additionalParams: Record): string { const originalParams = this.tuples.slice().concat(mapAsParams(additionalParams)) const params = toParams(originalParams) return `${this.url}/${this.source}/${this.publisherId}${params}` } - resolve (successCallback: (result: unknown) => void, errorCallback: () => void, additionalParams?: ResolutionParams): void { + resolve(successCallback: (result: unknown) => void, errorCallback: () => void, additionalParams?: ResolutionParams): void { try { this.unsafeResolve(successCallback, errorCallback, additionalParams || {}) } catch (e) { @@ -171,7 +171,7 @@ export class IdentityResolver { } } -function responseExpires (response: unknown) { +function responseExpires(response: unknown) { if (isObject(response) && 'getResponseHeader' in response && isFunction(response.getResponseHeader)) { const expiresHeader = response.getResponseHeader('expires') if (expiresHeader) { diff --git a/src/initializer.ts b/src/initializer.ts index 4a4db6a9..cb501764 100644 --- a/src/initializer.ts +++ b/src/initializer.ts @@ -6,7 +6,7 @@ import { EventBus, ExternalCallHandler, ExternalStorageHandler, ILiveConnect, Li import { EVENT_BUS_NAMESPACE } from './utils/consts' import { GlobalEventBus } from './events/event-bus' -export function LiveConnect (liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalStorageHandler, externalCallHandler: ExternalCallHandler, mode: string, externalEventBus?: EventBus): ILiveConnect | null { +export function LiveConnect(liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalStorageHandler, externalCallHandler: ExternalCallHandler, mode: string, externalEventBus?: EventBus): ILiveConnect | null { const minimalMode = mode === 'minimal' || process.env.LiveConnectMode === 'minimal' const bus = externalEventBus || GlobalEventBus(EVENT_BUS_NAMESPACE, 5, err => console.error(err)) const configuration = (isObject(liveConnectConfig) && liveConnectConfig) || {} diff --git a/src/manager/decisions.ts b/src/manager/decisions.ts index 6f990327..af9324c8 100644 --- a/src/manager/decisions.ts +++ b/src/manager/decisions.ts @@ -10,9 +10,9 @@ const DECISION_ID_COOKIE_NAMESPACE = 'lidids.' const _onlyUnique = (value: string, index: number, self: string[]) => self.indexOf(value) === index const _nonEmpty = (value: string) => value && trim(value).length > 0 -export function resolve (state: State, storageHandler: StorageHandler, eventBus: EventBus): State { +export function resolve(state: State, storageHandler: StorageHandler, eventBus: EventBus): State { let ret = {} - function _addDecisionId (key: string, cookieDomain?: string) { + function _addDecisionId(key: string, cookieDomain?: string) { if (key) { storageHandler.setCookie( `${DECISION_ID_COOKIE_NAMESPACE}${key}`, diff --git a/src/manager/identifiers.ts b/src/manager/identifiers.ts index 3dd83b44..b9bbb6bb 100644 --- a/src/manager/identifiers.ts +++ b/src/manager/identifiers.ts @@ -10,7 +10,7 @@ const NEXT_GEN_FP_NAME = '_lc2_fpi' const TLD_CACHE_KEY = '_li_dcdm_c' const DEFAULT_EXPIRATION_DAYS = 730 -export function resolve (state: State, storageHandler: StorageHandler, eventBus: EventBus): State { +export function resolve(state: State, storageHandler: StorageHandler, eventBus: EventBus): State { try { const determineTld = () => { const cachedDomain = storageHandler.getCookie(TLD_CACHE_KEY) diff --git a/src/minimal-live-connect.ts b/src/minimal-live-connect.ts index 52f072e9..8a078a6a 100644 --- a/src/minimal-live-connect.ts +++ b/src/minimal-live-connect.ts @@ -11,7 +11,7 @@ import { StorageStrategies } from './model/storage-strategy' import { EventBus, ExternalCallHandler, ExternalMinimalStorageHandler, ILiveConnect, LiveConnectConfig } from './types' import { LocalEventBus } from './events/event-bus' -function _minimalInitialization (liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalMinimalStorageHandler, externalCallHandler: ExternalCallHandler, eventBus: EventBus): ILiveConnect { +function _minimalInitialization(liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalMinimalStorageHandler, externalCallHandler: ExternalCallHandler, eventBus: EventBus): ILiveConnect { try { const callHandler = new CallHandler(externalCallHandler, eventBus) const validLiveConnectConfig = removeInvalidPairs(liveConnectConfig, eventBus) @@ -36,7 +36,7 @@ function _minimalInitialization (liveConnectConfig: LiveConnectConfig, externalS } } -export function MinimalLiveConnect (liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalMinimalStorageHandler, externalCallHandler: ExternalCallHandler, externalEventBus?: EventBus): ILiveConnect { +export function MinimalLiveConnect(liveConnectConfig: LiveConnectConfig, externalStorageHandler: ExternalMinimalStorageHandler, externalCallHandler: ExternalCallHandler, externalEventBus?: EventBus): ILiveConnect { try { const configuration = (isObject(liveConnectConfig) && liveConnectConfig) || {} configuration.globalVarName = configuration.globalVarName || 'liQ' diff --git a/src/pixel/fiddler.ts b/src/pixel/fiddler.ts index 4503129d..dc95717a 100644 --- a/src/pixel/fiddler.ts +++ b/src/pixel/fiddler.ts @@ -8,7 +8,7 @@ const MAX_ITEMS = 10 const LIMITING_KEYS = ['items', 'itemids'] const HASH_BEARERS = ['email', 'emailhash', 'hash', 'hashedemail'] -function _provided (state: State): State { +function _provided(state: State): State { const eventSource = state.eventSource || {} const objectKeys = Object.keys(eventSource) for (const key of objectKeys) { @@ -28,7 +28,7 @@ function _provided (state: State): State { return state } -function _itemsLimiter (state: State): State { +function _itemsLimiter(state: State): State { const event = state.eventSource || {} Object.keys(event).forEach(key => { const lowerCased = key.toLowerCase() @@ -42,7 +42,7 @@ function _itemsLimiter (state: State): State { const fiddlers = [_provided, _itemsLimiter] -export function fiddle (state: State): State { +export function fiddle(state: State): State { const reducer = (accumulator: State, func: (current: State) => State) => { return merge(accumulator, func(accumulator)) } diff --git a/src/pixel/sender.ts b/src/pixel/sender.ts index ea719a4b..59521ab3 100644 --- a/src/pixel/sender.ts +++ b/src/pixel/sender.ts @@ -20,7 +20,7 @@ export class PixelSender { this.presend = presend } - private callBakers (bakersJson: string): void { + private callBakers(bakersJson: string): void { try { const bakers = JSON.parse(bakersJson).bakers if (isArray(bakers)) { @@ -31,7 +31,7 @@ export class PixelSender { } } - private sendState (state: StateWrapper, endpoint: string, makeCall: (url: string) => void): void { + private sendState(state: StateWrapper, endpoint: string, makeCall: (url: string) => void): void { if (state.sendsPixel()) { if (isFunction(this.presend)) { this.presend() @@ -46,12 +46,12 @@ export class PixelSender { } } - private utcMillis () { + private utcMillis() { const now = new Date() return new Date(now.toUTCString()).getTime() + now.getMilliseconds() } - sendAjax (state: StateWrapper): void { + sendAjax(state: StateWrapper): void { this.sendState(state, 'j', uri => { this.calls.ajaxGet( uri, @@ -68,7 +68,7 @@ export class PixelSender { }) } - sendPixel (state: StateWrapper): void { + sendPixel(state: StateWrapper): void { this.sendState(state, 'p', uri => this.calls.pixelGet(uri, this.onload)) } } diff --git a/src/pixel/state.ts b/src/pixel/state.ts index d60c9940..ba24a583 100644 --- a/src/pixel/state.ts +++ b/src/pixel/state.ts @@ -7,7 +7,7 @@ import { EventBus, State } from '../types' const noOpEvents = ['setemail', 'setemailhash', 'sethashedemail'] -function ifDefined (key: K, fun: (value: NonNullable) => [string, string][]): (state: State) => [string, string][] { +function ifDefined(key: K, fun: (value: NonNullable) => [string, string][]): (state: State) => [string, string][] { return state => { const value = state[key] if (nonNull(value)) { @@ -54,19 +54,19 @@ const paramExtractors: ((state: State) => [string, string][])[] = [ ] export class Query { - tuples: [string, string][]; + tuples: [string, string][] constructor (tuples: [string, string][]) { this.tuples = tuples } - prependParams (...params: [string, string][]): Query { + prependParams(...params: [string, string][]): Query { const _tuples = this.tuples _tuples.unshift(...params) return new Query(_tuples) } - toQueryString (): string { + toQueryString(): string { return toParams(this.tuples) } } @@ -80,7 +80,7 @@ export class StateWrapper { this.eventBus = eventBus } - private static safeFiddle (newInfo: State, eventBus: EventBus): State { + private static safeFiddle(newInfo: State, eventBus: EventBus): State { try { return fiddle(JSON.parse(JSON.stringify(newInfo))) } catch (e) { @@ -90,11 +90,11 @@ export class StateWrapper { } } - combineWith (newInfo: State): StateWrapper { + combineWith(newInfo: State): StateWrapper { return new StateWrapper(merge(this.data, newInfo), this.eventBus) } - sendsPixel () { + sendsPixel() { const source = isObject(this.data.eventSource) ? this.data.eventSource : {} const eventKeys = Object.keys(source) .filter(objKey => objKey.toLowerCase() === 'eventname' || objKey.toLowerCase() === 'event') @@ -103,7 +103,7 @@ export class StateWrapper { return !eventName || noOpEvents.indexOf(eventName.toLowerCase()) === -1 } - asTuples (): [string, string][] { + asTuples(): [string, string][] { const acc: [string, string][] = [] paramExtractors.forEach((extractor) => { const params = extractor(this.data) @@ -114,7 +114,7 @@ export class StateWrapper { return acc } - asQuery (): Query { + asQuery(): Query { return new Query(this.asTuples()) } } diff --git a/src/pixel/stringify.ts b/src/pixel/stringify.ts index a6e6ccb1..cacc3eef 100644 --- a/src/pixel/stringify.ts +++ b/src/pixel/stringify.ts @@ -3,6 +3,6 @@ import { trim } from '../utils/types' export const MASK = '*********' -export function replacer (key: unknown, value: string): string { +export function replacer(key: unknown, value: string): string { return (typeof value === 'string' && isEmail(trim(value))) ? MASK : value } diff --git a/src/types.ts b/src/types.ts index f7a94dfc..c05ef767 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,49 +1,49 @@ import { StorageStrategy } from './model/storage-strategy' export interface ErrorDetails extends Error { - stackTrace?: string; - lineNumber?: number; - columnNumber?: number; - fileName?: string; + stackTrace?: string + lineNumber?: number + columnNumber?: number + fileName?: string } export interface ExternalMinimalStorageHandler { - getCookie?: (key: string) => string | null; - getDataFromLocalStorage?: (key: string) => string | null; - localStorageIsEnabled?: () => boolean; + getCookie?: (key: string) => string | null + getDataFromLocalStorage?: (key: string) => string | null + localStorageIsEnabled?: () => boolean } export interface ExternalStorageHandler extends ExternalMinimalStorageHandler { - setCookie?: (key: string, value: string, expires?: Date, sameSite?: string, domain?: string) => void; - setDataInLocalStorage?: (key: string, value: string) => void; - removeDataFromLocalStorage?: (key: string) => void; - findSimilarCookies?: (substring: string) => string[]; + setCookie?: (key: string, value: string, expires?: Date, sameSite?: string, domain?: string) => void + setDataInLocalStorage?: (key: string, value: string) => void + removeDataFromLocalStorage?: (key: string) => void + findSimilarCookies?: (substring: string) => string[] } export interface IdentityResolutionConfig { - url?: string; - expirationHours?: number; - ajaxTimeout?: number; - source?: string; - publisherId?: number; - requestedAttributes?: string[]; - contextSelectors?: string; - contextElementsLength?: number; + url?: string + expirationHours?: number + ajaxTimeout?: number + source?: string + publisherId?: number + requestedAttributes?: string[] + contextSelectors?: string + contextElementsLength?: number } export interface LiveConnectConfig { - appId?: string; - wrapperName?: string; - storageStrategy?: StorageStrategy; - collectorUrl?: string; - usPrivacyString?: string; - gdprApplies?: boolean; - expirationDays?: number; - identifiersToResolve?: string | string[]; - trackerName?: string; - identityResolutionConfig?: IdentityResolutionConfig; - distributorId?: string; - globalVarName?: string; + appId?: string + wrapperName?: string + storageStrategy?: StorageStrategy + collectorUrl?: string + usPrivacyString?: string + gdprApplies?: boolean + expirationDays?: number + identifiersToResolve?: string | string[] + trackerName?: string + identityResolutionConfig?: IdentityResolutionConfig + distributorId?: string + globalVarName?: string } export type ResolutionParams = Record @@ -51,83 +51,83 @@ export type ResolutionParams = Record // Object fields will be name and value of requested attributes export type IdentityResultionResult = object export interface ExternalCallHandler { - ajaxGet?: ( - url: string, - onSuccess: (responseText: string, response?: unknown) => void, - onError?: (error: unknown) => void, - timeout?: number - ) => void; - pixelGet?: ( - url: string, - onLoad?: () => void - ) => void; + ajaxGet?: ( + url: string, + onSuccess: (responseText: string, response?: unknown) => void, + onError?: (error: unknown) => void, + timeout?: number + ) => void + pixelGet?: ( + url: string, + onLoad?: () => void + ) => void } export interface HashedEmail { - md5: string; - sha1: string; - sha256: string; + md5: string + sha1: string + sha256: string } export interface RetrievedIdentifier { - name: string; - value: string; + name: string + value: string } export interface State extends LiveConnectConfig { - eventSource?: object; - liveConnectId?: string; - trackerName?: string; - pageUrl?: string; - domain?: string; - hashesFromIdentifiers?: HashedEmail[]; - decisionIds?: string[]; - peopleVerifiedId?: string; - errorDetails?: ErrorDetails; - retrievedIdentifiers?: RetrievedIdentifier[]; - hashedEmail?: HashedEmail[]; - providedHash?: string; - gdprConsent?: string; - contextSelectors?: string; - contextElementsLength?: number; - contextElements?: string; - privacyMode?: boolean; - referrer?: string; + eventSource?: object + liveConnectId?: string + trackerName?: string + pageUrl?: string + domain?: string + hashesFromIdentifiers?: HashedEmail[] + decisionIds?: string[] + peopleVerifiedId?: string + errorDetails?: ErrorDetails + retrievedIdentifiers?: RetrievedIdentifier[] + hashedEmail?: HashedEmail[] + providedHash?: string + gdprConsent?: string + contextSelectors?: string + contextElementsLength?: number + contextElements?: string + privacyMode?: boolean + referrer?: string } export interface HemStore { - hashedEmail?: HashedEmail[]; + hashedEmail?: HashedEmail[] } export interface ConfigMismatch { - appId: (string | undefined)[]; - wrapperName: (string | undefined)[]; - collectorUrl: (string | undefined)[]; + appId: (string | undefined)[] + wrapperName: (string | undefined)[] + collectorUrl: (string | undefined)[] } export interface ErrorBus { - emitErrorWithMessage (name: string, message: string, e?: unknown): this; - emitError (name: string, exception?: unknown): this; + emitErrorWithMessage(name: string, message: string, e?: unknown): this + emitError(name: string, exception?: unknown): this } export interface EventBus extends ErrorBus { - on void)> (name: string, callback: F, ctx?: ThisParameterType): this; - once void)> (name: string, callback: F, ctx?: ThisParameterType): this; - emit (name: string, event: unknown): this; - off (name: string, callback: (event: unknown) => void): this; + on void)>(name: string, callback: F, ctx?: ThisParameterType): this + once void)>(name: string, callback: F, ctx?: ThisParameterType): this + emit(name: string, event: unknown): this + off(name: string, callback: (event: unknown) => void): this } export interface ILiveConnect { - ready: boolean; - push: (event: unknown) => void; - fire: () => void; - resolve?: ( - successCallBack: (result: IdentityResultionResult) => void, - errorCallBack: () => void, - additionalParams?: ResolutionParams - ) => void; - resolutionCallUrl?: (additionalParams: ResolutionParams) => string; - peopleVerifiedId?: string; - config: LiveConnectConfig; - eventBus?: EventBus; + ready: boolean + push: (event: unknown) => void + fire: () => void + resolve?: ( + successCallBack: (result: IdentityResultionResult) => void, + errorCallBack: () => void, + additionalParams?: ResolutionParams + ) => void + resolutionCallUrl?: (additionalParams: ResolutionParams) => string + peopleVerifiedId?: string + config: LiveConnectConfig + eventBus?: EventBus } diff --git a/src/typings/window.d.ts b/src/typings/window.d.ts index 13475212..feff3a98 100644 --- a/src/typings/window.d.ts +++ b/src/typings/window.d.ts @@ -6,10 +6,10 @@ declare global { interface Window { // eslint-disable-next-line camelcase - liQ_instances?: ILiveConnect[]; - liQ?: ILiveConnect; - XDomainRequest?: { new (): XDomainRequest; prototype: XDomainRequest; create(): XDomainRequest }; // for IE compat - [k: string]: unknown; // allow accessing arbitrary fields - msCrypto: Crypto; + liQ_instances?: ILiveConnect[] + liQ?: ILiveConnect + XDomainRequest?: { new(): XDomainRequest; prototype: XDomainRequest; create(): XDomainRequest }; // for IE compat + [k: string]: unknown // allow accessing arbitrary fields + msCrypto: Crypto } } diff --git a/src/utils/b64.ts b/src/utils/b64.ts index f8dd02d8..96285c14 100644 --- a/src/utils/b64.ts +++ b/src/utils/b64.ts @@ -1,7 +1,7 @@ import { btoa as btoaFromLib } from './btoa' import { isFunction } from './types' -function _safeBtoa (s: string): string { +function _safeBtoa(s: string): string { const res = btoaFromLib(s) return res || '' } @@ -13,11 +13,11 @@ const _base64ToUrlEncodedChars: Record = { '/': '_' } -function _replaceBase64Chars (x: string): string { +function _replaceBase64Chars(x: string): string { return _base64ToUrlEncodedChars[x] || '' } -export function base64UrlEncode (s: string): string { +export function base64UrlEncode(s: string): string { let btoa = null // First we escape the string using encodeURIComponent to get the UTF-8 encoding of the characters, // then we convert the percent encodings into raw bytes, and finally feed it to btoa() function. diff --git a/src/utils/btoa.ts b/src/utils/btoa.ts index b7905536..6040dc50 100644 --- a/src/utils/btoa.ts +++ b/src/utils/btoa.ts @@ -1,8 +1,5 @@ -/** - * btoa() as defined by the HTML and Infra specs, which mostly just references - * RFC 4648. - */ -export function btoa (s: string): string | null { +// btoa() as defined by the HTML and Infra specs, which mostly just references RFC 4648. +export function btoa(s: string): string | null { // String conversion as required by Web IDL. s = `${s}` // "The btoa() method must throw an "InvalidCharacterError" DOMException if @@ -38,12 +35,9 @@ export function btoa (s: string): string | null { return out } -/** - * Lookup table for btoa(), which converts a six-bit number into the - * corresponding ASCII character. - */ +// Lookup table for btoa(), which converts a six-bit number into the corresponding ASCII character. const keystr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -function btoaLookup (index: number): string | undefined { +function btoaLookup(index: number): string | undefined { return (index >= 0 && index < 64) ? keystr[index] : undefined } diff --git a/src/utils/email.ts b/src/utils/email.ts index b8920875..a5836e88 100644 --- a/src/utils/email.ts +++ b/src/utils/email.ts @@ -4,20 +4,20 @@ import { HashedEmail } from '../types' const emailRegex = () => /\S+(@|%40)\S+\.\S+/ -export function isEmail (s: string): boolean { +export function isEmail(s: string): boolean { return emailRegex().test(s) } -export function containsEmailField (s: string): boolean { +export function containsEmailField(s: string): boolean { return emailRegex().test(s) } -export function extractEmail (s: string): string | null { +export function extractEmail(s: string): string | null { const result = s.match(emailRegex()) return result && result.map(trim)[0] } -export function listEmailsInString (s: string): string[] { +export function listEmailsInString(s: string): string[] { const result = [] // eslint-disable-next-line const emailLikeRegex = `([\\w\\d.+-]+(@|%40)[\\w\\d-]+.[\\w\\d.-]+)` @@ -30,7 +30,7 @@ export function listEmailsInString (s: string): string[] { return result } -export function replaceEmailsWithHashes (originalString: string): { hashesFromOriginalString: HashedEmail[]; stringWithoutRawEmails: string } { +export function replaceEmailsWithHashes(originalString: string): { hashesFromOriginalString: HashedEmail[]; stringWithoutRawEmails: string } { const emailsInString = listEmailsInString(originalString) const hashes = [] let convertedString = originalString diff --git a/src/utils/hash.ts b/src/utils/hash.ts index 9b9f22f9..2f95ef03 100644 --- a/src/utils/hash.ts +++ b/src/utils/hash.ts @@ -8,17 +8,17 @@ const hashLikeRegex = () => /(\s+)?[a-f0-9]{32,64}(\s+)?/gi const lengthToHashType: Map = new Map([[32, 'md5'], [40, 'sha1'], [64, 'sha256']]) -export function isHash (hash: string): boolean { +export function isHash(hash: string): boolean { const extractedHash = extractHashValue(hash) return !!extractedHash && lengthToHashType.has(extractedHash.length) } -export function extractHashValue (s: string): string | null { +export function extractHashValue(s: string): string | null { const result = s.match(hashLikeRegex()) return result && result.map(trim)[0] } -export function hashEmail (email: string): HashedEmail { +export function hashEmail(email: string): HashedEmail { const lowerCasedEmail = email.toLowerCase() return { md5: md5(lowerCasedEmail), @@ -27,6 +27,6 @@ export function hashEmail (email: string): HashedEmail { } } -export function domainHash (domain: string, limit = 12): string { +export function domainHash(domain: string, limit = 12): string { return sha1(domain.replace(/^\./, '')).substring(0, limit) } diff --git a/src/utils/page.ts b/src/utils/page.ts index 877f6354..4851b6c4 100644 --- a/src/utils/page.ts +++ b/src/utils/page.ts @@ -1,15 +1,15 @@ import { base64UrlEncode } from '../utils/b64' import { replaceEmailsWithHashes } from '../utils/email' -export function loadedDomain (): string { +export function loadedDomain(): string { return (document.domain || (document.location && document.location.host)) || (window && window.location && window.location.host) || 'localhost' } -export function getReferrer (win: Window = window): string | undefined { +export function getReferrer(win: Window = window): string | undefined { return _safeGet(() => (win.top as Window).document.referrer) } -export function getPage (win: Window = window): string | undefined { +export function getPage(win: Window = window): string | undefined { const ancestorOrigins = _safeGet(() => win.location.ancestorOrigins) || [] const windows: Window[] = [] @@ -32,7 +32,7 @@ export function getPage (win: Window = window): string | undefined { return detectedPageUrl } -export function getContextElements (privacyMode?: boolean, contextSelectors?: string, contextElementsLength?: number): string { +export function getContextElements(privacyMode?: boolean, contextSelectors?: string, contextElementsLength?: number): string { if (privacyMode || !contextSelectors || contextSelectors === '' || !contextElementsLength) { return '' } else { @@ -41,7 +41,7 @@ export function getContextElements (privacyMode?: boolean, contextSelectors?: st } } -function _collectElementsText (contextSelectors: string, contextElementsLength: number) { +function _collectElementsText(contextSelectors: string, contextElementsLength: number) { const collectedElements = window.document.querySelectorAll(contextSelectors) let collectedString = '' for (let i = 0; i < collectedElements.length; i++) { @@ -53,14 +53,14 @@ function _collectElementsText (contextSelectors: string, contextElementsLength: return collectedString } -function encodedByteCount (s: string): number { +function encodedByteCount(s: string): number { // From: https://stackoverflow.com/questions/2219526/how-many-bytes-in-a-javascript-string const utf8Bytelength = encodeURI(s).split(/%..|./).length - 1 const base64EncodedLength = 4 * Math.ceil(utf8Bytelength / 3.0) return base64EncodedLength } -function _safeGet (getter: () => A): A | undefined { +function _safeGet(getter: () => A): A | undefined { try { return getter() } catch (e) { diff --git a/src/utils/pixel.ts b/src/utils/pixel.ts index f6923ca2..f280b762 100644 --- a/src/utils/pixel.ts +++ b/src/utils/pixel.ts @@ -1,6 +1,6 @@ import { isFunction } from './types' -export function sendPixel (uri: string, onload: () => void): void { +export function sendPixel(uri: string, onload: () => void): void { const img = new window.Image() if (isFunction(onload)) { img.onload = onload diff --git a/src/utils/types.ts b/src/utils/types.ts index 75157896..51e48c24 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -2,81 +2,81 @@ export const UUID = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12 const uuidRegex = new RegExp(`^${UUID}$`, 'i') -export function safeToString (value: unknown): string { +export function safeToString(value: unknown): string { return typeof value === 'object' ? JSON.stringify(value) : ('' + value) } -export function nonNull (value: A): value is NonNullable { +export function nonNull(value: A): value is NonNullable { return value != null } -export function isNonEmpty (value: A): value is NonNullable { +export function isNonEmpty(value: A): value is NonNullable { return nonNull(value) && trim(value).length > 0 } -export function isUUID (value: unknown): value is string { +export function isUUID(value: unknown): value is string { return !!value && uuidRegex.test(trim(value)) } -export function isArray (arr: unknown): arr is unknown[] { +export function isArray(arr: unknown): arr is unknown[] { return Object.prototype.toString.call(arr) === '[object Array]' } const hasTrim = !!String.prototype.trim -export function trim (value: unknown): string { +export function trim(value: unknown): string { return hasTrim ? ('' + value).trim() : ('' + value).replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '') } -export function isString (str: unknown): str is string { +export function isString(str: unknown): str is string { return typeof str === 'string' } -export function strEqualsIgnoreCase (fistStr: string, secondStr: string): boolean { +export function strEqualsIgnoreCase(fistStr: string, secondStr: string): boolean { return isString(fistStr) && isString(secondStr) && trim(fistStr.toLowerCase()) === trim(secondStr.toLowerCase()) } -export function isObject (obj: unknown): obj is object { +export function isObject(obj: unknown): obj is object { return !!obj && typeof obj === 'object' && !isArray(obj) } -export function isRecord (obj: unknown): obj is Record { +export function isRecord(obj: unknown): obj is Record { return isObject(obj) } -export function isFunction (fun: unknown): fun is CallableFunction { +export function isFunction(fun: unknown): fun is CallableFunction { return !!fun && typeof fun === 'function' } -export function expiresInDays (expires: number): Date { +export function expiresInDays(expires: number): Date { return _expiresIn(expires, 864e5) } -function _expiresIn (expires: number, number: number): Date { +function _expiresIn(expires: number, number: number): Date { return new Date((new Date().getTime() + (expires * number))) } -export function expiresInHours (expires: number): Date { +export function expiresInHours(expires: number): Date { return _expiresIn(expires, 36e5) } -export function asParamOrEmpty (param: string, value: A, transform: (a: NonNullable) => string): [string, string][] { +export function asParamOrEmpty(param: string, value: A, transform: (a: NonNullable) => string): [string, string][] { return isNonEmpty(value) ? [[param, transform(value)]] : [] } -export function asStringParam (param: string, value: string | number | boolean | null | undefined): [string, string][] { +export function asStringParam(param: string, value: string | number | boolean | null | undefined): [string, string][] { return asParamOrEmpty(param, value, (s) => encodeURIComponent(s)) } -export function asStringParamTransform (param: string, value: A, transform: (a: NonNullable) => string | number | boolean): [string, string][] { +export function asStringParamTransform(param: string, value: A, transform: (a: NonNullable) => string | number | boolean): [string, string][] { return asParamOrEmpty(param, value, (s) => encodeURIComponent(transform(s))) } -export function asStringParamWhen (param: string, value: A, predicate: (s: NonNullable) => boolean): [string, string][] { +export function asStringParamWhen(param: string, value: A, predicate: (s: NonNullable) => boolean): [string, string][] { return (isNonEmpty(value) && isFunction(predicate) && predicate(value)) ? [[param, encodeURIComponent(value)]] : [] } -export function mapAsParams (paramsMap: Record): [string, string][] { +export function mapAsParams(paramsMap: Record): [string, string][] { if (paramsMap && isObject(paramsMap)) { const array: [string, string][] = [] Object.keys(paramsMap).forEach((key) => { @@ -95,14 +95,14 @@ export function mapAsParams (paramsMap: Record): [str } } -export function merge (obj1: A, obj2: B): A & B { +export function merge(obj1: A, obj2: B): A & B { const res = {} as A & B - function clean (obj: T): T | object { + function clean(obj: T): T | object { return isObject(obj) ? obj : {} } - function keys (obj: T): (keyof T)[] { + function keys(obj: T): (keyof T)[] { return Object.keys(obj) as (keyof T)[] } diff --git a/src/utils/ulid.ts b/src/utils/ulid.ts index 1ef7e803..215c745d 100644 --- a/src/utils/ulid.ts +++ b/src/utils/ulid.ts @@ -6,13 +6,13 @@ const TIME_LEN = 10 const RANDOM_LEN = 16 const prng = detectPrng() -function createError (message: string): Error & { source: string } { +function createError(message: string): Error & { source: string } { const err = new Error(message) as Error & { source: string } err.source = 'Ulid' return err } -function detectPrng (): () => number { +function detectPrng(): () => number { const root = typeof window !== 'undefined' ? window : null const browserCrypto = root && (root.crypto || root.msCrypto) if (browserCrypto) { @@ -25,13 +25,7 @@ function detectPrng (): () => number { return () => Math.random() } -/** - * encodes the time based on the length - * @param now - * @param len - * @returns {string} encoded time. - */ -function encodeTime (now: number, len: number): string { +function encodeTime(now: number, len: number): string { if (now > TIME_MAX) { throw createError('cannot encode time greater than ' + TIME_MAX) } @@ -45,12 +39,7 @@ function encodeTime (now: number, len: number): string { return str } -/** - * encodes random character - * @param len - * @returns {string} - */ -function encodeRandom (len: number): string { +function encodeRandom(len: number): string { let str = '' for (; len > 0; len--) { str = randomChar() + str @@ -58,11 +47,7 @@ function encodeRandom (len: number): string { return str } -/** - * gets a a random charcter from generated pseudorandom number - * @returns {string} - */ -function randomChar (): string { +function randomChar(): string { let rand = Math.floor(prng() * ENCODING_LEN) if (rand === ENCODING_LEN) { rand = ENCODING_LEN - 1 @@ -70,9 +55,7 @@ function randomChar (): string { return ENCODING.charAt(rand) } -/** - * the factory to generate unique identifier based on time and current pseudorandom number - */ -export function ulid (): string { +// the factory to generate unique identifier based on time and current pseudorandom number +export function ulid(): string { return encodeTime(Date.now(), TIME_LEN) + encodeRandom(RANDOM_LEN) } diff --git a/src/utils/url.ts b/src/utils/url.ts index ddb3402b..fe947be6 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -13,23 +13,23 @@ export const toParams = (tuples: ([string, string][])) => { return acc } -function _isNum (v: string): number | string { +function _isNum(v: string): number | string { return isNaN(+v) ? v : +v } -function _isNull (v: A): null | A { +function _isNull(v: A): null | A { return v === 'null' || v === 'undefined' ? null : v } -function _isBoolean (v: A): A | boolean { +function _isBoolean(v: A): A | boolean { return v === 'false' ? false : (v === 'true' ? true : v) } -function _convert (v: string): boolean | number | string | null { +function _convert(v: string): boolean | number | string | null { return _isBoolean(_isNull(_isNum(v))) } -function _parseParam (params: Record, key: string): ParsedParam | ParsedParam[] { +function _parseParam(params: Record, key: string): ParsedParam | ParsedParam[] { if (key in params) { const value = params[key] if (isArray(value)) { @@ -40,7 +40,7 @@ function _parseParam (params: Record, key: string): P } } -function _allParams (url: string): Record { +function _allParams(url: string): Record { let questionMarkIndex, queryParams, historyIndex const obj: Record = {} if (!url || (questionMarkIndex = url.indexOf('?')) === -1 || !(queryParams = url.slice(questionMarkIndex + 1))) { @@ -76,18 +76,18 @@ function _allParams (url: string): Record { return obj } -export function decodeValue (v: string): string { +export function decodeValue(v: string): string { return v.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) } -export function urlParams (url: string): Record { +export function urlParams(url: string): Record { const params = _allParams(url) const result: Record = {} Object.keys(params).forEach((k) => { result[k] = _parseParam(params, k) }) return result } -export function getQueryParameter (url: string, name: string): ParsedParam | ParsedParam[] { +export function getQueryParameter(url: string, name: string): ParsedParam | ParsedParam[] { const params = _allParams(url) return _parseParam(params, name) } diff --git a/src/utils/wrapping.ts b/src/utils/wrapping.ts index e050a49c..200711e1 100644 --- a/src/utils/wrapping.ts +++ b/src/utils/wrapping.ts @@ -18,7 +18,7 @@ export class WrappingContext { this.eventBus = eventBus } - wrap (functionName: K): NonNullable | NoopFunction { + wrap(functionName: K): NonNullable | NoopFunction { if (isObject(this.obj)) { const member = this.obj[functionName] if (isFunction(member)) { @@ -30,7 +30,7 @@ export class WrappingContext { return noop } - reportErrors (): void { + reportErrors(): void { if (this.errors.length > 0) { this.eventBus.emitErrorWithMessage(this.name, `The functions '${JSON.stringify(this.errors)}' were not provided`) } diff --git a/test/it/helpers/browser.ts b/test/it/helpers/browser.ts index 58776f42..4d1c43d6 100644 --- a/test/it/helpers/browser.ts +++ b/test/it/helpers/browser.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' const WAIT_UNTIL_TIMEOUT_MILLIS = 30000 const WAIT_UNTIL_INTERVAL = 500 -export async function getText (selector) { +export async function getText(selector) { let text: string await browser.waitUntil( async () => { @@ -28,11 +28,11 @@ export async function getText (selector) { return text } -export async function click (selector) { +export async function click(selector) { return $(selector).then(e => e.click()) } -export async function sendEvent (event, expectedRequests, server) { +export async function sendEvent(event, expectedRequests, server) { const error = await browser.execute(function (event) { try { window.liQ = window.liQ || [] @@ -48,7 +48,7 @@ export async function sendEvent (event, expectedRequests, server) { await waitForRequests(expectedRequests, server) } -export async function waitForRequests (expectedRequests, server) { +export async function waitForRequests(expectedRequests, server) { console.info(`Waiting for ${expectedRequests} requests`) await browser.waitUntil( () => { @@ -63,7 +63,7 @@ export async function waitForRequests (expectedRequests, server) { console.info('Done waiting for requests') } -export async function waitForBakerRequests (expectedRequests, server) { +export async function waitForBakerRequests(expectedRequests, server) { console.info(`Waiting for ${expectedRequests} baker requests`) await browser.waitUntil( () => { @@ -78,7 +78,7 @@ export async function waitForBakerRequests (expectedRequests, server) { console.info('Done waiting for baker requests') } -export async function resolveIdentity (expectedRequests, server) { +export async function resolveIdentity(expectedRequests, server) { const error = await browser.execute(() => { try { window.liQ = window.liQ || [] @@ -108,7 +108,7 @@ export async function resolveIdentity (expectedRequests, server) { } } -export async function fetchResolvedIdentity () { +export async function fetchResolvedIdentity() { console.info('Waiting for identity to resolve') let text = 'None' await browser.waitUntil( @@ -135,7 +135,7 @@ export async function fetchResolvedIdentity () { return text } -export async function probeLS () { +export async function probeLS() { const result = await browser.execute(function () { const key = '__live-connect-localstorage-probe-test' let enabled = false @@ -162,7 +162,7 @@ export async function probeLS () { return enabled } -export async function deleteAllCookies () { +export async function deleteAllCookies() { const error = await browser.execute(function () { try { const cookies = document.cookie.split('; ') @@ -189,12 +189,12 @@ export async function deleteAllCookies () { } } -export function isMobileSafari () { +export function isMobileSafari() { return browser.capabilities.browserName === 'safari' && (browser.capabilities.realMobile || browser.capabilities.real_mobile) } -export function isMobileSafari14OrNewer () { +export function isMobileSafari14OrNewer() { return browser.capabilities.browserName === 'safari' && ( (browser.capabilities.browserVersion && parseInt(browser.capabilities.browserVersion.substring(0, 2)) >= 14) || @@ -203,15 +203,15 @@ export function isMobileSafari14OrNewer () { (browser.capabilities.realMobile || browser.capabilities.real_mobile) } -export function isIE () { +export function isIE() { return browser.capabilities.browserName === 'internet explorer' } -export function isFirefox () { +export function isFirefox() { return browser.capabilities.browserName === 'firefox' } -export function isFirefoxAfter86 () { +export function isFirefoxAfter86() { return browser.capabilities.browserName === 'firefox' && ( (browser.capabilities.browserVersion && parseInt(browser.capabilities.browserVersion.split('.')[0]) > 86) || diff --git a/test/it/helpers/mock-server.ts b/test/it/helpers/mock-server.ts index f379cf94..a96ec1d6 100644 --- a/test/it/helpers/mock-server.ts +++ b/test/it/helpers/mock-server.ts @@ -14,7 +14,7 @@ const port = 3001 const bundle = fs.readFileSync('test-resources/bundle.iife.js', 'utf8') -export function MockServerFactory (config) { +export function MockServerFactory(config) { const preamble = `window.LI=${JSON.stringify(config)};\n` const fullContent = preamble + bundle const app = express() diff --git a/test/shared/utils/calls.ts b/test/shared/utils/calls.ts index 3ff63700..03d3c711 100644 --- a/test/shared/utils/calls.ts +++ b/test/shared/utils/calls.ts @@ -2,13 +2,13 @@ import { ExternalCallHandler } from '../../../src/types' import { isFunction } from '../../../src/utils/types' export const TestCallHandler: ExternalCallHandler = { - ajaxGet (url: string, responseHandler: (responseText: string, response: object) => void, fallback?: (error: unknown) => void, timeout = 1000): void { - function errorCallback (name: string, message: string, error: unknown, request: XMLHttpRequest | XDomainRequest) { + ajaxGet(url: string, responseHandler: (responseText: string, response: object) => void, fallback?: (error: unknown) => void, timeout = 1000): void { + function errorCallback(name: string, message: string, error: unknown, request: XMLHttpRequest | XDomainRequest) { console.error('Error while executing ajax call', message, error, request) if (isFunction(fallback)) fallback(error) } - function xhrCall (): XMLHttpRequest { + function xhrCall(): XMLHttpRequest { const xhr = new XMLHttpRequest() xhr.onreadystatechange = () => { if (xhr.readyState === 4) { @@ -24,7 +24,7 @@ export const TestCallHandler: ExternalCallHandler = { return xhr } - function xdrCall (): XDomainRequest { + function xdrCall(): XDomainRequest { const xdr = new window.XDomainRequest!() xdr.onprogress = () => undefined xdr.onerror = () => { @@ -50,7 +50,7 @@ export const TestCallHandler: ExternalCallHandler = { } }, - pixelGet (uri: string, onload?: () => void): void { + pixelGet(uri: string, onload?: () => void): void { const img = new window.Image() if (isFunction(onload)) { img.onload = onload diff --git a/test/shared/utils/storage.ts b/test/shared/utils/storage.ts index 8b26049f..84af5835 100644 --- a/test/shared/utils/storage.ts +++ b/test/shared/utils/storage.ts @@ -27,7 +27,7 @@ export class TestStorageHandler implements ExternalStorageHandler { }) } - getCookie (key: string): string | null { + getCookie(key: string): string | null { const result = this.cookies.get(key) if (result === undefined) { return null @@ -35,7 +35,7 @@ export class TestStorageHandler implements ExternalStorageHandler { return result } - findSimilarCookies (substring: string): string[] { + findSimilarCookies(substring: string): string[] { try { const allCookies = this.cookies.get() return Object.keys(allCookies).filter(key => key.indexOf(substring) >= 0 && allCookies[key] !== null).map(key => allCookies[key]) @@ -45,7 +45,7 @@ export class TestStorageHandler implements ExternalStorageHandler { } } - setCookie (key: string, value: string, expires?: Date, sameSite?: string, domain?: string): void { + setCookie(key: string, value: string, expires?: Date, sameSite?: string, domain?: string): void { if (expires) { let expiresDate: Date if (typeof expires === 'string') { @@ -61,14 +61,14 @@ export class TestStorageHandler implements ExternalStorageHandler { } } - localStorageIsEnabled () { + localStorageIsEnabled() { if (this._localStorageIsEnabled == null) { this._localStorageIsEnabled = this.checkLocalStorage() } return this._localStorageIsEnabled } - getDataFromLocalStorage (key: string): string | null { + getDataFromLocalStorage(key: string): string | null { if (this.localStorageIsEnabled()) { return window.localStorage.getItem(key) } else { @@ -76,19 +76,19 @@ export class TestStorageHandler implements ExternalStorageHandler { } } - setDataInLocalStorage (key: string, value: string): void { + setDataInLocalStorage(key: string, value: string): void { if (this.localStorageIsEnabled()) { window.localStorage.setItem(key, value) } } - removeDataFromLocalStorage (key: string): void { + removeDataFromLocalStorage(key: string): void { if (this.localStorageIsEnabled()) { window.localStorage.removeItem(key) } } - private checkLocalStorage () { + private checkLocalStorage() { let enabled = false try { if (window && window.localStorage) { diff --git a/test/unit/handlers/storage-handler.spec.ts b/test/unit/handlers/storage-handler.spec.ts index 28912155..48063682 100644 --- a/test/unit/handlers/storage-handler.spec.ts +++ b/test/unit/handlers/storage-handler.spec.ts @@ -11,9 +11,9 @@ import { EventBus } from '../../../src/types' use(dirtyChai) type RecordedError = { - name: string; - message: string; - exception?: unknown; + name: string + message: string + exception?: unknown } describe('StorageHandler', () => { diff --git a/test/unit/idex/identity-resolver.spec.ts b/test/unit/idex/identity-resolver.spec.ts index de77f774..c5cdcdb0 100644 --- a/test/unit/idex/identity-resolver.spec.ts +++ b/test/unit/idex/identity-resolver.spec.ts @@ -318,7 +318,7 @@ describe('IdentityResolver', () => { const expiresAt = new Date() expiresAt.setHours(expiresAt.getHours() + 12) - function epochSeconds (date) { + function epochSeconds(date) { Math.floor(date.getTime() / 1000) } diff --git a/test/unit/utils/page.spec.ts b/test/unit/utils/page.spec.ts index 821ffb4a..80e258fe 100644 --- a/test/unit/utils/page.spec.ts +++ b/test/unit/utils/page.spec.ts @@ -149,14 +149,14 @@ describe('Page Utils', () => { }) }) -function createElement (tag, text, document) { +function createElement(tag, text, document) { const newElement = document.createElement(tag) const newContent = document.createTextNode(text) newElement.appendChild(newContent) document.documentElement.appendChild(newElement) } -function definedProperty (object, name, getter) { +function definedProperty(object, name, getter) { Object.defineProperty(object, name, { get: getter })