@scbt-ecom/ui 0.127.1 → 0.128.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":"variableContextHolder.js","sources":["../../../../../lib/shared/utils/variableHolder/variableContextHolder.ts"],"sourcesContent":["import { localStorageActions } from '../localStorageActions'\n\nexport interface Variable<Key = string, Value = string> {\n _id: string\n key: Key\n value: Value\n createdAt: string\n updatedAt: string\n description: string\n}\n\nexport type VariableEntry<Key = string, Value = string> = [Key, Value]\n\nexport interface IVariableContextHolder<Key, Value> {\n variables: Variable<Key, Value>[]\n append: (variable: Variable<Key, Value>) => void\n remove: (key: Key) => void\n has: (key: Key) => boolean\n replace: (variables: Variable<Key, Value>[]) => void\n clear: () => void\n update: (id: string, variable: Variable<Key, Value>) => void\n entriesOf: (...keys: Key[]) => VariableEntry<Key, Value>[]\n observe: (listener: (variables: Variable<Key, Value>[]) => void) => () => void\n get: (key: Key) => Variable<Key, Value> | undefined\n}\n\nexport interface VariableStore {\n setItem: <T>(key: string, value: T) => void\n getItem: <T>(key: string) => T | null\n clearItems: (...keys: string[]) => void\n}\n\nclass InMemoryVariableStore implements VariableStore {\n private _store = new Map<string, unknown>()\n\n constructor() {}\n\n clearItems(...keys: string[]): void {\n for (const key of keys) {\n this._store.delete(key)\n }\n }\n\n getItem<T>(key: string): T | null {\n return (this._store.get(key) as T) ?? null\n }\n\n setItem<T>(key: string, value: T): void {\n this._store.set(key, value)\n }\n}\n\n/**\n * Класс для управления переменными\n */\nexport class VariableContextHolder<Key extends string = string, Value = string> implements IVariableContextHolder<Key, Value> {\n private _variables: Variable<Key, Value>[] = []\n private _listeners = new Map<symbol, (variables: Variable<Key, Value>[]) => void>()\n private _nextListenerId: number = 0\n private _storeContext: VariableStore\n\n private static _VARIABLE_REGEX: RegExp = /\\$\\{([^}]+)}/g\n private static _VARIABLE_PATTERN: string = '${variable}'\n private static _instance = new Map<string, VariableContextHolder>()\n\n private constructor(private _store: string) {\n if (typeof window === 'undefined') {\n this._storeContext = new InMemoryVariableStore()\n } else {\n this._storeContext = localStorageActions\n }\n\n this._variables = this._storeContext.getItem<Variable<Key, Value>[]>(this._store) ?? []\n }\n\n static unwrap(variable: string): string {\n return variable.replace(/\\$\\{|}/g, '')\n }\n\n static wrap(variable: string): string {\n return this._VARIABLE_PATTERN.replace('variable', variable)\n }\n\n static match(pattern: string): string[] | null {\n return pattern.match(this._VARIABLE_REGEX) as string[] | null\n }\n\n // use only a singleton instance, do not create duplicated instances of each store key\n public static getInstance(store: string): VariableContextHolder {\n const instance = VariableContextHolder._instance.get(store)\n\n if (!instance) {\n const holder = new VariableContextHolder(store)\n VariableContextHolder._instance.set(store, holder)\n\n return holder\n }\n\n return instance\n }\n\n get variables() {\n return this._variables\n }\n\n private collect() {\n this._storeContext.setItem(this._store, this._variables)\n this._listeners.forEach((listener) => listener(this._variables))\n\n return this._variables\n }\n\n get = (id: string) => {\n return this._variables.find((variable) => variable._id === id)\n }\n\n append = (variable: Variable<Key, Value>) => {\n this._variables.push(variable)\n this.collect()\n }\n\n clear = () => {\n this._variables = []\n this.collect()\n }\n\n entriesOf = (...keys: Key[]): VariableEntry<Key, Value>[] => {\n const entries: VariableEntry<Key, Value>[] = []\n\n for (const variable of this._variables) {\n if (keys.includes(variable.key)) entries.push([variable.key, variable.value])\n }\n\n return entries\n }\n\n remove = (key: Key) => {\n this._variables = this._variables.filter((v) => v.key !== key)\n this.collect()\n }\n\n replace = (variables: Variable<Key, Value>[]): Variable<Key, Value>[] => {\n this._variables = variables\n\n return this.collect()\n }\n\n update = (id: string, variable: Variable<Key, Value>): Variable<Key, Value>[] => {\n const updated = this._variables.map((v) => (v._id === id ? variable : v))\n\n return this.replace(updated)\n }\n\n observe = (listener: (variables: Variable<Key, Value>[]) => void): (() => void) => {\n const listenerId = Symbol(this._nextListenerId++)\n this._listeners.set(listenerId, listener)\n\n return () => {\n this._listeners.delete(listenerId)\n }\n }\n\n has(key: Key): boolean {\n return this._variables.some((variable) => variable.key === key)\n }\n}\n"],"names":["InMemoryVariableStore","__publicField","keys","key","value","_VariableContextHolder","_store","id","variable","entries","v","variables","updated","listener","listenerId","localStorageActions","pattern","store","instance","holder","VariableContextHolder"],"mappings":"oOAgCA,MAAMA,CAA+C,CAGnD,aAAc,CAFNC,EAAA,kBAAa,IAEN,CAEf,cAAcC,EAAsB,CAClC,UAAWC,KAAOD,EAChB,KAAK,OAAO,OAAOC,CAAG,CAE1B,CAEA,QAAWA,EAAuB,CAChC,OAAQ,KAAK,OAAO,IAAIA,CAAG,GAAW,IACxC,CAEA,QAAWA,EAAaC,EAAgB,CACtC,KAAK,OAAO,IAAID,EAAKC,CAAK,CAC5B,CACF,CAKO,MAAMC,EAAN,MAAMA,CAAiH,CAUpH,YAAoBC,EAAgB,CATpCL,EAAA,kBAAqC,CAAA,GACrCA,EAAA,sBAAiB,KACjBA,EAAA,uBAA0B,GAC1BA,EAAA,sBAqDRA,EAAA,WAAOM,GACE,KAAK,WAAW,KAAMC,GAAaA,EAAS,MAAQD,CAAE,GAG/DN,EAAA,cAAUO,GAAmC,CAC3C,KAAK,WAAW,KAAKA,CAAQ,EAC7B,KAAK,QAAA,CACP,GAEAP,EAAA,aAAQ,IAAM,CACZ,KAAK,WAAa,CAAA,EAClB,KAAK,QAAA,CACP,GAEAA,EAAA,iBAAY,IAAIC,IAA6C,CAC3D,MAAMO,EAAuC,CAAA,EAE7C,UAAWD,KAAY,KAAK,WACtBN,EAAK,SAASM,EAAS,GAAG,GAAGC,EAAQ,KAAK,CAACD,EAAS,IAAKA,EAAS,KAAK,CAAC,EAG9E,OAAOC,CACT,GAEAR,EAAA,cAAUE,GAAa,CACrB,KAAK,WAAa,KAAK,WAAW,OAAQO,GAAMA,EAAE,MAAQP,CAAG,EAC7D,KAAK,QAAA,CACP,GAEAF,EAAA,eAAWU,IACT,KAAK,WAAaA,EAEX,KAAK,QAAA,IAGdV,EAAA,cAAS,CAACM,EAAYC,IAA2D,CAC/E,MAAMI,EAAU,KAAK,WAAW,IAAKF,GAAOA,EAAE,MAAQH,EAAKC,EAAWE,CAAE,EAExE,OAAO,KAAK,QAAQE,CAAO,CAC7B,GAEAX,EAAA,eAAWY,GAAwE,CACjF,MAAMC,EAAa,OAAO,KAAK,iBAAiB,EAChD,YAAK,WAAW,IAAIA,EAAYD,CAAQ,EAEjC,IAAM,CACX,KAAK,WAAW,OAAOC,CAAU,CACnC,CACF,GA/F4B,KAAA,OAAAR,EACtB,OAAO,OAAW,IACpB,KAAK,cAAgB,IAAIN,EAEzB,KAAK,cAAgBe,EAGvB,KAAK,WAAa,KAAK,cAAc,QAAgC,KAAK,MAAM,GAAK,CAAA,CACvF,CAEA,OAAO,OAAOP,EAA0B,CACtC,OAAOA,EAAS,QAAQ,UAAW,EAAE,CACvC,CAEA,OAAO,KAAKA,EAA0B,CACpC,OAAO,KAAK,kBAAkB,QAAQ,WAAYA,CAAQ,CAC5D,CAEA,OAAO,MAAMQ,EAAkC,CAC7C,OAAOA,EAAQ,MAAM,KAAK,eAAe,CAC3C,CAGA,OAAc,YAAYC,EAAsC,CAC9D,MAAMC,EAAWb,EAAsB,UAAU,IAAIY,CAAK,EAE1D,GAAI,CAACC,EAAU,CACb,MAAMC,EAAS,IAAId,EAAsBY,CAAK,EAC9C,OAAAZ,EAAsB,UAAU,IAAIY,EAAOE,CAAM,EAE1CA,CACT,CAEA,OAAOD,CACT,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,UACd,CAEQ,SAAU,CAChB,YAAK,cAAc,QAAQ,KAAK,OAAQ,KAAK,UAAU,EACvD,KAAK,WAAW,QAASL,GAAaA,EAAS,KAAK,UAAU,CAAC,EAExD,KAAK,UACd,CAoDA,IAAIV,EAAmB,CACrB,OAAO,KAAK,WAAW,KAAMK,GAAaA,EAAS,MAAQL,CAAG,CAChE,CACF,EAxGEF,EANWI,EAMI,kBAA0B,iBACzCJ,EAPWI,EAOI,oBAA4B,eAC3CJ,EARWI,EAQI,YAAY,IAAI,KAR1B,IAAMe,EAANf"}
1
+ {"version":3,"file":"variableContextHolder.js","sources":["../../../../../lib/shared/utils/variableHolder/variableContextHolder.ts"],"sourcesContent":["import { localStorageActions } from '../localStorageActions'\n\nexport interface Variable<Key = string, Value = string> {\n _id: string\n key: Key\n value: Value\n createdAt: string\n updatedAt: string\n description: string\n}\n\nexport type VariableEntry<Key = string, Value = string> = [Key, Value]\n\nexport interface IVariableContextHolder<Key, Value> {\n /**\n * список переменных, находящихся в имплементации\n */\n variables: Variable<Key, Value>[]\n /**\n * метод для добавления переменной\n * @param variable\n */\n append: (variable: Variable<Key, Value>) => void\n /**\n * метод для удаления переменной\n * @param key\n */\n remove: (key: Key) => void\n /**\n * метод для проверки наличия переменной по ключу\n * @param key\n */\n has: (key: Key) => boolean\n /**\n * метод для замены всех переменных\n * @param variables\n */\n replace: (variables: Variable<Key, Value>[]) => void\n /**\n * метод для очистки переменных\n */\n clear: () => void\n /**\n * метод для обновления переменной, по её идентификатору\n * @param id\n * @param variable\n */\n update: (id: string, variable: Variable<Key, Value>) => void\n /**\n * получение вхождений переменных по ключам\n * @param keys\n * @returns {VariableEntry<Key, Value>[]} entries `Array<[Key, Value]>`\n */\n entriesOf: (...keys: Key[]) => VariableEntry<Key, Value>[]\n /**\n * метод для подписки на изменения переменных\n * @param listener\n * @returns функция для отписки\n */\n observe: (listener: (variables: Variable<Key, Value>[]) => void) => () => void\n /**\n * получение переменной по ключу\n * @param key\n * @returns `Variable<Key, Value>` если переменная присутствует, `undefined` если переменной не существует\n */\n get: (key: Key) => Variable<Key, Value> | undefined\n}\n\nexport interface VariableStore {\n setItem: <T>(key: string, value: T) => void\n getItem: <T>(key: string) => T | null\n clearItems: (...keys: string[]) => void\n}\n\nclass InMemoryVariableStore implements VariableStore {\n private _store = new Map<string, unknown>()\n\n constructor() {}\n\n clearItems(...keys: string[]): void {\n for (const key of keys) {\n this._store.delete(key)\n }\n }\n\n getItem<T>(key: string): T | null {\n return (this._store.get(key) as T) ?? null\n }\n\n setItem<T>(key: string, value: T): void {\n this._store.set(key, value)\n }\n}\n\n/**\n * Класс для управления переменными.\n * Присутствует возможность использования в среде исполнения NodeJS, при этом будет использоваться in-memory хранилище переменных, что может потреблять дополнительную память приложения\n *\n * @example Базовое использование\n * ```ts\n * // используем статичный метод класса для получения инстанса\n * const holder = VariableContextHolder.getInstance('VARIABLE_STORE')\n *\n * // эмулируем создание переменной\n * const variable: Variable = {\n * _id: Math.random().toString(36).substring(2),\n * // ключ должен быть обёрнут в шаблон переменной\n * // чтобы это сделать, используем статичный метод\n * key: VariableContextHolder.wrap('variable_key'),\n * value: 'variable_value',\n * createdAt: new Date().toISOString(),\n * updatedAt: new Date().toISOString(),\n * description: ''\n * }\n *\n * holder.append(variable)\n *\n * holder.variables.forEach((v) => {\n * // рендерим переменные как в соответствии с требованиями\n * })\n * ```\n *\n * @example Использование с react\n * ```tsx\n * const Component = () => {\n * // создадим ref с экземпляром класса (это нужно чтобы не изменять ссылку при ре-рендере)\n * const holder = useRef(VariableContextHolder.getInstance('VARIABLE_STORE'))\n * // подключаем и подписываемся на мутацию переменных\n * const variables = useSyncExternalStore(holder.current.observe, () => holder.current.variables)\n *\n * return (\n * <div>\n * {variables.map((variable) => (\n * // рендерим переменные как в соответствии с требованиями\n * ))}\n * </div>\n * )\n * }\n * ```\n *\n * @example Синхронизация с сервером\n * ```ts\n * const holder = VariableContextHolder.getInstance('VARIABLE_STORE')\n *\n * // загружаем переменные с сервера\n * fetch('https://backend.url/variables')\n * .then((response) => response.json())\n * .then((data) => holder.replace(data))\n * ```\n *\n * @example Обход строки для замены переменных на их значения\n * ```ts\n * const holder = VariableContextHolder.getInstance('VARIABLE_STORE')\n *\n * const transformVariable = (value: string): string => {\n * let str = value\n * // находим все переменные в строке\n * let matches = VariableContextHolder.match(str)\n * // получаем вхождения по найденным переменным\n * let variables = holder.entriesOf(...(matches ?? []))\n *\n * // выполняем замену переменных до тех пор, пока в строке содержатся переменные\n * while (!TypeGuards.isArrayEmpty(variables)) {\n * variables.forEach(([key, value]) => {\n * // заменяем каждую переменную на её значение\n * str = str.replace(key, value)\n * })\n * // пробуем снова получить переменные в строке,\n * // так как переменная может содержать другую переменную\n * matches = VariableContextHolder.match(str)\n * variables = holder.entriesOf(...(matches ?? []))\n * }\n *\n * return str\n * }\n *\n * const stringWithVariables = 'Процентная ставка \\${percent}% годовых до \\${months} месяцев'\n * const processedString = transformVariable(stringWithVariables)\n * ```\n */\nexport class VariableContextHolder<Key extends string = string, Value = string> implements IVariableContextHolder<Key, Value> {\n private _variables: Variable<Key, Value>[] = []\n private _listeners = new Map<symbol, (variables: Variable<Key, Value>[]) => void>()\n private _nextListenerId: number = 0\n private _storeContext: VariableStore\n\n private static _VARIABLE_REGEX: RegExp = /\\$\\{([^}]+)}/g\n private static _VARIABLE_PATTERN: string = '${variable}'\n private static _instance = new Map<string, VariableContextHolder>()\n\n private constructor(private _store: string) {\n // create in-memory store if instance created out of browser\n if (typeof window === 'undefined') {\n this._storeContext = new InMemoryVariableStore()\n } else {\n this._storeContext = localStorageActions\n }\n\n this._variables = this._storeContext.getItem<Variable<Key, Value>[]>(this._store) ?? []\n }\n\n /**\n * метод для извлечения ключа переменной из шаблона\n * @param variable\n */\n public static unwrap(variable: string): string {\n return variable.replace(/\\$\\{|}/g, '')\n }\n\n /**\n * метод для оборачивания ключа переменной в шаблон\n * @param variable\n */\n public static wrap(variable: string): string {\n return this._VARIABLE_PATTERN.replace('variable', variable)\n }\n\n /**\n * метод для поиска переменных в строке\n * @param pattern\n * @returns `string[]` если переменные присутствуют в строке, иначе `null`\n */\n public static match(pattern: string): string[] | null {\n return pattern.match(this._VARIABLE_REGEX) as string[] | null\n }\n\n /**\n * метод для получения синглтон экземпляра класса по ключу хранилища\n * @param store\n * @returns экземпляр подключенный к in-memory хранилищу если код выполняется в NodeJS, `localStorage` если в браузере\n */\n public static getInstance(store: string): VariableContextHolder {\n const instance = VariableContextHolder._instance.get(store)\n\n if (!instance) {\n const holder = new VariableContextHolder(store)\n VariableContextHolder._instance.set(store, holder)\n\n return holder\n }\n\n return instance\n }\n\n get variables() {\n return this._variables\n }\n\n private collect() {\n this._storeContext.setItem(this._store, this._variables)\n this._listeners.forEach((listener) => listener(this._variables))\n\n return this._variables\n }\n\n get = (id: string) => {\n return this._variables.find((variable) => variable._id === id)\n }\n\n append = (variable: Variable<Key, Value>) => {\n this._variables.push(variable)\n this.collect()\n }\n\n clear = () => {\n this._variables = []\n this.collect()\n }\n\n entriesOf = (...keys: Key[]): VariableEntry<Key, Value>[] => {\n const entries: VariableEntry<Key, Value>[] = []\n\n for (const variable of this._variables) {\n if (keys.includes(variable.key)) entries.push([variable.key, variable.value])\n }\n\n return entries\n }\n\n remove = (key: Key) => {\n this._variables = this._variables.filter((v) => v.key !== key)\n this.collect()\n }\n\n replace = (variables: Variable<Key, Value>[]): Variable<Key, Value>[] => {\n this._variables = variables\n\n return this.collect()\n }\n\n update = (id: string, variable: Variable<Key, Value>): Variable<Key, Value>[] => {\n const updated = this._variables.map((v) => (v._id === id ? variable : v))\n\n return this.replace(updated)\n }\n\n observe = (listener: (variables: Variable<Key, Value>[]) => void): (() => void) => {\n const listenerId = Symbol(this._nextListenerId++)\n this._listeners.set(listenerId, listener)\n\n return () => {\n this._listeners.delete(listenerId)\n }\n }\n\n has(key: Key): boolean {\n return this._variables.some((variable) => variable.key === key)\n }\n}\n"],"names":["InMemoryVariableStore","__publicField","keys","key","value","_VariableContextHolder","_store","id","variable","entries","v","variables","updated","listener","listenerId","localStorageActions","pattern","store","instance","holder","VariableContextHolder"],"mappings":"oOA0EA,MAAMA,CAA+C,CAGnD,aAAc,CAFNC,EAAA,kBAAa,IAEN,CAEf,cAAcC,EAAsB,CAClC,UAAWC,KAAOD,EAChB,KAAK,OAAO,OAAOC,CAAG,CAE1B,CAEA,QAAWA,EAAuB,CAChC,OAAQ,KAAK,OAAO,IAAIA,CAAG,GAAW,IACxC,CAEA,QAAWA,EAAaC,EAAgB,CACtC,KAAK,OAAO,IAAID,EAAKC,CAAK,CAC5B,CACF,CAwFO,MAAMC,EAAN,MAAMA,CAAiH,CAUpH,YAAoBC,EAAgB,CATpCL,EAAA,kBAAqC,CAAA,GACrCA,EAAA,sBAAiB,KACjBA,EAAA,uBAA0B,GAC1BA,EAAA,sBAuERA,EAAA,WAAOM,GACE,KAAK,WAAW,KAAMC,GAAaA,EAAS,MAAQD,CAAE,GAG/DN,EAAA,cAAUO,GAAmC,CAC3C,KAAK,WAAW,KAAKA,CAAQ,EAC7B,KAAK,QAAA,CACP,GAEAP,EAAA,aAAQ,IAAM,CACZ,KAAK,WAAa,CAAA,EAClB,KAAK,QAAA,CACP,GAEAA,EAAA,iBAAY,IAAIC,IAA6C,CAC3D,MAAMO,EAAuC,CAAA,EAE7C,UAAWD,KAAY,KAAK,WACtBN,EAAK,SAASM,EAAS,GAAG,GAAGC,EAAQ,KAAK,CAACD,EAAS,IAAKA,EAAS,KAAK,CAAC,EAG9E,OAAOC,CACT,GAEAR,EAAA,cAAUE,GAAa,CACrB,KAAK,WAAa,KAAK,WAAW,OAAQO,GAAMA,EAAE,MAAQP,CAAG,EAC7D,KAAK,QAAA,CACP,GAEAF,EAAA,eAAWU,IACT,KAAK,WAAaA,EAEX,KAAK,QAAA,IAGdV,EAAA,cAAS,CAACM,EAAYC,IAA2D,CAC/E,MAAMI,EAAU,KAAK,WAAW,IAAKF,GAAOA,EAAE,MAAQH,EAAKC,EAAWE,CAAE,EAExE,OAAO,KAAK,QAAQE,CAAO,CAC7B,GAEAX,EAAA,eAAWY,GAAwE,CACjF,MAAMC,EAAa,OAAO,KAAK,iBAAiB,EAChD,YAAK,WAAW,IAAIA,EAAYD,CAAQ,EAEjC,IAAM,CACX,KAAK,WAAW,OAAOC,CAAU,CACnC,CACF,GAjH4B,KAAA,OAAAR,EAEtB,OAAO,OAAW,IACpB,KAAK,cAAgB,IAAIN,EAEzB,KAAK,cAAgBe,EAGvB,KAAK,WAAa,KAAK,cAAc,QAAgC,KAAK,MAAM,GAAK,CAAA,CACvF,CAMA,OAAc,OAAOP,EAA0B,CAC7C,OAAOA,EAAS,QAAQ,UAAW,EAAE,CACvC,CAMA,OAAc,KAAKA,EAA0B,CAC3C,OAAO,KAAK,kBAAkB,QAAQ,WAAYA,CAAQ,CAC5D,CAOA,OAAc,MAAMQ,EAAkC,CACpD,OAAOA,EAAQ,MAAM,KAAK,eAAe,CAC3C,CAOA,OAAc,YAAYC,EAAsC,CAC9D,MAAMC,EAAWb,EAAsB,UAAU,IAAIY,CAAK,EAE1D,GAAI,CAACC,EAAU,CACb,MAAMC,EAAS,IAAId,EAAsBY,CAAK,EAC9C,OAAAZ,EAAsB,UAAU,IAAIY,EAAOE,CAAM,EAE1CA,CACT,CAEA,OAAOD,CACT,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,UACd,CAEQ,SAAU,CAChB,YAAK,cAAc,QAAQ,KAAK,OAAQ,KAAK,UAAU,EACvD,KAAK,WAAW,QAASL,GAAaA,EAAS,KAAK,UAAU,CAAC,EAExD,KAAK,UACd,CAoDA,IAAIV,EAAmB,CACrB,OAAO,KAAK,WAAW,KAAMK,GAAaA,EAAS,MAAQL,CAAG,CAChE,CACF,EA1HEF,EANWI,EAMI,kBAA0B,iBACzCJ,EAPWI,EAOI,oBAA4B,eAC3CJ,EARWI,EAQI,YAAY,IAAI,KAR1B,IAAMe,EAANf"}