@uniai-fe/util-functions 0.0.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.
- package/package.json +64 -0
- package/src/form/checkbox.ts +41 -0
- package/src/functions/api.server.ts +114 -0
- package/src/functions/api.ts +515 -0
- package/src/functions/chart.ts +304 -0
- package/src/functions/convert.ts +229 -0
- package/src/functions/crypto.ts +44 -0
- package/src/functions/date.ts +386 -0
- package/src/functions/file.ts +57 -0
- package/src/functions/format.ts +318 -0
- package/src/functions/log.ts +9 -0
- package/src/functions/mask.ts +175 -0
- package/src/functions/reg-exp.ts +26 -0
- package/src/functions/route.ts +46 -0
- package/src/functions/sort.ts +71 -0
- package/src/functions/validation.ts +155 -0
- package/src/index.tsx +20 -0
- package/src/react/convert.tsx +129 -0
- package/src/react/match.tsx +41 -0
- package/src/style/size.ts +128 -0
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@uniai-fe/util-functions",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "유니아이 FE/유틸리티 함수",
|
|
6
|
+
"author": "GraffitoRyu <@uniai-corp>(https://github.com/GraffitoRyu)",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/uniai-corp/modules"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {},
|
|
13
|
+
"files": [
|
|
14
|
+
"src"
|
|
15
|
+
],
|
|
16
|
+
"main": "./src/index.tsx",
|
|
17
|
+
"module": "./src/index.tsx",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": "./src/index.tsx",
|
|
20
|
+
"./api": "./src/functions/api.ts",
|
|
21
|
+
"./api.server": "./src/functions/api.server.ts",
|
|
22
|
+
"./chart": "./src/functions/chart.ts",
|
|
23
|
+
"./convert": "./src/functions/convert.ts",
|
|
24
|
+
"./date": "./src/functions/date.ts",
|
|
25
|
+
"./file": "./src/functions/file.ts",
|
|
26
|
+
"./format": "./src/functions/format.ts",
|
|
27
|
+
"./log": "./src/functions/log.ts",
|
|
28
|
+
"./mask": "./src/functions/mask.ts",
|
|
29
|
+
"./reg-exp": "./src/functions/reg-exp.ts",
|
|
30
|
+
"./route": "./src/functions/route.ts",
|
|
31
|
+
"./sort": "./src/functions/sort.ts",
|
|
32
|
+
"./validation": "./src/functions/validation.ts",
|
|
33
|
+
"./checkbox": "./src/form/checkbox.ts",
|
|
34
|
+
"./react/convert": "./src/react/convert.tsx",
|
|
35
|
+
"./react/match": "./src/react/match.tsx",
|
|
36
|
+
"./style/size": "./src/style/size.ts"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"next": ">= 15",
|
|
40
|
+
"react": ">= 19",
|
|
41
|
+
"react-dom": ">= 19"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"d3-array": "^3.2.4",
|
|
45
|
+
"decimal.js": "^10.6.0",
|
|
46
|
+
"html-react-parser": "^5.2.7"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/d3-array": "^3.2.2",
|
|
50
|
+
"@types/node": "^22.15.30",
|
|
51
|
+
"@types/react": "^19.2.2",
|
|
52
|
+
"@types/react-dom": "^19.2.2",
|
|
53
|
+
"@uniai-fe/eslint-config": "workspace:*",
|
|
54
|
+
"@uniai-fe/tsconfig": "workspace:*",
|
|
55
|
+
"eslint": "^9.38.0",
|
|
56
|
+
"next": "^15.5.6",
|
|
57
|
+
"prettier": "^3.6.2",
|
|
58
|
+
"recharts": "^3.3.0",
|
|
59
|
+
"typescript": "~5.9.3"
|
|
60
|
+
},
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "전체" 항목 선택에 따른 단일 항목 업데이트
|
|
3
|
+
* @util
|
|
4
|
+
* @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체
|
|
5
|
+
* @param {boolean} allCheckState 동기화할 "전체" 선택 상태
|
|
6
|
+
* @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체
|
|
7
|
+
*/
|
|
8
|
+
export const syncAllToEach = (
|
|
9
|
+
checkStateObject: Record<string, boolean>,
|
|
10
|
+
allCheckState: boolean,
|
|
11
|
+
): Record<string, boolean> =>
|
|
12
|
+
Object.fromEntries(
|
|
13
|
+
Object.entries(checkStateObject).map(([key]) => [key, allCheckState]),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* 단일 항목 선택에 따른 "전체" 항목 업데이트
|
|
18
|
+
* @util
|
|
19
|
+
* @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체
|
|
20
|
+
* @param {string} eachKey 선택한 단일 항목 키
|
|
21
|
+
* @param {boolean} eachChecked 선택한 단일 항목 선택 상태
|
|
22
|
+
* @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체
|
|
23
|
+
*/
|
|
24
|
+
export const syncEachToAll = (
|
|
25
|
+
checkStateObject: Record<string, boolean>,
|
|
26
|
+
eachKey: string,
|
|
27
|
+
eachChecked: boolean,
|
|
28
|
+
): Record<string, boolean> => {
|
|
29
|
+
const res = { ...checkStateObject, [eachKey]: eachChecked };
|
|
30
|
+
const exceptStateAll = Object.entries(res)
|
|
31
|
+
.filter(([key]) => key !== "all")
|
|
32
|
+
.map(([, checked]) => checked);
|
|
33
|
+
|
|
34
|
+
const isAllEachChecked = Object.values(exceptStateAll).every(
|
|
35
|
+
checked => checked,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
res.all = isAllEachChecked;
|
|
39
|
+
|
|
40
|
+
return res;
|
|
41
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { headers } from "next/headers";
|
|
4
|
+
import { NextResponse } from "next/server";
|
|
5
|
+
import { getQueryString } from "./api";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.
|
|
12
|
+
* - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.
|
|
13
|
+
* - Authorization 헤더가 없으면 undefined를 반환합니다.
|
|
14
|
+
*
|
|
15
|
+
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export async function setTokenRequestHeaders(): Promise<
|
|
19
|
+
HeadersInit | undefined
|
|
20
|
+
> {
|
|
21
|
+
const nextHeaders = await headers();
|
|
22
|
+
const token = nextHeaders.get("Authorization") || "";
|
|
23
|
+
if (!token) return undefined;
|
|
24
|
+
return new Headers({
|
|
25
|
+
Authorization: token,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
31
|
+
* @util
|
|
32
|
+
* @desc
|
|
33
|
+
* 추가되는 헤더:
|
|
34
|
+
* - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)
|
|
35
|
+
* - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)
|
|
36
|
+
* - Uniai-Native-Path: 호출된 API path (queryUrl)
|
|
37
|
+
* - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)
|
|
38
|
+
* @typeParam ResponseData - 응답 바디의 타입
|
|
39
|
+
* @property {ResponseData} res - fetch 응답 데이터
|
|
40
|
+
* @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등
|
|
41
|
+
* @property {string} queryUrl - API 쿼리 URL
|
|
42
|
+
* @property {string} [queryString] - 쿼리 스트링
|
|
43
|
+
* @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체
|
|
44
|
+
* @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용
|
|
45
|
+
* @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }
|
|
46
|
+
* @return {NextResponse<ResponseData>} 설정된 응답 객체
|
|
47
|
+
*/
|
|
48
|
+
export async function setDebugResponseHeaders<ResponseData>({
|
|
49
|
+
res,
|
|
50
|
+
infra,
|
|
51
|
+
queryUrl,
|
|
52
|
+
queryString,
|
|
53
|
+
searchParams,
|
|
54
|
+
fullUrl,
|
|
55
|
+
options,
|
|
56
|
+
}: {
|
|
57
|
+
/**
|
|
58
|
+
* fetch 응답 데이터
|
|
59
|
+
*/
|
|
60
|
+
res: ResponseData;
|
|
61
|
+
/**
|
|
62
|
+
* API 도메인
|
|
63
|
+
* - "ai"(ai-service), "db"(chickenmonger CRUD), "uniai"
|
|
64
|
+
* - 커스텀 도메인을 쓰는 경우 string으로 직접 적용
|
|
65
|
+
*/
|
|
66
|
+
infra: string;
|
|
67
|
+
/**
|
|
68
|
+
* API 엔드포인트 쿼리 path
|
|
69
|
+
*/
|
|
70
|
+
queryUrl: string;
|
|
71
|
+
} & Partial<{
|
|
72
|
+
/**
|
|
73
|
+
* 쿼리스트링
|
|
74
|
+
*/
|
|
75
|
+
queryString: string;
|
|
76
|
+
/**
|
|
77
|
+
* URLSearchParams 객체
|
|
78
|
+
*/
|
|
79
|
+
searchParams: URLSearchParams | object;
|
|
80
|
+
/**
|
|
81
|
+
* 전체 URL
|
|
82
|
+
*/
|
|
83
|
+
fullUrl: string;
|
|
84
|
+
/**
|
|
85
|
+
* 응답 옵션
|
|
86
|
+
*/
|
|
87
|
+
options: ResponseInit;
|
|
88
|
+
}>): Promise<NextResponse<ResponseData>> {
|
|
89
|
+
const response = NextResponse.json(res, options);
|
|
90
|
+
|
|
91
|
+
const root: { [infra: string]: string } = {
|
|
92
|
+
ai: process.env.AI_API_BASE || "not found", // "https://ai-api.chickenmonger.com",
|
|
93
|
+
db: process.env.DB_API_BASE || "not found", // "https://api.chickenmonger.com",
|
|
94
|
+
uniai: process.env.UNIAI_API_BASE || "https://qa-api.uniai.co.kr", // "not found",
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const isEnvExist =
|
|
98
|
+
!root[infra] ||
|
|
99
|
+
root[infra] === "not found" ||
|
|
100
|
+
(infra === "uniai" && process.env.UNIAI_API_BASE)
|
|
101
|
+
? false
|
|
102
|
+
: true;
|
|
103
|
+
|
|
104
|
+
response.headers.set("Uniai-Native-Domain-Env-Exist", String(isEnvExist));
|
|
105
|
+
response.headers.set("Uniai-Native-Domain", root[infra] || infra);
|
|
106
|
+
response.headers.set("Uniai-Native-Path", queryUrl);
|
|
107
|
+
|
|
108
|
+
const url =
|
|
109
|
+
fullUrl ||
|
|
110
|
+
`${root[infra] || infra || ""}${queryUrl || ""}${queryString || searchParams ? getQueryString(searchParams) : ""}`;
|
|
111
|
+
response.headers.set("Uniai-Native-URL", url);
|
|
112
|
+
|
|
113
|
+
return response;
|
|
114
|
+
}
|