@simplysm/core-node 13.0.0-beta.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/.cache/typecheck-node.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
- package/README.md +375 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/core-node/src/features/fs-watcher.d.ts +70 -0
- package/dist/core-node/src/features/fs-watcher.d.ts.map +1 -0
- package/dist/core-node/src/index.d.ts +7 -0
- package/dist/core-node/src/index.d.ts.map +1 -0
- package/dist/core-node/src/utils/fs.d.ts +197 -0
- package/dist/core-node/src/utils/fs.d.ts.map +1 -0
- package/dist/core-node/src/utils/path.d.ts +75 -0
- package/dist/core-node/src/utils/path.d.ts.map +1 -0
- package/dist/core-node/src/worker/create-worker.d.ts +23 -0
- package/dist/core-node/src/worker/create-worker.d.ts.map +1 -0
- package/dist/core-node/src/worker/types.d.ts +67 -0
- package/dist/core-node/src/worker/types.d.ts.map +1 -0
- package/dist/core-node/src/worker/worker.d.ts +27 -0
- package/dist/core-node/src/worker/worker.d.ts.map +1 -0
- package/dist/features/fs-watcher.js +100 -0
- package/dist/features/fs-watcher.js.map +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +7 -0
- package/dist/utils/fs.js +305 -0
- package/dist/utils/fs.js.map +7 -0
- package/dist/utils/path.js +48 -0
- package/dist/utils/path.js.map +7 -0
- package/dist/worker/create-worker.js +85 -0
- package/dist/worker/create-worker.js.map +7 -0
- package/dist/worker/types.js +1 -0
- package/dist/worker/types.js.map +7 -0
- package/dist/worker/worker.js +142 -0
- package/dist/worker/worker.js.map +7 -0
- package/lib/worker-dev-proxy.js +12 -0
- package/package.json +23 -0
- package/src/features/fs-watcher.ts +176 -0
- package/src/index.ts +11 -0
- package/src/utils/fs.ts +550 -0
- package/src/utils/path.ts +128 -0
- package/src/worker/create-worker.ts +141 -0
- package/src/worker/types.ts +86 -0
- package/src/worker/worker.ts +207 -0
- package/tests/utils/fs-watcher.spec.ts +295 -0
- package/tests/utils/fs.spec.ts +754 -0
- package/tests/utils/path.spec.ts +192 -0
- package/tests/worker/fixtures/test-worker.ts +35 -0
- package/tests/worker/sd-worker.spec.ts +183 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XML 변환 유틸리티
|
|
3
|
+
*/
|
|
4
|
+
import type { XmlBuilderOptions } from "fast-xml-parser";
|
|
5
|
+
/**
|
|
6
|
+
* XML 문자열을 객체로 파싱
|
|
7
|
+
* @param str XML 문자열
|
|
8
|
+
* @param options 옵션
|
|
9
|
+
* @param options.stripTagPrefix 태그 prefix 제거 여부 (namespace)
|
|
10
|
+
* @returns 파싱된 객체. 구조:
|
|
11
|
+
* - 속성: `$` 객체에 그룹화
|
|
12
|
+
* - 텍스트 노드: `_` 키에 저장
|
|
13
|
+
* - 자식 요소: 배열로 변환 (루트 요소 제외)
|
|
14
|
+
* @example
|
|
15
|
+
* xmlParse('<root id="1"><item>hello</item></root>');
|
|
16
|
+
* // { root: { $: { id: "1" }, item: [{ _: "hello" }] } }
|
|
17
|
+
*/
|
|
18
|
+
export declare function xmlParse(str: string, options?: {
|
|
19
|
+
stripTagPrefix?: boolean;
|
|
20
|
+
}): unknown;
|
|
21
|
+
/**
|
|
22
|
+
* 객체를 XML 문자열로 직렬화
|
|
23
|
+
* @param obj 직렬화할 객체
|
|
24
|
+
* @param options fast-xml-parser XmlBuilderOptions (선택)
|
|
25
|
+
* @returns XML 문자열
|
|
26
|
+
* @example
|
|
27
|
+
* xmlStringify({
|
|
28
|
+
* root: {
|
|
29
|
+
* $: { id: "1" },
|
|
30
|
+
* item: [{ _: "hello" }, { _: "world" }],
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* // '<root id="1"><item>hello</item><item>world</item></root>'
|
|
34
|
+
*/
|
|
35
|
+
export declare function xmlStringify(obj: unknown, options?: XmlBuilderOptions): string;
|
|
36
|
+
//# sourceMappingURL=xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/utils/xml.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAKzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAarF;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAS9E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Bytes } from "../common.types";
|
|
2
|
+
export interface ZipArchiveProgress {
|
|
3
|
+
fileName: string;
|
|
4
|
+
totalSize: number;
|
|
5
|
+
extractedSize: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* ZIP 아카이브 처리 클래스
|
|
9
|
+
*
|
|
10
|
+
* ZIP 파일의 읽기, 쓰기, 압축/해제를 처리합니다.
|
|
11
|
+
* 내부 캐시를 사용하여 동일 파일의 중복 압축 해제를 방지합니다.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // ZIP 파일 읽기
|
|
15
|
+
* await using archive = new ZipArchive(zipBytes);
|
|
16
|
+
* const content = await archive.get("file.txt");
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // ZIP 파일 생성
|
|
20
|
+
* await using archive = new ZipArchive();
|
|
21
|
+
* archive.write("file.txt", textBytes);
|
|
22
|
+
* archive.write("data.json", jsonBytes);
|
|
23
|
+
* const zipBytes = await archive.compress();
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // 전체 압축 해제 (진행률 표시)
|
|
27
|
+
* await using archive = new ZipArchive(zipBytes);
|
|
28
|
+
* const files = await archive.extractAll((progress) => {
|
|
29
|
+
* console.log(`${progress.fileName}: ${progress.extractedSize}/${progress.totalSize}`);
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
export declare class ZipArchive {
|
|
33
|
+
private readonly _reader?;
|
|
34
|
+
private readonly _cache;
|
|
35
|
+
private _entries?;
|
|
36
|
+
/**
|
|
37
|
+
* ZipArchive 생성
|
|
38
|
+
* @param data ZIP 데이터 (생략 시 새 아카이브 생성)
|
|
39
|
+
*/
|
|
40
|
+
constructor(data?: Blob | Bytes);
|
|
41
|
+
private _getEntries;
|
|
42
|
+
/**
|
|
43
|
+
* 모든 파일을 압축 해제
|
|
44
|
+
* @param progressCallback 진행률 콜백
|
|
45
|
+
*/
|
|
46
|
+
extractAll(progressCallback?: (progress: ZipArchiveProgress) => void): Promise<Map<string, Bytes | undefined>>;
|
|
47
|
+
/**
|
|
48
|
+
* 특정 파일 압축 해제
|
|
49
|
+
* @param fileName 파일 이름
|
|
50
|
+
*/
|
|
51
|
+
get(fileName: string): Promise<Bytes | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* 파일 존재 여부 확인
|
|
54
|
+
* @param fileName 파일 이름
|
|
55
|
+
*/
|
|
56
|
+
exists(fileName: string): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* 파일 쓰기 (캐시에 저장)
|
|
59
|
+
* @param fileName 파일 이름
|
|
60
|
+
* @param bytes 파일 내용
|
|
61
|
+
*/
|
|
62
|
+
write(fileName: string, bytes: Bytes): void;
|
|
63
|
+
/**
|
|
64
|
+
* 캐시된 파일들을 ZIP으로 압축
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* 내부적으로 `extractAll()`을 호출하여 모든 파일을 메모리에 로드한 후 압축합니다.
|
|
68
|
+
* 대용량 ZIP 파일의 경우 메모리 사용량에 주의가 필요합니다.
|
|
69
|
+
*/
|
|
70
|
+
compress(): Promise<Bytes>;
|
|
71
|
+
/**
|
|
72
|
+
* 리더 닫기 및 캐시 정리
|
|
73
|
+
*/
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* await using 지원
|
|
77
|
+
*/
|
|
78
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sd-zip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-zip.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/zip/sd-zip.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,CAA6D;IAE9E;;;OAGG;gBACS,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK;YAUjB,WAAW;IAQzB;;;OAGG;IACG,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IAkDpH;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAwBvD;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3C;;;;;;OAMG;IACG,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAiBhC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as chokidar from "chokidar";
|
|
2
|
+
import { type NormPath } from "../utils/path";
|
|
3
|
+
/**
|
|
4
|
+
* 지원하는 파일 변경 이벤트 타입 목록.
|
|
5
|
+
*/
|
|
6
|
+
declare const FS_WATCHER_EVENTS: readonly ["add", "addDir", "change", "unlink", "unlinkDir"];
|
|
7
|
+
/**
|
|
8
|
+
* 파일 변경 이벤트 타입.
|
|
9
|
+
*/
|
|
10
|
+
export type FsWatcherEvent = (typeof FS_WATCHER_EVENTS)[number];
|
|
11
|
+
/**
|
|
12
|
+
* 파일 변경 정보.
|
|
13
|
+
*/
|
|
14
|
+
export interface FsWatcherChangeInfo {
|
|
15
|
+
/** 변경 이벤트 타입 */
|
|
16
|
+
event: FsWatcherEvent;
|
|
17
|
+
/** 변경된 파일/디렉토리 경로 (정규화됨) */
|
|
18
|
+
path: NormPath;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* chokidar 기반 파일 시스템 감시 래퍼.
|
|
22
|
+
* 짧은 시간 내 발생한 이벤트를 병합하여 콜백 호출.
|
|
23
|
+
*
|
|
24
|
+
* **주의**: chokidar의 `ignoreInitial` 옵션은 내부적으로 항상 `true`로 설정된다.
|
|
25
|
+
* `options.ignoreInitial: false`를 전달하면 `onChange` 첫 호출 시 빈 배열로
|
|
26
|
+
* 콜백이 호출되지만, 실제 초기 파일 목록은 포함되지 않는다.
|
|
27
|
+
* 이는 이벤트 병합 로직과의 충돌을 방지하기 위한 의도된 동작이다.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* const watcher = await FsWatcher.watch(["src/**\/*.ts"]);
|
|
31
|
+
* watcher.onChange({ delay: 300 }, (changes) => {
|
|
32
|
+
* for (const { path, event } of changes) {
|
|
33
|
+
* console.log(`${event}: ${path}`);
|
|
34
|
+
* }
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // 종료
|
|
38
|
+
* await watcher.close();
|
|
39
|
+
*/
|
|
40
|
+
export declare class FsWatcher {
|
|
41
|
+
/**
|
|
42
|
+
* 파일 감시 시작 (비동기).
|
|
43
|
+
* ready 이벤트가 발생할 때까지 대기.
|
|
44
|
+
*
|
|
45
|
+
* @param paths - 감시할 파일/디렉토리 경로 또는 glob 패턴 배열
|
|
46
|
+
* @param options - chokidar 옵션
|
|
47
|
+
*/
|
|
48
|
+
static watch(paths: string[], options?: chokidar.ChokidarOptions): Promise<FsWatcher>;
|
|
49
|
+
private readonly _watcher;
|
|
50
|
+
private readonly _ignoreInitial;
|
|
51
|
+
private readonly _debounceQueues;
|
|
52
|
+
private readonly _logger;
|
|
53
|
+
private constructor();
|
|
54
|
+
/**
|
|
55
|
+
* 파일 변경 이벤트 핸들러 등록.
|
|
56
|
+
* 지정된 delay 시간 동안 이벤트를 모아서 한 번에 콜백 호출.
|
|
57
|
+
*
|
|
58
|
+
* @param opt.delay - 이벤트 병합 대기 시간 (ms)
|
|
59
|
+
* @param cb - 변경 이벤트 콜백
|
|
60
|
+
*/
|
|
61
|
+
onChange(opt: {
|
|
62
|
+
delay?: number;
|
|
63
|
+
}, cb: (changeInfos: FsWatcherChangeInfo[]) => void | Promise<void>): this;
|
|
64
|
+
/**
|
|
65
|
+
* 파일 감시 종료.
|
|
66
|
+
*/
|
|
67
|
+
close(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=fs-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../../../../src/features/fs-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,eAAe,CAAC;AAIxD;;GAEG;AACH,QAAA,MAAM,iBAAiB,6DAA8D,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,4BAA4B;IAC5B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,SAAS;IACpB;;;;;;OAMG;WACU,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAU3F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;IAEvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAEpE,OAAO;IAcP;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,mBAAmB,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAkEzG;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAG7B,cAAc,uBAAuB,CAAC;AAGtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { type GlobOptions } from "glob";
|
|
3
|
+
import "@simplysm/core-common";
|
|
4
|
+
/**
|
|
5
|
+
* 파일 또는 디렉토리 존재 확인 (동기).
|
|
6
|
+
* @param targetPath - 확인할 경로
|
|
7
|
+
*/
|
|
8
|
+
export declare function fsExistsSync(targetPath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 파일 또는 디렉토리 존재 확인 (비동기).
|
|
11
|
+
* @param targetPath - 확인할 경로
|
|
12
|
+
*/
|
|
13
|
+
export declare function fsExists(targetPath: string): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* 디렉토리 생성 (recursive).
|
|
16
|
+
* @param targetPath - 생성할 디렉토리 경로
|
|
17
|
+
*/
|
|
18
|
+
export declare function fsMkdirSync(targetPath: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* 디렉토리 생성 (recursive, 비동기).
|
|
21
|
+
* @param targetPath - 생성할 디렉토리 경로
|
|
22
|
+
*/
|
|
23
|
+
export declare function fsMkdir(targetPath: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 파일 또는 디렉토리 삭제.
|
|
26
|
+
* @param targetPath - 삭제할 경로
|
|
27
|
+
* @remarks 동기 버전은 재시도 없이 즉시 실패함. 파일 잠금 등 일시적 오류 가능성이 있는 경우 fsRm 사용을 권장함.
|
|
28
|
+
*/
|
|
29
|
+
export declare function fsRmSync(targetPath: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* 파일 또는 디렉토리 삭제 (비동기).
|
|
32
|
+
* @param targetPath - 삭제할 경로
|
|
33
|
+
* @remarks 비동기 버전은 파일 잠금 등의 일시적 오류에 대해 최대 6회(500ms 간격) 재시도함.
|
|
34
|
+
*/
|
|
35
|
+
export declare function fsRm(targetPath: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* 파일 또는 디렉토리 복사.
|
|
38
|
+
*
|
|
39
|
+
* sourcePath가 존재하지 않으면 아무 작업도 수행하지 않고 반환한다.
|
|
40
|
+
*
|
|
41
|
+
* @param sourcePath 복사할 원본 경로
|
|
42
|
+
* @param targetPath 복사 대상 경로
|
|
43
|
+
* @param filter 복사 여부를 결정하는 필터 함수.
|
|
44
|
+
* 각 파일/디렉토리의 **절대 경로**가 전달되며,
|
|
45
|
+
* true를 반환하면 복사, false면 제외.
|
|
46
|
+
* **주의**: 최상위 sourcePath는 필터 대상이 아니며,
|
|
47
|
+
* 모든 하위 항목(자식, 손자 등)에 재귀적으로 filter 함수가 적용된다.
|
|
48
|
+
* 디렉토리에 false를 반환하면 해당 디렉토리와 모든 하위 항목이 건너뛰어짐.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fsCopySync(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean): void;
|
|
51
|
+
/**
|
|
52
|
+
* 파일 또는 디렉토리 복사 (비동기).
|
|
53
|
+
*
|
|
54
|
+
* sourcePath가 존재하지 않으면 아무 작업도 수행하지 않고 반환한다.
|
|
55
|
+
*
|
|
56
|
+
* @param sourcePath 복사할 원본 경로
|
|
57
|
+
* @param targetPath 복사 대상 경로
|
|
58
|
+
* @param filter 복사 여부를 결정하는 필터 함수.
|
|
59
|
+
* 각 파일/디렉토리의 **절대 경로**가 전달되며,
|
|
60
|
+
* true를 반환하면 복사, false면 제외.
|
|
61
|
+
* **주의**: 최상위 sourcePath는 필터 대상이 아니며,
|
|
62
|
+
* 모든 하위 항목(자식, 손자 등)에 재귀적으로 filter 함수가 적용된다.
|
|
63
|
+
* 디렉토리에 false를 반환하면 해당 디렉토리와 모든 하위 항목이 건너뛰어짐.
|
|
64
|
+
*/
|
|
65
|
+
export declare function fsCopy(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* 파일 읽기 (UTF-8 문자열).
|
|
68
|
+
* @param targetPath - 읽을 파일 경로
|
|
69
|
+
*/
|
|
70
|
+
export declare function fsReadSync(targetPath: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* 파일 읽기 (UTF-8 문자열, 비동기).
|
|
73
|
+
* @param targetPath - 읽을 파일 경로
|
|
74
|
+
*/
|
|
75
|
+
export declare function fsRead(targetPath: string): Promise<string>;
|
|
76
|
+
/**
|
|
77
|
+
* 파일 읽기 (Buffer).
|
|
78
|
+
* @param targetPath - 읽을 파일 경로
|
|
79
|
+
*/
|
|
80
|
+
export declare function fsReadBufferSync(targetPath: string): Buffer;
|
|
81
|
+
/**
|
|
82
|
+
* 파일 읽기 (Buffer, 비동기).
|
|
83
|
+
* @param targetPath - 읽을 파일 경로
|
|
84
|
+
*/
|
|
85
|
+
export declare function fsReadBuffer(targetPath: string): Promise<Buffer>;
|
|
86
|
+
/**
|
|
87
|
+
* JSON 파일 읽기 (JsonConvert 사용).
|
|
88
|
+
* @param targetPath - 읽을 JSON 파일 경로
|
|
89
|
+
*/
|
|
90
|
+
export declare function fsReadJsonSync<T = unknown>(targetPath: string): T;
|
|
91
|
+
/**
|
|
92
|
+
* JSON 파일 읽기 (JsonConvert 사용, 비동기).
|
|
93
|
+
* @param targetPath - 읽을 JSON 파일 경로
|
|
94
|
+
*/
|
|
95
|
+
export declare function fsReadJson<T = unknown>(targetPath: string): Promise<T>;
|
|
96
|
+
/**
|
|
97
|
+
* 파일 쓰기 (부모 디렉토리 자동 생성).
|
|
98
|
+
* @param targetPath - 쓸 파일 경로
|
|
99
|
+
* @param data - 쓸 데이터 (문자열 또는 바이너리)
|
|
100
|
+
*/
|
|
101
|
+
export declare function fsWriteSync(targetPath: string, data: string | Uint8Array): void;
|
|
102
|
+
/**
|
|
103
|
+
* 파일 쓰기 (부모 디렉토리 자동 생성, 비동기).
|
|
104
|
+
* @param targetPath - 쓸 파일 경로
|
|
105
|
+
* @param data - 쓸 데이터 (문자열 또는 바이너리)
|
|
106
|
+
*/
|
|
107
|
+
export declare function fsWrite(targetPath: string, data: string | Uint8Array): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* JSON 파일 쓰기 (JsonConvert 사용).
|
|
110
|
+
* @param targetPath - 쓸 JSON 파일 경로
|
|
111
|
+
* @param data - 쓸 데이터
|
|
112
|
+
* @param options - JSON 직렬화 옵션
|
|
113
|
+
*/
|
|
114
|
+
export declare function fsWriteJsonSync(targetPath: string, data: unknown, options?: {
|
|
115
|
+
replacer?: (this: unknown, key: string | undefined, value: unknown) => unknown;
|
|
116
|
+
space?: string | number;
|
|
117
|
+
}): void;
|
|
118
|
+
/**
|
|
119
|
+
* JSON 파일 쓰기 (JsonConvert 사용, 비동기).
|
|
120
|
+
* @param targetPath - 쓸 JSON 파일 경로
|
|
121
|
+
* @param data - 쓸 데이터
|
|
122
|
+
* @param options - JSON 직렬화 옵션
|
|
123
|
+
*/
|
|
124
|
+
export declare function fsWriteJson(targetPath: string, data: unknown, options?: {
|
|
125
|
+
replacer?: (this: unknown, key: string | undefined, value: unknown) => unknown;
|
|
126
|
+
space?: string | number;
|
|
127
|
+
}): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* 디렉토리 내용 읽기.
|
|
130
|
+
* @param targetPath - 읽을 디렉토리 경로
|
|
131
|
+
*/
|
|
132
|
+
export declare function fsReaddirSync(targetPath: string): string[];
|
|
133
|
+
/**
|
|
134
|
+
* 디렉토리 내용 읽기 (비동기).
|
|
135
|
+
* @param targetPath - 읽을 디렉토리 경로
|
|
136
|
+
*/
|
|
137
|
+
export declare function fsReaddir(targetPath: string): Promise<string[]>;
|
|
138
|
+
/**
|
|
139
|
+
* 파일/디렉토리 정보 (심볼릭 링크 따라감).
|
|
140
|
+
* @param targetPath - 정보를 조회할 경로
|
|
141
|
+
*/
|
|
142
|
+
export declare function fsStatSync(targetPath: string): fs.Stats;
|
|
143
|
+
/**
|
|
144
|
+
* 파일/디렉토리 정보 (심볼릭 링크 따라감, 비동기).
|
|
145
|
+
* @param targetPath - 정보를 조회할 경로
|
|
146
|
+
*/
|
|
147
|
+
export declare function fsStat(targetPath: string): Promise<fs.Stats>;
|
|
148
|
+
/**
|
|
149
|
+
* 파일/디렉토리 정보 (심볼릭 링크 따라가지 않음).
|
|
150
|
+
* @param targetPath - 정보를 조회할 경로
|
|
151
|
+
*/
|
|
152
|
+
export declare function fsLstatSync(targetPath: string): fs.Stats;
|
|
153
|
+
/**
|
|
154
|
+
* 파일/디렉토리 정보 (심볼릭 링크 따라가지 않음, 비동기).
|
|
155
|
+
* @param targetPath - 정보를 조회할 경로
|
|
156
|
+
*/
|
|
157
|
+
export declare function fsLstat(targetPath: string): Promise<fs.Stats>;
|
|
158
|
+
/**
|
|
159
|
+
* 글로브 패턴으로 파일 검색.
|
|
160
|
+
* @param pattern - 글로브 패턴 (예: "**\/*.ts")
|
|
161
|
+
* @param options - glob 옵션
|
|
162
|
+
* @returns 매칭된 파일들의 절대 경로 배열
|
|
163
|
+
*/
|
|
164
|
+
export declare function fsGlobSync(pattern: string, options?: GlobOptions): string[];
|
|
165
|
+
/**
|
|
166
|
+
* 글로브 패턴으로 파일 검색 (비동기).
|
|
167
|
+
* @param pattern - 글로브 패턴 (예: "**\/*.ts")
|
|
168
|
+
* @param options - glob 옵션
|
|
169
|
+
* @returns 매칭된 파일들의 절대 경로 배열
|
|
170
|
+
*/
|
|
171
|
+
export declare function fsGlob(pattern: string, options?: GlobOptions): Promise<string[]>;
|
|
172
|
+
/**
|
|
173
|
+
* 지정 디렉토리 하위의 빈 디렉토리를 재귀적으로 탐색하여 삭제.
|
|
174
|
+
* 하위 디렉토리가 모두 삭제되어 빈 디렉토리가 된 경우, 해당 디렉토리도 삭제 대상이 됨.
|
|
175
|
+
*/
|
|
176
|
+
export declare function fsClearEmptyDirectory(dirPath: string): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* 시작 경로부터 루트 방향으로 상위 디렉토리를 순회하며 glob 패턴 검색.
|
|
179
|
+
* 각 디렉토리에서 childGlob 패턴에 매칭되는 모든 파일 경로를 수집.
|
|
180
|
+
* @param childGlob - 각 디렉토리에서 검색할 glob 패턴
|
|
181
|
+
* @param fromPath - 검색 시작 경로
|
|
182
|
+
* @param rootPath - 검색 종료 경로 (미지정 시 파일시스템 루트까지).
|
|
183
|
+
* **주의**: fromPath가 rootPath의 자식 경로여야 함.
|
|
184
|
+
* 그렇지 않으면 파일시스템 루트까지 검색함.
|
|
185
|
+
*/
|
|
186
|
+
export declare function fsFindAllParentChildPathsSync(childGlob: string, fromPath: string, rootPath?: string): string[];
|
|
187
|
+
/**
|
|
188
|
+
* 시작 경로부터 루트 방향으로 상위 디렉토리를 순회하며 glob 패턴 검색 (비동기).
|
|
189
|
+
* 각 디렉토리에서 childGlob 패턴에 매칭되는 모든 파일 경로를 수집.
|
|
190
|
+
* @param childGlob - 각 디렉토리에서 검색할 glob 패턴
|
|
191
|
+
* @param fromPath - 검색 시작 경로
|
|
192
|
+
* @param rootPath - 검색 종료 경로 (미지정 시 파일시스템 루트까지).
|
|
193
|
+
* **주의**: fromPath가 rootPath의 자식 경로여야 함.
|
|
194
|
+
* 그렇지 않으면 파일시스템 루트까지 검색함.
|
|
195
|
+
*/
|
|
196
|
+
export declare function fsFindAllParentChildPaths(childGlob: string, fromPath: string, rootPath?: string): Promise<string[]>;
|
|
197
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
declare const NORM: unique symbol;
|
|
2
|
+
/**
|
|
3
|
+
* 정규화된 경로를 나타내는 브랜드 타입.
|
|
4
|
+
* pathNorm()을 통해서만 생성 가능.
|
|
5
|
+
*/
|
|
6
|
+
export type NormPath = string & {
|
|
7
|
+
[NORM]: never;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* POSIX 스타일 경로로 변환 (백슬래시 → 슬래시).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* pathPosix("C:\\Users\\test"); // "C:/Users/test"
|
|
14
|
+
* pathPosix("src", "index.ts"); // "src/index.ts"
|
|
15
|
+
*/
|
|
16
|
+
export declare function pathPosix(...args: string[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* 파일 경로의 디렉토리를 변경.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* pathChangeFileDirectory("/a/b/c.txt", "/a", "/x");
|
|
22
|
+
* // → "/x/b/c.txt"
|
|
23
|
+
*
|
|
24
|
+
* @throws 파일이 fromDirectory 안에 없으면 에러
|
|
25
|
+
*/
|
|
26
|
+
export declare function pathChangeFileDirectory(filePath: string, fromDirectory: string, toDirectory: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 확장자를 제거한 파일명(basename)을 반환.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* pathGetBasenameWithoutExt("file.txt"); // "file"
|
|
32
|
+
* pathGetBasenameWithoutExt("/path/to/file.spec.ts"); // "file.spec"
|
|
33
|
+
*/
|
|
34
|
+
export declare function pathGetBasenameWithoutExt(filePath: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* childPath가 parentPath의 자식 경로인지 확인.
|
|
37
|
+
* 같은 경로는 false 반환.
|
|
38
|
+
*
|
|
39
|
+
* 경로는 내부적으로 `pathNorm()`으로 정규화된 후 비교되며,
|
|
40
|
+
* 플랫폼별 경로 구분자(Windows: `\`, Unix: `/`)를 사용한다.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* pathIsChildPath("/a/b/c", "/a/b"); // true
|
|
44
|
+
* pathIsChildPath("/a/b", "/a/b/c"); // false
|
|
45
|
+
* pathIsChildPath("/a/b", "/a/b"); // false (같은 경로)
|
|
46
|
+
*/
|
|
47
|
+
export declare function pathIsChildPath(childPath: string, parentPath: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* 경로를 정규화하여 NormPath로 반환.
|
|
50
|
+
* 절대 경로로 변환되며, 플랫폼별 구분자로 정규화됨.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* pathNorm("/some/path"); // NormPath
|
|
54
|
+
* pathNorm("relative", "path"); // NormPath (절대 경로로 변환)
|
|
55
|
+
*/
|
|
56
|
+
export declare function pathNorm(...paths: string[]): NormPath;
|
|
57
|
+
/**
|
|
58
|
+
* 타겟 경로 목록을 기준으로 파일을 필터링.
|
|
59
|
+
* 파일이 타겟 경로와 같거나 타겟의 자식 경로일 때 포함.
|
|
60
|
+
*
|
|
61
|
+
* @param files - 필터링할 파일 경로 목록.
|
|
62
|
+
* **주의**: cwd 하위의 절대 경로여야 함.
|
|
63
|
+
* cwd 외부 경로는 상대 경로(../ 형태)로 변환되어 처리됨.
|
|
64
|
+
* @param targets - 타겟 경로 목록 (cwd 기준 상대 경로, POSIX 스타일 권장)
|
|
65
|
+
* @param cwd - 현재 작업 디렉토리 (절대 경로)
|
|
66
|
+
* @returns targets가 빈 배열이면 files 그대로, 아니면 타겟 경로 하위 파일만
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* const files = ["/proj/src/a.ts", "/proj/src/b.ts", "/proj/tests/c.ts"];
|
|
70
|
+
* pathFilterByTargets(files, ["src"], "/proj");
|
|
71
|
+
* // → ["/proj/src/a.ts", "/proj/src/b.ts"]
|
|
72
|
+
*/
|
|
73
|
+
export declare function pathFilterByTargets(files: string[], targets: string[], cwd: string): string[];
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../src/utils/path.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,IAAI,eAAqB,CAAC;AAEhC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAC9B,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAMF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAGnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAU5G;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAa9E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAErD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAO7F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 워커 스레드에서 사용할 워커 팩토리.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* // 이벤트 없는 워커
|
|
6
|
+
* export default createWorker({
|
|
7
|
+
* add: (a: number, b: number) => a + b,
|
|
8
|
+
* });
|
|
9
|
+
*
|
|
10
|
+
* // 이벤트 있는 워커
|
|
11
|
+
* interface MyEvents { progress: number; }
|
|
12
|
+
* const methods = {
|
|
13
|
+
* calc: (x: number) => { sender.send("progress", 50); return x * 2; },
|
|
14
|
+
* };
|
|
15
|
+
* const sender = createWorker<typeof methods, MyEvents>(methods);
|
|
16
|
+
* export default sender;
|
|
17
|
+
*/
|
|
18
|
+
export declare function createWorker<TMethods extends Record<string, (...args: any[]) => unknown>, TEvents extends Record<string, unknown> = Record<string, never>>(methods: TMethods): {
|
|
19
|
+
send<K extends keyof TEvents & string>(event: K, data?: TEvents[K]): void;
|
|
20
|
+
__methods: TMethods;
|
|
21
|
+
__events: TEvents;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=create-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-worker.d.ts","sourceRoot":"","sources":["../../../../src/worker/create-worker.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,EAC5D,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAE/D,OAAO,EAAE,QAAQ,GAChB;IACD,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1E,SAAS,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,CA0GA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createWorker()`가 반환하는 워커 모듈의 타입 구조.
|
|
3
|
+
* `Worker.create<typeof import("./worker")>()`에서 타입 추론에 사용된다.
|
|
4
|
+
*
|
|
5
|
+
* @see createWorker - 워커 모듈 생성
|
|
6
|
+
* @see Worker.create - 워커 프록시 생성
|
|
7
|
+
*/
|
|
8
|
+
export interface WorkerModule {
|
|
9
|
+
default: {
|
|
10
|
+
__methods: Record<string, (...args: any[]) => unknown>;
|
|
11
|
+
__events: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 메서드 타입의 반환값을 Promise로 래핑하는 매핑 타입.
|
|
16
|
+
* 워커 메서드는 postMessage 기반으로 동작하여 항상 비동기이므로,
|
|
17
|
+
* 동기 메서드 타입도 `Promise<Awaited<R>>`로 변환한다.
|
|
18
|
+
*/
|
|
19
|
+
export type PromisifyMethods<T> = {
|
|
20
|
+
[K in keyof T]: T[K] extends (...args: infer P) => infer R ? (...args: P) => Promise<Awaited<R>> : never;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* SdWorker.create()가 반환하는 Proxy 타입.
|
|
24
|
+
* Promisified 메서드들 + on() + terminate() 제공.
|
|
25
|
+
*/
|
|
26
|
+
export type WorkerProxy<TModule extends WorkerModule> = PromisifyMethods<TModule["default"]["__methods"]> & {
|
|
27
|
+
/**
|
|
28
|
+
* 워커 이벤트 리스너 등록.
|
|
29
|
+
*/
|
|
30
|
+
on<K extends keyof TModule["default"]["__events"] & string>(event: K, listener: (data: TModule["default"]["__events"][K]) => void): void;
|
|
31
|
+
/**
|
|
32
|
+
* 워커 이벤트 리스너 제거.
|
|
33
|
+
*/
|
|
34
|
+
off<K extends keyof TModule["default"]["__events"] & string>(event: K, listener: (data: TModule["default"]["__events"][K]) => void): void;
|
|
35
|
+
/**
|
|
36
|
+
* 워커 종료.
|
|
37
|
+
*/
|
|
38
|
+
terminate(): Promise<void>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Worker 내부 요청 메시지.
|
|
42
|
+
*/
|
|
43
|
+
export interface WorkerRequest {
|
|
44
|
+
id: string;
|
|
45
|
+
method: string;
|
|
46
|
+
params: unknown[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Worker 내부 응답 메시지.
|
|
50
|
+
*/
|
|
51
|
+
export type WorkerResponse = {
|
|
52
|
+
request: WorkerRequest;
|
|
53
|
+
type: "return";
|
|
54
|
+
body?: unknown;
|
|
55
|
+
} | {
|
|
56
|
+
request: WorkerRequest;
|
|
57
|
+
type: "error";
|
|
58
|
+
body: Error;
|
|
59
|
+
} | {
|
|
60
|
+
type: "event";
|
|
61
|
+
event: string;
|
|
62
|
+
body?: unknown;
|
|
63
|
+
} | {
|
|
64
|
+
type: "log";
|
|
65
|
+
body: string;
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/worker/types.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;KAC/B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CACzG,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,SAAS,YAAY,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG;IAC1G;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,EACxD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,IAAI,CAAC;IAER;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,EACzD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,IAAI,CAAC;IAER;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IACE,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACD;IACE,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,KAAK,CAAC;CACb,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { WorkerOptions as WorkerRawOptions } from "worker_threads";
|
|
2
|
+
import type { WorkerModule, WorkerProxy } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* 타입 안전한 Worker 래퍼.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* // worker.ts
|
|
8
|
+
* export default createWorker({
|
|
9
|
+
* add: (a: number, b: number) => a + b,
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* // main.ts
|
|
13
|
+
* const worker = Worker.create<typeof import("./worker")>("./worker.ts");
|
|
14
|
+
* const result = await worker.add(10, 20); // 30
|
|
15
|
+
* await worker.terminate();
|
|
16
|
+
*/
|
|
17
|
+
export declare const Worker: {
|
|
18
|
+
/**
|
|
19
|
+
* 타입 안전한 Worker Proxy 생성.
|
|
20
|
+
*
|
|
21
|
+
* @param filePath - 워커 파일 경로 (file:// URL 또는 절대 경로)
|
|
22
|
+
* @param opt - Worker 옵션
|
|
23
|
+
* @returns Proxy 객체 (메서드 직접 호출, on(), terminate() 지원)
|
|
24
|
+
*/
|
|
25
|
+
create<TModule extends WorkerModule>(filePath: string, opt?: Omit<WorkerRawOptions, "stdout" | "stderr">): WorkerProxy<TModule>;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../../src/worker/worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAiC,MAAM,SAAS,CAAC;AAoJxF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;IACjB;;;;;;OAMG;WACI,OAAO,SAAS,YAAY,YACvB,MAAM,QACV,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAChD,WAAW,CAAC,OAAO,CAAC;CAyBxB,CAAC"}
|