zakir-core 0.1.0 → 0.1.1

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,2 +1,49 @@
1
- export declare function debounce<T extends (...args: any[]) => void>(fn: T, delay?: number): (...args: Parameters<T>) => void;
2
- export declare function throttle<T extends (...args: any[]) => void>(fn: T, delay?: number): (...args: Parameters<T>) => void;
1
+ export type AnyFn = (...args: any[]) => any;
2
+ export declare function noop(): void;
3
+ export declare function identity<T>(x: T): T;
4
+ export declare function once<T extends AnyFn>(fn: T): T;
5
+ export declare function onceAsync<T extends (...args: any[]) => Promise<any>>(fn: T): T;
6
+ export declare function delay(ms: number): Promise<void>;
7
+ export declare function defer(fn: AnyFn): void;
8
+ export declare function tryCatch<T extends AnyFn>(fn: T, onError?: (err: unknown) => void): (...args: Parameters<T>) => ReturnType<T> | undefined;
9
+ export type Debounced<T extends AnyFn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {
10
+ cancel: () => void;
11
+ flush: () => ReturnType<T> | undefined;
12
+ pending: () => boolean;
13
+ };
14
+ export declare function debounce<T extends AnyFn>(fn: T, wait?: number, options?: {
15
+ leading?: boolean;
16
+ trailing?: boolean;
17
+ maxWait?: number;
18
+ }): Debounced<T>;
19
+ export type Throttled<T extends AnyFn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {
20
+ cancel: () => void;
21
+ flush: () => ReturnType<T> | undefined;
22
+ pending: () => boolean;
23
+ };
24
+ export declare function throttle<T extends AnyFn>(fn: T, wait?: number, options?: {
25
+ leading?: boolean;
26
+ trailing?: boolean;
27
+ }): Throttled<T>;
28
+ type MemoOpts = {
29
+ maxSize?: number;
30
+ };
31
+ export declare function memoize<T extends AnyFn>(fn: T, keyResolver?: (...args: Parameters<T>) => string | number, options?: MemoOpts): T & {
32
+ cache: Map<string | number, ReturnType<T>>;
33
+ clear: () => void;
34
+ delete: (key: string | number) => boolean;
35
+ };
36
+ export declare function memoizeAsync<T extends (...args: any[]) => Promise<any>>(fn: T, keyResolver?: (...args: Parameters<T>) => string | number, options?: MemoOpts): T & {
37
+ cache: Map<string | number, ReturnType<T>>;
38
+ clear: () => void;
39
+ delete: (key: string | number) => boolean;
40
+ };
41
+ export declare function pipe(): (x: any) => any;
42
+ export declare function pipe<T1, T2>(a: (x: T1) => T2): (x: T1) => T2;
43
+ export declare function pipe<T1, T2, T3>(a: (x: T1) => T2, b: (x: T2) => T3): (x: T1) => T3;
44
+ export declare function pipe<T1, T2, T3, T4>(a: (x: T1) => T2, b: (x: T2) => T3, c: (x: T3) => T4): (x: T1) => T4;
45
+ export declare function compose(): (x: any) => any;
46
+ export declare function compose<T1, T2>(a: (x: T1) => T2): (x: T1) => T2;
47
+ export declare function compose<T1, T2, T3>(a: (x: T2) => T3, b: (x: T1) => T2): (x: T1) => T3;
48
+ export declare function compose<T1, T2, T3, T4>(a: (x: T3) => T4, b: (x: T2) => T3, c: (x: T1) => T2): (x: T1) => T4;
49
+ export {};
package/dist/function.js CHANGED
@@ -1,17 +1,234 @@
1
- export function debounce(fn, delay = 300) {
2
- let timer;
3
- return (...args) => {
4
- clearTimeout(timer);
5
- timer = setTimeout(() => fn(...args), delay);
1
+ function now() {
2
+ const p = globalThis.performance;
3
+ if (p && typeof p.now === "function")
4
+ return p.now();
5
+ return Date.now();
6
+ }
7
+ function toIntNonNeg(n) {
8
+ const x = n | 0;
9
+ return x < 0 ? 0 : x;
10
+ }
11
+ function lruTouch(m, key) {
12
+ const v = m.get(key);
13
+ if (v === undefined && !m.has(key))
14
+ return;
15
+ m.delete(key);
16
+ m.set(key, v);
17
+ }
18
+ function lruTrim(m, maxSize) {
19
+ if (maxSize <= 0)
20
+ return;
21
+ while (m.size > maxSize) {
22
+ const k = m.keys().next().value;
23
+ if (k === undefined)
24
+ return;
25
+ m.delete(k);
26
+ }
27
+ }
28
+ export function noop() { }
29
+ export function identity(x) {
30
+ return x;
31
+ }
32
+ export function once(fn) {
33
+ let called = false;
34
+ let value;
35
+ return function (...args) {
36
+ if (!called) {
37
+ called = true;
38
+ value = fn.apply(this, args);
39
+ }
40
+ return value;
41
+ };
42
+ }
43
+ export function onceAsync(fn) {
44
+ let p = null;
45
+ return function (...args) {
46
+ if (!p)
47
+ p = fn.apply(this, args);
48
+ return p;
6
49
  };
7
50
  }
8
- export function throttle(fn, delay = 300) {
9
- let last = 0;
51
+ export function delay(ms) {
52
+ const t = toIntNonNeg(ms);
53
+ return new Promise(resolve => setTimeout(resolve, t));
54
+ }
55
+ export function defer(fn) {
56
+ setTimeout(fn, 0);
57
+ }
58
+ export function tryCatch(fn, onError) {
10
59
  return (...args) => {
11
- const now = Date.now();
12
- if (now - last >= delay) {
13
- last = now;
14
- fn(...args);
60
+ try {
61
+ return fn(...args);
62
+ }
63
+ catch (err) {
64
+ onError?.(err);
65
+ return undefined;
15
66
  }
16
67
  };
17
68
  }
69
+ export function debounce(fn, wait = 0, options) {
70
+ const leading = !!options?.leading;
71
+ const trailing = options?.trailing !== false;
72
+ const w = toIntNonNeg(wait);
73
+ const maxWait = options?.maxWait === undefined ? undefined : toIntNonNeg(options.maxWait);
74
+ let timer = null;
75
+ let lastArgs = null;
76
+ let lastThis = null;
77
+ let lastCallTime = 0;
78
+ let lastInvokeTime = 0;
79
+ let lastResult = undefined;
80
+ const clearState = () => {
81
+ lastArgs = null;
82
+ lastThis = null;
83
+ };
84
+ const invoke = () => {
85
+ if (!lastArgs)
86
+ return lastResult;
87
+ const args = lastArgs;
88
+ const ctx = lastThis;
89
+ clearState();
90
+ lastInvokeTime = now();
91
+ lastResult = fn.apply(ctx, args);
92
+ return lastResult;
93
+ };
94
+ const stopTimer = () => {
95
+ if (timer)
96
+ clearTimeout(timer);
97
+ timer = null;
98
+ };
99
+ const startTimer = (ms) => {
100
+ stopTimer();
101
+ timer = setTimeout(onTimer, ms);
102
+ };
103
+ const remainingWait = (t) => {
104
+ const sinceCall = t - lastCallTime;
105
+ const sinceInvoke = t - lastInvokeTime;
106
+ const timeWaiting = w - sinceCall;
107
+ return maxWait === undefined ? timeWaiting : Math.min(timeWaiting, maxWait - sinceInvoke);
108
+ };
109
+ const shouldInvoke = (t) => {
110
+ const sinceCall = t - lastCallTime;
111
+ const sinceInvoke = t - lastInvokeTime;
112
+ return (lastCallTime === 0 ||
113
+ sinceCall >= w ||
114
+ sinceCall < 0 ||
115
+ (maxWait !== undefined && sinceInvoke >= maxWait));
116
+ };
117
+ const onTimer = () => {
118
+ timer = null;
119
+ const t = now();
120
+ if (shouldInvoke(t)) {
121
+ if (trailing)
122
+ invoke();
123
+ return;
124
+ }
125
+ startTimer(remainingWait(t));
126
+ };
127
+ const debounced = function (...args) {
128
+ const t = now();
129
+ const isInvoking = shouldInvoke(t);
130
+ lastArgs = args;
131
+ lastThis = this;
132
+ lastCallTime = t;
133
+ if (!timer) {
134
+ if (leading && isInvoking) {
135
+ const r = invoke();
136
+ if (trailing)
137
+ startTimer(w);
138
+ else
139
+ clearState();
140
+ return r;
141
+ }
142
+ if (trailing) {
143
+ startTimer(w);
144
+ }
145
+ else {
146
+ clearState();
147
+ }
148
+ return lastResult;
149
+ }
150
+ if (maxWait !== undefined && isInvoking) {
151
+ if (trailing)
152
+ startTimer(w);
153
+ return invoke();
154
+ }
155
+ return lastResult;
156
+ };
157
+ debounced.cancel = () => {
158
+ stopTimer();
159
+ clearState();
160
+ lastCallTime = 0;
161
+ lastInvokeTime = 0;
162
+ lastResult = undefined;
163
+ };
164
+ debounced.flush = () => {
165
+ if (!timer)
166
+ return lastResult;
167
+ stopTimer();
168
+ return trailing ? invoke() : lastResult;
169
+ };
170
+ debounced.pending = () => !!timer;
171
+ return debounced;
172
+ }
173
+ export function throttle(fn, wait = 0, options) {
174
+ const leading = options?.leading !== false;
175
+ const trailing = options?.trailing !== false;
176
+ return debounce(fn, wait, { leading, trailing, maxWait: toIntNonNeg(wait) });
177
+ }
178
+ export function memoize(fn, keyResolver, options) {
179
+ const cache = new Map();
180
+ const maxSize = options?.maxSize === undefined ? 0 : toIntNonNeg(options.maxSize);
181
+ const memoized = function (...args) {
182
+ const key = keyResolver ? keyResolver(...args) : args[0];
183
+ if (cache.has(key)) {
184
+ if (maxSize > 0)
185
+ lruTouch(cache, key);
186
+ return cache.get(key);
187
+ }
188
+ const result = fn.apply(this, args);
189
+ cache.set(key, result);
190
+ if (maxSize > 0)
191
+ lruTrim(cache, maxSize);
192
+ return result;
193
+ };
194
+ memoized.cache = cache;
195
+ memoized.clear = () => cache.clear();
196
+ memoized.delete = (key) => cache.delete(key);
197
+ return memoized;
198
+ }
199
+ export function memoizeAsync(fn, keyResolver, options) {
200
+ const cache = new Map();
201
+ const maxSize = options?.maxSize === undefined ? 0 : toIntNonNeg(options.maxSize);
202
+ const memoized = function (...args) {
203
+ const key = keyResolver ? keyResolver(...args) : args[0];
204
+ const cached = cache.get(key);
205
+ if (cached) {
206
+ if (maxSize > 0)
207
+ lruTouch(cache, key);
208
+ return cached;
209
+ }
210
+ const p = fn.apply(this, args);
211
+ cache.set(key, p);
212
+ if (maxSize > 0)
213
+ lruTrim(cache, maxSize);
214
+ p.catch(() => {
215
+ if (cache.get(key) === p)
216
+ cache.delete(key);
217
+ });
218
+ return p;
219
+ };
220
+ memoized.cache = cache;
221
+ memoized.clear = () => cache.clear();
222
+ memoized.delete = (key) => cache.delete(key);
223
+ return memoized;
224
+ }
225
+ export function pipe(...fns) {
226
+ if (fns.length === 0)
227
+ return (x) => x;
228
+ return (x) => fns.reduce((v, fn) => fn(v), x);
229
+ }
230
+ export function compose(...fns) {
231
+ if (fns.length === 0)
232
+ return (x) => x;
233
+ return (x) => fns.reduceRight((v, fn) => fn(v), x);
234
+ }
package/dist/string.d.ts CHANGED
@@ -1,2 +1,29 @@
1
- export declare function uuid(): string;
2
- export declare function capitalize(str: string): string;
1
+ type UnknownString = string | null | undefined;
2
+ export declare const translitBase: Record<string, string>;
3
+ export declare function extendTransliteration(map: Record<string, string>): void;
4
+ export declare function capitalize(input: UnknownString, locale?: string): string;
5
+ export declare function capitalizeWords(input: UnknownString, locale?: string): string;
6
+ export declare function lower(input: UnknownString, locale?: string): string;
7
+ export declare function upper(input: UnknownString, locale?: string): string;
8
+ export declare function trim(input: UnknownString): string;
9
+ export declare function normalizeSpaces(input: UnknownString): string;
10
+ export declare function truncate(input: UnknownString, length: number, suffix?: string, locale?: string): string;
11
+ export declare function startsWithIgnoreCase(input: UnknownString, search: string, locale?: string): boolean;
12
+ export declare function endsWithIgnoreCase(input: UnknownString, search: string, locale?: string): boolean;
13
+ export declare function includesIgnoreCase(input: UnknownString, search: string, locale?: string): boolean;
14
+ export declare function removeNonAlphaNumeric(input: UnknownString): string;
15
+ export declare function slugify(input: UnknownString, locale?: string, maxLength?: number): string;
16
+ export declare function repeat(input: UnknownString, times: number): string;
17
+ export declare function padLeft(input: UnknownString, length: number, pad?: string): string;
18
+ export declare function padRight(input: UnknownString, length: number, pad?: string): string;
19
+ export declare function reverse(input: UnknownString, locale?: string): string;
20
+ export declare function isEmptyString(input: UnknownString): boolean;
21
+ export declare function equalsIgnoreCase(a: UnknownString, b: UnknownString, locale?: string): boolean;
22
+ export declare function extractInitials(input: UnknownString, locale?: string): string;
23
+ export declare function safeSubstring(input: UnknownString, start: number, end?: number, locale?: string): string;
24
+ export declare function removeDiacritics(input: UnknownString): string;
25
+ export declare function ensurePrefix(input: UnknownString, prefix: string): string;
26
+ export declare function ensureSuffix(input: UnknownString, suffix: string): string;
27
+ export declare function compareLocale(a: UnknownString, b: UnknownString, locale?: string, sensitivity?: Intl.CollatorOptions["sensitivity"]): number;
28
+ export declare function count(input: UnknownString, needle: string, locale?: string): number;
29
+ export {};
package/dist/string.js CHANGED
@@ -1,8 +1,239 @@
1
- export function uuid() {
2
- return crypto.randomUUID();
1
+ const HAS_SEGMENTER = typeof Intl !== "undefined" && typeof Intl.Segmenter === "function";
2
+ const HAS_COLLATOR = typeof Intl !== "undefined" && typeof Intl.Collator === "function";
3
+ const SEGMENTER_CACHE_MAX = 16;
4
+ const segmenterCache = new Map();
5
+ const COLLATOR_CACHE_MAX = 16;
6
+ const collatorCache = new Map();
7
+ function getSegmenter(locale) {
8
+ if (!HAS_SEGMENTER)
9
+ return null;
10
+ const existing = segmenterCache.get(locale);
11
+ if (existing) {
12
+ segmenterCache.delete(locale);
13
+ segmenterCache.set(locale, existing);
14
+ return existing;
15
+ }
16
+ const s = new Intl.Segmenter(locale, { granularity: "grapheme" });
17
+ segmenterCache.set(locale, s);
18
+ if (segmenterCache.size > SEGMENTER_CACHE_MAX) {
19
+ const k = segmenterCache.keys().next().value;
20
+ if (k)
21
+ segmenterCache.delete(k);
22
+ }
23
+ return s;
3
24
  }
4
- export function capitalize(str) {
5
- if (!str)
25
+ function getCollator(locale, sensitivity) {
26
+ if (!HAS_COLLATOR)
27
+ return null;
28
+ const key = `${locale}|${sensitivity ?? "base"}`;
29
+ const existing = collatorCache.get(key);
30
+ if (existing) {
31
+ collatorCache.delete(key);
32
+ collatorCache.set(key, existing);
33
+ return existing;
34
+ }
35
+ const c = new Intl.Collator(locale, {
36
+ sensitivity: sensitivity ?? "base",
37
+ usage: "sort"
38
+ });
39
+ collatorCache.set(key, c);
40
+ if (collatorCache.size > COLLATOR_CACHE_MAX) {
41
+ const k = collatorCache.keys().next().value;
42
+ if (k)
43
+ collatorCache.delete(k);
44
+ }
45
+ return c;
46
+ }
47
+ function toStringSafe(v) {
48
+ if (v === null || v === undefined)
49
+ return "";
50
+ return String(v);
51
+ }
52
+ function isNonEmptyString(v) {
53
+ return typeof v === "string" && v.length > 0;
54
+ }
55
+ function splitGraphemes(input, locale) {
56
+ const seg = getSegmenter(locale);
57
+ if (!seg)
58
+ return Array.from(input);
59
+ return Array.from(seg.segment(input), (x) => x.segment);
60
+ }
61
+ let HAS_UNICODE_PROPS = true;
62
+ try {
63
+ new RegExp("\\p{L}", "u");
64
+ }
65
+ catch {
66
+ HAS_UNICODE_PROPS = false;
67
+ }
68
+ const reKeepLettersNumbers = HAS_UNICODE_PROPS
69
+ ? /[^\p{L}\p{N}]/gu
70
+ : /[^a-zA-Z0-9]/g;
71
+ const reSlugStrip = HAS_UNICODE_PROPS
72
+ ? /[^\p{L}\p{N}\s-]/gu
73
+ : /[^a-z0-9\s-]/g;
74
+ export const translitBase = {
75
+ "ə": "e", "Ə": "e",
76
+ "ı": "i", "İ": "i",
77
+ "ş": "s", "Ş": "s",
78
+ "ğ": "g", "Ğ": "g",
79
+ "ç": "c", "Ç": "c",
80
+ "ö": "o", "Ö": "o",
81
+ "ü": "u", "Ü": "u",
82
+ "ñ": "n", "Ñ": "n"
83
+ };
84
+ export function extendTransliteration(map) {
85
+ for (const k in map)
86
+ translitBase[k] = map[k];
87
+ }
88
+ function transliterate(input) {
89
+ let out = "";
90
+ for (const ch of input)
91
+ out += translitBase[ch] ?? ch;
92
+ return out;
93
+ }
94
+ function foldCase(input, locale) {
95
+ return input.toLocaleLowerCase(locale).normalize("NFKC");
96
+ }
97
+ export function capitalize(input, locale = "en-US") {
98
+ if (!isNonEmptyString(input))
99
+ return "";
100
+ const g = splitGraphemes(input, locale);
101
+ if (g.length === 0)
102
+ return "";
103
+ return g[0].toLocaleUpperCase(locale) + g.slice(1).join("");
104
+ }
105
+ export function capitalizeWords(input, locale = "en-US") {
106
+ if (!isNonEmptyString(input))
107
+ return "";
108
+ return input.trim().split(/\s+/).map(w => capitalize(w, locale)).join(" ");
109
+ }
110
+ export function lower(input, locale = "en-US") {
111
+ return toStringSafe(input).toLocaleLowerCase(locale);
112
+ }
113
+ export function upper(input, locale = "en-US") {
114
+ return toStringSafe(input).toLocaleUpperCase(locale);
115
+ }
116
+ export function trim(input) {
117
+ return toStringSafe(input).trim();
118
+ }
119
+ export function normalizeSpaces(input) {
120
+ return toStringSafe(input).replace(/\s+/g, " ").trim();
121
+ }
122
+ export function truncate(input, length, suffix = "…", locale = "en-US") {
123
+ const str = toStringSafe(input);
124
+ if (length <= 0)
125
+ return "";
126
+ const g = splitGraphemes(str, locale);
127
+ if (g.length <= length)
6
128
  return str;
7
- return str[0].toUpperCase() + str.slice(1);
129
+ return g.slice(0, length).join("") + suffix;
130
+ }
131
+ export function startsWithIgnoreCase(input, search, locale = "en-US") {
132
+ if (!isNonEmptyString(search))
133
+ return false;
134
+ return foldCase(toStringSafe(input), locale).startsWith(foldCase(search, locale));
135
+ }
136
+ export function endsWithIgnoreCase(input, search, locale = "en-US") {
137
+ if (!isNonEmptyString(search))
138
+ return false;
139
+ return foldCase(toStringSafe(input), locale).endsWith(foldCase(search, locale));
140
+ }
141
+ export function includesIgnoreCase(input, search, locale = "en-US") {
142
+ if (!isNonEmptyString(search))
143
+ return false;
144
+ return foldCase(toStringSafe(input), locale).includes(foldCase(search, locale));
145
+ }
146
+ export function removeNonAlphaNumeric(input) {
147
+ return toStringSafe(input).replace(reKeepLettersNumbers, "");
148
+ }
149
+ export function slugify(input, locale = "en-US", maxLength = 0) {
150
+ let s = normalizeSpaces(input);
151
+ if (!s)
152
+ return "";
153
+ s = transliterate(s)
154
+ .toLocaleLowerCase(locale)
155
+ .normalize("NFKD")
156
+ .replace(/[\u0300-\u036f]/g, "")
157
+ .replace(reSlugStrip, "")
158
+ .replace(/\s+/g, "-")
159
+ .replace(/-+/g, "-")
160
+ .replace(/^-|-$/g, "");
161
+ if (maxLength > 0 && s.length > maxLength) {
162
+ s = s.slice(0, maxLength).replace(/-+$/g, "");
163
+ }
164
+ return s;
165
+ }
166
+ export function repeat(input, times) {
167
+ if (times <= 0)
168
+ return "";
169
+ return toStringSafe(input).repeat(times);
170
+ }
171
+ export function padLeft(input, length, pad = " ") {
172
+ const str = toStringSafe(input);
173
+ if (str.length >= length)
174
+ return str;
175
+ const p = pad.length ? pad : " ";
176
+ const need = length - str.length;
177
+ return p.repeat(Math.ceil(need / p.length)).slice(0, need) + str;
178
+ }
179
+ export function padRight(input, length, pad = " ") {
180
+ const str = toStringSafe(input);
181
+ if (str.length >= length)
182
+ return str;
183
+ const p = pad.length ? pad : " ";
184
+ const need = length - str.length;
185
+ return str + p.repeat(Math.ceil(need / p.length)).slice(0, need);
186
+ }
187
+ export function reverse(input, locale = "en-US") {
188
+ return splitGraphemes(toStringSafe(input), locale).reverse().join("");
189
+ }
190
+ export function isEmptyString(input) {
191
+ return toStringSafe(input).length === 0;
192
+ }
193
+ export function equalsIgnoreCase(a, b, locale = "en-US") {
194
+ return foldCase(toStringSafe(a), locale) === foldCase(toStringSafe(b), locale);
195
+ }
196
+ export function extractInitials(input, locale = "en-US") {
197
+ if (!isNonEmptyString(input))
198
+ return "";
199
+ return input.trim().split(/\s+/)
200
+ .map(w => splitGraphemes(w, locale)[0] || "")
201
+ .map(ch => (ch ? ch.toLocaleUpperCase(locale) : ""))
202
+ .join("");
203
+ }
204
+ export function safeSubstring(input, start, end, locale = "en-US") {
205
+ const g = splitGraphemes(toStringSafe(input), locale);
206
+ const s = Math.max(0, start);
207
+ const e = end === undefined ? g.length : Math.max(s, end);
208
+ return g.slice(s, e).join("");
209
+ }
210
+ export function removeDiacritics(input) {
211
+ return toStringSafe(input).normalize("NFKD").replace(/[\u0300-\u036f]/g, "");
212
+ }
213
+ export function ensurePrefix(input, prefix) {
214
+ const str = toStringSafe(input);
215
+ return str.startsWith(prefix) ? str : prefix + str;
216
+ }
217
+ export function ensureSuffix(input, suffix) {
218
+ const str = toStringSafe(input);
219
+ return str.endsWith(suffix) ? str : str + suffix;
220
+ }
221
+ export function compareLocale(a, b, locale = "en-US", sensitivity = "base") {
222
+ const c = getCollator(locale, sensitivity);
223
+ if (c)
224
+ return c.compare(toStringSafe(a), toStringSafe(b));
225
+ return toStringSafe(a).localeCompare(toStringSafe(b), locale, { sensitivity });
226
+ }
227
+ export function count(input, needle, locale = "en-US") {
228
+ if (!isNonEmptyString(needle))
229
+ return 0;
230
+ const hay = foldCase(toStringSafe(input), locale);
231
+ const ndl = foldCase(needle, locale);
232
+ let i = 0;
233
+ let c = 0;
234
+ while ((i = hay.indexOf(ndl, i)) !== -1) {
235
+ c++;
236
+ i += ndl.length;
237
+ }
238
+ return c;
8
239
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zakir-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Core utility functions – zero dependency",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",