@jthong/util 0.1.0-alpha.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.
- package/README.md +43 -0
- package/dist/array/index.cjs +35 -0
- package/dist/array/index.cjs.map +1 -0
- package/dist/array/index.d.cts +6 -0
- package/dist/array/index.d.ts +6 -0
- package/dist/array/index.js +30 -0
- package/dist/array/index.js.map +1 -0
- package/dist/fn/index.cjs +27 -0
- package/dist/fn/index.cjs.map +1 -0
- package/dist/fn/index.d.cts +5 -0
- package/dist/fn/index.d.ts +5 -0
- package/dist/fn/index.js +23 -0
- package/dist/fn/index.js.map +1 -0
- package/dist/index.cjs +92 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/object/index.cjs +28 -0
- package/dist/object/index.cjs.map +1 -0
- package/dist/object/index.d.cts +5 -0
- package/dist/object/index.d.ts +5 -0
- package/dist/object/index.js +24 -0
- package/dist/object/index.js.map +1 -0
- package/dist/string/index.cjs +14 -0
- package/dist/string/index.cjs.map +1 -0
- package/dist/string/index.d.cts +6 -0
- package/dist/string/index.d.ts +6 -0
- package/dist/string/index.js +9 -0
- package/dist/string/index.js.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @jthong/util
|
|
2
|
+
|
|
3
|
+
프레임워크에 종속되지 않는 TypeScript 유틸리티 함수.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @jthong/util
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// 전체 import
|
|
15
|
+
import { capitalize, chunk, debounce } from "@jthong/util";
|
|
16
|
+
|
|
17
|
+
// 서브패스 import (tree-shaking 친화적)
|
|
18
|
+
import { capitalize } from "@jthong/util/string";
|
|
19
|
+
import { chunk } from "@jthong/util/array";
|
|
20
|
+
import { pick } from "@jthong/util/object";
|
|
21
|
+
import { debounce } from "@jthong/util/fn";
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## API
|
|
25
|
+
|
|
26
|
+
### `/string`
|
|
27
|
+
- `capitalize(str)` — 첫 글자 대문자
|
|
28
|
+
- `camelToKebab(str)` / `kebabToCamel(str)` — 케이스 변환
|
|
29
|
+
- `truncate(str, max, suffix?)` — 자르고 접미사 붙이기
|
|
30
|
+
|
|
31
|
+
### `/array`
|
|
32
|
+
- `chunk(arr, size)` — n개씩 분할
|
|
33
|
+
- `unique(arr)` — 중복 제거
|
|
34
|
+
- `groupBy(arr, keyFn)` — 키별 그룹화
|
|
35
|
+
- `range(start, end?, step?)` — 정수 범위
|
|
36
|
+
|
|
37
|
+
### `/object`
|
|
38
|
+
- `pick(obj, keys)` / `omit(obj, keys)`
|
|
39
|
+
- `isPlainObject(value)` — 순수 객체 판별 (SSR 안전)
|
|
40
|
+
|
|
41
|
+
### `/fn`
|
|
42
|
+
- `debounce(fn, ms)` / `throttle(fn, ms)`
|
|
43
|
+
- `sleep(ms)` — Promise 기반 대기
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/array/index.ts
|
|
4
|
+
var chunk = (arr, size) => {
|
|
5
|
+
if (size <= 0) return [];
|
|
6
|
+
const result = [];
|
|
7
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
8
|
+
result.push(arr.slice(i, i + size));
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
};
|
|
12
|
+
var unique = (arr) => Array.from(new Set(arr));
|
|
13
|
+
var groupBy = (arr, keyFn) => {
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const item of arr) {
|
|
16
|
+
const key = keyFn(item);
|
|
17
|
+
(result[key] ??= []).push(item);
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var range = (start, end, step = 1) => {
|
|
22
|
+
const [from, to] = end === void 0 ? [0, start] : [start, end];
|
|
23
|
+
const result = [];
|
|
24
|
+
for (let i = from; step > 0 ? i < to : i > to; i += step) {
|
|
25
|
+
result.push(i);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.chunk = chunk;
|
|
31
|
+
exports.groupBy = groupBy;
|
|
32
|
+
exports.range = range;
|
|
33
|
+
exports.unique = unique;
|
|
34
|
+
//# sourceMappingURL=index.cjs.map
|
|
35
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/array/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,KAAA,GAAQ,CAAI,GAAA,EAAmB,IAAA,KAAwB;AAClE,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,OAAO,EAAC;AACvB,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,KAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,MAAA,GAAS,CAAI,GAAA,KAA2B,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,GAAG,CAAC;AAErE,IAAM,OAAA,GAAU,CACrB,GAAA,EACA,KAAA,KACmB;AACnB,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,IAAA,CAAC,OAAO,GAAG,CAAA,KAAM,EAAC,EAAG,KAAK,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,GAAA,EAAc,OAAO,CAAA,KAAgB;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,GAAA,KAAQ,MAAA,GAAY,CAAC,CAAA,EAAG,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,IAAA,EAAM;AACxD,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["export const chunk = <T>(arr: readonly T[], size: number): T[][] => {\n if (size <= 0) return [];\n const result: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n};\n\nexport const unique = <T>(arr: readonly T[]): T[] => Array.from(new Set(arr));\n\nexport const groupBy = <T, K extends PropertyKey>(\n arr: readonly T[],\n keyFn: (item: T) => K,\n): Record<K, T[]> => {\n const result = {} as Record<K, T[]>;\n for (const item of arr) {\n const key = keyFn(item);\n (result[key] ??= []).push(item);\n }\n return result;\n};\n\nexport const range = (start: number, end?: number, step = 1): number[] => {\n const [from, to] = end === undefined ? [0, start] : [start, end];\n const result: number[] = [];\n for (let i = from; step > 0 ? i < to : i > to; i += step) {\n result.push(i);\n }\n return result;\n};\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const chunk: <T>(arr: readonly T[], size: number) => T[][];
|
|
2
|
+
declare const unique: <T>(arr: readonly T[]) => T[];
|
|
3
|
+
declare const groupBy: <T, K extends PropertyKey>(arr: readonly T[], keyFn: (item: T) => K) => Record<K, T[]>;
|
|
4
|
+
declare const range: (start: number, end?: number, step?: number) => number[];
|
|
5
|
+
|
|
6
|
+
export { chunk, groupBy, range, unique };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const chunk: <T>(arr: readonly T[], size: number) => T[][];
|
|
2
|
+
declare const unique: <T>(arr: readonly T[]) => T[];
|
|
3
|
+
declare const groupBy: <T, K extends PropertyKey>(arr: readonly T[], keyFn: (item: T) => K) => Record<K, T[]>;
|
|
4
|
+
declare const range: (start: number, end?: number, step?: number) => number[];
|
|
5
|
+
|
|
6
|
+
export { chunk, groupBy, range, unique };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/array/index.ts
|
|
2
|
+
var chunk = (arr, size) => {
|
|
3
|
+
if (size <= 0) return [];
|
|
4
|
+
const result = [];
|
|
5
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
6
|
+
result.push(arr.slice(i, i + size));
|
|
7
|
+
}
|
|
8
|
+
return result;
|
|
9
|
+
};
|
|
10
|
+
var unique = (arr) => Array.from(new Set(arr));
|
|
11
|
+
var groupBy = (arr, keyFn) => {
|
|
12
|
+
const result = {};
|
|
13
|
+
for (const item of arr) {
|
|
14
|
+
const key = keyFn(item);
|
|
15
|
+
(result[key] ??= []).push(item);
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
};
|
|
19
|
+
var range = (start, end, step = 1) => {
|
|
20
|
+
const [from, to] = end === void 0 ? [0, start] : [start, end];
|
|
21
|
+
const result = [];
|
|
22
|
+
for (let i = from; step > 0 ? i < to : i > to; i += step) {
|
|
23
|
+
result.push(i);
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { chunk, groupBy, range, unique };
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/array/index.ts"],"names":[],"mappings":";AAAO,IAAM,KAAA,GAAQ,CAAI,GAAA,EAAmB,IAAA,KAAwB;AAClE,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,OAAO,EAAC;AACvB,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,KAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,MAAA,GAAS,CAAI,GAAA,KAA2B,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,GAAG,CAAC;AAErE,IAAM,OAAA,GAAU,CACrB,GAAA,EACA,KAAA,KACmB;AACnB,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,IAAA,CAAC,OAAO,GAAG,CAAA,KAAM,EAAC,EAAG,KAAK,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,GAAA,EAAc,OAAO,CAAA,KAAgB;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,GAAA,KAAQ,MAAA,GAAY,CAAC,CAAA,EAAG,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,IAAA,EAAM;AACxD,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["export const chunk = <T>(arr: readonly T[], size: number): T[][] => {\n if (size <= 0) return [];\n const result: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n};\n\nexport const unique = <T>(arr: readonly T[]): T[] => Array.from(new Set(arr));\n\nexport const groupBy = <T, K extends PropertyKey>(\n arr: readonly T[],\n keyFn: (item: T) => K,\n): Record<K, T[]> => {\n const result = {} as Record<K, T[]>;\n for (const item of arr) {\n const key = keyFn(item);\n (result[key] ??= []).push(item);\n }\n return result;\n};\n\nexport const range = (start: number, end?: number, step = 1): number[] => {\n const [from, to] = end === undefined ? [0, start] : [start, end];\n const result: number[] = [];\n for (let i = from; step > 0 ? i < to : i > to; i += step) {\n result.push(i);\n }\n return result;\n};\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/fn/index.ts
|
|
4
|
+
var debounce = (fn, ms) => {
|
|
5
|
+
let timer;
|
|
6
|
+
return (...args) => {
|
|
7
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
8
|
+
timer = setTimeout(() => fn(...args), ms);
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
var throttle = (fn, ms) => {
|
|
12
|
+
let last = 0;
|
|
13
|
+
return (...args) => {
|
|
14
|
+
const now = Date.now();
|
|
15
|
+
if (now - last >= ms) {
|
|
16
|
+
last = now;
|
|
17
|
+
fn(...args);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
|
|
23
|
+
exports.debounce = debounce;
|
|
24
|
+
exports.sleep = sleep;
|
|
25
|
+
exports.throttle = throttle;
|
|
26
|
+
//# sourceMappingURL=index.cjs.map
|
|
27
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fn/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAA,GAAQ,WAAW,MAAM,EAAA,CAAG,GAAG,IAAI,GAAG,EAAE,CAAA;AAAA,EAC1C,CAAA;AACF;AAEO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,QAAQ,EAAA,EAAI;AACpB,MAAA,IAAA,GAAO,GAAA;AACP,MAAA,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAEO,IAAM,KAAA,GAAQ,CAAC,EAAA,KACpB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC","file":"index.cjs","sourcesContent":["export const debounce = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return (...args: Args) => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n};\n\nexport const throttle = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let last = 0;\n return (...args: Args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n};\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const debounce: <Args extends unknown[]>(fn: (...args: Args) => void, ms: number) => ((...args: Args) => void);
|
|
2
|
+
declare const throttle: <Args extends unknown[]>(fn: (...args: Args) => void, ms: number) => ((...args: Args) => void);
|
|
3
|
+
declare const sleep: (ms: number) => Promise<void>;
|
|
4
|
+
|
|
5
|
+
export { debounce, sleep, throttle };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const debounce: <Args extends unknown[]>(fn: (...args: Args) => void, ms: number) => ((...args: Args) => void);
|
|
2
|
+
declare const throttle: <Args extends unknown[]>(fn: (...args: Args) => void, ms: number) => ((...args: Args) => void);
|
|
3
|
+
declare const sleep: (ms: number) => Promise<void>;
|
|
4
|
+
|
|
5
|
+
export { debounce, sleep, throttle };
|
package/dist/fn/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/fn/index.ts
|
|
2
|
+
var debounce = (fn, ms) => {
|
|
3
|
+
let timer;
|
|
4
|
+
return (...args) => {
|
|
5
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
6
|
+
timer = setTimeout(() => fn(...args), ms);
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
var throttle = (fn, ms) => {
|
|
10
|
+
let last = 0;
|
|
11
|
+
return (...args) => {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
if (now - last >= ms) {
|
|
14
|
+
last = now;
|
|
15
|
+
fn(...args);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
|
+
|
|
21
|
+
export { debounce, sleep, throttle };
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fn/index.ts"],"names":[],"mappings":";AAAO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAA,GAAQ,WAAW,MAAM,EAAA,CAAG,GAAG,IAAI,GAAG,EAAE,CAAA;AAAA,EAC1C,CAAA;AACF;AAEO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,QAAQ,EAAA,EAAI;AACpB,MAAA,IAAA,GAAO,GAAA;AACP,MAAA,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAEO,IAAM,KAAA,GAAQ,CAAC,EAAA,KACpB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC","file":"index.js","sourcesContent":["export const debounce = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return (...args: Args) => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n};\n\nexport const throttle = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let last = 0;\n return (...args: Args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n};\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/string/index.ts
|
|
4
|
+
var capitalize = (str) => str.length === 0 ? str : str[0].toUpperCase() + str.slice(1);
|
|
5
|
+
var camelToKebab = (str) => str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, "");
|
|
6
|
+
var kebabToCamel = (str) => str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
7
|
+
var truncate = (str, max, suffix = "...") => str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;
|
|
8
|
+
|
|
9
|
+
// src/array/index.ts
|
|
10
|
+
var chunk = (arr, size) => {
|
|
11
|
+
if (size <= 0) return [];
|
|
12
|
+
const result = [];
|
|
13
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
14
|
+
result.push(arr.slice(i, i + size));
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
18
|
+
var unique = (arr) => Array.from(new Set(arr));
|
|
19
|
+
var groupBy = (arr, keyFn) => {
|
|
20
|
+
const result = {};
|
|
21
|
+
for (const item of arr) {
|
|
22
|
+
const key = keyFn(item);
|
|
23
|
+
(result[key] ??= []).push(item);
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
var range = (start, end, step = 1) => {
|
|
28
|
+
const [from, to] = end === void 0 ? [0, start] : [start, end];
|
|
29
|
+
const result = [];
|
|
30
|
+
for (let i = from; step > 0 ? i < to : i > to; i += step) {
|
|
31
|
+
result.push(i);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// src/object/index.ts
|
|
37
|
+
var pick = (obj, keys) => {
|
|
38
|
+
const result = {};
|
|
39
|
+
for (const key of keys) {
|
|
40
|
+
if (key in obj) result[key] = obj[key];
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
var omit = (obj, keys) => {
|
|
45
|
+
const result = { ...obj };
|
|
46
|
+
for (const key of keys) {
|
|
47
|
+
delete result[key];
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
var isPlainObject = (value) => {
|
|
52
|
+
if (typeof value !== "object" || value === null) return false;
|
|
53
|
+
const proto = Object.getPrototypeOf(value);
|
|
54
|
+
return proto === null || proto === Object.prototype;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// src/fn/index.ts
|
|
58
|
+
var debounce = (fn, ms) => {
|
|
59
|
+
let timer;
|
|
60
|
+
return (...args) => {
|
|
61
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
62
|
+
timer = setTimeout(() => fn(...args), ms);
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
var throttle = (fn, ms) => {
|
|
66
|
+
let last = 0;
|
|
67
|
+
return (...args) => {
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
if (now - last >= ms) {
|
|
70
|
+
last = now;
|
|
71
|
+
fn(...args);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
76
|
+
|
|
77
|
+
exports.camelToKebab = camelToKebab;
|
|
78
|
+
exports.capitalize = capitalize;
|
|
79
|
+
exports.chunk = chunk;
|
|
80
|
+
exports.debounce = debounce;
|
|
81
|
+
exports.groupBy = groupBy;
|
|
82
|
+
exports.isPlainObject = isPlainObject;
|
|
83
|
+
exports.kebabToCamel = kebabToCamel;
|
|
84
|
+
exports.omit = omit;
|
|
85
|
+
exports.pick = pick;
|
|
86
|
+
exports.range = range;
|
|
87
|
+
exports.sleep = sleep;
|
|
88
|
+
exports.throttle = throttle;
|
|
89
|
+
exports.truncate = truncate;
|
|
90
|
+
exports.unique = unique;
|
|
91
|
+
//# sourceMappingURL=index.cjs.map
|
|
92
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/string/index.ts","../src/array/index.ts","../src/object/index.ts","../src/fn/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,UAAA,GAAa,CAAC,GAAA,KACzB,GAAA,CAAI,WAAW,CAAA,GAAI,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAG,WAAA,EAAY,GAAI,GAAA,CAAI,MAAM,CAAC;AAEvD,IAAM,eAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,aAAa,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE;AAE/D,IAAM,YAAA,GAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa;AAErD,IAAM,QAAA,GAAW,CAAC,GAAA,EAAa,GAAA,EAAa,SAAS,KAAA,KAC1D,GAAA,CAAI,UAAU,GAAA,GAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI;;;ACVtE,IAAM,KAAA,GAAQ,CAAI,GAAA,EAAmB,IAAA,KAAwB;AAClE,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,OAAO,EAAC;AACvB,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,KAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,MAAA,GAAS,CAAI,GAAA,KAA2B,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,GAAG,CAAC;AAErE,IAAM,OAAA,GAAU,CACrB,GAAA,EACA,KAAA,KACmB;AACnB,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,IAAA,CAAC,OAAO,GAAG,CAAA,KAAM,EAAC,EAAG,KAAK,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,GAAA,EAAc,OAAO,CAAA,KAAgB;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,GAAA,KAAQ,MAAA,GAAY,CAAC,CAAA,EAAG,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,IAAA,EAAM;AACxD,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT;;;AC9BO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,GAAA,EAAI;AACxB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAqD;AACjF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AACzC,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,SAAA;AAC5C;;;AC1BO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAA,GAAQ,WAAW,MAAM,EAAA,CAAG,GAAG,IAAI,GAAG,EAAE,CAAA;AAAA,EAC1C,CAAA;AACF;AAEO,IAAM,QAAA,GAAW,CACtB,EAAA,EACA,EAAA,KAC8B;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAI,IAAA,KAAe;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,QAAQ,EAAA,EAAI;AACpB,MAAA,IAAA,GAAO,GAAA;AACP,MAAA,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAEO,IAAM,KAAA,GAAQ,CAAC,EAAA,KACpB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC","file":"index.cjs","sourcesContent":["export const capitalize = (str: string): string =>\n str.length === 0 ? str : str[0]!.toUpperCase() + str.slice(1);\n\nexport const camelToKebab = (str: string): string =>\n str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, \"\");\n\nexport const kebabToCamel = (str: string): string =>\n str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n\nexport const truncate = (str: string, max: number, suffix = \"...\"): string =>\n str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;\n","export const chunk = <T>(arr: readonly T[], size: number): T[][] => {\n if (size <= 0) return [];\n const result: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n};\n\nexport const unique = <T>(arr: readonly T[]): T[] => Array.from(new Set(arr));\n\nexport const groupBy = <T, K extends PropertyKey>(\n arr: readonly T[],\n keyFn: (item: T) => K,\n): Record<K, T[]> => {\n const result = {} as Record<K, T[]>;\n for (const item of arr) {\n const key = keyFn(item);\n (result[key] ??= []).push(item);\n }\n return result;\n};\n\nexport const range = (start: number, end?: number, step = 1): number[] => {\n const [from, to] = end === undefined ? [0, start] : [start, end];\n const result: number[] = [];\n for (let i = from; step > 0 ? i < to : i > to; i += step) {\n result.push(i);\n }\n return result;\n};\n","export const pick = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Pick<T, K> => {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n};\n\nexport const omit = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Omit<T, K> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n};\n","export const debounce = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return (...args: Args) => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n};\n\nexport const throttle = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let last = 0;\n return (...args: Args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n};\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { camelToKebab, capitalize, kebabToCamel, truncate } from './string/index.cjs';
|
|
2
|
+
export { chunk, groupBy, range, unique } from './array/index.cjs';
|
|
3
|
+
export { isPlainObject, omit, pick } from './object/index.cjs';
|
|
4
|
+
export { debounce, sleep, throttle } from './fn/index.cjs';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { camelToKebab, capitalize, kebabToCamel, truncate } from './string/index.js';
|
|
2
|
+
export { chunk, groupBy, range, unique } from './array/index.js';
|
|
3
|
+
export { isPlainObject, omit, pick } from './object/index.js';
|
|
4
|
+
export { debounce, sleep, throttle } from './fn/index.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// src/string/index.ts
|
|
2
|
+
var capitalize = (str) => str.length === 0 ? str : str[0].toUpperCase() + str.slice(1);
|
|
3
|
+
var camelToKebab = (str) => str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, "");
|
|
4
|
+
var kebabToCamel = (str) => str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
5
|
+
var truncate = (str, max, suffix = "...") => str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;
|
|
6
|
+
|
|
7
|
+
// src/array/index.ts
|
|
8
|
+
var chunk = (arr, size) => {
|
|
9
|
+
if (size <= 0) return [];
|
|
10
|
+
const result = [];
|
|
11
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
12
|
+
result.push(arr.slice(i, i + size));
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
var unique = (arr) => Array.from(new Set(arr));
|
|
17
|
+
var groupBy = (arr, keyFn) => {
|
|
18
|
+
const result = {};
|
|
19
|
+
for (const item of arr) {
|
|
20
|
+
const key = keyFn(item);
|
|
21
|
+
(result[key] ??= []).push(item);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var range = (start, end, step = 1) => {
|
|
26
|
+
const [from, to] = end === void 0 ? [0, start] : [start, end];
|
|
27
|
+
const result = [];
|
|
28
|
+
for (let i = from; step > 0 ? i < to : i > to; i += step) {
|
|
29
|
+
result.push(i);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/object/index.ts
|
|
35
|
+
var pick = (obj, keys) => {
|
|
36
|
+
const result = {};
|
|
37
|
+
for (const key of keys) {
|
|
38
|
+
if (key in obj) result[key] = obj[key];
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
var omit = (obj, keys) => {
|
|
43
|
+
const result = { ...obj };
|
|
44
|
+
for (const key of keys) {
|
|
45
|
+
delete result[key];
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
var isPlainObject = (value) => {
|
|
50
|
+
if (typeof value !== "object" || value === null) return false;
|
|
51
|
+
const proto = Object.getPrototypeOf(value);
|
|
52
|
+
return proto === null || proto === Object.prototype;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/fn/index.ts
|
|
56
|
+
var debounce = (fn, ms) => {
|
|
57
|
+
let timer;
|
|
58
|
+
return (...args) => {
|
|
59
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
60
|
+
timer = setTimeout(() => fn(...args), ms);
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
var throttle = (fn, ms) => {
|
|
64
|
+
let last = 0;
|
|
65
|
+
return (...args) => {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
if (now - last >= ms) {
|
|
68
|
+
last = now;
|
|
69
|
+
fn(...args);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
74
|
+
|
|
75
|
+
export { camelToKebab, capitalize, chunk, debounce, groupBy, isPlainObject, kebabToCamel, omit, pick, range, sleep, throttle, truncate, unique };
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/string/index.ts","../src/array/index.ts","../src/object/index.ts","../src/fn/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const capitalize = (str: string): string =>\n str.length === 0 ? str : str[0]!.toUpperCase() + str.slice(1);\n\nexport const camelToKebab = (str: string): string =>\n str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, \"\");\n\nexport const kebabToCamel = (str: string): string =>\n str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n\nexport const truncate = (str: string, max: number, suffix = \"...\"): string =>\n str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;\n","export const chunk = <T>(arr: readonly T[], size: number): T[][] => {\n if (size <= 0) return [];\n const result: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n};\n\nexport const unique = <T>(arr: readonly T[]): T[] => Array.from(new Set(arr));\n\nexport const groupBy = <T, K extends PropertyKey>(\n arr: readonly T[],\n keyFn: (item: T) => K,\n): Record<K, T[]> => {\n const result = {} as Record<K, T[]>;\n for (const item of arr) {\n const key = keyFn(item);\n (result[key] ??= []).push(item);\n }\n return result;\n};\n\nexport const range = (start: number, end?: number, step = 1): number[] => {\n const [from, to] = end === undefined ? [0, start] : [start, end];\n const result: number[] = [];\n for (let i = from; step > 0 ? i < to : i > to; i += step) {\n result.push(i);\n }\n return result;\n};\n","export const pick = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Pick<T, K> => {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n};\n\nexport const omit = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Omit<T, K> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n};\n","export const debounce = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return (...args: Args) => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n};\n\nexport const throttle = <Args extends unknown[]>(\n fn: (...args: Args) => void,\n ms: number,\n): ((...args: Args) => void) => {\n let last = 0;\n return (...args: Args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n};\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/object/index.ts
|
|
4
|
+
var pick = (obj, keys) => {
|
|
5
|
+
const result = {};
|
|
6
|
+
for (const key of keys) {
|
|
7
|
+
if (key in obj) result[key] = obj[key];
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
var omit = (obj, keys) => {
|
|
12
|
+
const result = { ...obj };
|
|
13
|
+
for (const key of keys) {
|
|
14
|
+
delete result[key];
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
18
|
+
var isPlainObject = (value) => {
|
|
19
|
+
if (typeof value !== "object" || value === null) return false;
|
|
20
|
+
const proto = Object.getPrototypeOf(value);
|
|
21
|
+
return proto === null || proto === Object.prototype;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.isPlainObject = isPlainObject;
|
|
25
|
+
exports.omit = omit;
|
|
26
|
+
exports.pick = pick;
|
|
27
|
+
//# sourceMappingURL=index.cjs.map
|
|
28
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/object/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,GAAA,EAAI;AACxB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAqD;AACjF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AACzC,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,SAAA;AAC5C","file":"index.cjs","sourcesContent":["export const pick = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Pick<T, K> => {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n};\n\nexport const omit = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Omit<T, K> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n};\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const pick: <T extends object, K extends keyof T>(obj: T, keys: readonly K[]) => Pick<T, K>;
|
|
2
|
+
declare const omit: <T extends object, K extends keyof T>(obj: T, keys: readonly K[]) => Omit<T, K>;
|
|
3
|
+
declare const isPlainObject: (value: unknown) => value is Record<string, unknown>;
|
|
4
|
+
|
|
5
|
+
export { isPlainObject, omit, pick };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const pick: <T extends object, K extends keyof T>(obj: T, keys: readonly K[]) => Pick<T, K>;
|
|
2
|
+
declare const omit: <T extends object, K extends keyof T>(obj: T, keys: readonly K[]) => Omit<T, K>;
|
|
3
|
+
declare const isPlainObject: (value: unknown) => value is Record<string, unknown>;
|
|
4
|
+
|
|
5
|
+
export { isPlainObject, omit, pick };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/object/index.ts
|
|
2
|
+
var pick = (obj, keys) => {
|
|
3
|
+
const result = {};
|
|
4
|
+
for (const key of keys) {
|
|
5
|
+
if (key in obj) result[key] = obj[key];
|
|
6
|
+
}
|
|
7
|
+
return result;
|
|
8
|
+
};
|
|
9
|
+
var omit = (obj, keys) => {
|
|
10
|
+
const result = { ...obj };
|
|
11
|
+
for (const key of keys) {
|
|
12
|
+
delete result[key];
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
var isPlainObject = (value) => {
|
|
17
|
+
if (typeof value !== "object" || value === null) return false;
|
|
18
|
+
const proto = Object.getPrototypeOf(value);
|
|
19
|
+
return proto === null || proto === Object.prototype;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { isPlainObject, omit, pick };
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/object/index.ts"],"names":[],"mappings":";AAAO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,IAAA,GAAO,CAClB,GAAA,EACA,IAAA,KACe;AACf,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,GAAA,EAAI;AACxB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAqD;AACjF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AACzC,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,SAAA;AAC5C","file":"index.js","sourcesContent":["export const pick = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Pick<T, K> => {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n};\n\nexport const omit = <T extends object, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Omit<T, K> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/string/index.ts
|
|
4
|
+
var capitalize = (str) => str.length === 0 ? str : str[0].toUpperCase() + str.slice(1);
|
|
5
|
+
var camelToKebab = (str) => str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, "");
|
|
6
|
+
var kebabToCamel = (str) => str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
7
|
+
var truncate = (str, max, suffix = "...") => str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;
|
|
8
|
+
|
|
9
|
+
exports.camelToKebab = camelToKebab;
|
|
10
|
+
exports.capitalize = capitalize;
|
|
11
|
+
exports.kebabToCamel = kebabToCamel;
|
|
12
|
+
exports.truncate = truncate;
|
|
13
|
+
//# sourceMappingURL=index.cjs.map
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/string/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,UAAA,GAAa,CAAC,GAAA,KACzB,GAAA,CAAI,WAAW,CAAA,GAAI,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAG,WAAA,EAAY,GAAI,GAAA,CAAI,MAAM,CAAC;AAEvD,IAAM,eAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,aAAa,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE;AAE/D,IAAM,YAAA,GAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa;AAErD,IAAM,QAAA,GAAW,CAAC,GAAA,EAAa,GAAA,EAAa,SAAS,KAAA,KAC1D,GAAA,CAAI,UAAU,GAAA,GAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI","file":"index.cjs","sourcesContent":["export const capitalize = (str: string): string =>\n str.length === 0 ? str : str[0]!.toUpperCase() + str.slice(1);\n\nexport const camelToKebab = (str: string): string =>\n str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, \"\");\n\nexport const kebabToCamel = (str: string): string =>\n str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n\nexport const truncate = (str: string, max: number, suffix = \"...\"): string =>\n str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const capitalize: (str: string) => string;
|
|
2
|
+
declare const camelToKebab: (str: string) => string;
|
|
3
|
+
declare const kebabToCamel: (str: string) => string;
|
|
4
|
+
declare const truncate: (str: string, max: number, suffix?: string) => string;
|
|
5
|
+
|
|
6
|
+
export { camelToKebab, capitalize, kebabToCamel, truncate };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const capitalize: (str: string) => string;
|
|
2
|
+
declare const camelToKebab: (str: string) => string;
|
|
3
|
+
declare const kebabToCamel: (str: string) => string;
|
|
4
|
+
declare const truncate: (str: string, max: number, suffix?: string) => string;
|
|
5
|
+
|
|
6
|
+
export { camelToKebab, capitalize, kebabToCamel, truncate };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/string/index.ts
|
|
2
|
+
var capitalize = (str) => str.length === 0 ? str : str[0].toUpperCase() + str.slice(1);
|
|
3
|
+
var camelToKebab = (str) => str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, "");
|
|
4
|
+
var kebabToCamel = (str) => str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
5
|
+
var truncate = (str, max, suffix = "...") => str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;
|
|
6
|
+
|
|
7
|
+
export { camelToKebab, capitalize, kebabToCamel, truncate };
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/string/index.ts"],"names":[],"mappings":";AAAO,IAAM,UAAA,GAAa,CAAC,GAAA,KACzB,GAAA,CAAI,WAAW,CAAA,GAAI,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAG,WAAA,EAAY,GAAI,GAAA,CAAI,MAAM,CAAC;AAEvD,IAAM,eAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,aAAa,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE;AAE/D,IAAM,YAAA,GAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa;AAErD,IAAM,QAAA,GAAW,CAAC,GAAA,EAAa,GAAA,EAAa,SAAS,KAAA,KAC1D,GAAA,CAAI,UAAU,GAAA,GAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI","file":"index.js","sourcesContent":["export const capitalize = (str: string): string =>\n str.length === 0 ? str : str[0]!.toUpperCase() + str.slice(1);\n\nexport const camelToKebab = (str: string): string =>\n str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, \"\");\n\nexport const kebabToCamel = (str: string): string =>\n str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n\nexport const truncate = (str: string, max: number, suffix = \"...\"): string =>\n str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jthong/util",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "Framework-agnostic TypeScript utility functions",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./string": {
|
|
18
|
+
"types": "./dist/string/index.d.ts",
|
|
19
|
+
"import": "./dist/string/index.js",
|
|
20
|
+
"require": "./dist/string/index.cjs"
|
|
21
|
+
},
|
|
22
|
+
"./array": {
|
|
23
|
+
"types": "./dist/array/index.d.ts",
|
|
24
|
+
"import": "./dist/array/index.js",
|
|
25
|
+
"require": "./dist/array/index.cjs"
|
|
26
|
+
},
|
|
27
|
+
"./object": {
|
|
28
|
+
"types": "./dist/object/index.d.ts",
|
|
29
|
+
"import": "./dist/object/index.js",
|
|
30
|
+
"require": "./dist/object/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./fn": {
|
|
33
|
+
"types": "./dist/fn/index.d.ts",
|
|
34
|
+
"import": "./dist/fn/index.js",
|
|
35
|
+
"require": "./dist/fn/index.cjs"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md"
|
|
41
|
+
],
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"tsup": "^8.3.5",
|
|
44
|
+
"typescript": "^5.7.2",
|
|
45
|
+
"vitest": "^2.1.8"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"dev": "tsup --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"typecheck": "tsc --noEmit",
|
|
56
|
+
"clean": "rm -rf dist .turbo"
|
|
57
|
+
}
|
|
58
|
+
}
|