@vbotma/toolkit 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Vladislav Kibenko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Converts string value from camel case to kebab case.
3
+ * @param value - value to convert.
4
+ */
5
+ export declare function camelToKebab(value: string): string;
@@ -0,0 +1,6 @@
1
+ export type CamelToSnakeCase<T extends string> = T extends `${infer First}${infer Rest}` ? `${First extends Capitalize<First> ? '_' : ''}${Lowercase<First>}${CamelToSnakeCase<Rest>}` : T;
2
+ /**
3
+ * Converts string value from camel case to snake case.
4
+ * @param value - value to convert.
5
+ */
6
+ export declare function camelToSnake<T extends string>(value: T): CamelToSnakeCase<T>;
@@ -0,0 +1,9 @@
1
+ import { CamelToSnakeCase } from './camelToSnake.js';
2
+ export type ConvertCamelKeysToSnakeCase<T> = {
3
+ [K in keyof T as CamelToSnakeCase<string & K>]: T[K];
4
+ };
5
+ /**
6
+ * Converts object keys from snake to camel case.
7
+ * @param value - value to convert.
8
+ */
9
+ export declare function camelToSnakeObjKeys<T extends object>(value: T): ConvertCamelKeysToSnakeCase<T>;
@@ -0,0 +1,9 @@
1
+ import { SnakeToCamelCase } from './snakeToCamel.js';
2
+ export type DeepConvertSnakeKeysToCamelCase<T> = T extends infer U ? U extends object ? U extends Date ? U : U extends (infer Item)[] ? DeepConvertSnakeKeysToCamelCase<Item>[] : {
3
+ [K in keyof U as SnakeToCamelCase<string & K>]: DeepConvertSnakeKeysToCamelCase<U[K]>;
4
+ } & {} : U : T;
5
+ /**
6
+ * Deeply converts object keys from snake to camel case.
7
+ * @param value - value to convert.
8
+ */
9
+ export declare function deepSnakeToCamelObjKeys<T extends object>(value: T): DeepConvertSnakeKeysToCamelCase<T>;
@@ -0,0 +1,6 @@
1
+ export type SnakeToCamelCase<S extends string> = S extends `${infer Head}_${infer Tail}` ? `${Head}${Capitalize<SnakeToCamelCase<Tail>>}` : S;
2
+ /**
3
+ * Converts string value from snake case to camel case.
4
+ * @param value - value to convert.
5
+ */
6
+ export declare function snakeToCamel<T extends string>(value: T): SnakeToCamelCase<T>;
@@ -0,0 +1,9 @@
1
+ import { SnakeToCamelCase } from './snakeToCamel.js';
2
+ export type ConvertSnakeKeysToCamelCase<T> = {
3
+ [K in keyof T as SnakeToCamelCase<string & K>]: T[K];
4
+ };
5
+ /**
6
+ * Converts object keys from snake to camel case.
7
+ * @param value - value to convert.
8
+ */
9
+ export declare function snakeToCamelObjKeys<T extends object>(value: T): ConvertSnakeKeysToCamelCase<T>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Converts string value from snake case to kebab case.
3
+ * @param value - value to convert.
4
+ */
5
+ export declare function snakeToKebab(value: string): string;
@@ -0,0 +1,9 @@
1
+ export type CallbackFn = () => void;
2
+ /**
3
+ * Returns a tuple, containing function to add cleanup, call cleanup, and flag showing whether
4
+ * cleanup was called. Cleanup will not be performed in case, it was done before.
5
+ */
6
+ export declare function createCbCollector(...cbs: (CallbackFn | CallbackFn[])[]): [
7
+ add: (...fns: CallbackFn[]) => void,
8
+ call: () => void
9
+ ];
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Message log level.
3
+ */
4
+ export type LogLevel = 'log' | 'error' | 'warn';
5
+ export interface LoggerOptions {
6
+ bgColor?: string;
7
+ textColor?: string;
8
+ /**
9
+ * True if logs are enabled.
10
+ * @default true
11
+ */
12
+ shouldLog?: boolean | (() => boolean);
13
+ }
14
+ export type LoggerFn = (...args: any[]) => void;
15
+ export type LoggerForceFn = (...args: any[]) => void;
16
+ export interface Logger {
17
+ /**
18
+ * Prints an error message into the console.
19
+ * @param args - items to log.
20
+ */
21
+ error: LoggerFn;
22
+ /**
23
+ * Prints an error message into the console ignoring the `shouldLog`
24
+ * constructor option.
25
+ * @param args - items to log.
26
+ */
27
+ forceError: LoggerForceFn;
28
+ /**
29
+ * Prints a log message into the console ignoring the `shouldLog` constructor
30
+ * option.
31
+ * @param args - items to log.
32
+ */
33
+ forceLog: LoggerForceFn;
34
+ /**
35
+ * Prints a warning message into the console ignoring the `shouldLog`
36
+ * constructor option.
37
+ * @param args - items to log.
38
+ */
39
+ forceWarn: LoggerForceFn;
40
+ /**
41
+ * Prints a log message into the console.
42
+ * @param args - items to log.
43
+ */
44
+ log: LoggerFn;
45
+ /**
46
+ * Prints a warning message into the console.
47
+ * @param args - items to log.
48
+ */
49
+ warn: LoggerFn;
50
+ }
51
+ export declare function createLogger(scope: string, options?: LoggerOptions): Logger;
@@ -0,0 +1,15 @@
1
+ export * from './casing/camelToKebab.js';
2
+ export * from './casing/camelToSnake.js';
3
+ export * from './casing/camelToSnakeObjKeys.js';
4
+ export * from './casing/deepSnakeToCamelObjKeys.js';
5
+ export * from './casing/snakeToCamel.js';
6
+ export * from './casing/snakeToCamelObjKeys.js';
7
+ export * from './casing/snakeToKebab.js';
8
+ export * from './storage/storage.js';
9
+ export type * from './types/logical.js';
10
+ export type * from './types/misc.js';
11
+ export type * from './types/predicates.js';
12
+ export type * from './types/unions.js';
13
+ export * from './createCbCollector.js';
14
+ export * from './createLogger.js';
15
+ export * from './monads.js';
@@ -0,0 +1,21 @@
1
+ import { BetterPromise, BetterPromiseExecutorContext, BetterPromiseOptions, TimeoutError } from 'better-promises';
2
+ import { either as E, taskEither as TE } from 'fp-ts';
3
+ import { AnyFn } from './types/misc.js';
4
+ export type AnyEither<L = any, R = any> = E.Either<L, R> | TE.TaskEither<L, R>;
5
+ export type AnyFnAnyEither<L = any, R = any> = (...args: any) => AnyEither<L, R>;
6
+ export type RightOfEither<T extends AnyEither> = [T] extends [E.Either<any, infer U>] ? U : T extends TE.TaskEither<any, infer U> ? U : never;
7
+ export type LeftOfEither<T extends AnyEither> = [T] extends [E.Either<infer U, any>] ? U : T extends TE.TaskEither<infer U, any> ? U : never;
8
+ export type RightOfReturn<F extends AnyFnAnyEither> = RightOfEither<ReturnType<F>>;
9
+ export type LeftOfReturn<F extends AnyFnAnyEither> = LeftOfEither<ReturnType<F>>;
10
+ export type MaybeMonadToCommon<T> = [T] extends [E.Either<any, infer U>] ? U : T extends TE.TaskEither<any, infer U> ? BetterPromise<U> : T;
11
+ export type MaybeCommonToMonad<T> = T extends AnyEither ? T : T extends PromiseLike<infer U> ? TE.TaskEither<unknown, U> : E.Either<unknown, T>;
12
+ export type MaybeMonadReturnTypeToCommon<Fn extends AnyFn> = MaybeMonadToCommon<ReturnType<Fn>>;
13
+ export type MaybeCommonReturnTypeToMonad<Fn extends AnyFn> = MaybeCommonToMonad<ReturnType<Fn>>;
14
+ export declare function throwifyAnyEither<E extends AnyEither>(either: E): MaybeMonadToCommon<E>;
15
+ export declare function throwifyFpFn<Fn extends AnyFnAnyEither>(fn: Fn): (((...args: Parameters<Fn>) => MaybeMonadReturnTypeToCommon<Fn>) & {
16
+ [K in keyof Fn]: Fn[K];
17
+ });
18
+ export type BetterTaskEitherError = TimeoutError;
19
+ export declare const BetterTaskEither: (<E, T>(executor: (resolve: (data: T) => void, reject: (reason: E) => void, context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>) => (void | Promise<void>), options?: BetterPromiseOptions) => TE.TaskEither<E | BetterTaskEitherError, T>) & {
20
+ fn: <E, T>(fn_: (context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>) => (E.Either<E, T> | TE.TaskEither<E, T>), options?: BetterPromiseOptions) => TE.TaskEither<E | BetterTaskEitherError, T>;
21
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Saves value in the storage.
3
+ * @param key - storage key.
4
+ * @param value - storage value.
5
+ */
6
+ export declare function setStorageValue<T>(key: string, value: T): void;
7
+ /**
8
+ * Extracts value from the storage.
9
+ * @param key - storage key.
10
+ */
11
+ export declare function getStorageValue<R>(key: string): R | undefined;
@@ -0,0 +1,2 @@
1
+ export type If<Cond extends boolean, True, False> = Cond extends true ? True : False;
2
+ export type Or<A extends boolean, B extends boolean> = A extends true ? true : (B extends true ? true : false);
@@ -0,0 +1,2 @@
1
+ export type Maybe<T> = T | undefined | null;
2
+ export type AnyFn = (...args: any[]) => any;
@@ -0,0 +1,2 @@
1
+ export type IsNever<T> = [T] extends [never] ? true : false;
2
+ export type IsUndefined<T> = [T] extends [undefined] ? true : false;
@@ -0,0 +1,7 @@
1
+ export type UnionStringKeys<U> = U extends U ? {
2
+ [K in keyof U]-?: U[K] extends string | undefined ? K : never;
3
+ }[keyof U] : never;
4
+ export type UnionRequiredKeys<U> = U extends U ? {
5
+ [K in UnionStringKeys<U>]: ({} extends Pick<U, K> ? never : K);
6
+ }[UnionStringKeys<U>] : never;
7
+ export type UnionOptionalKeys<U> = Exclude<UnionStringKeys<U>, UnionRequiredKeys<U>>;
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("better-promises"),n=require("fp-ts");function w(t){return t.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function m(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function $(t){return Object.entries(t).reduce((e,[r,o])=>(e[m(r)]=o,e),{})}function b(t){return t.replace(/_[a-z]/g,e=>e[1].toUpperCase())}function p(t){return Object.entries(t).reduce((e,[r,o])=>(e[b(r)]=o,e),{})}function l(t){const e=p(t);for(const r in e){const o=e[r];o&&typeof o=="object"&&!(o instanceof Date)&&(e[r]=Array.isArray(o)?o.map(l):l(o))}return e}function O(t){return t.replace(/_([a-z])/g,(e,r)=>`-${r.toLowerCase()}`)}function d(t){return`tapps/${t}`}function j(t,e){sessionStorage.setItem(d(t),JSON.stringify(e))}function K(t){const e=sessionStorage.getItem(d(t));try{return e?JSON.parse(e):void 0}catch{}}function L(...t){const e=t.flat(1);return[e.push.bind(e),()=>{e.forEach(r=>{r()})}]}function A(t,e){e||(e={});const{textColor:r,bgColor:o,shouldLog:i}=e,a=i===void 0?!0:i,C=typeof a=="boolean"?()=>a:a,f=(c,s,...u)=>{if(s||C()){const g="font-weight:bold;padding:0 5px;border-radius:100px",[T,S,E]={log:["#0089c3","white","INFO"],error:["#ff0000F0","white","ERR"],warn:["#D38E15","white","WARN"]}[c];console[c](`%c${E} ${Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(new Date)}%c %c${t}`,`${g};background-color:${T};color:${S}`,"",`${g};${r?`color:${r};`:""}${o?`background-color:${o}`:""}`,...u)}};return[["log","forceLog"],["warn","forceWarn"],["error","forceError"]].reduce((c,[s,u])=>(c[s]=f.bind(void 0,s,!1),c[u]=f.bind(void 0,s,!0),c),{})}function k(t){const e=r=>{throw r};return typeof t=="function"?h.BetterPromise.resolve(n.function.pipe(t,n.taskEither.match(e,r=>r))()):n.function.pipe(t,n.either.match(e,r=>r))}function F(t){return Object.assign((...e)=>k(t(...e)),t)}const y=Object.assign((t,e)=>n.function.pipe(n.taskEither.tryCatch(()=>new h.BetterPromise((r,o,i)=>t(a=>r(n.either.right(a)),a=>r(n.either.left(a)),i),e),r=>r),n.taskEither.chainW(n.either.match(n.taskEither.left,n.taskEither.right))),{fn:(t,e)=>y((r,o,i)=>{const a=t(i);n.function.pipe(typeof a=="function"?a:n.taskEither.fromEither(a),n.taskEither.matchW(o,r))()},e)});exports.BetterTaskEither=y;exports.camelToKebab=w;exports.camelToSnake=m;exports.camelToSnakeObjKeys=$;exports.createCbCollector=L;exports.createLogger=A;exports.deepSnakeToCamelObjKeys=l;exports.getStorageValue=K;exports.setStorageValue=j;exports.snakeToCamel=b;exports.snakeToCamelObjKeys=p;exports.snakeToKebab=O;exports.throwifyAnyEither=k;exports.throwifyFpFn=F;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/casing/camelToKebab.ts","../src/casing/camelToSnake.ts","../src/casing/camelToSnakeObjKeys.ts","../src/casing/snakeToCamel.ts","../src/casing/snakeToCamelObjKeys.ts","../src/casing/deepSnakeToCamelObjKeys.ts","../src/casing/snakeToKebab.ts","../src/storage/storage.ts","../src/createCbCollector.ts","../src/createLogger.ts","../src/monads.ts"],"sourcesContent":["/**\n * Converts string value from camel case to kebab case.\n * @param value - value to convert.\n */\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`);\n}\n","export type CamelToSnakeCase<T extends string> = T extends `${infer First}${infer Rest}`\n ? `${First extends Capitalize<First> ? '_' : ''}${Lowercase<First>}${CamelToSnakeCase<Rest>}`\n : T;\n\n/**\n * Converts string value from camel case to snake case.\n * @param value - value to convert.\n */\nexport function camelToSnake<T extends string>(value: T): CamelToSnakeCase<T> {\n return value.replace(/[A-Z]/g, match => `_${match.toLowerCase()}`) as CamelToSnakeCase<T>;\n}\n","import { camelToSnake, type CamelToSnakeCase } from '@/casing/camelToSnake.js';\n\nexport type ConvertCamelKeysToSnakeCase<T> = {\n [K in keyof T as CamelToSnakeCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function camelToSnakeObjKeys<T extends object>(value: T): ConvertCamelKeysToSnakeCase<T> {\n return Object.entries(value).reduce<ConvertCamelKeysToSnakeCase<T>>((acc, [k, v]) => {\n acc[camelToSnake(k) as keyof ConvertCamelKeysToSnakeCase<T>] = v;\n return acc;\n }, {} as ConvertCamelKeysToSnakeCase<T>);\n}\n","export type SnakeToCamelCase<S extends string> =\n S extends `${infer Head}_${infer Tail}`\n ? `${Head}${Capitalize<SnakeToCamelCase<Tail>>}`\n : S;\n\n/**\n * Converts string value from snake case to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamel<T extends string>(value: T): SnakeToCamelCase<T> {\n return value.replace(/_[a-z]/g, m => m[1].toUpperCase()) as SnakeToCamelCase<T>;\n}\n","import { snakeToCamel, type SnakeToCamelCase } from '@/casing/snakeToCamel.js';\n\nexport type ConvertSnakeKeysToCamelCase<T> = {\n [K in keyof T as SnakeToCamelCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamelObjKeys<T extends object>(value: T): ConvertSnakeKeysToCamelCase<T> {\n return Object.entries(value).reduce<ConvertSnakeKeysToCamelCase<T>>((acc, [k, v]) => {\n acc[snakeToCamel(k) as keyof ConvertSnakeKeysToCamelCase<T>] = v;\n return acc;\n }, {} as ConvertSnakeKeysToCamelCase<T>);\n}\n","import type { SnakeToCamelCase } from '@/casing/snakeToCamel.js';\nimport { snakeToCamelObjKeys } from '@/casing/snakeToCamelObjKeys.js';\n\nexport type DeepConvertSnakeKeysToCamelCase<T> = T extends infer U\n ? U extends object\n ? U extends Date\n ? U\n : U extends (infer Item)[]\n ? DeepConvertSnakeKeysToCamelCase<Item>[]\n : {\n [K in keyof U as SnakeToCamelCase<string & K>]: DeepConvertSnakeKeysToCamelCase<U[K]>\n } & {}\n : U\n : T;\n\n/**\n * Deeply converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function deepSnakeToCamelObjKeys<T extends object>(\n value: T,\n): DeepConvertSnakeKeysToCamelCase<T> {\n const camelCased = snakeToCamelObjKeys(value);\n for (const key in camelCased) {\n const value = camelCased[key];\n if (value && typeof value === 'object' && !(value instanceof Date)) {\n (camelCased as any)[key] = Array.isArray(value)\n ? value.map(deepSnakeToCamelObjKeys)\n : deepSnakeToCamelObjKeys(value);\n }\n }\n return camelCased as DeepConvertSnakeKeysToCamelCase<T>;\n}\n","/**\n * Converts string value from snake case to kebab case.\n * @param value - value to convert.\n */\nexport function snakeToKebab(value: string): string {\n return value.replace(/_([a-z])/g, (_, letter) => `-${letter.toLowerCase()}`);\n}\n","/**\n * Converts a passed storage key to the formatted state.\n * @param key - storage key.\n */\nfunction formatKey(key: string): string {\n return `tapps/${key}`;\n}\n\n/**\n * Saves value in the storage.\n * @param key - storage key.\n * @param value - storage value.\n */\nexport function setStorageValue<T>(key: string, value: T): void {\n sessionStorage.setItem(formatKey(key), JSON.stringify(value));\n}\n\n/**\n * Extracts value from the storage.\n * @param key - storage key.\n */\nexport function getStorageValue<R>(key: string): R | undefined {\n const value = sessionStorage.getItem(formatKey(key));\n try {\n return value ? JSON.parse(value) as R : undefined;\n } catch {\n }\n}\n","export type CallbackFn = () => void;\n\n/**\n * Returns a tuple, containing function to add cleanup, call cleanup, and flag showing whether\n * cleanup was called. Cleanup will not be performed in case, it was done before.\n */\nexport function createCbCollector(...cbs: (CallbackFn | CallbackFn[])[]): [\n add: (...fns: CallbackFn[]) => void,\n call: () => void,\n] {\n const callbacks = cbs.flat(1);\n\n return [\n callbacks.push.bind(callbacks),\n () => {\n callbacks.forEach(cb => {\n cb();\n });\n },\n ];\n}\n","/**\n * Message log level.\n */\nexport type LogLevel = 'log' | 'error' | 'warn';\n\nexport interface LoggerOptions {\n bgColor?: string;\n textColor?: string;\n /**\n * True if logs are enabled.\n * @default true\n */\n shouldLog?: boolean | (() => boolean);\n}\n\nexport type LoggerFn = (...args: any[]) => void;\nexport type LoggerForceFn = (...args: any[]) => void;\n\nexport interface Logger {\n /**\n * Prints an error message into the console.\n * @param args - items to log.\n */\n error: LoggerFn;\n /**\n * Prints an error message into the console ignoring the `shouldLog`\n * constructor option.\n * @param args - items to log.\n */\n forceError: LoggerForceFn;\n /**\n * Prints a log message into the console ignoring the `shouldLog` constructor\n * option.\n * @param args - items to log.\n */\n forceLog: LoggerForceFn;\n /**\n * Prints a warning message into the console ignoring the `shouldLog`\n * constructor option.\n * @param args - items to log.\n */\n forceWarn: LoggerForceFn;\n /**\n * Prints a log message into the console.\n * @param args - items to log.\n */\n log: LoggerFn;\n /**\n * Prints a warning message into the console.\n * @param args - items to log.\n */\n warn: LoggerFn;\n}\n\n/* @__NO_SIDE_EFFECTS__*/\nexport function createLogger(scope: string, options?: LoggerOptions): Logger {\n options ||= {};\n const {\n textColor,\n bgColor,\n shouldLog: optionsShouldLog,\n } = options;\n const shouldLogValue = optionsShouldLog === undefined ? true : optionsShouldLog;\n const shouldLog = typeof shouldLogValue === 'boolean'\n ? () => shouldLogValue\n : shouldLogValue;\n\n /**\n * Prints a message into the console.\n * @param level - log level.\n * @param force - should `shouldLog` value be ignored.\n * @param args - arguments.\n */\n const print = (level: LogLevel, force: boolean, ...args: any[]): void => {\n if (force || shouldLog()) {\n const commonCss = 'font-weight:bold;padding:0 5px;border-radius:100px';\n const [timeBgColor, timeTextColor, prefix] = {\n log: ['#0089c3', 'white', 'INFO'],\n error: ['#ff0000F0', 'white', 'ERR'],\n warn: ['#D38E15', 'white', 'WARN'],\n }[level];\n console[level](\n `%c${prefix} ${\n Intl\n .DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n timeZone: 'UTC',\n })\n .format(new Date())\n }%c %c${scope}`,\n `${commonCss};background-color:${timeBgColor};color:${timeTextColor}`,\n '',\n `${commonCss};${textColor ? `color:${textColor};` : ''}${bgColor ? `background-color:${bgColor}` : ''}`,\n ...args,\n );\n }\n };\n\n return ([\n ['log', 'forceLog'],\n ['warn', 'forceWarn'],\n ['error', 'forceError'],\n ] as const).reduce<Logger>((acc, [level, forceMethod]) => {\n acc[level] = print.bind(undefined, level, false);\n acc[forceMethod] = print.bind(undefined, level, true);\n return acc;\n }, {} as Logger);\n}\n","import {\n BetterPromise,\n type BetterPromiseExecutorContext,\n type BetterPromiseOptions,\n type TimeoutError,\n} from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport type { AnyFn } from '@/types/misc.js';\n\nexport type AnyEither<L = any, R = any> = E.Either<L, R> | TE.TaskEither<L, R>;\nexport type AnyFnAnyEither<L = any, R = any> = (...args: any) => AnyEither<L, R>;\n\nexport type RightOfEither<T extends AnyEither> = [T] extends [E.Either<any, infer U>]\n ? U\n : T extends TE.TaskEither<any, infer U>\n ? U\n : never;\nexport type LeftOfEither<T extends AnyEither> = [T] extends [E.Either<infer U, any>]\n ? U\n : T extends TE.TaskEither<infer U, any>\n ? U\n : never;\nexport type RightOfReturn<F extends AnyFnAnyEither> = RightOfEither<ReturnType<F>>;\nexport type LeftOfReturn<F extends AnyFnAnyEither> = LeftOfEither<ReturnType<F>>;\n\nexport type MaybeMonadToCommon<T> = [T] extends [E.Either<any, infer U>]\n ? U\n : T extends TE.TaskEither<any, infer U>\n ? BetterPromise<U>\n : T;\n\nexport type MaybeCommonToMonad<T> = T extends AnyEither\n ? T\n : T extends PromiseLike<infer U>\n ? TE.TaskEither<unknown, U>\n : E.Either<unknown, T>;\n\nexport type MaybeMonadReturnTypeToCommon<Fn extends AnyFn> = MaybeMonadToCommon<ReturnType<Fn>>;\n\nexport type MaybeCommonReturnTypeToMonad<Fn extends AnyFn> = MaybeCommonToMonad<ReturnType<Fn>>;\n\nexport function throwifyAnyEither<E extends AnyEither>(either: E): MaybeMonadToCommon<E> {\n const onError = (e: unknown) => {\n throw e;\n };\n return (\n typeof either === 'function'\n ? BetterPromise.resolve(fn.pipe(either, TE.match(onError, data => data))())\n : fn.pipe(either, E.match(onError, data => data))\n ) as MaybeMonadToCommon<E>;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport function throwifyFpFn<Fn extends AnyFnAnyEither>(\n fn: Fn,\n): (\n & ((...args: Parameters<Fn>) => MaybeMonadReturnTypeToCommon<Fn>)\n & { [K in keyof Fn]: Fn[K] }\n) {\n return Object.assign(\n (...args: Parameters<Fn>) => {\n return throwifyAnyEither(fn(...args)) as MaybeMonadReturnTypeToCommon<Fn>;\n },\n fn,\n );\n}\n\nexport type BetterTaskEitherError = TimeoutError;\n\nexport const BetterTaskEither = /* #__PURE__ */ Object.assign(\n <E, T>(\n executor: (\n resolve: (data: T) => void,\n reject: (reason: E) => void,\n context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>,\n ) => (void | Promise<void>),\n options?: BetterPromiseOptions,\n ): TE.TaskEither<E | BetterTaskEitherError, T> => {\n return fn.pipe(\n TE.tryCatch(\n () => {\n return new BetterPromise<E.Either<E, T>>((res, _rej, context) => {\n return executor(\n result => res(E.right(result)),\n error => res(E.left(error)),\n context,\n );\n }, options);\n },\n e => e as E,\n ),\n TE.chainW(E.match(TE.left, TE.right<E, T>)),\n );\n },\n {\n fn: <E, T>(\n fn_: (context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>) => (\n E.Either<E, T> | TE.TaskEither<E, T>\n ),\n options?: BetterPromiseOptions,\n ): TE.TaskEither<E | BetterTaskEitherError, T> => {\n return BetterTaskEither<E, T>((resolve, reject, context) => {\n const result = fn_(context);\n void fn.pipe(\n typeof result === 'function' ? result : TE.fromEither(result),\n TE.matchW(reject, resolve),\n )();\n }, options);\n },\n },\n);\n"],"names":["camelToKebab","value","match","camelToSnake","camelToSnakeObjKeys","acc","k","v","snakeToCamel","m","snakeToCamelObjKeys","deepSnakeToCamelObjKeys","camelCased","key","snakeToKebab","_","letter","formatKey","setStorageValue","getStorageValue","createCbCollector","cbs","callbacks","cb","createLogger","scope","options","textColor","bgColor","optionsShouldLog","shouldLogValue","shouldLog","print","level","force","args","commonCss","timeBgColor","timeTextColor","prefix","forceMethod","throwifyAnyEither","either","onError","e","BetterPromise","fn","TE","data","E","throwifyFpFn","BetterTaskEither","executor","res","_rej","context","result","error","fn_","resolve","reject"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,139 @@
1
+ import { BetterPromise as d } from "better-promises";
2
+ import { function as f, taskEither as i, either as u } from "fp-ts";
3
+ function L(t) {
4
+ return t.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`);
5
+ }
6
+ function $(t) {
7
+ return t.replace(/[A-Z]/g, (e) => `_${e.toLowerCase()}`);
8
+ }
9
+ function x(t) {
10
+ return Object.entries(t).reduce((e, [o, r]) => (e[$(o)] = r, e), {});
11
+ }
12
+ function k(t) {
13
+ return t.replace(/_[a-z]/g, (e) => e[1].toUpperCase());
14
+ }
15
+ function S(t) {
16
+ return Object.entries(t).reduce((e, [o, r]) => (e[k(o)] = r, e), {});
17
+ }
18
+ function m(t) {
19
+ const e = S(t);
20
+ for (const o in e) {
21
+ const r = e[o];
22
+ r && typeof r == "object" && !(r instanceof Date) && (e[o] = Array.isArray(r) ? r.map(m) : m(r));
23
+ }
24
+ return e;
25
+ }
26
+ function A(t) {
27
+ return t.replace(/_([a-z])/g, (e, o) => `-${o.toLowerCase()}`);
28
+ }
29
+ function h(t) {
30
+ return `tapps/${t}`;
31
+ }
32
+ function K(t, e) {
33
+ sessionStorage.setItem(h(t), JSON.stringify(e));
34
+ }
35
+ function _(t) {
36
+ const e = sessionStorage.getItem(h(t));
37
+ try {
38
+ return e ? JSON.parse(e) : void 0;
39
+ } catch {
40
+ }
41
+ }
42
+ function v(...t) {
43
+ const e = t.flat(1);
44
+ return [
45
+ e.push.bind(e),
46
+ () => {
47
+ e.forEach((o) => {
48
+ o();
49
+ });
50
+ }
51
+ ];
52
+ }
53
+ // @__NO_SIDE_EFFECTS__
54
+ function D(t, e) {
55
+ e || (e = {});
56
+ const {
57
+ textColor: o,
58
+ bgColor: r,
59
+ shouldLog: c
60
+ } = e, n = c === void 0 ? !0 : c, b = typeof n == "boolean" ? () => n : n, g = (a, s, ...l) => {
61
+ if (s || b()) {
62
+ const p = "font-weight:bold;padding:0 5px;border-radius:100px", [y, C, w] = {
63
+ log: ["#0089c3", "white", "INFO"],
64
+ error: ["#ff0000F0", "white", "ERR"],
65
+ warn: ["#D38E15", "white", "WARN"]
66
+ }[a];
67
+ console[a](
68
+ `%c${w} ${Intl.DateTimeFormat("en-GB", {
69
+ hour: "2-digit",
70
+ minute: "2-digit",
71
+ second: "2-digit",
72
+ fractionalSecondDigits: 3,
73
+ timeZone: "UTC"
74
+ }).format(/* @__PURE__ */ new Date())}%c %c${t}`,
75
+ `${p};background-color:${y};color:${C}`,
76
+ "",
77
+ `${p};${o ? `color:${o};` : ""}${r ? `background-color:${r}` : ""}`,
78
+ ...l
79
+ );
80
+ }
81
+ };
82
+ return [
83
+ ["log", "forceLog"],
84
+ ["warn", "forceWarn"],
85
+ ["error", "forceError"]
86
+ ].reduce((a, [s, l]) => (a[s] = g.bind(void 0, s, !1), a[l] = g.bind(void 0, s, !0), a), {});
87
+ }
88
+ function T(t) {
89
+ const e = (o) => {
90
+ throw o;
91
+ };
92
+ return typeof t == "function" ? d.resolve(f.pipe(t, i.match(e, (o) => o))()) : f.pipe(t, u.match(e, (o) => o));
93
+ }
94
+ // @__NO_SIDE_EFFECTS__
95
+ function F(t) {
96
+ return Object.assign(
97
+ (...e) => T(t(...e)),
98
+ t
99
+ );
100
+ }
101
+ const O = /* @__PURE__ */ Object.assign(
102
+ (t, e) => f.pipe(
103
+ i.tryCatch(
104
+ () => new d((o, r, c) => t(
105
+ (n) => o(u.right(n)),
106
+ (n) => o(u.left(n)),
107
+ c
108
+ ), e),
109
+ (o) => o
110
+ ),
111
+ i.chainW(u.match(i.left, i.right))
112
+ ),
113
+ {
114
+ fn: (t, e) => O((o, r, c) => {
115
+ const n = t(c);
116
+ f.pipe(
117
+ typeof n == "function" ? n : i.fromEither(n),
118
+ i.matchW(r, o)
119
+ )();
120
+ }, e)
121
+ }
122
+ );
123
+ export {
124
+ O as BetterTaskEither,
125
+ L as camelToKebab,
126
+ $ as camelToSnake,
127
+ x as camelToSnakeObjKeys,
128
+ v as createCbCollector,
129
+ D as createLogger,
130
+ m as deepSnakeToCamelObjKeys,
131
+ _ as getStorageValue,
132
+ K as setStorageValue,
133
+ k as snakeToCamel,
134
+ S as snakeToCamelObjKeys,
135
+ A as snakeToKebab,
136
+ T as throwifyAnyEither,
137
+ F as throwifyFpFn
138
+ };
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/casing/camelToKebab.ts","../src/casing/camelToSnake.ts","../src/casing/camelToSnakeObjKeys.ts","../src/casing/snakeToCamel.ts","../src/casing/snakeToCamelObjKeys.ts","../src/casing/deepSnakeToCamelObjKeys.ts","../src/casing/snakeToKebab.ts","../src/storage/storage.ts","../src/createCbCollector.ts","../src/createLogger.ts","../src/monads.ts"],"sourcesContent":["/**\n * Converts string value from camel case to kebab case.\n * @param value - value to convert.\n */\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`);\n}\n","export type CamelToSnakeCase<T extends string> = T extends `${infer First}${infer Rest}`\n ? `${First extends Capitalize<First> ? '_' : ''}${Lowercase<First>}${CamelToSnakeCase<Rest>}`\n : T;\n\n/**\n * Converts string value from camel case to snake case.\n * @param value - value to convert.\n */\nexport function camelToSnake<T extends string>(value: T): CamelToSnakeCase<T> {\n return value.replace(/[A-Z]/g, match => `_${match.toLowerCase()}`) as CamelToSnakeCase<T>;\n}\n","import { camelToSnake, type CamelToSnakeCase } from '@/casing/camelToSnake.js';\n\nexport type ConvertCamelKeysToSnakeCase<T> = {\n [K in keyof T as CamelToSnakeCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function camelToSnakeObjKeys<T extends object>(value: T): ConvertCamelKeysToSnakeCase<T> {\n return Object.entries(value).reduce<ConvertCamelKeysToSnakeCase<T>>((acc, [k, v]) => {\n acc[camelToSnake(k) as keyof ConvertCamelKeysToSnakeCase<T>] = v;\n return acc;\n }, {} as ConvertCamelKeysToSnakeCase<T>);\n}\n","export type SnakeToCamelCase<S extends string> =\n S extends `${infer Head}_${infer Tail}`\n ? `${Head}${Capitalize<SnakeToCamelCase<Tail>>}`\n : S;\n\n/**\n * Converts string value from snake case to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamel<T extends string>(value: T): SnakeToCamelCase<T> {\n return value.replace(/_[a-z]/g, m => m[1].toUpperCase()) as SnakeToCamelCase<T>;\n}\n","import { snakeToCamel, type SnakeToCamelCase } from '@/casing/snakeToCamel.js';\n\nexport type ConvertSnakeKeysToCamelCase<T> = {\n [K in keyof T as SnakeToCamelCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamelObjKeys<T extends object>(value: T): ConvertSnakeKeysToCamelCase<T> {\n return Object.entries(value).reduce<ConvertSnakeKeysToCamelCase<T>>((acc, [k, v]) => {\n acc[snakeToCamel(k) as keyof ConvertSnakeKeysToCamelCase<T>] = v;\n return acc;\n }, {} as ConvertSnakeKeysToCamelCase<T>);\n}\n","import type { SnakeToCamelCase } from '@/casing/snakeToCamel.js';\nimport { snakeToCamelObjKeys } from '@/casing/snakeToCamelObjKeys.js';\n\nexport type DeepConvertSnakeKeysToCamelCase<T> = T extends infer U\n ? U extends object\n ? U extends Date\n ? U\n : U extends (infer Item)[]\n ? DeepConvertSnakeKeysToCamelCase<Item>[]\n : {\n [K in keyof U as SnakeToCamelCase<string & K>]: DeepConvertSnakeKeysToCamelCase<U[K]>\n } & {}\n : U\n : T;\n\n/**\n * Deeply converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function deepSnakeToCamelObjKeys<T extends object>(\n value: T,\n): DeepConvertSnakeKeysToCamelCase<T> {\n const camelCased = snakeToCamelObjKeys(value);\n for (const key in camelCased) {\n const value = camelCased[key];\n if (value && typeof value === 'object' && !(value instanceof Date)) {\n (camelCased as any)[key] = Array.isArray(value)\n ? value.map(deepSnakeToCamelObjKeys)\n : deepSnakeToCamelObjKeys(value);\n }\n }\n return camelCased as DeepConvertSnakeKeysToCamelCase<T>;\n}\n","/**\n * Converts string value from snake case to kebab case.\n * @param value - value to convert.\n */\nexport function snakeToKebab(value: string): string {\n return value.replace(/_([a-z])/g, (_, letter) => `-${letter.toLowerCase()}`);\n}\n","/**\n * Converts a passed storage key to the formatted state.\n * @param key - storage key.\n */\nfunction formatKey(key: string): string {\n return `tapps/${key}`;\n}\n\n/**\n * Saves value in the storage.\n * @param key - storage key.\n * @param value - storage value.\n */\nexport function setStorageValue<T>(key: string, value: T): void {\n sessionStorage.setItem(formatKey(key), JSON.stringify(value));\n}\n\n/**\n * Extracts value from the storage.\n * @param key - storage key.\n */\nexport function getStorageValue<R>(key: string): R | undefined {\n const value = sessionStorage.getItem(formatKey(key));\n try {\n return value ? JSON.parse(value) as R : undefined;\n } catch {\n }\n}\n","export type CallbackFn = () => void;\n\n/**\n * Returns a tuple, containing function to add cleanup, call cleanup, and flag showing whether\n * cleanup was called. Cleanup will not be performed in case, it was done before.\n */\nexport function createCbCollector(...cbs: (CallbackFn | CallbackFn[])[]): [\n add: (...fns: CallbackFn[]) => void,\n call: () => void,\n] {\n const callbacks = cbs.flat(1);\n\n return [\n callbacks.push.bind(callbacks),\n () => {\n callbacks.forEach(cb => {\n cb();\n });\n },\n ];\n}\n","/**\n * Message log level.\n */\nexport type LogLevel = 'log' | 'error' | 'warn';\n\nexport interface LoggerOptions {\n bgColor?: string;\n textColor?: string;\n /**\n * True if logs are enabled.\n * @default true\n */\n shouldLog?: boolean | (() => boolean);\n}\n\nexport type LoggerFn = (...args: any[]) => void;\nexport type LoggerForceFn = (...args: any[]) => void;\n\nexport interface Logger {\n /**\n * Prints an error message into the console.\n * @param args - items to log.\n */\n error: LoggerFn;\n /**\n * Prints an error message into the console ignoring the `shouldLog`\n * constructor option.\n * @param args - items to log.\n */\n forceError: LoggerForceFn;\n /**\n * Prints a log message into the console ignoring the `shouldLog` constructor\n * option.\n * @param args - items to log.\n */\n forceLog: LoggerForceFn;\n /**\n * Prints a warning message into the console ignoring the `shouldLog`\n * constructor option.\n * @param args - items to log.\n */\n forceWarn: LoggerForceFn;\n /**\n * Prints a log message into the console.\n * @param args - items to log.\n */\n log: LoggerFn;\n /**\n * Prints a warning message into the console.\n * @param args - items to log.\n */\n warn: LoggerFn;\n}\n\n/* @__NO_SIDE_EFFECTS__*/\nexport function createLogger(scope: string, options?: LoggerOptions): Logger {\n options ||= {};\n const {\n textColor,\n bgColor,\n shouldLog: optionsShouldLog,\n } = options;\n const shouldLogValue = optionsShouldLog === undefined ? true : optionsShouldLog;\n const shouldLog = typeof shouldLogValue === 'boolean'\n ? () => shouldLogValue\n : shouldLogValue;\n\n /**\n * Prints a message into the console.\n * @param level - log level.\n * @param force - should `shouldLog` value be ignored.\n * @param args - arguments.\n */\n const print = (level: LogLevel, force: boolean, ...args: any[]): void => {\n if (force || shouldLog()) {\n const commonCss = 'font-weight:bold;padding:0 5px;border-radius:100px';\n const [timeBgColor, timeTextColor, prefix] = {\n log: ['#0089c3', 'white', 'INFO'],\n error: ['#ff0000F0', 'white', 'ERR'],\n warn: ['#D38E15', 'white', 'WARN'],\n }[level];\n console[level](\n `%c${prefix} ${\n Intl\n .DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n timeZone: 'UTC',\n })\n .format(new Date())\n }%c %c${scope}`,\n `${commonCss};background-color:${timeBgColor};color:${timeTextColor}`,\n '',\n `${commonCss};${textColor ? `color:${textColor};` : ''}${bgColor ? `background-color:${bgColor}` : ''}`,\n ...args,\n );\n }\n };\n\n return ([\n ['log', 'forceLog'],\n ['warn', 'forceWarn'],\n ['error', 'forceError'],\n ] as const).reduce<Logger>((acc, [level, forceMethod]) => {\n acc[level] = print.bind(undefined, level, false);\n acc[forceMethod] = print.bind(undefined, level, true);\n return acc;\n }, {} as Logger);\n}\n","import {\n BetterPromise,\n type BetterPromiseExecutorContext,\n type BetterPromiseOptions,\n type TimeoutError,\n} from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport type { AnyFn } from '@/types/misc.js';\n\nexport type AnyEither<L = any, R = any> = E.Either<L, R> | TE.TaskEither<L, R>;\nexport type AnyFnAnyEither<L = any, R = any> = (...args: any) => AnyEither<L, R>;\n\nexport type RightOfEither<T extends AnyEither> = [T] extends [E.Either<any, infer U>]\n ? U\n : T extends TE.TaskEither<any, infer U>\n ? U\n : never;\nexport type LeftOfEither<T extends AnyEither> = [T] extends [E.Either<infer U, any>]\n ? U\n : T extends TE.TaskEither<infer U, any>\n ? U\n : never;\nexport type RightOfReturn<F extends AnyFnAnyEither> = RightOfEither<ReturnType<F>>;\nexport type LeftOfReturn<F extends AnyFnAnyEither> = LeftOfEither<ReturnType<F>>;\n\nexport type MaybeMonadToCommon<T> = [T] extends [E.Either<any, infer U>]\n ? U\n : T extends TE.TaskEither<any, infer U>\n ? BetterPromise<U>\n : T;\n\nexport type MaybeCommonToMonad<T> = T extends AnyEither\n ? T\n : T extends PromiseLike<infer U>\n ? TE.TaskEither<unknown, U>\n : E.Either<unknown, T>;\n\nexport type MaybeMonadReturnTypeToCommon<Fn extends AnyFn> = MaybeMonadToCommon<ReturnType<Fn>>;\n\nexport type MaybeCommonReturnTypeToMonad<Fn extends AnyFn> = MaybeCommonToMonad<ReturnType<Fn>>;\n\nexport function throwifyAnyEither<E extends AnyEither>(either: E): MaybeMonadToCommon<E> {\n const onError = (e: unknown) => {\n throw e;\n };\n return (\n typeof either === 'function'\n ? BetterPromise.resolve(fn.pipe(either, TE.match(onError, data => data))())\n : fn.pipe(either, E.match(onError, data => data))\n ) as MaybeMonadToCommon<E>;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport function throwifyFpFn<Fn extends AnyFnAnyEither>(\n fn: Fn,\n): (\n & ((...args: Parameters<Fn>) => MaybeMonadReturnTypeToCommon<Fn>)\n & { [K in keyof Fn]: Fn[K] }\n) {\n return Object.assign(\n (...args: Parameters<Fn>) => {\n return throwifyAnyEither(fn(...args)) as MaybeMonadReturnTypeToCommon<Fn>;\n },\n fn,\n );\n}\n\nexport type BetterTaskEitherError = TimeoutError;\n\nexport const BetterTaskEither = /* #__PURE__ */ Object.assign(\n <E, T>(\n executor: (\n resolve: (data: T) => void,\n reject: (reason: E) => void,\n context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>,\n ) => (void | Promise<void>),\n options?: BetterPromiseOptions,\n ): TE.TaskEither<E | BetterTaskEitherError, T> => {\n return fn.pipe(\n TE.tryCatch(\n () => {\n return new BetterPromise<E.Either<E, T>>((res, _rej, context) => {\n return executor(\n result => res(E.right(result)),\n error => res(E.left(error)),\n context,\n );\n }, options);\n },\n e => e as E,\n ),\n TE.chainW(E.match(TE.left, TE.right<E, T>)),\n );\n },\n {\n fn: <E, T>(\n fn_: (context: BetterPromiseExecutorContext<E.Either<E | BetterTaskEitherError, T>>) => (\n E.Either<E, T> | TE.TaskEither<E, T>\n ),\n options?: BetterPromiseOptions,\n ): TE.TaskEither<E | BetterTaskEitherError, T> => {\n return BetterTaskEither<E, T>((resolve, reject, context) => {\n const result = fn_(context);\n void fn.pipe(\n typeof result === 'function' ? result : TE.fromEither(result),\n TE.matchW(reject, resolve),\n )();\n }, options);\n },\n },\n);\n"],"names":["camelToKebab","value","match","camelToSnake","camelToSnakeObjKeys","acc","k","v","snakeToCamel","m","snakeToCamelObjKeys","deepSnakeToCamelObjKeys","camelCased","key","snakeToKebab","_","letter","formatKey","setStorageValue","getStorageValue","createCbCollector","cbs","callbacks","cb","createLogger","scope","options","textColor","bgColor","optionsShouldLog","shouldLogValue","shouldLog","print","level","force","args","commonCss","timeBgColor","timeTextColor","prefix","forceMethod","throwifyAnyEither","either","onError","e","BetterPromise","fn","TE","data","E","throwifyFpFn","BetterTaskEither","executor","res","_rej","context","result","error","fn_","resolve","reject"],"mappings":";;AAIO,SAASA,EAAaC,GAAuB;AAClD,SAAOA,EAAM,QAAQ,UAAU,CAAAC,MAAS,IAAIA,EAAM,YAAA,CAAa,EAAE;AACnE;ACEO,SAASC,EAA+BF,GAA+B;AAC5E,SAAOA,EAAM,QAAQ,UAAU,CAAAC,MAAS,IAAIA,EAAM,YAAA,CAAa,EAAE;AACnE;ACAO,SAASE,EAAsCH,GAA0C;AAC9F,SAAO,OAAO,QAAQA,CAAK,EAAE,OAAuC,CAACI,GAAK,CAACC,GAAGC,CAAC,OAC7EF,EAAIF,EAAaG,CAAC,CAAyC,IAAIC,GACxDF,IACN,CAAA,CAAoC;AACzC;ACNO,SAASG,EAA+BP,GAA+B;AAC5E,SAAOA,EAAM,QAAQ,WAAW,CAAAQ,MAAKA,EAAE,CAAC,EAAE,aAAa;AACzD;ACDO,SAASC,EAAsCT,GAA0C;AAC9F,SAAO,OAAO,QAAQA,CAAK,EAAE,OAAuC,CAACI,GAAK,CAACC,GAAGC,CAAC,OAC7EF,EAAIG,EAAaF,CAAC,CAAyC,IAAIC,GACxDF,IACN,CAAA,CAAoC;AACzC;ACIO,SAASM,EACdV,GACoC;AACpC,QAAMW,IAAaF,EAAoBT,CAAK;AAC5C,aAAWY,KAAOD,GAAY;AAC5B,UAAMX,IAAQW,EAAWC,CAAG;AAC5B,IAAIZ,KAAS,OAAOA,KAAU,YAAY,EAAEA,aAAiB,UAC1DW,EAAmBC,CAAG,IAAI,MAAM,QAAQZ,CAAK,IAC1CA,EAAM,IAAIU,CAAuB,IACjCA,EAAwBV,CAAK;AAAA,EAErC;AACA,SAAOW;AACT;AC5BO,SAASE,EAAab,GAAuB;AAClD,SAAOA,EAAM,QAAQ,aAAa,CAACc,GAAGC,MAAW,IAAIA,EAAO,YAAA,CAAa,EAAE;AAC7E;ACFA,SAASC,EAAUJ,GAAqB;AACtC,SAAO,SAASA,CAAG;AACrB;AAOO,SAASK,EAAmBL,GAAaZ,GAAgB;AAC9D,iBAAe,QAAQgB,EAAUJ,CAAG,GAAG,KAAK,UAAUZ,CAAK,CAAC;AAC9D;AAMO,SAASkB,EAAmBN,GAA4B;AAC7D,QAAMZ,IAAQ,eAAe,QAAQgB,EAAUJ,CAAG,CAAC;AACnD,MAAI;AACF,WAAOZ,IAAQ,KAAK,MAAMA,CAAK,IAAS;AAAA,EAC1C,QAAQ;AAAA,EACR;AACF;ACrBO,SAASmB,KAAqBC,GAGnC;AACA,QAAMC,IAAYD,EAAI,KAAK,CAAC;AAE5B,SAAO;AAAA,IACLC,EAAU,KAAK,KAAKA,CAAS;AAAA,IAC7B,MAAM;AACJ,MAAAA,EAAU,QAAQ,CAAAC,MAAM;AACtB,QAAAA,EAAA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EAAA;AAEJ;AAAA;ACmCO,SAASC,EAAaC,GAAeC,GAAiC;AAC3E,EAAAA,UAAY,CAAA;AACZ,QAAM;AAAA,IACJ,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAWC;AAAA,EAAA,IACTH,GACEI,IAAiBD,MAAqB,SAAY,KAAOA,GACzDE,IAAY,OAAOD,KAAmB,YACxC,MAAMA,IACNA,GAQEE,IAAQ,CAACC,GAAiBC,MAAmBC,MAAsB;AACvE,QAAID,KAASH,KAAa;AACxB,YAAMK,IAAY,sDACZ,CAACC,GAAaC,GAAeC,CAAM,IAAI;AAAA,QAC3C,KAAK,CAAC,WAAW,SAAS,MAAM;AAAA,QAChC,OAAO,CAAC,aAAa,SAAS,KAAK;AAAA,QACnC,MAAM,CAAC,WAAW,SAAS,MAAM;AAAA,MAAA,EACjCN,CAAK;AACP,cAAQA,CAAK;AAAA,QACX,KAAKM,CAAM,IACT,KACG,eAAe,SAAS;AAAA,UACvB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,wBAAwB;AAAA,UACxB,UAAU;AAAA,QAAA,CACX,EACA,OAAO,oBAAI,MAAM,CACtB,QAAQd,CAAK;AAAA,QACb,GAAGW,CAAS,qBAAqBC,CAAW,UAAUC,CAAa;AAAA,QACnE;AAAA,QACA,GAAGF,CAAS,IAAIT,IAAY,SAASA,CAAS,MAAM,EAAE,GAAGC,IAAU,oBAAoBA,CAAO,KAAK,EAAE;AAAA,QACrG,GAAGO;AAAA,MAAA;AAAA,IAEP;AAAA,EACF;AAEA,SAAQ;AAAA,IACN,CAAC,OAAO,UAAU;AAAA,IAClB,CAAC,QAAQ,WAAW;AAAA,IACpB,CAAC,SAAS,YAAY;AAAA,EAAA,EACZ,OAAe,CAAC9B,GAAK,CAAC4B,GAAOO,CAAW,OAClDnC,EAAI4B,CAAK,IAAID,EAAM,KAAK,QAAWC,GAAO,EAAK,GAC/C5B,EAAImC,CAAW,IAAIR,EAAM,KAAK,QAAWC,GAAO,EAAI,GAC7C5B,IACN,CAAA,CAAY;AACjB;ACpEO,SAASoC,EAAuCC,GAAkC;AACvF,QAAMC,IAAU,CAACC,MAAe;AAC9B,UAAMA;AAAA,EACR;AACA,SACE,OAAOF,KAAW,aACdG,EAAc,QAAQC,EAAG,KAAKJ,GAAQK,EAAG,MAAMJ,GAAS,CAAAK,MAAQA,CAAI,CAAC,EAAA,CAAG,IACxEF,EAAG,KAAKJ,GAAQO,EAAE,MAAMN,GAAS,CAAAK,MAAQA,CAAI,CAAC;AAEtD;AAAA;AAGO,SAASE,EACdJ,GAIA;AACA,SAAO,OAAO;AAAA,IACZ,IAAIX,MACKM,EAAkBK,EAAG,GAAGX,CAAI,CAAC;AAAA,IAEtCW;AAAAA,EAAA;AAEJ;AAIO,MAAMK,IAAmC,uBAAO;AAAA,EACrD,CACEC,GAKA1B,MAEOoB,EAAG;AAAA,IACRC,EAAG;AAAA,MACD,MACS,IAAIF,EAA8B,CAACQ,GAAKC,GAAMC,MAC5CH;AAAA,QACL,CAAAI,MAAUH,EAAIJ,EAAE,MAAMO,CAAM,CAAC;AAAA,QAC7B,CAAAC,MAASJ,EAAIJ,EAAE,KAAKQ,CAAK,CAAC;AAAA,QAC1BF;AAAA,MAAA,GAED7B,CAAO;AAAA,MAEZ,CAAAkB,MAAKA;AAAA,IAAA;AAAA,IAEPG,EAAG,OAAOE,EAAE,MAAMF,EAAG,MAAMA,EAAG,KAAW,CAAC;AAAA,EAAA;AAAA,EAG9C;AAAA,IACE,IAAI,CACFW,GAGAhC,MAEOyB,EAAuB,CAACQ,GAASC,GAAQL,MAAY;AAC1D,YAAMC,IAASE,EAAIH,CAAO;AAC1B,MAAKT,EAAG;AAAA,QACN,OAAOU,KAAW,aAAaA,IAAST,EAAG,WAAWS,CAAM;AAAA,QAC5DT,EAAG,OAAOa,GAAQD,CAAO;AAAA,MAAA,EAC3B;AAAA,IACF,GAAGjC,CAAO;AAAA,EACZ;AAEJ;"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@vbotma/toolkit",
3
+ "version": "1.0.4",
4
+ "description": "Internal toolkit used in the @vbot packages.",
5
+ "keywords": [
6
+ "vbot-mini-apps",
7
+ "typescript"
8
+ ],
9
+ "license": "MIT",
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/dts/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/dts/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs",
23
+ "default": "./dist/index.cjs"
24
+ }
25
+ },
26
+ "devDependencies": {
27
+ "tsconfig": "0.0.2",
28
+ "test-utils": "0.0.1"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "dependencies": {
34
+ "better-promises": "^1.0.0",
35
+ "fp-ts": "^2.16.11"
36
+ },
37
+ "scripts": {
38
+ "test": "vitest --run",
39
+ "lint": "eslint src",
40
+ "lint:fix": "pnpm run lint --fix",
41
+ "typecheck": "tsc --noEmit -p tsconfig.build.json",
42
+ "build": "vite build -c vite.config.ts"
43
+ }
44
+ }