@jthong/util 0.1.0-alpha.0 → 0.1.0-alpha.2
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 +7 -0
- package/dist/array/index.cjs +11 -0
- package/dist/array/index.cjs.map +1 -1
- package/dist/array/index.d.ts +91 -6
- package/dist/array/index.d.ts.map +1 -0
- package/dist/array/index.js +11 -1
- package/dist/array/index.js.map +1 -1
- package/dist/fn/index.cjs +54 -0
- package/dist/fn/index.cjs.map +1 -1
- package/dist/fn/index.d.ts +149 -5
- package/dist/fn/index.d.ts.map +1 -0
- package/dist/fn/index.js +51 -1
- package/dist/fn/index.js.map +1 -1
- package/dist/index.cjs +119 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -1
- package/dist/index.js.map +1 -1
- package/dist/object/index.cjs.map +1 -1
- package/dist/object/index.d.ts +44 -5
- package/dist/object/index.d.ts.map +1 -0
- package/dist/object/index.js.map +1 -1
- package/dist/string/index.cjs +11 -0
- package/dist/string/index.cjs.map +1 -1
- package/dist/string/index.d.ts +94 -6
- package/dist/string/index.d.ts.map +1 -0
- package/dist/string/index.js +10 -1
- package/dist/string/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/array/index.d.cts +0 -6
- package/dist/fn/index.d.cts +0 -5
- package/dist/index.d.cts +0 -4
- package/dist/object/index.d.cts +0 -5
- package/dist/string/index.d.cts +0 -6
package/dist/string/index.d.ts
CHANGED
|
@@ -1,6 +1,94 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 문자열의 첫 글자를 대문자로 변환합니다.
|
|
3
|
+
*
|
|
4
|
+
* @param str - 변환할 문자열
|
|
5
|
+
* @returns 첫 글자가 대문자가 된 문자열. 빈 문자열은 그대로 반환됩니다.
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* capitalize("hello"); // "Hello"
|
|
9
|
+
* capitalize(""); // ""
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare const capitalize: (str: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* camelCase 문자열을 kebab-case로 변환합니다.
|
|
15
|
+
*
|
|
16
|
+
* @param str - camelCase 문자열
|
|
17
|
+
* @returns kebab-case로 변환된 문자열
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* camelToKebab("backgroundColor"); // "background-color"
|
|
21
|
+
* camelToKebab("HTMLParser"); // "h-t-m-l-parser"
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const camelToKebab: (str: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* kebab-case 문자열을 camelCase로 변환합니다.
|
|
27
|
+
*
|
|
28
|
+
* @param str - kebab-case 문자열
|
|
29
|
+
* @returns camelCase로 변환된 문자열
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* kebabToCamel("background-color"); // "backgroundColor"
|
|
33
|
+
* kebabToCamel("data-test-id"); // "dataTestId"
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare const kebabToCamel: (str: string) => string;
|
|
37
|
+
/**
|
|
38
|
+
* 문자열이 최대 길이를 초과하면 잘라내고 접미사를 붙입니다.
|
|
39
|
+
*
|
|
40
|
+
* @param str - 원본 문자열
|
|
41
|
+
* @param max - 결과의 최대 길이 (접미사 포함)
|
|
42
|
+
* @param suffix - 잘렸을 때 붙일 접미사 (기본값 `"..."`)
|
|
43
|
+
* @returns 최대 길이 이하면 원본, 초과하면 잘린 문자열 + 접미사
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* truncate("hello world", 8); // "hello..."
|
|
47
|
+
* truncate("hi", 5); // "hi" (변경 없음)
|
|
48
|
+
* truncate("hello world", 8, "…"); // "hello w…"
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare const truncate: (str: string, max: number, suffix?: string) => string;
|
|
52
|
+
/**
|
|
53
|
+
* 숫자에 천 단위 구분자를 추가합니다. `Intl.NumberFormat` 기반이라 음수/소수/로케일을 모두 지원합니다.
|
|
54
|
+
*
|
|
55
|
+
* @param n - 포맷할 숫자
|
|
56
|
+
* @param locale - BCP 47 로케일 태그 (기본값 `"en-US"`)
|
|
57
|
+
* @returns 천 단위 구분자가 들어간 문자열
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* formatNumber(1234567); // "1,234,567"
|
|
61
|
+
* formatNumber(-1234.56); // "-1,234.56"
|
|
62
|
+
* formatNumber(1234567, "de-DE"); // "1.234.567" (독일은 점이 구분자)
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare const formatNumber: (n: number, locale?: string) => string;
|
|
66
|
+
/**
|
|
67
|
+
* {@link mask} 함수의 옵션.
|
|
68
|
+
*/
|
|
69
|
+
export interface MaskOptions {
|
|
70
|
+
/** 앞에서 보존할 문자 수. 기본값 `1`. */
|
|
71
|
+
start?: number;
|
|
72
|
+
/** 뒤에서 보존할 문자 수. 기본값 `0`. */
|
|
73
|
+
end?: number;
|
|
74
|
+
/** 가릴 때 사용할 문자. 기본값 `"*"`. */
|
|
75
|
+
char?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 문자열의 중간 일부를 마스킹 문자로 가립니다. 이메일/전화번호 등 민감 정보 표시에 유용합니다.
|
|
79
|
+
*
|
|
80
|
+
* 문자열이 `start + end`보다 짧으면 원본을 그대로 반환합니다.
|
|
81
|
+
*
|
|
82
|
+
* @param str - 원본 문자열
|
|
83
|
+
* @param opts - 마스킹 옵션 ({@link MaskOptions} 참고)
|
|
84
|
+
* @returns 마스킹된 문자열
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* mask("01012345678", { start: 3, end: 4 }); // "010****5678"
|
|
88
|
+
* mask("jthong@gmail.com", { start: 1, end: 10 }); // "j*****@gmail.com"
|
|
89
|
+
* mask("secret", { start: 0, end: 0, char: "#" }); // "######"
|
|
90
|
+
* mask("hi", { start: 1, end: 1 }); // "hi" (너무 짧아 변경 없음)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare const mask: (str: string, opts?: MaskOptions) => string;
|
|
94
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MACsB,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAC4B,CAAC;AAExE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MACkB,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,eAAc,KAAG,MACe,CAAC;AAEpF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,eAAgB,KAAG,MAClB,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,EAAE,OAAM,WAAgB,KAAG,MAO1D,CAAC"}
|
package/dist/string/index.js
CHANGED
|
@@ -3,7 +3,16 @@ var capitalize = (str) => str.length === 0 ? str : str[0].toUpperCase() + str.sl
|
|
|
3
3
|
var camelToKebab = (str) => str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, "");
|
|
4
4
|
var kebabToCamel = (str) => str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
5
5
|
var truncate = (str, max, suffix = "...") => str.length <= max ? str : str.slice(0, Math.max(0, max - suffix.length)) + suffix;
|
|
6
|
+
var formatNumber = (n, locale = "en-US") => new Intl.NumberFormat(locale).format(n);
|
|
7
|
+
var mask = (str, opts = {}) => {
|
|
8
|
+
const start = Math.max(0, opts.start ?? 1);
|
|
9
|
+
const end = Math.max(0, opts.end ?? 0);
|
|
10
|
+
const char = opts.char ?? "*";
|
|
11
|
+
if (str.length <= start + end) return str;
|
|
12
|
+
const masked = char.repeat(str.length - start - end);
|
|
13
|
+
return str.slice(0, start) + masked + str.slice(str.length - end);
|
|
14
|
+
};
|
|
6
15
|
|
|
7
|
-
export { camelToKebab, capitalize, kebabToCamel, truncate };
|
|
16
|
+
export { camelToKebab, capitalize, formatNumber, kebabToCamel, mask, truncate };
|
|
8
17
|
//# sourceMappingURL=index.js.map
|
|
9
18
|
//# sourceMappingURL=index.js.map
|
package/dist/string/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/string/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../src/string/index.ts"],"names":[],"mappings":";AAWO,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;AAavD,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;AAa/D,IAAM,YAAA,GAAe,CAAC,GAAA,KAC3B,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa;AAgBrD,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;AAetE,IAAM,YAAA,GAAe,CAAC,CAAA,EAAW,MAAA,GAAS,OAAA,KAC/C,IAAI,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC;AA8BjC,IAAM,IAAA,GAAO,CAAC,GAAA,EAAa,IAAA,GAAoB,EAAC,KAAc;AACnE,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA;AACzC,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AACrC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,GAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,GAAA,EAAK,OAAO,GAAA;AACtC,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAA,GAAS,QAAQ,GAAG,CAAA;AACnD,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA;AAClE","file":"index.js","sourcesContent":["/**\n * 문자열의 첫 글자를 대문자로 변환합니다.\n *\n * @param str - 변환할 문자열\n * @returns 첫 글자가 대문자가 된 문자열. 빈 문자열은 그대로 반환됩니다.\n * @example\n * ```ts\n * capitalize(\"hello\"); // \"Hello\"\n * capitalize(\"\"); // \"\"\n * ```\n */\nexport const capitalize = (str: string): string =>\n str.length === 0 ? str : str[0]!.toUpperCase() + str.slice(1);\n\n/**\n * camelCase 문자열을 kebab-case로 변환합니다.\n *\n * @param str - camelCase 문자열\n * @returns kebab-case로 변환된 문자열\n * @example\n * ```ts\n * camelToKebab(\"backgroundColor\"); // \"background-color\"\n * camelToKebab(\"HTMLParser\"); // \"h-t-m-l-parser\"\n * ```\n */\nexport const camelToKebab = (str: string): string =>\n str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).replace(/^-/, \"\");\n\n/**\n * kebab-case 문자열을 camelCase로 변환합니다.\n *\n * @param str - kebab-case 문자열\n * @returns camelCase로 변환된 문자열\n * @example\n * ```ts\n * kebabToCamel(\"background-color\"); // \"backgroundColor\"\n * kebabToCamel(\"data-test-id\"); // \"dataTestId\"\n * ```\n */\nexport const kebabToCamel = (str: string): string =>\n str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n\n/**\n * 문자열이 최대 길이를 초과하면 잘라내고 접미사를 붙입니다.\n *\n * @param str - 원본 문자열\n * @param max - 결과의 최대 길이 (접미사 포함)\n * @param suffix - 잘렸을 때 붙일 접미사 (기본값 `\"...\"`)\n * @returns 최대 길이 이하면 원본, 초과하면 잘린 문자열 + 접미사\n * @example\n * ```ts\n * truncate(\"hello world\", 8); // \"hello...\"\n * truncate(\"hi\", 5); // \"hi\" (변경 없음)\n * truncate(\"hello world\", 8, \"…\"); // \"hello w…\"\n * ```\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\n/**\n * 숫자에 천 단위 구분자를 추가합니다. `Intl.NumberFormat` 기반이라 음수/소수/로케일을 모두 지원합니다.\n *\n * @param n - 포맷할 숫자\n * @param locale - BCP 47 로케일 태그 (기본값 `\"en-US\"`)\n * @returns 천 단위 구분자가 들어간 문자열\n * @example\n * ```ts\n * formatNumber(1234567); // \"1,234,567\"\n * formatNumber(-1234.56); // \"-1,234.56\"\n * formatNumber(1234567, \"de-DE\"); // \"1.234.567\" (독일은 점이 구분자)\n * ```\n */\nexport const formatNumber = (n: number, locale = \"en-US\"): string =>\n new Intl.NumberFormat(locale).format(n);\n\n/**\n * {@link mask} 함수의 옵션.\n */\nexport interface MaskOptions {\n /** 앞에서 보존할 문자 수. 기본값 `1`. */\n start?: number;\n /** 뒤에서 보존할 문자 수. 기본값 `0`. */\n end?: number;\n /** 가릴 때 사용할 문자. 기본값 `\"*\"`. */\n char?: string;\n}\n\n/**\n * 문자열의 중간 일부를 마스킹 문자로 가립니다. 이메일/전화번호 등 민감 정보 표시에 유용합니다.\n *\n * 문자열이 `start + end`보다 짧으면 원본을 그대로 반환합니다.\n *\n * @param str - 원본 문자열\n * @param opts - 마스킹 옵션 ({@link MaskOptions} 참고)\n * @returns 마스킹된 문자열\n * @example\n * ```ts\n * mask(\"01012345678\", { start: 3, end: 4 }); // \"010****5678\"\n * mask(\"jthong@gmail.com\", { start: 1, end: 10 }); // \"j*****@gmail.com\"\n * mask(\"secret\", { start: 0, end: 0, char: \"#\" }); // \"######\"\n * mask(\"hi\", { start: 1, end: 1 }); // \"hi\" (너무 짧아 변경 없음)\n * ```\n */\nexport const mask = (str: string, opts: MaskOptions = {}): string => {\n const start = Math.max(0, opts.start ?? 1);\n const end = Math.max(0, opts.end ?? 0);\n const char = opts.char ?? \"*\";\n if (str.length <= start + end) return str;\n const masked = char.repeat(str.length - start - end);\n return str.slice(0, start) + masked + str.slice(str.length - end);\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jthong/util",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.2",
|
|
4
4
|
"description": "Framework-agnostic TypeScript utility functions",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"access": "public"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
|
-
"build": "tsup",
|
|
51
|
+
"build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist",
|
|
52
52
|
"dev": "tsup --watch",
|
|
53
53
|
"test": "vitest run",
|
|
54
54
|
"test:watch": "vitest",
|
package/dist/array/index.d.cts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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 };
|
package/dist/fn/index.d.cts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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/index.d.cts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
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/object/index.d.cts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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 };
|
package/dist/string/index.d.cts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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 };
|