@simplysm/core-common 14.0.50 → 14.0.52
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 +2 -3
- package/README.md +0 -160
- package/docs/errors/argument-error.md +0 -26
- package/docs/errors/not-implemented-error.md +0 -33
- package/docs/errors/sd-error.md +0 -38
- package/docs/errors/timeout-error.md +0 -36
- package/docs/extensions/array.md +0 -125
- package/docs/extensions/map.md +0 -43
- package/docs/extensions/set.md +0 -35
- package/docs/features/debounce-queue.md +0 -48
- package/docs/features/event-emitter.md +0 -52
- package/docs/features/serial-queue.md +0 -44
- package/docs/type-utils/common-types.md +0 -100
- package/docs/type-utils/env.md +0 -42
- package/docs/types/date-only.md +0 -86
- package/docs/types/date-time.md +0 -106
- package/docs/types/lazy-gc-map.md +0 -59
- package/docs/types/time.md +0 -62
- package/docs/types/uuid.md +0 -41
- package/docs/utils/bytes.md +0 -36
- package/docs/utils/dt.md +0 -60
- package/docs/utils/err.md +0 -26
- package/docs/utils/json.md +0 -58
- package/docs/utils/num.md +0 -56
- package/docs/utils/obj.md +0 -107
- package/docs/utils/path.md +0 -30
- package/docs/utils/primitive.md +0 -28
- package/docs/utils/str.md +0 -63
- package/docs/utils/template-strings.md +0 -49
- package/docs/utils/transfer.md +0 -35
- package/docs/utils/wait.md +0 -35
- package/docs/utils/xml.md +0 -49
- package/docs/utils/zip-archive.md +0 -77
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# Common Types
|
|
2
|
-
|
|
3
|
-
공유 타입 정의. `Buffer` 대신 사용하는 바이너리 타입, ORM과 공유하는 원시 타입, 범용 유틸리티 타입을 제공한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { Bytes, PrimitiveTypeMap, PrimitiveTypeStr, PrimitiveType, DeepPartial, Type } from "@simplysm/core-common";
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Types
|
|
10
|
-
|
|
11
|
-
### `Bytes`
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
export type Bytes = Uint8Array;
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`Buffer` 대신 사용하는 바이너리 타입 별칭.
|
|
18
|
-
|
|
19
|
-
### `PrimitiveTypeMap`
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
export type PrimitiveTypeMap = {
|
|
23
|
-
string: string;
|
|
24
|
-
number: number;
|
|
25
|
-
boolean: boolean;
|
|
26
|
-
DateTime: DateTime;
|
|
27
|
-
DateOnly: DateOnly;
|
|
28
|
-
Time: Time;
|
|
29
|
-
Uuid: Uuid;
|
|
30
|
-
Bytes: Bytes;
|
|
31
|
-
};
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
원시 타입 문자열 key → 실제 타입 매핑. `@simplysm/orm-common`과 공유한다.
|
|
35
|
-
|
|
36
|
-
### `PrimitiveTypeStr`
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
export type PrimitiveTypeStr = keyof PrimitiveTypeMap;
|
|
40
|
-
// "string" | "number" | "boolean" | "DateTime" | "DateOnly" | "Time" | "Uuid" | "Bytes"
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
원시 타입 문자열 key union.
|
|
44
|
-
|
|
45
|
-
### `PrimitiveType`
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
export type PrimitiveType = PrimitiveTypeMap[PrimitiveTypeStr] | undefined;
|
|
49
|
-
// string | number | boolean | DateTime | DateOnly | Time | Uuid | Bytes | undefined
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
원시 타입 union.
|
|
53
|
-
|
|
54
|
-
### `DeepPartial<TObject>`
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
export type DeepPartial<TObject> = Partial<{
|
|
58
|
-
[K in keyof TObject]: TObject[K] extends PrimitiveType ? TObject[K] : DeepPartial<TObject[K]>;
|
|
59
|
-
}>;
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
객체의 모든 속성을 재귀적으로 optional로 변환한다. 원시 타입(`PrimitiveType`)은 그대로 유지하고, object/array 타입에만 재귀적으로 `Partial`을 적용한다.
|
|
63
|
-
|
|
64
|
-
### `Type<TInstance>`
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
export interface Type<TInstance> extends Function {
|
|
68
|
-
new (...args: unknown[]): TInstance;
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
생성자 타입. 의존성 주입, 팩토리 패턴, instanceof 체크 등에 활용한다.
|
|
73
|
-
|
|
74
|
-
## Usage
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
import { Bytes, PrimitiveTypeStr, DeepPartial, Type } from "@simplysm/core-common";
|
|
78
|
-
|
|
79
|
-
// Bytes
|
|
80
|
-
const data: Bytes = new Uint8Array([1, 2, 3]);
|
|
81
|
-
|
|
82
|
-
// PrimitiveTypeStr
|
|
83
|
-
const typeStr: PrimitiveTypeStr = "DateTime";
|
|
84
|
-
|
|
85
|
-
// DeepPartial
|
|
86
|
-
interface Config {
|
|
87
|
-
server: { host: string; port: number };
|
|
88
|
-
db: { name: string; user: string };
|
|
89
|
-
}
|
|
90
|
-
const partial: DeepPartial<Config> = {
|
|
91
|
-
server: { host: "localhost" }, // port 생략 가능
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
// Type<T>
|
|
95
|
-
function create<T>(ctor: Type<T>): T {
|
|
96
|
-
return new ctor();
|
|
97
|
-
}
|
|
98
|
-
class MyService {}
|
|
99
|
-
const svc = create(MyService);
|
|
100
|
-
```
|
package/docs/type-utils/env.md
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# env / parseBoolEnv
|
|
2
|
-
|
|
3
|
-
환경변수 접근 유틸리티 함수. `process.env`/`import.meta.env` 직접 접근 대신 이 함수를 사용해야 한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export function env(key: string): string | undefined;
|
|
7
|
-
export function env(key: string, value: string): void;
|
|
8
|
-
|
|
9
|
-
export function parseBoolEnv(value: unknown): boolean;
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
직접 named import로 사용한다:
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
import { env, parseBoolEnv } from "@simplysm/core-common";
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Functions
|
|
19
|
-
|
|
20
|
-
| Function | Signature | Description |
|
|
21
|
-
|----------|-----------|-------------|
|
|
22
|
-
| `env` | `(key: string) => string \| undefined` | 환경변수 값 읽기. `process.env` 우선, fallback `import.meta.env` |
|
|
23
|
-
| `env` | `(key: string, value: string) => void` | 환경변수 값 쓰기 (`process.env`에 저장) |
|
|
24
|
-
| `parseBoolEnv` | `(value: unknown) => boolean` | 환경변수 값을 boolean으로 파싱. `"true"`, `"1"`, `"yes"`, `"on"` (대소문자 무시) → `true`, 그 외 → `false` |
|
|
25
|
-
|
|
26
|
-
## Usage
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
import { env, parseBoolEnv } from "@simplysm/core-common";
|
|
30
|
-
|
|
31
|
-
// 읽기
|
|
32
|
-
const apiUrl = env("API_URL"); // string | undefined
|
|
33
|
-
|
|
34
|
-
// 쓰기
|
|
35
|
-
env("DEBUG", "true");
|
|
36
|
-
|
|
37
|
-
// boolean 파싱
|
|
38
|
-
parseBoolEnv(env("DEBUG")); // true
|
|
39
|
-
parseBoolEnv("yes"); // true
|
|
40
|
-
parseBoolEnv("false"); // false
|
|
41
|
-
parseBoolEnv("0"); // false
|
|
42
|
-
```
|
package/docs/types/date-only.md
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# DateOnly
|
|
2
|
-
|
|
3
|
-
불변 날짜 클래스 (시간 제외: `yyyy-MM-dd`). 시간 정보 없이 날짜만 저장하며 로컬 타임존 기준으로 동작한다. 주차 계산을 지원한다. 수정 메서드는 모두 새 인스턴스를 반환한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export class DateOnly {
|
|
7
|
-
readonly date: Date;
|
|
8
|
-
|
|
9
|
-
constructor();
|
|
10
|
-
constructor(year: number, month: number, day: number);
|
|
11
|
-
constructor(tick: number);
|
|
12
|
-
constructor(date: Date);
|
|
13
|
-
|
|
14
|
-
static parse(str: string): DateOnly;
|
|
15
|
-
static getDateByYearWeekSeq(
|
|
16
|
-
arg: { year: number; month?: number; weekSeq: number },
|
|
17
|
-
weekStartDay?: number,
|
|
18
|
-
minDaysInFirstWeek?: number,
|
|
19
|
-
): DateOnly;
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Members
|
|
24
|
-
|
|
25
|
-
| Member | Kind | Type | Description |
|
|
26
|
-
|--------|------|------|-------------|
|
|
27
|
-
| `date` | property | `Date` | 내부 Date 객체 (시간 부분은 항상 00:00:00) |
|
|
28
|
-
| `year` | getter | `number` | 연도 |
|
|
29
|
-
| `month` | getter | `number` | 월 (1-12) |
|
|
30
|
-
| `day` | getter | `number` | 일 (1-31) |
|
|
31
|
-
| `tick` | getter | `number` | Unix 타임스탬프 (밀리초) |
|
|
32
|
-
| `dayOfWeek` | getter | `number` | 요일 (일요일=0 ~ 토요일=6) |
|
|
33
|
-
| `isValid` | getter | `boolean` | 날짜가 올바르게 설정되었는지 여부 |
|
|
34
|
-
| `parse` | static | `(str: string) => DateOnly` | 문자열을 파싱하여 DateOnly 생성 |
|
|
35
|
-
| `getDateByYearWeekSeq` | static | `(arg, weekStartDay?, minDaysInFirstWeek?) => DateOnly` | 연도·(월)·주차로 해당 주의 시작 날짜 반환 |
|
|
36
|
-
| `setYear` | method | `(year: number) => DateOnly` | 지정된 연도로 새 인스턴스 반환 |
|
|
37
|
-
| `setMonth` | method | `(month: number) => DateOnly` | 지정된 월로 새 인스턴스 반환. 현재 일이 대상 월의 일수보다 크면 마지막 일로 조정됨 |
|
|
38
|
-
| `setDay` | method | `(day: number) => DateOnly` | 지정된 일로 새 인스턴스 반환 |
|
|
39
|
-
| `addYears` | method | `(years: number) => DateOnly` | 지정된 연수를 더한 새 인스턴스 반환 |
|
|
40
|
-
| `addMonths` | method | `(months: number) => DateOnly` | 지정된 월수를 더한 새 인스턴스 반환 |
|
|
41
|
-
| `addDays` | method | `(days: number) => DateOnly` | 지정된 일수를 더한 새 인스턴스 반환 |
|
|
42
|
-
| `getBaseYearMonthSeqForWeekSeq` | method | `(weekStartDay?, minDaysInFirstWeek?) => { year: number; monthSeq: number }` | 이 날짜가 포함된 주의 기준 연도와 월 반환 |
|
|
43
|
-
| `getWeekSeqStartDate` | method | `(weekStartDay?, minDaysInFirstWeek?) => DateOnly` | 이 날짜가 포함된 주의 시작 날짜 반환 |
|
|
44
|
-
| `getWeekSeqOfYear` | method | `(weekStartDay?, minDaysInFirstWeek?) => { year: number; weekSeq: number }` | 연도와 주차 번호 반환 |
|
|
45
|
-
| `getWeekSeqOfMonth` | method | `(weekStartDay?, minDaysInFirstWeek?) => { year: number; monthSeq: number; weekSeq: number }` | 연도, 월, 해당 월 내의 주차 번호 반환 |
|
|
46
|
-
| `toFormatString` | method | `(formatStr: string) => string` | 지정된 형식 문자열로 변환 (형식 토큰은 [`DateTime`](./date-time.md) 참조) |
|
|
47
|
-
| `toString` | method | `() => string` | `"yyyy-MM-dd"` 형식 문자열 반환 |
|
|
48
|
-
|
|
49
|
-
## `parse` — 지원 형식
|
|
50
|
-
|
|
51
|
-
| 형식 | 예시 | 타임존 |
|
|
52
|
-
|------|------|--------|
|
|
53
|
-
| `yyyy-MM-dd` | `"2025-01-15"` | 타임존 무관 (직접 추출) |
|
|
54
|
-
| `yyyyMMdd` | `"20250115"` | 타임존 무관 (직접 추출) |
|
|
55
|
-
| ISO 8601 | `"2025-01-15T00:00:00Z"` | UTC로 해석 후 로컬 타임존 변환 |
|
|
56
|
-
|
|
57
|
-
서버/클라이언트 타임존이 다른 경우 `yyyy-MM-dd` 형식 권장.
|
|
58
|
-
|
|
59
|
-
## 주차 계산 파라미터
|
|
60
|
-
|
|
61
|
-
| 파라미터 | 기본값 | 설명 |
|
|
62
|
-
|----------|--------|------|
|
|
63
|
-
| `weekStartDay` | `1` (월요일) | 주 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일) |
|
|
64
|
-
| `minDaysInFirstWeek` | `4` | 첫 번째 주로 간주되기 위한 최소 일수 (ISO 8601 표준) |
|
|
65
|
-
|
|
66
|
-
## Usage
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
import { DateOnly } from "@simplysm/core-common";
|
|
70
|
-
|
|
71
|
-
const today = new DateOnly();
|
|
72
|
-
const specific = new DateOnly(2025, 1, 15);
|
|
73
|
-
const parsed = DateOnly.parse("2025-01-15");
|
|
74
|
-
|
|
75
|
-
// 불변 수정
|
|
76
|
-
const nextWeek = today.addDays(7);
|
|
77
|
-
const firstDayOfMonth = today.setDay(1);
|
|
78
|
-
|
|
79
|
-
// 주차 계산 (ISO 8601 기본값: 월요일 시작, 첫 주 최소 4일)
|
|
80
|
-
const { year, weekSeq } = new DateOnly(2025, 1, 6).getWeekSeqOfYear();
|
|
81
|
-
// { year: 2025, weekSeq: 2 }
|
|
82
|
-
|
|
83
|
-
// 주차로 날짜 계산
|
|
84
|
-
const weekStart = DateOnly.getDateByYearWeekSeq({ year: 2025, weekSeq: 2 });
|
|
85
|
-
// 2025-01-06 (월요일)
|
|
86
|
-
```
|
package/docs/types/date-time.md
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
# DateTime
|
|
2
|
-
|
|
3
|
-
불변 날짜시간 클래스 (밀리초 정밀도, 로컬 타임존). JavaScript `Date` 객체를 래핑하여 불변성과 편리한 API를 제공한다. 수정 메서드는 모두 새 인스턴스를 반환한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export class DateTime {
|
|
7
|
-
readonly date: Date;
|
|
8
|
-
|
|
9
|
-
constructor();
|
|
10
|
-
constructor(year: number, month: number, day: number, hour?: number, minute?: number, second?: number, millisecond?: number);
|
|
11
|
-
constructor(tick: number);
|
|
12
|
-
constructor(date: Date);
|
|
13
|
-
|
|
14
|
-
static parse(str: string): DateTime;
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Members
|
|
19
|
-
|
|
20
|
-
| Member | Kind | Type | Description |
|
|
21
|
-
|--------|------|------|-------------|
|
|
22
|
-
| `date` | property | `Date` | 내부 Date 객체 |
|
|
23
|
-
| `year` | getter | `number` | 연도 |
|
|
24
|
-
| `month` | getter | `number` | 월 (1-12) |
|
|
25
|
-
| `day` | getter | `number` | 일 (1-31) |
|
|
26
|
-
| `hour` | getter | `number` | 시 (0-23) |
|
|
27
|
-
| `minute` | getter | `number` | 분 (0-59) |
|
|
28
|
-
| `second` | getter | `number` | 초 (0-59) |
|
|
29
|
-
| `millisecond` | getter | `number` | 밀리초 (0-999) |
|
|
30
|
-
| `tick` | getter | `number` | Unix 타임스탬프 (밀리초) |
|
|
31
|
-
| `dayOfWeek` | getter | `number` | 요일 (일요일=0 ~ 토요일=6) |
|
|
32
|
-
| `timezoneOffsetMinutes` | getter | `number` | 타임존 오프셋 (분) |
|
|
33
|
-
| `isValid` | getter | `boolean` | 날짜시간이 올바르게 설정되었는지 여부 |
|
|
34
|
-
| `parse` | static | `(str: string) => DateTime` | 문자열을 파싱하여 DateTime 생성 |
|
|
35
|
-
| `setYear` | method | `(year: number) => DateTime` | 지정된 연도로 새 인스턴스 반환 |
|
|
36
|
-
| `setMonth` | method | `(month: number) => DateTime` | 지정된 월로 새 인스턴스 반환. 현재 일이 대상 월의 일수보다 크면 마지막 일로 조정됨 |
|
|
37
|
-
| `setDay` | method | `(day: number) => DateTime` | 지정된 일로 새 인스턴스 반환 |
|
|
38
|
-
| `setHour` | method | `(hour: number) => DateTime` | 지정된 시로 새 인스턴스 반환 |
|
|
39
|
-
| `setMinute` | method | `(minute: number) => DateTime` | 지정된 분으로 새 인스턴스 반환 |
|
|
40
|
-
| `setSecond` | method | `(second: number) => DateTime` | 지정된 초로 새 인스턴스 반환 |
|
|
41
|
-
| `setMillisecond` | method | `(millisecond: number) => DateTime` | 지정된 밀리초로 새 인스턴스 반환 |
|
|
42
|
-
| `addYears` | method | `(years: number) => DateTime` | 지정된 연수를 더한 새 인스턴스 반환 |
|
|
43
|
-
| `addMonths` | method | `(months: number) => DateTime` | 지정된 월수를 더한 새 인스턴스 반환 |
|
|
44
|
-
| `addDays` | method | `(days: number) => DateTime` | 지정된 일수를 더한 새 인스턴스 반환 |
|
|
45
|
-
| `addHours` | method | `(hours: number) => DateTime` | 지정된 시간을 더한 새 인스턴스 반환 |
|
|
46
|
-
| `addMinutes` | method | `(minutes: number) => DateTime` | 지정된 분을 더한 새 인스턴스 반환 |
|
|
47
|
-
| `addSeconds` | method | `(seconds: number) => DateTime` | 지정된 초를 더한 새 인스턴스 반환 |
|
|
48
|
-
| `addMilliseconds` | method | `(milliseconds: number) => DateTime` | 지정된 밀리초를 더한 새 인스턴스 반환 |
|
|
49
|
-
| `toFormatString` | method | `(formatStr: string) => string` | 지정된 형식 문자열로 변환 |
|
|
50
|
-
| `toString` | method | `() => string` | ISO 형식 문자열 반환 (`yyyy-MM-ddTHH:mm:ss.fffzzz`) |
|
|
51
|
-
|
|
52
|
-
## `parse` — 지원 형식
|
|
53
|
-
|
|
54
|
-
| 형식 | 예시 |
|
|
55
|
-
|------|------|
|
|
56
|
-
| `yyyy-MM-dd HH:mm:ss` | `"2025-01-15 10:30:00"` |
|
|
57
|
-
| `yyyy-MM-dd HH:mm:ss.fff` | `"2025-01-15 10:30:00.123"` |
|
|
58
|
-
| `yyyyMMddHHmmss` | `"20250115103000"` |
|
|
59
|
-
| `yyyy-MM-dd AM/PM HH:mm:ss` | `"2025-01-15 AM 10:30:00"` |
|
|
60
|
-
| `yyyy-MM-dd 오전/오후 HH:mm:ss` | `"2025-01-15 오전 10:30:00"` |
|
|
61
|
-
| ISO 8601 | `"2025-01-15T10:30:00Z"` |
|
|
62
|
-
|
|
63
|
-
## `toFormatString` — 형식 문자열 토큰
|
|
64
|
-
|
|
65
|
-
| 토큰 | 설명 | 예시 |
|
|
66
|
-
|------|------|------|
|
|
67
|
-
| `yyyy` | 4자리 연도 | `2025` |
|
|
68
|
-
| `yy` | 2자리 연도 | `25` |
|
|
69
|
-
| `MM` | 0 채움 월 | `01`~`12` |
|
|
70
|
-
| `M` | 월 | `1`~`12` |
|
|
71
|
-
| `ddd` | 요일 | `일`, `월`, `화`, `수`, `목`, `금`, `토` |
|
|
72
|
-
| `dd` | 0 채움 일 | `01`~`31` |
|
|
73
|
-
| `d` | 일 | `1`~`31` |
|
|
74
|
-
| `tt` | 오전/오후 | `AM`, `PM` |
|
|
75
|
-
| `HH` | 0 채움 24시간 | `00`~`23` |
|
|
76
|
-
| `H` | 24시간 | `0`~`23` |
|
|
77
|
-
| `hh` | 0 채움 12시간 | `01`~`12` |
|
|
78
|
-
| `h` | 12시간 | `1`~`12` |
|
|
79
|
-
| `mm` | 0 채움 분 | `00`~`59` |
|
|
80
|
-
| `m` | 분 | `0`~`59` |
|
|
81
|
-
| `ss` | 0 채움 초 | `00`~`59` |
|
|
82
|
-
| `s` | 초 | `0`~`59` |
|
|
83
|
-
| `fff` | 밀리초 (3자리) | `000`~`999` |
|
|
84
|
-
| `ff` | 밀리초 (2자리) | `00`~`99` |
|
|
85
|
-
| `f` | 밀리초 (1자리) | `0`~`9` |
|
|
86
|
-
| `zzz` | 타임존 오프셋 (`±HH:mm`) | `+09:00` |
|
|
87
|
-
| `zz` | 타임존 오프셋 (`±HH`) | `+09` |
|
|
88
|
-
| `z` | 타임존 오프셋 (`±H`) | `+9` |
|
|
89
|
-
|
|
90
|
-
## Usage
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
import { DateTime } from "@simplysm/core-common";
|
|
94
|
-
|
|
95
|
-
const now = new DateTime();
|
|
96
|
-
const specific = new DateTime(2025, 1, 15, 10, 30, 0);
|
|
97
|
-
const fromTick = new DateTime(Date.now());
|
|
98
|
-
const parsed = DateTime.parse("2025-01-15 10:30:00");
|
|
99
|
-
|
|
100
|
-
const formatted = now.toFormatString("yyyy-MM-dd HH:mm:ss");
|
|
101
|
-
const iso = now.toString(); // "2025-01-15T10:30:00.000+09:00"
|
|
102
|
-
|
|
103
|
-
// 불변 수정
|
|
104
|
-
const nextMonth = now.addMonths(1);
|
|
105
|
-
const endOfYear = now.setMonth(12).setDay(31);
|
|
106
|
-
```
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# LazyGcMap
|
|
2
|
-
|
|
3
|
-
자동 만료 기능이 있는 Map. LRU 방식으로 접근 시간을 갱신하고, 지정된 시간 동안 접근하지 않으면 자동 삭제한다. 사용 후 반드시 `dispose()`를 호출해야 GC 타이머가 정리된다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export class LazyGcMap<TKey, TValue> {
|
|
7
|
-
constructor(options: {
|
|
8
|
-
gcInterval?: number;
|
|
9
|
-
expireTime: number;
|
|
10
|
-
onExpire?: (key: TKey, value: TValue) => void | Promise<void>;
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Constructor Options
|
|
16
|
-
|
|
17
|
-
| Field | Type | Required | Description |
|
|
18
|
-
|-------|------|----------|-------------|
|
|
19
|
-
| `expireTime` | `number` | 필수 | 만료 시간 (밀리초). 마지막 접근 이후 이 시간이 지나면 삭제됨 |
|
|
20
|
-
| `gcInterval` | `number` | 선택 | GC 간격 (밀리초). 생략 시 `expireTime / 10` (최소 1000ms) |
|
|
21
|
-
| `onExpire` | `(key: TKey, value: TValue) => void \| Promise<void>` | 선택 | 만료 시 호출되는 콜백. 에러 발생 시 로그 출력 후 계속 실행 |
|
|
22
|
-
|
|
23
|
-
## Members
|
|
24
|
-
|
|
25
|
-
| Member | Kind | Type | Description |
|
|
26
|
-
|--------|------|------|-------------|
|
|
27
|
-
| `size` | getter | `number` | 저장된 항목 수 |
|
|
28
|
-
| `has` | method | `(key: TKey) => boolean` | key 존재 여부 확인 (접근 시간 갱신하지 않음) |
|
|
29
|
-
| `get` | method | `(key: TKey) => TValue \| undefined` | 값 조회 (접근 시간 갱신) |
|
|
30
|
-
| `set` | method | `(key: TKey, value: TValue) => void` | 값 저장 (접근 시간 설정 및 GC 타이머 시작) |
|
|
31
|
-
| `delete` | method | `(key: TKey) => boolean` | 항목 삭제 |
|
|
32
|
-
| `getOrCreate` | method | `(key: TKey, factory: () => TValue) => TValue` | key가 없으면 팩토리로 생성하여 저장 후 반환 |
|
|
33
|
-
| `clear` | method | `() => void` | 모든 항목 삭제 (인스턴스는 계속 사용 가능) |
|
|
34
|
-
| `dispose` | method | `() => void` | 인스턴스 정리 (GC 타이머 중지 및 데이터 삭제). 이후 모든 작업 무시됨 |
|
|
35
|
-
| `values` | method | `() => IterableIterator<TValue>` | 값 순회 |
|
|
36
|
-
| `keys` | method | `() => IterableIterator<TKey>` | key 순회 |
|
|
37
|
-
| `entries` | method | `() => IterableIterator<[TKey, TValue]>` | 엔트리 순회 |
|
|
38
|
-
|
|
39
|
-
## Usage
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
import { LazyGcMap } from "@simplysm/core-common";
|
|
43
|
-
|
|
44
|
-
const cache = new LazyGcMap<string, Data>({
|
|
45
|
-
expireTime: 60_000, // 60초 미접근 시 삭제
|
|
46
|
-
gcInterval: 10_000, // 10초마다 GC 실행 (생략 시 6000ms)
|
|
47
|
-
onExpire: async (key, value) => {
|
|
48
|
-
await value.cleanup(); // 정리 작업
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
cache.set("key", data);
|
|
54
|
-
const val = cache.get("key"); // 접근 시간 갱신
|
|
55
|
-
const created = cache.getOrCreate("other", () => createData());
|
|
56
|
-
} finally {
|
|
57
|
-
cache.dispose(); // 반드시 호출
|
|
58
|
-
}
|
|
59
|
-
```
|
package/docs/types/time.md
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# Time
|
|
2
|
-
|
|
3
|
-
불변 시간 클래스 (날짜 제외: `HH:mm:ss.fff`). 날짜 정보 없이 시간만 저장하며 24시간을 초과하거나 음수인 값은 자동으로 정규화된다. 수정 및 산술 메서드는 새 인스턴스를 반환하며 모두 24시간 순환한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export class Time {
|
|
7
|
-
constructor();
|
|
8
|
-
constructor(hour: number, minute: number, second?: number, millisecond?: number);
|
|
9
|
-
constructor(tick: number);
|
|
10
|
-
constructor(date: Date);
|
|
11
|
-
|
|
12
|
-
static parse(str: string): Time;
|
|
13
|
-
}
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Members
|
|
17
|
-
|
|
18
|
-
| Member | Kind | Type | Description |
|
|
19
|
-
|--------|------|------|-------------|
|
|
20
|
-
| `hour` | getter | `number` | 시 (0-23) |
|
|
21
|
-
| `minute` | getter | `number` | 분 (0-59) |
|
|
22
|
-
| `second` | getter | `number` | 초 (0-59) |
|
|
23
|
-
| `millisecond` | getter | `number` | 밀리초 (0-999) |
|
|
24
|
-
| `tick` | getter | `number` | 자정(00:00:00.000) 기준 밀리초 |
|
|
25
|
-
| `isValid` | getter | `boolean` | 시간이 올바르게 설정되었는지 여부 |
|
|
26
|
-
| `parse` | static | `(str: string) => Time` | 문자열을 파싱하여 Time 생성 |
|
|
27
|
-
| `setHour` | method | `(hour: number) => Time` | 지정된 시로 새 인스턴스 반환 |
|
|
28
|
-
| `setMinute` | method | `(minute: number) => Time` | 지정된 분으로 새 인스턴스 반환 |
|
|
29
|
-
| `setSecond` | method | `(second: number) => Time` | 지정된 초로 새 인스턴스 반환 |
|
|
30
|
-
| `setMillisecond` | method | `(millisecond: number) => Time` | 지정된 밀리초로 새 인스턴스 반환 |
|
|
31
|
-
| `addHours` | method | `(hours: number) => Time` | 지정된 시간을 더한 새 인스턴스 반환 (24시간 순환) |
|
|
32
|
-
| `addMinutes` | method | `(minutes: number) => Time` | 지정된 분을 더한 새 인스턴스 반환 (24시간 순환) |
|
|
33
|
-
| `addSeconds` | method | `(seconds: number) => Time` | 지정된 초를 더한 새 인스턴스 반환 (24시간 순환) |
|
|
34
|
-
| `addMilliseconds` | method | `(milliseconds: number) => Time` | 지정된 밀리초를 더한 새 인스턴스 반환 (24시간 순환) |
|
|
35
|
-
| `toFormatString` | method | `(formatStr: string) => string` | 지정된 형식 문자열로 변환 (형식 토큰은 [`DateTime`](./date-time.md) 참조, 날짜 관련 토큰 제외) |
|
|
36
|
-
| `toString` | method | `() => string` | `"HH:mm:ss.fff"` 형식 문자열 반환 |
|
|
37
|
-
|
|
38
|
-
## `parse` — 지원 형식
|
|
39
|
-
|
|
40
|
-
| 형식 | 예시 |
|
|
41
|
-
|------|------|
|
|
42
|
-
| `HH:mm:ss` | `"10:30:00"` |
|
|
43
|
-
| `HH:mm:ss.fff` | `"10:30:00.123"` |
|
|
44
|
-
| `AM/PM HH:mm:ss` | `"AM 10:30:00"`, `"PM 02:15:00"` |
|
|
45
|
-
| ISO 8601 | `"2025-01-15T10:30:00Z"` (시간 부분만 추출, 타임존 변환 적용) |
|
|
46
|
-
|
|
47
|
-
## Usage
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
import { Time } from "@simplysm/core-common";
|
|
51
|
-
|
|
52
|
-
const now = new Time();
|
|
53
|
-
const specific = new Time(10, 30, 0);
|
|
54
|
-
const parsed = Time.parse("10:30:00");
|
|
55
|
-
|
|
56
|
-
// 불변 수정
|
|
57
|
-
const later = specific.addHours(2).addMinutes(30);
|
|
58
|
-
// 24시간 순환
|
|
59
|
-
const midnight = new Time(23, 0, 0).addHours(2); // 01:00:00
|
|
60
|
-
|
|
61
|
-
const formatted = specific.toFormatString("HH:mm:ss");
|
|
62
|
-
```
|
package/docs/types/uuid.md
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Uuid
|
|
2
|
-
|
|
3
|
-
UUID v4 클래스. `crypto.getRandomValues` 기반으로 암호학적으로 안전한 UUID를 생성한다 (Chrome 37+, Node.js 호환).
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
export class Uuid {
|
|
7
|
-
constructor(uuid: string);
|
|
8
|
-
|
|
9
|
-
static generate(): Uuid;
|
|
10
|
-
static fromBytes(bytes: Bytes): Uuid;
|
|
11
|
-
}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## Members
|
|
15
|
-
|
|
16
|
-
| Member | Kind | Type | Description |
|
|
17
|
-
|--------|------|------|-------------|
|
|
18
|
-
| `generate` | static | `() => Uuid` | 새 UUID v4 인스턴스 생성 |
|
|
19
|
-
| `fromBytes` | static | `(bytes: Bytes) => Uuid` | 16바이트 `Uint8Array`로 UUID 생성. 바이트 크기가 16이 아니면 `ArgumentError` 발생 |
|
|
20
|
-
| `toString` | method | `() => string` | UUID 문자열 반환 (`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) |
|
|
21
|
-
| `toBytes` | method | `() => Bytes` | UUID를 16바이트 `Uint8Array`로 변환 |
|
|
22
|
-
|
|
23
|
-
## Related Types
|
|
24
|
-
|
|
25
|
-
### `Bytes`
|
|
26
|
-
|
|
27
|
-
`Uint8Array` 별칭. [`Bytes`](../type-utils/common-types.md) 참조.
|
|
28
|
-
|
|
29
|
-
## Usage
|
|
30
|
-
|
|
31
|
-
```typescript
|
|
32
|
-
import { Uuid } from "@simplysm/core-common";
|
|
33
|
-
|
|
34
|
-
const id = Uuid.generate();
|
|
35
|
-
const fromStr = new Uuid("550e8400-e29b-41d4-a716-446655440000");
|
|
36
|
-
|
|
37
|
-
console.log(id.toString()); // "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
38
|
-
|
|
39
|
-
const bytes = id.toBytes(); // Uint8Array(16)
|
|
40
|
-
const restored = Uuid.fromBytes(bytes);
|
|
41
|
-
```
|
package/docs/utils/bytes.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# bytes
|
|
2
|
-
|
|
3
|
-
`Uint8Array` 유틸리티 네임스페이스. 복잡한 변환 연산을 제공한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { bytes } from "@simplysm/core-common";
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Functions
|
|
10
|
-
|
|
11
|
-
| Function | Signature | Description |
|
|
12
|
-
|----------|-----------|-------------|
|
|
13
|
-
| `concat` | `(arrays: Bytes[]) => Bytes` | 여러 `Uint8Array` 결합 |
|
|
14
|
-
| `toHex` | `(bytes: Bytes) => string` | `Uint8Array`를 소문자 hex 문자열로 변환 |
|
|
15
|
-
| `fromHex` | `(hex: string) => Bytes` | hex 문자열을 `Uint8Array`로 변환. 홀수 길이이거나 유효하지 않은 문자가 있으면 `ArgumentError` |
|
|
16
|
-
| `toBase64` | `(bytes: Bytes) => string` | `Uint8Array`를 Base64 문자열로 변환 |
|
|
17
|
-
| `fromBase64` | `(base64: string) => Bytes` | Base64 문자열을 `Uint8Array`로 변환. 유효하지 않은 문자/길이이면 `ArgumentError` |
|
|
18
|
-
|
|
19
|
-
## Usage
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
import { bytes } from "@simplysm/core-common";
|
|
23
|
-
|
|
24
|
-
// concat
|
|
25
|
-
const a = new Uint8Array([1, 2]);
|
|
26
|
-
const b = new Uint8Array([3, 4]);
|
|
27
|
-
bytes.concat([a, b]); // Uint8Array([1, 2, 3, 4])
|
|
28
|
-
|
|
29
|
-
// hex 변환
|
|
30
|
-
bytes.toHex(new Uint8Array([255, 0, 127])); // "ff007f"
|
|
31
|
-
bytes.fromHex("ff007f"); // Uint8Array([255, 0, 127])
|
|
32
|
-
|
|
33
|
-
// base64 변환
|
|
34
|
-
bytes.toBase64(new Uint8Array([72, 101, 108, 108, 111])); // "SGVsbG8="
|
|
35
|
-
bytes.fromBase64("SGVsbG8="); // Uint8Array([72, 101, 108, 108, 111])
|
|
36
|
-
```
|
package/docs/utils/dt.md
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# dt
|
|
2
|
-
|
|
3
|
-
날짜 포맷 유틸리티 네임스페이스. `DateTime`, `DateOnly`, `Time` 클래스 내부에서 사용되는 저수준 포맷/변환 함수를 제공한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { dt } from "@simplysm/core-common";
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Functions
|
|
10
|
-
|
|
11
|
-
| Function | Signature | Description |
|
|
12
|
-
|----------|-----------|-------------|
|
|
13
|
-
| `format` | `(formatString, args) => string` | 형식 문자열에 따라 날짜/시간을 문자열로 변환 |
|
|
14
|
-
| `normalizeMonth` | `(year, month, day) => DtNormalizedMonth` | 월 설정 시 연/월/일 정규화 (범위 벗어난 월 처리, 마지막 일 초과 처리) |
|
|
15
|
-
| `convert12To24` | `(rawHour, isPM) => number` | 12시간 형식을 24시간 형식으로 변환 |
|
|
16
|
-
|
|
17
|
-
## `format` — args
|
|
18
|
-
|
|
19
|
-
| Field | Type | Description |
|
|
20
|
-
|-------|------|-------------|
|
|
21
|
-
| `year` | `number` | 연도 |
|
|
22
|
-
| `month` | `number` | 월 |
|
|
23
|
-
| `day` | `number` | 일 |
|
|
24
|
-
| `hour` | `number` | 시 |
|
|
25
|
-
| `minute` | `number` | 분 |
|
|
26
|
-
| `second` | `number` | 초 |
|
|
27
|
-
| `millisecond` | `number` | 밀리초 |
|
|
28
|
-
| `timezoneOffsetMinutes` | `number` | 타임존 오프셋 (분) |
|
|
29
|
-
|
|
30
|
-
형식 문자열 토큰은 [`DateTime.toFormatString`](../types/date-time.md)과 동일하다.
|
|
31
|
-
|
|
32
|
-
## Related Types
|
|
33
|
-
|
|
34
|
-
### `DtNormalizedMonth`
|
|
35
|
-
|
|
36
|
-
`normalizeMonth()` 결과 타입:
|
|
37
|
-
|
|
38
|
-
| Field | Type | Description |
|
|
39
|
-
|-------|------|-------------|
|
|
40
|
-
| `year` | `number` | 정규화된 연도 |
|
|
41
|
-
| `month` | `number` | 정규화된 월 (1-12) |
|
|
42
|
-
| `day` | `number` | 정규화된 일 |
|
|
43
|
-
|
|
44
|
-
## Usage
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
import { dt } from "@simplysm/core-common";
|
|
48
|
-
|
|
49
|
-
// 포맷
|
|
50
|
-
dt.format("yyyy-MM-dd", { year: 2025, month: 1, day: 15 }); // "2025-01-15"
|
|
51
|
-
|
|
52
|
-
// 월 정규화
|
|
53
|
-
dt.normalizeMonth(2025, 13, 15); // { year: 2026, month: 1, day: 15 }
|
|
54
|
-
dt.normalizeMonth(2025, 2, 31); // { year: 2025, month: 2, day: 28 }
|
|
55
|
-
|
|
56
|
-
// 12시간 → 24시간
|
|
57
|
-
dt.convert12To24(12, false); // 0 (12:00 AM = 0:00)
|
|
58
|
-
dt.convert12To24(12, true); // 12 (12:00 PM = 12:00)
|
|
59
|
-
dt.convert12To24(3, true); // 15 (3:00 PM = 15:00)
|
|
60
|
-
```
|
package/docs/utils/err.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# err
|
|
2
|
-
|
|
3
|
-
에러 메시지 추출 유틸리티 네임스페이스.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { err } from "@simplysm/core-common";
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Functions
|
|
10
|
-
|
|
11
|
-
| Function | Signature | Description |
|
|
12
|
-
|----------|-----------|-------------|
|
|
13
|
-
| `message` | `(err: unknown) => string` | `catch` 블록의 `unknown` 에러에서 메시지 추출. `Error` 인스턴스이면 `message` 속성 반환, 그렇지 않으면 `String()` 변환 결과 반환 |
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
import { err } from "@simplysm/core-common";
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
await doSomething();
|
|
22
|
-
} catch (e) {
|
|
23
|
-
const msg = err.message(e); // string
|
|
24
|
-
console.log(msg);
|
|
25
|
-
}
|
|
26
|
-
```
|
package/docs/utils/json.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# json
|
|
2
|
-
|
|
3
|
-
JSON 변환 유틸리티 네임스페이스. `DateTime`, `DateOnly`, `Time`, `Uuid`, `Set`, `Map`, `Error`, `Uint8Array` 등 커스텀 타입을 지원하는 직렬화/역직렬화를 제공한다.
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { json } from "@simplysm/core-common";
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Functions
|
|
10
|
-
|
|
11
|
-
| Function | Signature | Description |
|
|
12
|
-
|----------|-----------|-------------|
|
|
13
|
-
| `stringify` | `(obj, options?) => string` | 객체를 JSON 문자열로 직렬화 |
|
|
14
|
-
| `parse` | `<TResult = unknown>(json: string) => TResult` | JSON 문자열을 객체로 역직렬화. null 값은 undefined로 변환 |
|
|
15
|
-
|
|
16
|
-
## `stringify` — options
|
|
17
|
-
|
|
18
|
-
| Field | Type | Description |
|
|
19
|
-
|-------|------|-------------|
|
|
20
|
-
| `space` | `string \| number` | JSON 들여쓰기 |
|
|
21
|
-
| `replacer` | `(key, value) => unknown` | 커스텀 replacer. 기본 타입 변환 전에 호출됨 |
|
|
22
|
-
| `redactBytes` | `boolean` | `true`이면 `Uint8Array` 내용을 `"__hidden__"`으로 대체 (로깅용). 이 옵션으로 직렬화된 결과는 `parse()`로 복원 불가 |
|
|
23
|
-
|
|
24
|
-
## 지원 타입
|
|
25
|
-
|
|
26
|
-
| 타입 | 직렬화 형식 |
|
|
27
|
-
|------|-------------|
|
|
28
|
-
| `DateTime` | `{ __type__: "DateTime", data: "yyyy-MM-ddTHH:mm:ss.fffzzz" }` |
|
|
29
|
-
| `DateOnly` | `{ __type__: "DateOnly", data: "yyyy-MM-dd" }` |
|
|
30
|
-
| `Time` | `{ __type__: "Time", data: "HH:mm:ss.fff" }` |
|
|
31
|
-
| `Uuid` | `{ __type__: "Uuid", data: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }` |
|
|
32
|
-
| `Date` | `{ __type__: "Date", data: ISO8601 }` |
|
|
33
|
-
| `Set` | `{ __type__: "Set", data: [...] }` |
|
|
34
|
-
| `Map` | `{ __type__: "Map", data: [[k, v], ...] }` |
|
|
35
|
-
| `Error` | `{ __type__: "Error", data: { name, message, stack, ... } }` |
|
|
36
|
-
| `Uint8Array` | `{ __type__: "Uint8Array", data: "hex문자열" }` |
|
|
37
|
-
|
|
38
|
-
`parse()`는 JSON null 값을 undefined로 변환한다. 이는 simplysm 프레임워크의 null-free 규칙을 위한 의도적인 동작이다.
|
|
39
|
-
|
|
40
|
-
## Usage
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
import { json, DateTime, Uuid } from "@simplysm/core-common";
|
|
44
|
-
|
|
45
|
-
// 커스텀 타입 지원 직렬화
|
|
46
|
-
const serialized = json.stringify({
|
|
47
|
-
date: new DateTime(),
|
|
48
|
-
id: Uuid.generate(),
|
|
49
|
-
data: new Uint8Array([1, 2, 3]),
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// 커스텀 타입 복원
|
|
53
|
-
const restored = json.parse<{ date: DateTime; id: Uuid }>(serialized);
|
|
54
|
-
// restored.date는 DateTime 인스턴스
|
|
55
|
-
|
|
56
|
-
// 로깅용 (바이너리 숨김)
|
|
57
|
-
const logStr = json.stringify({ data: sensitiveBytes }, { redactBytes: true });
|
|
58
|
-
```
|