@simplysm/core-common 14.0.47 → 14.0.48

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 ADDED
@@ -0,0 +1,255 @@
1
+ # @simplysm/core-common
2
+
3
+ 브라우저와 Node.js 모두에서 사용 가능한 순수 공통 유틸리티 패키지. 다른 `@simplysm/*` 패키지에 대한 내부 의존성이 없는 리프 패키지다.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @simplysm/core-common
9
+ ```
10
+
11
+ ## API Overview
12
+
13
+ ### Errors
14
+
15
+ | API | Type | Description |
16
+ |-----|------|-------------|
17
+ | `SdError` | class | 트리 구조 에러 체인 지원. 메시지를 역순으로 결합 (상위 => 하위 => 원인) |
18
+ | `ArgumentError` | class | 인자 유효성 오류. 인자 객체를 YAML 형식으로 메시지에 포함 |
19
+ | `NotImplementedError` | class | 미구현 기능 호출 시 발생 |
20
+ | `TimeoutError` | class | 대기 시간 초과 시 발생 (시도 횟수 포함) |
21
+
22
+ → See [docs/errors.md](./docs/errors.md) for details.
23
+
24
+ ### Types (Value Objects)
25
+
26
+ | API | Type | Description |
27
+ |-----|------|-------------|
28
+ | `DateTime` | class | 불변 날짜시간 (밀리초 정밀도, 로컬 타임존) |
29
+ | `DateOnly` | class | 불변 날짜 (시간 제외, 주차 계산 지원) |
30
+ | `Time` | class | 불변 시간 (24시간 순환, 날짜 제외) |
31
+ | `Uuid` | class | UUID v4 (crypto.getRandomValues 기반) |
32
+ | `LazyGcMap<TKey, TValue>` | class | 자동 만료 기능이 있는 LRU Map |
33
+
34
+ → See [docs/types.md](./docs/types.md) for details.
35
+
36
+ ### Features
37
+
38
+ | API | Type | Description |
39
+ |-----|------|-------------|
40
+ | `EventEmitter<TEvents>` | class | 타입 안전 EventEmitter (EventTarget 기반, 브라우저/Node.js 모두 지원) |
41
+ | `DebounceQueue` | class | 비동기 디바운스 큐 (짧은 시간 내 다수 호출 시 마지막만 실행) |
42
+ | `SerialQueue` | class | 비동기 직렬 큐 (순차 실행 보장) |
43
+
44
+ → See [docs/features.md](./docs/features.md) for details.
45
+
46
+ ### Extensions (Prototype)
47
+
48
+ Array, Map, Set 프로토타입 확장이 자동 등록됨 (side-effect import):
49
+
50
+ | API | Type | Description |
51
+ |-----|------|-------------|
52
+ | **Array Methods (Immutable)** | | `single`, `first`, `last`, `filterExists`, `ofType`, `groupBy`, `toMap`, `toMapAsync`, `toArrayMap`, `toSetMap`, `toMapValues`, `toObject`, `toTree`, `distinct`, `orderBy`, `orderByDesc`, `diffs`, `oneWayDiffs`, `merge`, `sum`, `min`, `max`, `shuffle`, `mapAsync`, `filterAsync`, `mapMany`, `mapManyAsync`, `parallelAsync` |
53
+ | **Array Methods (Mutable)** | | `remove`, `insert`, `toggle`, `clear`, `distinctThis`, `orderByThis`, `orderByDescThis` |
54
+ | **Map Extensions** | | `getOrCreate`, `update` |
55
+ | **Set Extensions** | | `adds`, `toggle` |
56
+ | `ArrayDiffsResult<T, P>` | type | diffs() 결과 타입 (INSERT/DELETE/UPDATE) |
57
+ | `ArrayOneWayDiffResult<T>` | type | oneWayDiffs() 결과 타입 (create/update/same) |
58
+ | `TreeArray<T>` | type | toTree() 결과 타입 (children 속성 추가) |
59
+ | `ComparableType` | type | 정렬/비교 가능한 타입 union |
60
+
61
+ → See [docs/extensions.md](./docs/extensions.md) for details.
62
+
63
+ ### Environment
64
+
65
+ | API | Type | Description |
66
+ |-----|------|-------------|
67
+ | `env` | function | 환경변수 get/set. `env(key)` 읽기, `env(key, value)` 쓰기 |
68
+ | `parseBoolEnv` | function | 환경변수 값을 boolean으로 파싱 ("true"/"1"/"yes"/"on" -> true) |
69
+
70
+ ### Utils (Namespace Imports)
71
+
72
+ | API | Type | Description |
73
+ |-----|------|-------------|
74
+ | `obj` | namespace | clone, equal, merge, merge3, omit, omitByFilter, pick, getChainValue, getChainValueByDepth, setChainValue, deleteChainValue, clearUndefined, clear, nullToUndefined, unflatten, keys, entries, fromEntries, map |
75
+ | `str` | namespace | getKoreanSuffix, replaceFullWidth, toPascalCase, toCamelCase, toKebabCase, toSnakeCase, isNullOrEmpty, insert |
76
+ | `num` | namespace | parseInt, parseFloat, parseRoundedInt, isNullOrEmpty, format |
77
+ | `bytes` | namespace | concat, toHex, fromHex, toBase64, fromBase64 |
78
+ | `path` | namespace | join, basename, extname |
79
+ | `json` | namespace | stringify, parse |
80
+ | `xml` | namespace | parse, stringify |
81
+ | `wait` | namespace | until, time |
82
+ | `transfer` | namespace | encode, decode |
83
+ | `err` | namespace | message |
84
+ | `dt` | namespace | format, normalizeMonth, convert12To24 |
85
+ | `primitive` | namespace | typeStr |
86
+
87
+ → See [docs/utils.md](./docs/utils.md) for details.
88
+
89
+ ### Utils (Direct Exports)
90
+
91
+ | API | Type | Description |
92
+ |-----|------|-------------|
93
+ | `js` | function | JavaScript 코드 하이라이팅용 태그드 템플릿 리터럴 |
94
+ | `ts` | function | TypeScript 코드 하이라이팅용 태그드 템플릿 리터럴 |
95
+ | `html` | function | HTML 마크업 하이라이팅용 태그드 템플릿 리터럴 |
96
+ | `tsql` | function | MSSQL T-SQL 하이라이팅용 태그드 템플릿 리터럴 |
97
+ | `mysql` | function | MySQL SQL 하이라이팅용 태그드 템플릿 리터럴 |
98
+ | `pgsql` | function | PostgreSQL SQL 하이라이팅용 태그드 템플릿 리터럴 |
99
+ | `ZipArchive` | class | ZIP 파일 읽기/쓰기/압축/해제 (캐싱, 진행률 콜백 지원) |
100
+ | `ZipArchiveProgress` | interface | ZipArchive 진행률 콜백 데이터 |
101
+
102
+ ### Type Utilities
103
+
104
+ | API | Type | Description |
105
+ |-----|------|-------------|
106
+ | `Bytes` | type | `Uint8Array` 별칭 (Buffer 대신 사용) |
107
+ | `PrimitiveTypeMap` | type | 원시 타입 문자열 key -> 타입 매핑 |
108
+ | `PrimitiveTypeStr` | type | 원시 타입 문자열 key union (`"string" \| "number" \| ...`) |
109
+ | `PrimitiveType` | type | 원시 타입 union (`string \| number \| boolean \| DateTime \| ...`) |
110
+ | `DeepPartial<T>` | type | 모든 속성을 재귀적으로 optional로 변환 |
111
+ | `Type<T>` | interface | 생성자 타입 (`new (...args) => T`) |
112
+ | `EqualOptions` | interface | obj.equal() 옵션 |
113
+ | `MergeOptions` | interface | obj.merge() 옵션 |
114
+ | `Merge3KeyOptions` | interface | obj.merge3() key 옵션 |
115
+ | `DtNormalizedMonth` | interface | dt.normalizeMonth() 결과 타입 |
116
+ | `UndefToOptional<T>` | type | undefined 타입을 optional로 변환 |
117
+ | `OptionalToUndef<T>` | type | optional 속성을 undefined 포함 타입으로 변환 |
118
+
119
+ → See [docs/utils.md](./docs/utils.md) for details.
120
+
121
+ ## Usage Examples
122
+
123
+ ### 프로토타입 확장 사용
124
+
125
+ ```typescript
126
+ import "@simplysm/core-common";
127
+
128
+ // Array 확장
129
+ const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
130
+ const user = users.single((u) => u.id === 1);
131
+ const grouped = users.groupBy((u) => u.name);
132
+ const sorted = users.orderBy((u) => u.name);
133
+ const diffs = newUsers.diffs(oldUsers, { keys: ["id"] });
134
+
135
+ // Map 확장
136
+ const cache = new Map<string, number[]>();
137
+ const arr = cache.getOrCreate("key", []);
138
+
139
+ // Set 확장
140
+ const set = new Set<string>();
141
+ set.adds("a", "b", "c"); // 여러 항목 추가
142
+ ```
143
+
144
+ ### 에러 체인 처리
145
+
146
+ ```typescript
147
+ import { SdError } from "@simplysm/core-common";
148
+
149
+ try {
150
+ await fetch(url);
151
+ } catch (err) {
152
+ throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
153
+ // 결과 메시지: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
154
+ }
155
+ ```
156
+
157
+ ### 네임스페이스 유틸리티 사용
158
+
159
+ ```typescript
160
+ import { obj, str, json, DateTime, Uuid } from "@simplysm/core-common";
161
+
162
+ // 깊은 복사 및 비교
163
+ const copied = obj.clone({ nested: { data: [1, 2, 3] } });
164
+ const isEqual = obj.equal(a, b, { topLevelExcludes: ["updatedAt"] });
165
+ const merged = obj.merge(defaults, overrides);
166
+
167
+ // obj.omit, obj.pick
168
+ const noId = obj.omit(user, ["id"]);
169
+ const onlyName = obj.pick(user, ["name", "email"]);
170
+
171
+ // 한국어 조사 처리
172
+ const suffix = str.getKoreanSuffix("파일", "을"); // "을"
173
+ const camel = str.toCamelCase("HelloWorld"); // "helloWorld"
174
+
175
+ // 커스텀 타입 지원 JSON 직렬화
176
+ const serialized = json.stringify({
177
+ date: new DateTime(),
178
+ id: Uuid.generate()
179
+ });
180
+ const restored = json.parse(serialized); // DateTime, Uuid 타입 복원됨
181
+ ```
182
+
183
+ ### 비동기 큐 사용
184
+
185
+ ```typescript
186
+ import { DebounceQueue, SerialQueue } from "@simplysm/core-common";
187
+
188
+ // 디바운스 큐: 짧은 시간 내 재호출 시 이전 호출 무시
189
+ const dq = new DebounceQueue(300);
190
+ dq.on("error", (err) => console.error(err));
191
+ dq.run(() => saveData());
192
+ dq.run(() => saveData()); // 첫 번째 호출 무시, 300ms 후 마지막만 실행
193
+
194
+ // 직렬 큐: 순차 실행
195
+ const sq = new SerialQueue();
196
+ sq.run(async () => await step1());
197
+ sq.run(async () => await step2()); // step1 완료 후 실행
198
+ sq.run(async () => await step3()); // step2 완료 후 실행
199
+ ```
200
+
201
+ ### DateTime 사용
202
+
203
+ ```typescript
204
+ import { DateTime, DateOnly, Time, Uuid } from "@simplysm/core-common";
205
+
206
+ const now = new DateTime();
207
+ const specific = new DateTime(2025, 1, 15, 10, 30, 0);
208
+ const parsed = DateTime.parse("2025-01-15 10:30:00");
209
+ const formatted = now.toFormatString("yyyy-MM-dd HH:mm:ss");
210
+ const today = new DateOnly();
211
+ const id = Uuid.generate();
212
+ ```
213
+
214
+ ### 자동 만료 Map 사용
215
+
216
+ ```typescript
217
+ import { LazyGcMap } from "@simplysm/core-common";
218
+
219
+ const cache = new LazyGcMap<string, Data>({
220
+ expireTime: 60_000,
221
+ onExpire: async (key, value) => {
222
+ await value.cleanup();
223
+ },
224
+ });
225
+ try {
226
+ cache.set("key", data);
227
+ const val = cache.get("key"); // 접근 시간 갱신
228
+ } finally {
229
+ cache.dispose();
230
+ }
231
+ ```
232
+
233
+ ### EventEmitter 사용
234
+
235
+ ```typescript
236
+ import { EventEmitter } from "@simplysm/core-common";
237
+
238
+ interface MyEvents {
239
+ data: string;
240
+ error: Error;
241
+ done: void;
242
+ }
243
+
244
+ class MyService extends EventEmitter<MyEvents> {
245
+ async load() {
246
+ this.emit("data", "Loading...");
247
+ this.emit("done"); // void 타입은 인자 없이 호출
248
+ }
249
+ }
250
+
251
+ const svc = new MyService();
252
+ svc.on("data", (data) => console.log(data)); // data: string
253
+ svc.on("done", () => console.log("completed"));
254
+ await svc.load();
255
+ ```
@@ -1 +1 @@
1
- {"version":3,"file":"transferable.d.ts","sourceRoot":"","sources":["../../src/utils/transferable.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,KAAK,YAAY,GAAG,WAAW,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B,CAMA;AAoJD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA2E5C"}
1
+ {"version":3,"file":"transferable.d.ts","sourceRoot":"","sources":["../../src/utils/transferable.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,KAAK,YAAY,GAAG,WAAW,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B,CAMA;AAoJD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAgF5C"}
@@ -203,7 +203,11 @@ export function decode(obj) {
203
203
  if (Array.isArray(obj)) {
204
204
  return obj.map((item) => decode(item));
205
205
  }
206
- // 3. Map 재귀
206
+ // 3. Uint8Array (encode에서 그대로 반환하므로 decode에서도 그대로 반환)
207
+ if (obj instanceof Uint8Array) {
208
+ return obj;
209
+ }
210
+ // 4. Map 재귀
207
211
  if (obj instanceof Map) {
208
212
  const newMap = new Map();
209
213
  for (const [k, v] of obj) {
@@ -211,7 +215,7 @@ export function decode(obj) {
211
215
  }
212
216
  return newMap;
213
217
  }
214
- // 4. Set 재귀
218
+ // 5. Set 재귀
215
219
  if (obj instanceof Set) {
216
220
  const newSet = new Set();
217
221
  for (const v of obj) {
@@ -219,7 +223,7 @@ export function decode(obj) {
219
223
  }
220
224
  return newSet;
221
225
  }
222
- // 5. 객체 재귀
226
+ // 6. 객체 재귀
223
227
  if (typeof obj === "object") {
224
228
  const record = obj;
225
229
  const result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"transferable.js","sourceRoot":"","sources":["../../src/utils/transferable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAUrC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,gBAAgB;AAEhB;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY;IAIjC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CACjB,GAAY,EACZ,YAA4B,EAC5B,IAAyB,EACzB,SAAsB,EACtB,KAA2B;IAE3B,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC;IAE5B,0BAA0B;IAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,6BAA6B;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9D,MAAM,IAAI,SAAS,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC;QAElC,YAAY;QACZ,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,gBAAgB;QAChB,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,wDAAwD;YACxD,iDAAiD;YACjD,MAAM,mBAAmB,GACvB,OAAO,iBAAiB,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,YAAY,iBAAiB,CAAC;YACtF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAqB,CAAC;YACzC,IAAI,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,GAAG,GAAG,CAAC;QACf,CAAC;QACD,6CAA6C;aACxC,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;YAC7B,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,CAAC;aAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACnC,MAAM,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpD,CAAC;aAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACnC,MAAM,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpD,CAAC;aAAM,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;YAC/B,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;aAAM,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;YAC/B,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtD,CAAC;aAAM,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;YACjC,MAAM,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;QAClF,CAAC;aAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,GAGd,CAAC;YACF,MAAM,GAAG;gBACP,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI;wBACvB,CAAC,CAAC;4BACE,MAAM,EAAE,UAAU,CAChB,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,EACnB,SAAS,EACT,KAAK,CACN;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI;wBACtB,CAAC,CAAC;4BACE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC;yBACpF;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC;QACJ,CAAC;QACD,cAAc;aACT,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAC7B,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CACjE,CAAC;QACJ,CAAC;QACD,YAAY;aACP,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;YAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,CACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBACvC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;gBACjD,GAAG,EAAE,CAAC;gBACN,OAAO;oBACL,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;oBACtD,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;iBACzD,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,YAAY;aACP,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;YAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,CACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAC1E,CACF,CAAC;QACJ,CAAC;QACD,cAAc;aACT,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,GAA8B,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,GAAG,GAAG,CAAC;QACf,CAAC;QACD,WAAW;aACN,CAAC;YACJ,OAAO,GAAG,CAAC;QACb,CAAC;QAED,kBAAkB;QAClB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,gCAAgC;QAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,YAAY;AAEZ,gBAAgB;AAEhB;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY;IACjC,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC;IAE5B,uBAAuB;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,UAAU,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,GAA0C,CAAC;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAC5E,MAAM,SAAS,GAAG,IAAyC,CAAC;YAC5D,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAC3E,MAAM,SAAS,GAAG,IAOjB,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAGtC,CAAC;YAEF,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;YAC1B,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAE5B,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;YACtD,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI;gBAAG,GAAa,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI;gBAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,YAAY;IACZ,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY;IACZ,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAW,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,YAAY"}
1
+ {"version":3,"file":"transferable.js","sourceRoot":"","sources":["../../src/utils/transferable.ts"],"names":[],"mappings":"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"}
package/docs/errors.md ADDED
@@ -0,0 +1,82 @@
1
+ # Errors
2
+
3
+ ## `SdError`
4
+
5
+ 트리 구조 에러 체인을 지원하는 에러 클래스. ES2024 `cause` 속성을 활용한다.
6
+
7
+ ```typescript
8
+ export class SdError extends Error {
9
+ override cause?: Error;
10
+
11
+ /** 원인 에러를 감싸서 생성. 메시지는 역순으로 결합됨 */
12
+ constructor(cause: Error, ...messages: string[]);
13
+ /** 메시지만으로 생성 */
14
+ constructor(...messages: string[]);
15
+ }
16
+ ```
17
+
18
+ 생성자에 전달된 메시지들은 역순으로 결합된다. `cause`가 `Error` 인스턴스이면 그 메시지도 체인 끝에 추가된다.
19
+
20
+ ```typescript
21
+ throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
22
+ // message: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
23
+
24
+ throw new SdError("잘못된 상태", "처리 불가");
25
+ // message: "처리 불가 => 잘못된 상태"
26
+ ```
27
+
28
+ ## `ArgumentError`
29
+
30
+ 유효하지 않은 인자를 전달받았을 때 발생하는 에러. 인자 객체를 YAML 형식으로 메시지에 포함하여 디버깅을 용이하게 한다.
31
+
32
+ ```typescript
33
+ export class ArgumentError extends SdError {
34
+ /** 기본 메시지("잘못된 인자입니다.")와 함께 인자 객체를 YAML 형식으로 출력 */
35
+ constructor(argObj: Record<string, unknown>);
36
+ /** 커스텀 메시지와 함께 인자 객체를 YAML 형식으로 출력 */
37
+ constructor(message: string, argObj: Record<string, unknown>);
38
+ }
39
+ ```
40
+
41
+ ```typescript
42
+ throw new ArgumentError({ userId: 123, name: null });
43
+ // message: "잘못된 인자입니다.\n\nuserId: 123\nname: null"
44
+
45
+ throw new ArgumentError("잘못된 사용자", { userId: 123 });
46
+ // message: "잘못된 사용자\n\nuserId: 123"
47
+ ```
48
+
49
+ ## `NotImplementedError`
50
+
51
+ 아직 구현되지 않은 기능이 호출되었을 때 발생하는 에러.
52
+
53
+ ```typescript
54
+ export class NotImplementedError extends SdError {
55
+ constructor(message?: string);
56
+ }
57
+ ```
58
+
59
+ ```typescript
60
+ throw new NotImplementedError("서브클래스에서 구현 필요");
61
+ // message: "미구현: 서브클래스에서 구현 필요"
62
+ ```
63
+
64
+ ## `TimeoutError`
65
+
66
+ 대기 시간이 초과되었을 때 발생하는 에러. `wait.until()`에서 최대 시도 횟수를 초과하면 자동으로 발생한다.
67
+
68
+ ```typescript
69
+ export class TimeoutError extends SdError {
70
+ constructor(count?: number, message?: string);
71
+ }
72
+ ```
73
+
74
+ | Parameter | Type | Description |
75
+ |-----------|------|-------------|
76
+ | `count` | `number \| undefined` | 시도 횟수 |
77
+ | `message` | `string \| undefined` | 추가 메시지 |
78
+
79
+ ```typescript
80
+ throw new TimeoutError(50, "API 응답 대기 초과");
81
+ // message: "대기 시간 초과(50회 시도): API 응답 대기 초과"
82
+ ```
@@ -0,0 +1,167 @@
1
+ # Extensions (Prototype)
2
+
3
+ `@simplysm/core-common`을 import하면 `Array`, `Map`, `Set` 프로토타입 확장이 자동 등록된다.
4
+
5
+ ```typescript
6
+ import "@simplysm/core-common"; // side-effect import — 확장 등록
7
+ ```
8
+
9
+ ## Array Extensions (Immutable)
10
+
11
+ 새 배열을 반환하며 원본 배열을 변경하지 않는다.
12
+
13
+ | Method | Signature | Description |
14
+ |--------|-----------|-------------|
15
+ | `single` | `(predicate?) => T \| undefined` | 조건에 맞는 단일 요소 반환. 2개 이상이면 `ArgumentError` 발생 |
16
+ | `first` | `(predicate?) => T \| undefined` | 첫 번째 요소 반환 |
17
+ | `last` | `(predicate?) => T \| undefined` | 마지막 요소 반환 |
18
+ | `filterExists` | `() => NonNullable<T>[]` | null/undefined 제거 |
19
+ | `ofType` | `(type) => TNarrow[]` | 특정 타입의 요소만 필터 (`PrimitiveTypeStr` 또는 생성자) |
20
+ | `mapAsync` | `(selector) => Promise<TResult[]>` | 비동기 매핑 (순차 실행) |
21
+ | `filterAsync` | `(predicate) => Promise<T[]>` | 비동기 필터 (순차 실행) |
22
+ | `mapMany` | `(selector?) => TResult[]` | 매핑 후 평탄화 (또는 중첩 배열 평탄화) |
23
+ | `mapManyAsync` | `(selector?) => Promise<TResult[]>` | 비동기 매핑 후 평탄화 (순차 실행) |
24
+ | `parallelAsync` | `(fn) => Promise<TResult[]>` | 비동기 병렬 처리 (`Promise.all` 사용) |
25
+ | `groupBy` | `(keySelector, valueSelector?) => { key, values }[]` | key 기준 그룹화. 객체 key는 O(n²), 원시 key는 O(n) |
26
+ | `toMap` | `(keySelector, valueSelector?) => Map<TKey, TValue>` | Map으로 변환. 중복 key이면 `ArgumentError` 발생 |
27
+ | `toMapAsync` | `(keySelector, valueSelector?) => Promise<Map<TKey, TValue>>` | 비동기 Map으로 변환 |
28
+ | `toArrayMap` | `(keySelector, valueSelector?) => Map<TKey, TValue[]>` | 그룹 Map으로 변환. O(n) 성능 |
29
+ | `toSetMap` | `(keySelector, valueSelector?) => Map<TKey, Set<TValue>>` | 그룹 Set Map으로 변환 |
30
+ | `toMapValues` | `(keySelector, valueSelector) => Map<TKey, TValue>` | 그룹화 후 그룹별로 값 변환 |
31
+ | `toObject` | `(keySelector, valueSelector?) => Record<string, TValue>` | 일반 객체로 변환. 중복 key이면 `ArgumentError` 발생 |
32
+ | `toTree` | `(keyProp, parentKey) => TreeArray<T>[]` | 평면 배열을 트리 구조로 변환. O(n) 복잡도 |
33
+ | `distinct` | `(options?) => T[]` | 중복 제거. 객체 배열에서 `keyFn` 없이 사용하면 O(n²) |
34
+ | `orderBy` | `(selector?) => T[]` | 오름차순 정렬 |
35
+ | `orderByDesc` | `(selector?) => T[]` | 내림차순 정렬 |
36
+ | `diffs` | `(target, options?) => ArrayDiffsResult<T, P>[]` | 두 배열 비교 (INSERT/DELETE/UPDATE) |
37
+ | `oneWayDiffs` | `(orgItems, keyPropNameOrGetValFn, options?) => ArrayOneWayDiffResult<T>[]` | 단방향 차이 계산 (create/update/same) |
38
+ | `merge` | `(target, options?) => (T \| P \| T&P)[]` | 두 배열 병합 |
39
+ | `sum` | `(selector?) => number` | 합계. 빈 배열이면 0 |
40
+ | `min` | `(selector?) => T \| undefined` | 최솟값 |
41
+ | `max` | `(selector?) => T \| undefined` | 최댓값 |
42
+ | `shuffle` | `() => T[]` | 무작위 섞기 |
43
+
44
+ ### `toTree` 상세
45
+
46
+ ```typescript
47
+ interface Item {
48
+ id: number;
49
+ parentId?: number;
50
+ name: string;
51
+ }
52
+
53
+ const items: Item[] = [
54
+ { id: 1, name: "root" },
55
+ { id: 2, parentId: 1, name: "child1" },
56
+ { id: 3, parentId: 2, name: "grandchild" },
57
+ ];
58
+
59
+ const tree = items.toTree("id", "parentId");
60
+ // [{ id: 1, name: "root", children: [
61
+ // { id: 2, name: "child1", children: [
62
+ // { id: 3, name: "grandchild", children: [] }
63
+ // ]}
64
+ // ]}]
65
+ ```
66
+
67
+ ### `diffs` 상세
68
+
69
+ ```typescript
70
+ const diffs = newItems.diffs(oldItems, { keys: ["id"], excludes: ["updatedAt"] });
71
+ // ArrayDiffsResult: { source: undefined, target: item } (INSERT)
72
+ // { source: item, target: undefined } (DELETE)
73
+ // { source: item, target: item } (UPDATE)
74
+ ```
75
+
76
+ ### `oneWayDiffs` 상세
77
+
78
+ ```typescript
79
+ const diffs = newItems.oneWayDiffs(orgItems, "id", { includeSame: false });
80
+ // ArrayOneWayDiffResult: { type: "create", item, orgItem: undefined }
81
+ // { type: "update", item, orgItem }
82
+ // { type: "same", item, orgItem }
83
+ ```
84
+
85
+ ## Array Extensions (Mutable)
86
+
87
+ 원본 배열을 직접 변경한다.
88
+
89
+ | Method | Signature | Description |
90
+ |--------|-----------|-------------|
91
+ | `insert` | `(index, ...items) => this` | 지정 위치에 항목 삽입 |
92
+ | `remove` | `(item \| selector) => this` | 항목 또는 조건에 맞는 항목 제거 |
93
+ | `toggle` | `(item) => this` | 항목 토글 (있으면 제거, 없으면 추가) |
94
+ | `clear` | `() => this` | 배열 비우기 |
95
+ | `distinctThis` | `(options?) => T[]` | 원본 배열에서 중복 제거 |
96
+ | `orderByThis` | `(selector?) => T[]` | 원본 배열을 오름차순 정렬 |
97
+ | `orderByDescThis` | `(selector?) => T[]` | 원본 배열을 내림차순 정렬 |
98
+
99
+ ## Map Extensions
100
+
101
+ | Method | Signature | Description |
102
+ |--------|-----------|-------------|
103
+ | `getOrCreate` | `(key, newValue \| newValueFn) => V` | key가 없으면 새 값을 설정하고 반환. V 타입이 함수이면 팩토리로 감싸야 함 |
104
+ | `update` | `(key, updateFn) => void` | 기존 값을 기반으로 업데이트. key가 없어도 `updateFn`이 호출됨 |
105
+
106
+ ```typescript
107
+ const map = new Map<string, number[]>();
108
+ const arr = map.getOrCreate("key", []); // 없으면 [] 설정 후 반환
109
+
110
+ const countMap = new Map<string, number>();
111
+ countMap.update("key", (v) => (v ?? 0) + 1); // 카운터 증가
112
+ ```
113
+
114
+ ## Set Extensions
115
+
116
+ | Method | Signature | Description |
117
+ |--------|-----------|-------------|
118
+ | `adds` | `(...values: T[]) => this` | 여러 값을 한 번에 추가 |
119
+ | `toggle` | `(value, addOrDel?) => this` | 값 토글. `addOrDel`로 강제 추가/제거 가능 |
120
+
121
+ ```typescript
122
+ const set = new Set<number>([1, 2, 3]);
123
+ set.adds(4, 5, 6); // 여러 항목 추가
124
+ set.toggle(2); // 2가 있으므로 제거 → {1, 3, 4, 5, 6}
125
+ set.toggle(99, "add"); // 강제 추가
126
+ set.toggle(99, "del"); // 강제 제거
127
+ ```
128
+
129
+ ## Exported Types
130
+
131
+ ### `ArrayDiffsResult<TOriginal, TOther>`
132
+
133
+ `diffs()` 메서드의 반환 타입. discriminated union으로 `source`와 `target` 중 하나가 `undefined`이면 INSERT/DELETE, 둘 다 있으면 UPDATE.
134
+
135
+ ```typescript
136
+ export type ArrayDiffsResult<TOriginal, TOther> =
137
+ | { source: undefined; target: TOther } // INSERT
138
+ | { source: TOriginal; target: undefined } // DELETE
139
+ | { source: TOriginal; target: TOther }; // UPDATE
140
+ ```
141
+
142
+ ### `ArrayOneWayDiffResult<TItem>`
143
+
144
+ `oneWayDiffs()` 메서드의 반환 타입. `type` 필드로 분기.
145
+
146
+ ```typescript
147
+ export type ArrayOneWayDiffResult<TItem> =
148
+ | { type: "create"; item: TItem; orgItem: undefined }
149
+ | { type: "update"; item: TItem; orgItem: TItem }
150
+ | { type: "same"; item: TItem; orgItem: TItem };
151
+ ```
152
+
153
+ ### `TreeArray<TNode>`
154
+
155
+ `toTree()` 메서드의 반환 타입. 원본 타입에 `children` 속성이 추가된다.
156
+
157
+ ```typescript
158
+ export type TreeArray<TNode> = TNode & { children: TreeArray<TNode>[] };
159
+ ```
160
+
161
+ ### `ComparableType`
162
+
163
+ `orderBy`, `orderByDesc`, `orderByThis`, `orderByDescThis`의 selector 반환 타입.
164
+
165
+ ```typescript
166
+ export type ComparableType = string | number | boolean | DateTime | DateOnly | Time | undefined;
167
+ ```