@yeongseoksong/framework 1.6.2 → 1.7.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 +63 -1
- package/dist/platform/index.d.mts +40 -0
- package/dist/platform/index.mjs +30 -0
- package/dist/ui/index.mjs +104 -102
- package/dist/util/index.d.mts +50 -1
- package/dist/util/index.mjs +68 -0
- package/package.json +14 -33
- package/dist/store/index.cjs +0 -393
- package/dist/store/index.d.ts +0 -237
- package/dist/types/index.cjs +0 -18
- package/dist/types/index.d.ts +0 -105
- package/dist/ui/index.cjs +0 -3136
- package/dist/ui/index.d.ts +0 -1347
- package/dist/util/index.cjs +0 -199
- package/dist/util/index.d.ts +0 -114
package/dist/util/index.cjs
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var __async = (__this, __arguments, generator) => {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
var fulfilled = (value) => {
|
|
22
|
-
try {
|
|
23
|
-
step(generator.next(value));
|
|
24
|
-
} catch (e) {
|
|
25
|
-
reject(e);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
var rejected = (value) => {
|
|
29
|
-
try {
|
|
30
|
-
step(generator.throw(value));
|
|
31
|
-
} catch (e) {
|
|
32
|
-
reject(e);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
36
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// util/index.ts
|
|
41
|
-
var util_exports = {};
|
|
42
|
-
__export(util_exports, {
|
|
43
|
-
COMPANY_NAME: () => COMPANY_NAME,
|
|
44
|
-
LOGO_ALT: () => LOGO_ALT,
|
|
45
|
-
LOGO_SRC: () => LOGO_SRC,
|
|
46
|
-
filterAndSort: () => filterAndSort,
|
|
47
|
-
fixJosa: () => fixJosa,
|
|
48
|
-
getFinalSound: () => getFinalSound,
|
|
49
|
-
hasFinalConsonant: () => hasFinalConsonant,
|
|
50
|
-
josa: () => josa,
|
|
51
|
-
runFinalizers: () => runFinalizers,
|
|
52
|
-
t: () => t,
|
|
53
|
-
withJosa: () => withJosa
|
|
54
|
-
});
|
|
55
|
-
module.exports = __toCommonJS(util_exports);
|
|
56
|
-
|
|
57
|
-
// util/env.util.ts
|
|
58
|
-
var _a;
|
|
59
|
-
var COMPANY_NAME = (_a = process.env.NEXT_PUBLIC_COMPANY_NAME) != null ? _a : "";
|
|
60
|
-
var _a2;
|
|
61
|
-
var LOGO_SRC = (_a2 = process.env.NEXT_PUBLIC_LOGO_SRC) != null ? _a2 : "/logo.svg";
|
|
62
|
-
var _a3;
|
|
63
|
-
var LOGO_ALT = (_a3 = process.env.NEXT_PUBLIC_LOGO_ALT) != null ? _a3 : "\uB85C\uACE0";
|
|
64
|
-
|
|
65
|
-
// util/text.util.ts
|
|
66
|
-
var COMPANY_TOKEN = "%c";
|
|
67
|
-
function t(text) {
|
|
68
|
-
return text.replaceAll(COMPANY_TOKEN, COMPANY_NAME);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// util/sort.util.ts
|
|
72
|
-
function filterAndSort(items, direction = "asc") {
|
|
73
|
-
const sign = direction === "asc" ? 1 : -1;
|
|
74
|
-
return (items != null ? items : []).filter((item) => item.isShow).sort((a, b) => (a.order - b.order) * sign);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// util/finalize.util.ts
|
|
78
|
-
function runFinalizers(finalize, label = "finalize") {
|
|
79
|
-
return __async(this, null, function* () {
|
|
80
|
-
if (!finalize) return;
|
|
81
|
-
const list = Array.isArray(finalize) ? finalize : [finalize];
|
|
82
|
-
for (const fn of list) {
|
|
83
|
-
try {
|
|
84
|
-
yield fn();
|
|
85
|
-
} catch (caught) {
|
|
86
|
-
console.error(`[${label}] finalize\uC5D0\uC11C \uC608\uC678\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.`, caught);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// util/josa.util.ts
|
|
93
|
-
var HANGUL_BASE = 44032;
|
|
94
|
-
var HANGUL_LAST = 55203;
|
|
95
|
-
var JONG_RIEUL = 8;
|
|
96
|
-
var DIGIT_FINAL = {
|
|
97
|
-
"0": "\u3147",
|
|
98
|
-
// 영
|
|
99
|
-
"1": "\u3139",
|
|
100
|
-
// 일
|
|
101
|
-
"2": null,
|
|
102
|
-
// 이
|
|
103
|
-
"3": "\u3141",
|
|
104
|
-
// 삼
|
|
105
|
-
"4": null,
|
|
106
|
-
// 사
|
|
107
|
-
"5": null,
|
|
108
|
-
// 오
|
|
109
|
-
"6": "\u3131",
|
|
110
|
-
// 육
|
|
111
|
-
"7": "\u3139",
|
|
112
|
-
// 칠
|
|
113
|
-
"8": "\u3139",
|
|
114
|
-
// 팔
|
|
115
|
-
"9": null
|
|
116
|
-
// 구
|
|
117
|
-
};
|
|
118
|
-
var ALPHA_FINAL = {
|
|
119
|
-
l: "\u3139",
|
|
120
|
-
// 엘
|
|
121
|
-
m: "\u3141",
|
|
122
|
-
// 엠
|
|
123
|
-
n: "\u3134",
|
|
124
|
-
// 엔
|
|
125
|
-
r: "\u3139",
|
|
126
|
-
// 아르
|
|
127
|
-
s: "\u3145",
|
|
128
|
-
// 에스
|
|
129
|
-
x: "\u3145",
|
|
130
|
-
// 엑스
|
|
131
|
-
f: "\u314D"
|
|
132
|
-
// 에프
|
|
133
|
-
};
|
|
134
|
-
var NO_FINAL = { has: false, rieul: false };
|
|
135
|
-
function getFinalSound(word) {
|
|
136
|
-
const trimmed = word.trim();
|
|
137
|
-
if (!trimmed) return NO_FINAL;
|
|
138
|
-
for (let i = trimmed.length - 1; i >= 0; i -= 1) {
|
|
139
|
-
const char = trimmed[i];
|
|
140
|
-
const code = char.charCodeAt(0);
|
|
141
|
-
if (code >= HANGUL_BASE && code <= HANGUL_LAST) {
|
|
142
|
-
const jong = (code - HANGUL_BASE) % 28;
|
|
143
|
-
return { has: jong !== 0, rieul: jong === JONG_RIEUL };
|
|
144
|
-
}
|
|
145
|
-
if (char >= "0" && char <= "9") {
|
|
146
|
-
const final = DIGIT_FINAL[char];
|
|
147
|
-
return { has: final !== null, rieul: final === "\u3139" };
|
|
148
|
-
}
|
|
149
|
-
const lower = char.toLowerCase();
|
|
150
|
-
if (lower >= "a" && lower <= "z") {
|
|
151
|
-
const final = ALPHA_FINAL[lower];
|
|
152
|
-
return { has: Boolean(final), rieul: final === "\u3139" };
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return NO_FINAL;
|
|
156
|
-
}
|
|
157
|
-
function hasFinalConsonant(word) {
|
|
158
|
-
return getFinalSound(word).has;
|
|
159
|
-
}
|
|
160
|
-
function josa(word, pair) {
|
|
161
|
-
const [withFinal, withoutFinal] = pair.split("/");
|
|
162
|
-
const sound = getFinalSound(word);
|
|
163
|
-
if (pair === "\uC73C\uB85C/\uB85C" && sound.rieul) return withoutFinal;
|
|
164
|
-
return sound.has ? withFinal : withoutFinal;
|
|
165
|
-
}
|
|
166
|
-
function withJosa(word, pair) {
|
|
167
|
-
return `${word}${josa(word, pair)}`;
|
|
168
|
-
}
|
|
169
|
-
function fixJosa(text) {
|
|
170
|
-
return text.replace(
|
|
171
|
-
/([^\s(])(은\(는\)|는\(은\)|이\(가\)|가\(이\)|을\(를\)|를\(을\)|과\(와\)|와\(과\))/g,
|
|
172
|
-
(_match, word, marker) => {
|
|
173
|
-
const [first, second] = marker.replace(")", "").split("(");
|
|
174
|
-
const pair = WITH_FINAL.has(first) ? `${first}/${second}` : `${second}/${first}`;
|
|
175
|
-
return `${word}${josa(word, pair)}`;
|
|
176
|
-
}
|
|
177
|
-
).replace(
|
|
178
|
-
/([^\s(])\((으|이)\)(로|라|나|란|여)/g,
|
|
179
|
-
(_match, word, optional, tail) => {
|
|
180
|
-
const pair = `${optional}${tail}/${tail}`;
|
|
181
|
-
return `${word}${josa(word, pair)}`;
|
|
182
|
-
}
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
var WITH_FINAL = /* @__PURE__ */ new Set(["\uC740", "\uC774", "\uC744", "\uACFC"]);
|
|
186
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
187
|
-
0 && (module.exports = {
|
|
188
|
-
COMPANY_NAME,
|
|
189
|
-
LOGO_ALT,
|
|
190
|
-
LOGO_SRC,
|
|
191
|
-
filterAndSort,
|
|
192
|
-
fixJosa,
|
|
193
|
-
getFinalSound,
|
|
194
|
-
hasFinalConsonant,
|
|
195
|
-
josa,
|
|
196
|
-
runFinalizers,
|
|
197
|
-
t,
|
|
198
|
-
withJosa
|
|
199
|
-
});
|
package/dist/util/index.d.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { CommonInfo } from '../types/index.js';
|
|
2
|
-
import 'react';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 소비자 앱이 주입하는 상수들.
|
|
6
|
-
*
|
|
7
|
-
* 값은 소비자 앱의 `NEXT_PUBLIC_*` 환경변수에서 온다. 번들러가 빌드 시점에
|
|
8
|
-
* 리터럴로 치환하므로, tsup이 ui/util 번들을 나눠도 양쪽에 같은 값이 박힌다.
|
|
9
|
-
* (모듈 전역 변수로 주입하던 이전 방식은 번들이 갈리면서 값이 공유되지 않았다.)
|
|
10
|
-
*
|
|
11
|
-
* `process.env.X` 형태로 통째로 접근해야 한다. 구조분해(`const { X } = process.env`)는
|
|
12
|
-
* 번들러의 정적 치환 대상이 아니라서 undefined가 된다.
|
|
13
|
-
*/
|
|
14
|
-
/** `%c` 토큰이 치환될 회사명. 소비자 앱에서 필수. */
|
|
15
|
-
declare const COMPANY_NAME: string;
|
|
16
|
-
/** 헤더 로고 이미지 경로. */
|
|
17
|
-
declare const LOGO_SRC: string;
|
|
18
|
-
/** 헤더 로고 대체 텍스트. */
|
|
19
|
-
declare const LOGO_ALT: string;
|
|
20
|
-
|
|
21
|
-
/** 문자열 안의 `%c`를 회사명으로 치환한다. 서버/클라이언트 양쪽에서 안전하다. */
|
|
22
|
-
declare function t(text: string): string;
|
|
23
|
-
|
|
24
|
-
type SortDirection = 'asc' | 'desc';
|
|
25
|
-
/**
|
|
26
|
-
* isShow 필터 + order 정렬. 기본은 오름차순(`asc`) — 기존 호출부와 동일하다.
|
|
27
|
-
* CommonInfo를 extends 하는 모든 타입에 사용 가능
|
|
28
|
-
*/
|
|
29
|
-
declare function filterAndSort<T extends CommonInfo>(items: T[] | undefined, direction?: SortDirection): T[];
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 어떤 작업이 끝난 뒤 항상 돌려야 하는 뒷정리 — 라우팅, 모달 닫기, 목록 새로고침 등.
|
|
33
|
-
*
|
|
34
|
-
* 폼에 딸린 개념이 아니다. 제출·삭제·업로드처럼 "끝나면 정리한다"가 필요한 곳이면
|
|
35
|
-
* 어느 스토어에서든 같은 타입과 실행기를 쓴다.
|
|
36
|
-
*/
|
|
37
|
-
/**
|
|
38
|
-
* 뒷정리 함수. **인자를 받지 않는다** — 대개 결과와 무관한 정리·이동이라
|
|
39
|
-
* 기존 함수(`close`, `refetch`, `() => router.push('/')`)를 그대로 꽂을 수 있어야 한다.
|
|
40
|
-
* 반환값은 무시하고, 프로미스면 기다린다.
|
|
41
|
-
*/
|
|
42
|
-
type Finalizer = () => unknown | Promise<unknown>;
|
|
43
|
-
/** 하나 또는 여러 개. 여러 개면 넘긴 순서대로 실행된다. */
|
|
44
|
-
type Finalizers = Finalizer | Finalizer[];
|
|
45
|
-
/**
|
|
46
|
-
* `finalize`를 하나든 여러 개든 같은 방식으로 실행한다.
|
|
47
|
-
*
|
|
48
|
-
* 여기서 터진 예외는 **본 작업의 결과를 뒤집지 않는다** — 작업은 이미 끝났고, 뒷정리
|
|
49
|
-
* 하나가 실패했다고 성공 알림을 취소하거나 처리되지 않은 rejection을 만들 이유가 없다.
|
|
50
|
-
* 대신 콘솔에 남겨 개발 중에 눈에 띄게 한다.
|
|
51
|
-
*
|
|
52
|
-
* @param label 콘솔 메시지에 붙일 호출부 이름 (예: `'useSdForm'`)
|
|
53
|
-
*/
|
|
54
|
-
declare function runFinalizers(finalize: Finalizers | undefined, label?: string): Promise<void>;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 한글 조사(은/는, 이/가, 을/를 …)를 앞 단어에 맞춰 고르는 순수 유틸.
|
|
58
|
-
*
|
|
59
|
-
* 회사명·사용자 이름·품목명처럼 **런타임에 정해지는 값** 뒤에 조사가 붙을 때 필요하다.
|
|
60
|
-
* `"%c은(는)"`처럼 두 형태를 병기하면 읽기 불편하고, 한쪽만 쓰면 값에 따라 어색해진다.
|
|
61
|
-
*
|
|
62
|
-
* DOM·React·Mantine에 의존하지 않는 순수 함수라 서버·클라이언트 어디서든 쓴다.
|
|
63
|
-
*/
|
|
64
|
-
/** 지원하는 조사 쌍. 표기는 '받침 있을 때/없을 때' 순서다. */
|
|
65
|
-
type JosaPair = '은/는' | '이/가' | '을/를' | '과/와' | '으로/로' | '아/야' | '이라/라' | '이나/나' | '이란/란' | '이여/여';
|
|
66
|
-
interface FinalSound {
|
|
67
|
-
/** 받침이 있는지 */
|
|
68
|
-
has: boolean;
|
|
69
|
-
/** 받침이 ㄹ인지 — '으로/로'는 ㄹ 받침을 받침 없음처럼 다룬다 */
|
|
70
|
-
rieul: boolean;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 단어의 마지막 소리에서 받침 정보를 읽는다.
|
|
74
|
-
*
|
|
75
|
-
* 한글 음절 · 숫자 · 알파벳까지 본다. 괄호나 문장부호로 끝나면 그 앞 글자를 찾아
|
|
76
|
-
* 올라간다("(주)가나(주)" 같은 표기도 마지막 실제 글자를 기준으로 판단하기 위해서다).
|
|
77
|
-
* 판단할 근거가 없으면 받침 없음으로 본다 — 한국어에서 더 자연스러운 쪽이다.
|
|
78
|
-
*/
|
|
79
|
-
declare function getFinalSound(word: string): FinalSound;
|
|
80
|
-
/** 받침이 있으면 `true`. 판단할 수 없으면 `false`(받침 없음으로 본다). */
|
|
81
|
-
declare function hasFinalConsonant(word: string): boolean;
|
|
82
|
-
/**
|
|
83
|
-
* 단어에 맞는 조사 **하나만** 돌려준다.
|
|
84
|
-
*
|
|
85
|
-
* ```ts
|
|
86
|
-
* josa('가나전자', '은/는') // '는'
|
|
87
|
-
* josa('한빛', '은/는') // '은'
|
|
88
|
-
* josa('서울', '으로/로') // '로' ← ㄹ 받침은 '로'
|
|
89
|
-
* josa('URL', '을/를') // '을' ← 엘
|
|
90
|
-
* ```
|
|
91
|
-
*/
|
|
92
|
-
declare function josa(word: string, pair: JosaPair): string;
|
|
93
|
-
/**
|
|
94
|
-
* 단어와 조사를 붙여서 돌려준다.
|
|
95
|
-
*
|
|
96
|
-
* ```ts
|
|
97
|
-
* withJosa('가나전자', '이/가') // '가나전자가'
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
declare function withJosa(word: string, pair: JosaPair): string;
|
|
101
|
-
/**
|
|
102
|
-
* 문장에 병기된 조사 표기를 실제 값에 맞게 하나로 정리한다.
|
|
103
|
-
*
|
|
104
|
-
* 원고를 `"%c은(는) 무엇입니까"`처럼 쓰고, 치환이 끝난 뒤 이 함수를 한 번 돌리면
|
|
105
|
-
* `"가나전자는 무엇입니까"`가 된다. 알아보는 표기는 두 가지다.
|
|
106
|
-
*
|
|
107
|
-
* - `은(는)` `이(가)` `을(를)` `과(와)` — 앞이 받침 있는 형태, 괄호 안이 없는 형태
|
|
108
|
-
* - `(으)로` `(이)라` `(이)나` `(이)란` `(이)여` — 괄호 안이 받침 있을 때만 붙는 음절
|
|
109
|
-
*
|
|
110
|
-
* 두 형태의 순서가 뒤바뀐 표기(`는(은)`)도 같은 규칙으로 받는다.
|
|
111
|
-
*/
|
|
112
|
-
declare function fixJosa(text: string): string;
|
|
113
|
-
|
|
114
|
-
export { COMPANY_NAME, type Finalizer, type Finalizers, type JosaPair, LOGO_ALT, LOGO_SRC, type SortDirection, filterAndSort, fixJosa, getFinalSound, hasFinalConsonant, josa, runFinalizers, t, withJosa };
|