sonamu 0.9.5 → 0.9.7
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/dist/api/config.d.ts +13 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/context.d.ts +17 -7
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +18 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +55 -4
- package/dist/api/index.js +8 -3
- package/dist/api/sonamu.d.ts +24 -9
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +365 -79
- package/dist/api/websocket-helpers.d.ts +24 -0
- package/dist/api/websocket-helpers.d.ts.map +1 -0
- package/dist/api/websocket-helpers.js +77 -0
- package/dist/bin/cli.js +12 -4
- package/dist/dict/sonamu-dictionary.js +5 -5
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.js +3 -3
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/migration/code-generation.js +7 -7
- package/dist/stream/index.d.ts +6 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +13 -2
- package/dist/stream/ws-audience-resolver.d.ts +15 -0
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
- package/dist/stream/ws-audience-resolver.js +31 -0
- package/dist/stream/ws-audience.d.ts +28 -0
- package/dist/stream/ws-audience.d.ts.map +1 -0
- package/dist/stream/ws-audience.js +46 -0
- package/dist/stream/ws-cluster-bus.d.ts +23 -0
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
- package/dist/stream/ws-cluster-bus.js +18 -0
- package/dist/stream/ws-core.d.ts +15 -0
- package/dist/stream/ws-core.d.ts.map +1 -0
- package/dist/stream/ws-core.js +1 -0
- package/dist/stream/ws-delivery.d.ts +24 -0
- package/dist/stream/ws-delivery.d.ts.map +1 -0
- package/dist/stream/ws-delivery.js +103 -0
- package/dist/stream/ws-local-connection-store.d.ts +10 -0
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
- package/dist/stream/ws-local-connection-store.js +44 -0
- package/dist/stream/ws-presence-store.d.ts +61 -0
- package/dist/stream/ws-presence-store.d.ts.map +1 -0
- package/dist/stream/ws-presence-store.js +236 -0
- package/dist/stream/ws-registry.d.ts +42 -0
- package/dist/stream/ws-registry.d.ts.map +1 -0
- package/dist/stream/ws-registry.js +108 -0
- package/dist/stream/ws.d.ts +52 -0
- package/dist/stream/ws.d.ts.map +1 -0
- package/dist/stream/ws.js +397 -0
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +72 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +13 -12
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +7 -4
- package/dist/syncer/event-batcher.d.ts +27 -0
- package/dist/syncer/event-batcher.d.ts.map +1 -0
- package/dist/syncer/event-batcher.js +69 -0
- package/dist/syncer/file-patterns.d.ts +48 -26
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +71 -23
- package/dist/syncer/file-tracking.d.ts +13 -0
- package/dist/syncer/file-tracking.d.ts.map +1 -0
- package/dist/syncer/file-tracking.js +33 -0
- package/dist/syncer/index.js +2 -2
- package/dist/syncer/module-loader.d.ts +2 -11
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +3 -3
- package/dist/syncer/syncer-actions.d.ts +39 -6
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +125 -10
- package/dist/syncer/syncer.d.ts +33 -19
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +168 -168
- package/dist/syncer/watcher.d.ts +8 -0
- package/dist/syncer/watcher.d.ts.map +1 -0
- package/dist/syncer/watcher.js +105 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +2 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +36 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +8 -1
- package/dist/testing/fixture-manager.js +1 -1
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -2
- package/dist/ui/api.js +1 -1
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-DzZ7vBk4.js → index-BmThfg-s.js} +37 -37
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/async-utils.d.ts +27 -3
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +56 -6
- package/dist/utils/formatter.d.ts +7 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +93 -59
- package/dist/utils/fs-utils.d.ts +2 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +10 -2
- package/dist/utils/process-utils.d.ts +10 -4
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +20 -7
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -2
- package/package.json +3 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
- package/src/api/__tests__/websocket-context.types.test.ts +58 -0
- package/src/api/config.ts +28 -2
- package/src/api/context.ts +21 -7
- package/src/api/decorators.ts +103 -3
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/dict/sonamu-dictionary.ts +2 -2
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +5 -5
- package/src/shared/app.shared.ts.txt +254 -1
- package/src/shared/web.shared.ts.txt +282 -1
- package/src/stream/__tests__/ws-contracts.test.ts +381 -0
- package/src/stream/__tests__/ws.test.ts +449 -0
- package/src/stream/index.ts +6 -0
- package/src/stream/ws-audience-resolver.ts +35 -0
- package/src/stream/ws-audience.ts +62 -0
- package/src/stream/ws-cluster-bus.ts +32 -0
- package/src/stream/ws-core.ts +16 -0
- package/src/stream/ws-delivery.ts +138 -0
- package/src/stream/ws-local-connection-store.ts +44 -0
- package/src/stream/ws-presence-store.ts +326 -0
- package/src/stream/ws-registry.ts +138 -0
- package/src/stream/ws.ts +591 -0
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
- package/src/syncer/api-parser.ts +112 -1
- package/src/syncer/checksum.ts +23 -29
- package/src/syncer/code-generator.ts +4 -1
- package/src/syncer/event-batcher.ts +72 -0
- package/src/syncer/file-patterns.ts +98 -30
- package/src/syncer/file-tracking.ts +27 -0
- package/src/syncer/module-loader.ts +5 -12
- package/src/syncer/syncer-actions.ts +179 -17
- package/src/syncer/syncer.ts +250 -287
- package/src/syncer/watcher.ts +128 -0
- package/src/tasks/workflow-manager.ts +1 -0
- package/src/template/__tests__/services.template.websocket.test.ts +79 -0
- package/src/template/implementations/services.template.ts +69 -0
- package/src/testing/bootstrap.ts +8 -1
- package/src/types/types.ts +20 -2
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +111 -74
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +21 -4
- package/src/utils/utils.ts +1 -1
package/dist/ui-web/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/sonamu-ui/setting.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>{{projectName}}: Sonamu UI</title>
|
|
8
|
-
<script type="module" crossorigin src="/sonamu-ui/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/sonamu-ui/assets/index-BmThfg-s.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/sonamu-ui/assets/index-D4rYm-Xz.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -25,8 +25,32 @@ export declare function reduceAsync<T, U>(arr: T[], reducer: (accumulator: U, cu
|
|
|
25
25
|
/**
|
|
26
26
|
* 비동기 glob 함수입니다.
|
|
27
27
|
* AsyncIterableIterator로 날아오는 glob의 반환을 받아 끝까지 돌아서 배열로 반환합니다.
|
|
28
|
-
*
|
|
29
|
-
* @
|
|
28
|
+
*
|
|
29
|
+
* @param pathPattern glob 패턴 (절대 경로 또는 상대 경로)
|
|
30
|
+
* @param options.exclude 매치에서 제외할 패턴 목록 (예: `["**\/node_modules/**"]`).
|
|
31
|
+
* alternation을 포함하는 패턴이 의도치 않게 빌드 산출물 디렉토리를 휘말리게 하는 것을 막는 안전망.
|
|
30
32
|
*/
|
|
31
|
-
export declare function globAsync(pathPattern: string
|
|
33
|
+
export declare function globAsync(pathPattern: string, options?: {
|
|
34
|
+
exclude?: string[];
|
|
35
|
+
}): Promise<string[]>;
|
|
36
|
+
/**
|
|
37
|
+
* 키별로 trailing-edge debounce. 같은 key에 대해 delay 안에 여러 번 호출되면 마지막 args만
|
|
38
|
+
* delay 후에 fn 호출. key가 다르면 timer 독립적.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const debounced = debounceByKey<string>(100, (path) => handleFileChange(path));
|
|
42
|
+
* debounced("a.ts"); debounced("a.ts"); // 100ms 후 한 번만 호출
|
|
43
|
+
* debounced("b.ts"); // a.ts와 별개로 100ms 후 호출
|
|
44
|
+
*/
|
|
45
|
+
export declare function debounceByKey<K, A extends unknown[]>(delay: number, fn: (key: K, ...args: A) => void | Promise<void>): (key: K, ...args: A) => void;
|
|
46
|
+
/**
|
|
47
|
+
* 같은 key에 대한 호출 결과를 캐시. 같은 key로 다시 호출되면 fn 실행 없이 캐시값 반환.
|
|
48
|
+
* 무효화는 프로세스 재시작 (또는 외부에서 invalidate). 호출자가 keyFn으로 args → string 매핑.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* const cachedFmt = cached(formatCodeInternal, (code, filePath) => `${ext(filePath)}:${sha1(code)}`);
|
|
52
|
+
* await cachedFmt(code, "a.ts"); // 실제 호출
|
|
53
|
+
* await cachedFmt(code, "a.ts"); // 캐시 hit
|
|
54
|
+
*/
|
|
55
|
+
export declare function cached<A extends unknown[], R>(fn: (...args: A) => Promise<R>, keyFn: (...args: A) => string): (...args: A) => Promise<R>;
|
|
32
56
|
//# sourceMappingURL=async-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../../src/utils/async-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../../src/utils/async-utils.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,GAAG,EAAE,CAAC,EAAE,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAClE,OAAO,CAAC,CAAC,EAAE,CAAC,CAKd;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,GAAG,EAAE,CAAC,EAAE,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAClE,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EACjC,GAAG,EAAE,CAAC,EAAE,EACR,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GACzD,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,GAAG,EAAE,CAAC,EAAE,EACR,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACnF,YAAY,EAAE,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAMZ;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAanB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,EAAE,EAClD,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC/C,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,CAY9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC3C,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,MAAM,GAC5B,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAY5B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { debounce } from "radashi";
|
|
2
3
|
import { glob } from "fs/promises";
|
|
3
4
|
import path from "path";
|
|
5
|
+
import { minimatch } from "minimatch";
|
|
4
6
|
|
|
5
7
|
//#region src/utils/async-utils.ts
|
|
6
8
|
/**
|
|
@@ -51,19 +53,67 @@ async function reduceAsync(arr, reducer, initialValue) {
|
|
|
51
53
|
/**
|
|
52
54
|
* 비동기 glob 함수입니다.
|
|
53
55
|
* AsyncIterableIterator로 날아오는 glob의 반환을 받아 끝까지 돌아서 배열로 반환합니다.
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
+
*
|
|
57
|
+
* @param pathPattern glob 패턴 (절대 경로 또는 상대 경로)
|
|
58
|
+
* @param options.exclude 매치에서 제외할 패턴 목록 (예: `["**\/node_modules/**"]`).
|
|
59
|
+
* alternation을 포함하는 패턴이 의도치 않게 빌드 산출물 디렉토리를 휘말리게 하는 것을 막는 안전망.
|
|
56
60
|
*/
|
|
57
|
-
async function globAsync(pathPattern) {
|
|
61
|
+
async function globAsync(pathPattern, options) {
|
|
58
62
|
const files = [];
|
|
59
|
-
|
|
63
|
+
const excludePatterns = options?.exclude;
|
|
64
|
+
const iter = excludePatterns ? glob(path.resolve(pathPattern), { exclude: (filePath) => excludePatterns.some((pat) => minimatch(filePath, pat, { dot: true })) }) : glob(path.resolve(pathPattern));
|
|
65
|
+
for await (const file of iter) {
|
|
60
66
|
files.push(file);
|
|
61
67
|
}
|
|
62
68
|
return files;
|
|
63
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* 키별로 trailing-edge debounce. 같은 key에 대해 delay 안에 여러 번 호출되면 마지막 args만
|
|
72
|
+
* delay 후에 fn 호출. key가 다르면 timer 독립적.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const debounced = debounceByKey<string>(100, (path) => handleFileChange(path));
|
|
76
|
+
* debounced("a.ts"); debounced("a.ts"); // 100ms 후 한 번만 호출
|
|
77
|
+
* debounced("b.ts"); // a.ts와 별개로 100ms 후 호출
|
|
78
|
+
*/
|
|
79
|
+
function debounceByKey(delay, fn) {
|
|
80
|
+
const debouncersByKey = new Map();
|
|
81
|
+
return (key, ...args) => {
|
|
82
|
+
let debounced = debouncersByKey.get(key);
|
|
83
|
+
if (!debounced) {
|
|
84
|
+
debounced = debounce({ delay }, (k, ...a) => {
|
|
85
|
+
void fn(k, ...a);
|
|
86
|
+
});
|
|
87
|
+
debouncersByKey.set(key, debounced);
|
|
88
|
+
}
|
|
89
|
+
debounced(key, ...args);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 같은 key에 대한 호출 결과를 캐시. 같은 key로 다시 호출되면 fn 실행 없이 캐시값 반환.
|
|
94
|
+
* 무효화는 프로세스 재시작 (또는 외부에서 invalidate). 호출자가 keyFn으로 args → string 매핑.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* const cachedFmt = cached(formatCodeInternal, (code, filePath) => `${ext(filePath)}:${sha1(code)}`);
|
|
98
|
+
* await cachedFmt(code, "a.ts"); // 실제 호출
|
|
99
|
+
* await cachedFmt(code, "a.ts"); // 캐시 hit
|
|
100
|
+
*/
|
|
101
|
+
function cached(fn, keyFn) {
|
|
102
|
+
const cache = new Map();
|
|
103
|
+
return async (...args) => {
|
|
104
|
+
const key = keyFn(...args);
|
|
105
|
+
const hit = cache.get(key);
|
|
106
|
+
if (hit !== undefined) {
|
|
107
|
+
return hit;
|
|
108
|
+
}
|
|
109
|
+
const result = await fn(...args);
|
|
110
|
+
cache.set(key, result);
|
|
111
|
+
return result;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
64
114
|
var init_async_utils = __esmMin((() => {}));
|
|
65
115
|
|
|
66
116
|
//#endregion
|
|
67
117
|
init_async_utils();
|
|
68
|
-
export { everyAsync, filterAsync, globAsync, init_async_utils, mapAsync, reduceAsync };
|
|
69
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
118
|
+
export { cached, debounceByKey, everyAsync, filterAsync, globAsync, init_async_utils, mapAsync, reduceAsync };
|
|
119
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdXRpbHMuanMiLCJuYW1lcyI6WyJmaWxlczogc3RyaW5nW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYXN5bmMtdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2xvYiB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG4vKipcbiAqIOu5hOuPmeq4sCDsobDqsbTsnLzroZwg67Cw7Je07J2EIO2VhO2EsOunge2VqeuLiOuLpFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZpbHRlcmVkID0gYXdhaXQgZmlsdGVyQXN5bmMoWzEsIDIsIDNdLCBhc3luYyAoeCkgPT4geCA+IDEpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsdGVyQXN5bmM8VD4oXG4gIGFycjogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNlPGJvb2xlYW4+LFxuKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGFyci5tYXAoKGl0ZW0sIGluZGV4KSA9PiBwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIGFycikudGhlbigoa2VlcCkgPT4gKHsgaXRlbSwga2VlcCB9KSkpLFxuICApO1xuICByZXR1cm4gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIua2VlcCkubWFwKChyKSA9PiByLml0ZW0pO1xufVxuXG4vKipcbiAqIOu5hOuPmeq4sCDsobDqsbTsnbQg66qo65OgIOyalOyGjOyXkCDrjIDtlbQg7LC47J247KeAIO2ZleyduO2VqeuLiOuLpFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbFZhbGlkID0gYXdhaXQgZXZlcnlBc3luYyhbMSwgMiwgM10sIGFzeW5jICh4KSA9PiB4ID4gMCk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmVyeUFzeW5jPFQ+KFxuICBhcnI6IFRbXSxcbiAgcHJlZGljYXRlOiAoaXRlbTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzZTxib29sZWFuPixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmICghKGF3YWl0IHByZWRpY2F0ZShhcnJbaV0sIGksIGFycikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIOu5hOuPmeq4sCDrs4DtmZgg7ZWo7IiY66W8IOuwsOyXtOydmCDqsIEg7JqU7IaM7JeQIOyggeyaqe2VqeuLiOuLpFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRvdWJsZWQgPSBhd2FpdCBtYXBBc3luYyhbMSwgMiwgM10sIGFzeW5jICh4KSA9PiB4ICogMik7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXBBc3luYzxULCBVPihcbiAgYXJyOiBUW10sXG4gIG1hcHBlcjogKGl0ZW06IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2U8VT4sXG4pOiBQcm9taXNlPFVbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoYXJyLm1hcCgoaXRlbSwgaW5kZXgpID0+IG1hcHBlcihpdGVtLCBpbmRleCwgYXJyKSkpO1xufVxuXG4vKipcbiAqIOu5hOuPmeq4sCDrpqzrk4DshJzroZwg67Cw7Je07J2EIOy2leyVve2VqeuLiOuLpFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHN1bSA9IGF3YWl0IHJlZHVjZUFzeW5jKFsxLCAyLCAzXSwgYXN5bmMgKGFjYywgeCkgPT4gYWNjICsgeCwgMCk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWR1Y2VBc3luYzxULCBVPihcbiAgYXJyOiBUW10sXG4gIHJlZHVjZXI6IChhY2N1bXVsYXRvcjogVSwgY3VycmVudFZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNlPFU+LFxuICBpbml0aWFsVmFsdWU6IFUsXG4pOiBQcm9taXNlPFU+IHtcbiAgbGV0IGFjY3VtdWxhdG9yID0gaW5pdGlhbFZhbHVlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGFjY3VtdWxhdG9yID0gYXdhaXQgcmVkdWNlcihhY2N1bXVsYXRvciwgYXJyW2ldLCBpLCBhcnIpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuLyoqXG4gKiDruYTrj5nquLAgZ2xvYiDtlajsiJjsnoXri4jri6QuXG4gKiBBc3luY0l0ZXJhYmxlSXRlcmF0b3LroZwg64Kg7JWE7Jik64qUIGdsb2LsnZgg67CY7ZmY7J2EIOuwm+yVhCDrgZ3quYzsp4Ag64+M7JWE7IScIOuwsOyXtOuhnCDrsJjtmZjtlanri4jri6QuXG4gKlxuICogQHBhcmFtIHBhdGhQYXR0ZXJuIGdsb2Ig7Yyo7YS0ICjsoIjrjIAg6rK966GcIOuYkOuKlCDsg4HrjIAg6rK966GcKVxuICogQHBhcmFtIG9wdGlvbnMuZXhjbHVkZSDrp6TsuZjsl5DshJwg7KCc7Jm47ZWgIO2MqO2EtCDrqqnroZ0gKOyYiDogYFtcIioqXFwvbm9kZV9tb2R1bGVzLyoqXCJdYCkuXG4gKiAgIGFsdGVybmF0aW9u7J2EIO2PrO2VqO2VmOuKlCDtjKjthLTsnbQg7J2Y64+E7LmYIOyViuqyjCDruYzrk5wg7IKw7Lac66y8IOuUlOugie2GoOumrOulvCDtnJjrp5Drpqzqsowg7ZWY64qUIOqyg+ydhCDrp4nripQg7JWI7KCE66edLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2xvYkFzeW5jKFxuICBwYXRoUGF0dGVybjogc3RyaW5nLFxuICBvcHRpb25zPzogeyBleGNsdWRlPzogc3RyaW5nW10gfSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IG9wdGlvbnM/LmV4Y2x1ZGU7XG4gIGNvbnN0IGl0ZXIgPSBleGNsdWRlUGF0dGVybnNcbiAgICA/IGdsb2IocGF0aC5yZXNvbHZlKHBhdGhQYXR0ZXJuKSwge1xuICAgICAgICBleGNsdWRlOiAoZmlsZVBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICBleGNsdWRlUGF0dGVybnMuc29tZSgocGF0KSA9PiBtaW5pbWF0Y2goZmlsZVBhdGgsIHBhdCwgeyBkb3Q6IHRydWUgfSkpLFxuICAgICAgfSlcbiAgICA6IGdsb2IocGF0aC5yZXNvbHZlKHBhdGhQYXR0ZXJuKSk7XG4gIGZvciBhd2FpdCAoY29uc3QgZmlsZSBvZiBpdGVyKSB7XG4gICAgZmlsZXMucHVzaChmaWxlKTtcbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5cbi8qKlxuICog7YKk67OE66GcIHRyYWlsaW5nLWVkZ2UgZGVib3VuY2UuIOqwmeydgCBrZXnsl5Ag64yA7ZW0IGRlbGF5IOyViOyXkCDsl6zrn6wg67KIIO2YuOy2nOuQmOuptCDrp4jsp4Drp4kgYXJnc+unjFxuICogZGVsYXkg7ZuE7JeQIGZuIO2YuOy2nC4ga2V56rCAIOuLpOultOuptCB0aW1lciDrj4Xrpr3soIEuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlQnlLZXk8c3RyaW5nPigxMDAsIChwYXRoKSA9PiBoYW5kbGVGaWxlQ2hhbmdlKHBhdGgpKTtcbiAqIGRlYm91bmNlZChcImEudHNcIik7IGRlYm91bmNlZChcImEudHNcIik7IC8vIDEwMG1zIO2bhCDtlZwg67KI66eMIO2YuOy2nFxuICogZGVib3VuY2VkKFwiYi50c1wiKTsgLy8gYS50c+yZgCDrs4TqsJzroZwgMTAwbXMg7ZuEIO2YuOy2nFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2VCeUtleTxLLCBBIGV4dGVuZHMgdW5rbm93bltdPihcbiAgZGVsYXk6IG51bWJlcixcbiAgZm46IChrZXk6IEssIC4uLmFyZ3M6IEEpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuKTogKGtleTogSywgLi4uYXJnczogQSkgPT4gdm9pZCB7XG4gIGNvbnN0IGRlYm91bmNlcnNCeUtleSA9IG5ldyBNYXA8SywgKGtleTogSywgLi4uYXJnczogQSkgPT4gdm9pZD4oKTtcbiAgcmV0dXJuIChrZXksIC4uLmFyZ3MpID0+IHtcbiAgICBsZXQgZGVib3VuY2VkID0gZGVib3VuY2Vyc0J5S2V5LmdldChrZXkpO1xuICAgIGlmICghZGVib3VuY2VkKSB7XG4gICAgICBkZWJvdW5jZWQgPSBkZWJvdW5jZSh7IGRlbGF5IH0sIChrOiBLLCAuLi5hOiBBKSA9PiB7XG4gICAgICAgIHZvaWQgZm4oaywgLi4uYSk7XG4gICAgICB9KTtcbiAgICAgIGRlYm91bmNlcnNCeUtleS5zZXQoa2V5LCBkZWJvdW5jZWQpO1xuICAgIH1cbiAgICBkZWJvdW5jZWQoa2V5LCAuLi5hcmdzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiDqsJnsnYAga2V57JeQIOuMgO2VnCDtmLjstpwg6rKw6rO866W8IOy6kOyLnC4g6rCZ7J2AIGtleeuhnCDri6Tsi5wg7Zi47Lac65CY66m0IGZuIOyLpO2WiSDsl4bsnbQg7LqQ7Iuc6rCSIOuwmO2ZmC5cbiAqIOustO2aqO2ZlOuKlCDtlITroZzshLjsiqQg7J6s7Iuc7J6RICjrmJDripQg7Jm467aA7JeQ7IScIGludmFsaWRhdGUpLiDtmLjstpzsnpDqsIAga2V5Rm7snLzroZwgYXJncyDihpIgc3RyaW5nIOunpO2VkS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgY2FjaGVkRm10ID0gY2FjaGVkKGZvcm1hdENvZGVJbnRlcm5hbCwgKGNvZGUsIGZpbGVQYXRoKSA9PiBgJHtleHQoZmlsZVBhdGgpfToke3NoYTEoY29kZSl9YCk7XG4gKiBhd2FpdCBjYWNoZWRGbXQoY29kZSwgXCJhLnRzXCIpOyAvLyDsi6TsoJwg7Zi47LacXG4gKiBhd2FpdCBjYWNoZWRGbXQoY29kZSwgXCJhLnRzXCIpOyAvLyDsupDsi5wgaGl0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZWQ8QSBleHRlbmRzIHVua25vd25bXSwgUj4oXG4gIGZuOiAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPixcbiAga2V5Rm46ICguLi5hcmdzOiBBKSA9PiBzdHJpbmcsXG4pOiAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFI+KCk7XG4gIHJldHVybiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGtleUZuKC4uLmFyZ3MpO1xuICAgIGNvbnN0IGhpdCA9IGNhY2hlLmdldChrZXkpO1xuICAgIGlmIChoaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhpdDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFXQSxlQUFzQixZQUNwQixLQUNBLFdBQ2M7Q0FDZCxNQUFNLFVBQVUsTUFBTSxRQUFRLElBQzVCLElBQUksS0FBSyxNQUFNLFVBQVUsVUFBVSxNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sVUFBVTtFQUFFO0VBQU07RUFBTSxFQUFFLENBQUMsQ0FDdkY7QUFDRCxRQUFPLFFBQVEsUUFBUSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssTUFBTSxFQUFFLEtBQUs7Ozs7Ozs7QUFRekQsZUFBc0IsV0FDcEIsS0FDQSxXQUNrQjtBQUNsQixNQUFLLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDbkMsTUFBSSxDQUFFLE1BQU0sVUFBVSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUc7QUFDdEMsVUFBTzs7O0FBR1gsUUFBTzs7Ozs7OztBQVFULGVBQXNCLFNBQ3BCLEtBQ0EsUUFDYztBQUNkLFFBQU8sUUFBUSxJQUFJLElBQUksS0FBSyxNQUFNLFVBQVUsT0FBTyxNQUFNLE9BQU8sSUFBSSxDQUFDLENBQUM7Ozs7Ozs7QUFReEUsZUFBc0IsWUFDcEIsS0FDQSxTQUNBLGNBQ1k7Q0FDWixJQUFJLGNBQWM7QUFDbEIsTUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQ25DLGdCQUFjLE1BQU0sUUFBUSxhQUFhLElBQUksSUFBSSxHQUFHLElBQUk7O0FBRTFELFFBQU87Ozs7Ozs7Ozs7QUFXVCxlQUFzQixVQUNwQixhQUNBLFNBQ21CO0NBQ25CLE1BQU1BLFFBQWtCLEVBQUU7Q0FDMUIsTUFBTSxrQkFBa0IsU0FBUztDQUNqQyxNQUFNLE9BQU8sa0JBQ1QsS0FBSyxLQUFLLFFBQVEsWUFBWSxFQUFFLEVBQzlCLFVBQVUsYUFDUixnQkFBZ0IsTUFBTSxRQUFRLFVBQVUsVUFBVSxLQUFLLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUN6RSxDQUFDLEdBQ0YsS0FBSyxLQUFLLFFBQVEsWUFBWSxDQUFDO0FBQ25DLFlBQVcsTUFBTSxRQUFRLE1BQU07QUFDN0IsUUFBTSxLQUFLLEtBQUs7O0FBRWxCLFFBQU87Ozs7Ozs7Ozs7O0FBWVQsU0FBZ0IsY0FDZCxPQUNBLElBQzhCO0NBQzlCLE1BQU0sa0JBQWtCLElBQUksS0FBc0M7QUFDbEUsU0FBUSxLQUFLLEdBQUcsU0FBUztFQUN2QixJQUFJLFlBQVksZ0JBQWdCLElBQUksSUFBSTtBQUN4QyxNQUFJLENBQUMsV0FBVztBQUNkLGVBQVksU0FBUyxFQUFFLE9BQU8sR0FBRyxHQUFNLEdBQUcsTUFBUztBQUNqRCxTQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUU7S0FDaEI7QUFDRixtQkFBZ0IsSUFBSSxLQUFLLFVBQVU7O0FBRXJDLFlBQVUsS0FBSyxHQUFHLEtBQUs7Ozs7Ozs7Ozs7OztBQWEzQixTQUFnQixPQUNkLElBQ0EsT0FDNEI7Q0FDNUIsTUFBTSxRQUFRLElBQUksS0FBZ0I7QUFDbEMsUUFBTyxPQUFPLEdBQUcsU0FBUztFQUN4QixNQUFNLE1BQU0sTUFBTSxHQUFHLEtBQUs7RUFDMUIsTUFBTSxNQUFNLE1BQU0sSUFBSSxJQUFJO0FBQzFCLE1BQUksUUFBUSxXQUFXO0FBQ3JCLFVBQU87O0VBRVQsTUFBTSxTQUFTLE1BQU0sR0FBRyxHQUFHLEtBQUs7QUFDaEMsUUFBTSxJQUFJLEtBQUssT0FBTztBQUN0QixTQUFPIn0=
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 코드를 프로젝트의 oxfmt + oxlint 설정에 맞춰 포매팅한 문자열을 반환합니다.
|
|
3
|
+
*
|
|
4
|
+
* 캐싱도 있어요 ㅎㅎ 똑같은 입력에 대해서 캐시 커버됩니다.
|
|
5
|
+
* 수명은 프로세스 죽을때까지 ㅋ
|
|
6
|
+
*/
|
|
7
|
+
export declare const formatCode: (code: string, filePath: string) => Promise<string>;
|
|
2
8
|
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,eAAO,MAAM,UAAU,qDAGrB,CAAC"}
|
package/dist/utils/formatter.js
CHANGED
|
@@ -1,92 +1,126 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
2
|
import { init_controller, isTest } from "./controller.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { cached, init_async_utils } from "./async-utils.js";
|
|
4
|
+
import { execute, init_process_utils } from "./process-utils.js";
|
|
5
|
+
import { createHash } from "crypto";
|
|
6
|
+
import { readFile, unlink, writeFile } from "fs/promises";
|
|
7
|
+
import path, { dirname, join } from "path";
|
|
6
8
|
import { createRequire } from "module";
|
|
7
9
|
import { format } from "oxfmt";
|
|
8
10
|
|
|
9
11
|
//#region src/utils/formatter.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/**
|
|
13
|
+
* 캐시 없는 포맷함수 엔트리.
|
|
14
|
+
*/
|
|
15
|
+
async function formatCodeInternal(code, filePath) {
|
|
16
|
+
if (filePath.endsWith(".json")) {
|
|
17
|
+
return runOxfmt(code, filePath);
|
|
15
18
|
}
|
|
19
|
+
return runOxfmt(await runOxlint(code), filePath);
|
|
16
20
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
/**
|
|
22
|
+
* 프로젝트 설정을 찾아서 이에 맞춰서 코드를 포맷합니다.
|
|
23
|
+
*/
|
|
24
|
+
async function runOxfmt(code, filePath) {
|
|
25
|
+
const result = await format(path.basename(filePath), code, await loadOxfmtConfig());
|
|
26
|
+
const errors = result.errors.filter((e) => e.severity === "Error");
|
|
27
|
+
if (errors.length > 0) {
|
|
28
|
+
if (!isTest()) {
|
|
29
|
+
console.error(`oxfmt errors (${filePath}):`);
|
|
30
|
+
for (const err of errors) {
|
|
31
|
+
const label = err.labels[0];
|
|
32
|
+
if (label) {
|
|
33
|
+
const before = code.slice(Math.max(0, label.start - 80), label.start);
|
|
34
|
+
const at = code.slice(label.start, label.end);
|
|
35
|
+
const after = code.slice(label.end, Math.min(code.length, label.end + 80));
|
|
36
|
+
console.error(` - ${err.message} (offset ${label.start}-${label.end})`);
|
|
37
|
+
console.error(` around: ...${before}»${at}«${after}...`);
|
|
38
|
+
} else {
|
|
39
|
+
console.error(` - ${err.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return code;
|
|
44
|
+
}
|
|
45
|
+
return result.code;
|
|
46
|
+
}
|
|
47
|
+
async function loadOxfmtConfig() {
|
|
48
|
+
if (cachedOxfmtConfig !== null) {
|
|
49
|
+
return cachedOxfmtConfig;
|
|
50
|
+
}
|
|
51
|
+
let dir = process.cwd();
|
|
52
|
+
while (true) {
|
|
53
|
+
const candidate = join(dir, ".oxfmtrc.json");
|
|
54
|
+
try {
|
|
55
|
+
cachedOxfmtConfig = JSON.parse(await readFile(candidate, "utf-8"));
|
|
56
|
+
return cachedOxfmtConfig;
|
|
57
|
+
} catch (e) {
|
|
58
|
+
if (e.code !== "ENOENT") {
|
|
59
|
+
!isTest() && console.error(`Failed to load ${candidate}:`, e);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
24
62
|
}
|
|
63
|
+
const parent = dirname(dir);
|
|
64
|
+
if (parent === dir) break;
|
|
65
|
+
dir = parent;
|
|
25
66
|
}
|
|
26
|
-
|
|
27
|
-
|
|
67
|
+
cachedOxfmtConfig = {};
|
|
68
|
+
return cachedOxfmtConfig;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 프로젝트 설정에 맞춰 코드를 lint합니다.
|
|
72
|
+
*
|
|
73
|
+
* 프로젝트 설정을 적용받는 oxlint cli를 찾아 띄워서,
|
|
74
|
+
* 임시 파일에 in-place로 써서 그 결과를 빼오는 방식으로 작동합니다.
|
|
75
|
+
* 왜 이렇게 하느냐? oxlint가 node api도 안 주고 cli에서 stdin 옵션도 안 주기 때문...
|
|
76
|
+
*/
|
|
77
|
+
async function runOxlint(code) {
|
|
78
|
+
if (isTest()) {
|
|
79
|
+
return code;
|
|
28
80
|
}
|
|
29
81
|
const tmpFile = join(process.cwd(), `.sonamu-fmt-${Date.now()}-${Math.random().toString(36).slice(2)}.ts`);
|
|
30
82
|
try {
|
|
31
|
-
|
|
32
|
-
const oxlintBin = resolveOxlintBin();
|
|
83
|
+
await writeFile(tmpFile, code, "utf-8");
|
|
33
84
|
try {
|
|
34
|
-
|
|
85
|
+
await execute(resolveOxlintBin(), [
|
|
35
86
|
"--fix",
|
|
36
87
|
"--fix-suggestions",
|
|
37
88
|
"--type-aware",
|
|
38
89
|
tmpFile
|
|
39
|
-
], {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} catch (execError) {
|
|
44
|
-
if (execError instanceof Error) {
|
|
45
|
-
const errObj = execError;
|
|
46
|
-
if (typeof errObj.status === "number") {
|
|
47
|
-
void errObj.status;
|
|
48
|
-
} else {
|
|
49
|
-
throw execError;
|
|
50
|
-
}
|
|
51
|
-
} else {
|
|
52
|
-
throw execError;
|
|
90
|
+
], { timeout: 1e4 });
|
|
91
|
+
} catch (e) {
|
|
92
|
+
if (typeof e.code !== "number") {
|
|
93
|
+
throw e;
|
|
53
94
|
}
|
|
54
95
|
}
|
|
55
|
-
|
|
56
|
-
const reformatted = await format(fileName, lintFixed, OXFMT_OPTIONS);
|
|
57
|
-
if (reformatted.errors.length > 0) {
|
|
58
|
-
const errorMessages = reformatted.errors.filter((e) => e.severity === "Error").map((e) => e.message);
|
|
59
|
-
if (errorMessages.length > 0) {
|
|
60
|
-
!isTest() && console.error("oxfmt reformat errors:", errorMessages);
|
|
61
|
-
throw new Error(`oxfmt reformat error: ${errorMessages.join(", ")}`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return reformatted.code;
|
|
96
|
+
return await readFile(tmpFile, "utf-8");
|
|
65
97
|
} finally {
|
|
66
98
|
try {
|
|
67
|
-
|
|
99
|
+
await unlink(tmpFile);
|
|
68
100
|
} catch {}
|
|
69
101
|
}
|
|
70
102
|
}
|
|
71
|
-
|
|
103
|
+
function resolveOxlintBin() {
|
|
104
|
+
try {
|
|
105
|
+
return _require.resolve("oxlint/bin/oxlint");
|
|
106
|
+
} catch {
|
|
107
|
+
return "oxlint";
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
var _require, formatCode, cachedOxfmtConfig;
|
|
72
111
|
var init_formatter = __esmMin((() => {
|
|
112
|
+
init_async_utils();
|
|
73
113
|
init_controller();
|
|
114
|
+
init_process_utils();
|
|
74
115
|
_require = createRequire(import.meta.url);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
jsxSingleQuote: false,
|
|
81
|
-
trailingComma: "all",
|
|
82
|
-
semi: true,
|
|
83
|
-
endOfLine: "lf",
|
|
84
|
-
bracketSpacing: true,
|
|
85
|
-
sortImports: true
|
|
86
|
-
};
|
|
116
|
+
formatCode = cached(formatCodeInternal, (code, filePath) => {
|
|
117
|
+
const ext = filePath.endsWith(".tsx") ? "tsx" : filePath.endsWith(".json") ? "json" : "ts";
|
|
118
|
+
return `${ext}:${createHash("sha1").update(code).digest("hex")}`;
|
|
119
|
+
});
|
|
120
|
+
cachedOxfmtConfig = null;
|
|
87
121
|
}));
|
|
88
122
|
|
|
89
123
|
//#endregion
|
|
90
124
|
init_formatter();
|
|
91
125
|
export { formatCode, init_formatter };
|
|
92
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwibmFtZXMiOlsiY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZm9ybWF0dGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG4vLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGZzL3Byb21pc2Vz6rCAIG1vY2vrkJjsp4Drp4wsIOyVhOuemCBydW5PeGxpbnTsnbQgaXNUZXN0IOqwgOuTnOuhnCDslYgg64+E64uI6rmMXG4vLyDqt7jrg6UgZnMvcHJvbWlzZXMg6re464yA66GcIOyCrOyaqS4gKHByb2R1Y3Rpb27sl5DshJzrp4wg7J6E7Iuc7YyM7J28IO2dkOumhOydtCDrj5Xri4jri6QuKVxuaW1wb3J0IHsgcmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGZvcm1hdCwgdHlwZSBGb3JtYXRDb25maWcgfSBmcm9tIFwib3hmbXRcIjtcblxuaW1wb3J0IHsgY2FjaGVkIH0gZnJvbSBcIi4vYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4ZWN1dGUgfSBmcm9tIFwiLi9wcm9jZXNzLXV0aWxzXCI7XG5cbmNvbnN0IF9yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG4vKipcbiAqIOy9lOuTnOulvCDtlITroZzsoJ3tirjsnZggb3hmbXQgKyBveGxpbnQg7ISk7KCV7JeQIOunnuy2sCDtj6zrp6TtjIXtlZwg66y47J6Q7Je07J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiDsupDsi7Hrj4Qg7J6I7Ja07JqUIOOFjuOFjiDrmJHqsJnsnYAg7J6F66Cl7JeQIOuMgO2VtOyEnCDsupDsi5wg7Luk67KE65Cp64uI64ukLlxuICog7IiY66qF7J2AIO2UhOuhnOyEuOyKpCDso73snYTrlYzquYzsp4Ag44WLXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRDb2RlID0gY2FjaGVkKGZvcm1hdENvZGVJbnRlcm5hbCwgKGNvZGUsIGZpbGVQYXRoKSA9PiB7XG4gIGNvbnN0IGV4dCA9IGZpbGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSA/IFwidHN4XCIgOiBmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpID8gXCJqc29uXCIgOiBcInRzXCI7XG4gIHJldHVybiBgJHtleHR9OiR7Y3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGNvZGUpLmRpZ2VzdChcImhleFwiKX1gO1xufSk7XG5cbi8qKlxuICog7LqQ7IucIOyXhuuKlCDtj6zrp7ftlajsiJgg7JeU7Yq466asLlxuICovXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDb2RlSW50ZXJuYWwoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8ganNvbuydgCDtj6zrp7frp4wg7ZWY66m0IOuQqeuLiOuLpC5cbiAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICByZXR1cm4gcnVuT3hmbXQoY29kZSwgZmlsZVBhdGgpO1xuICB9XG5cbiAgLy8g66aw7Yq4IOuovOyggCDtlZwg64uk7J2M7JeQIO2PrOunt+ycvOuhnCDrp4jrrLTrpqztlbTsmpQuXG4gIHJldHVybiBydW5PeGZtdChhd2FpdCBydW5PeGxpbnQoY29kZSksIGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7J2EIOywvuyVhOyEnCDsnbTsl5Ag66ee7Law7IScIOy9lOuTnOulvCDtj6zrp7ftlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94Zm10KGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZvcm1hdChwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSwgY29kZSwgYXdhaXQgbG9hZE94Zm10Q29uZmlnKCkpO1xuXG4gIGNvbnN0IGVycm9ycyA9IHJlc3VsdC5lcnJvcnMuZmlsdGVyKChlKSA9PiBlLnNldmVyaXR5ID09PSBcIkVycm9yXCIpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBveGZtdCBlcnJvcnMgKCR7ZmlsZVBhdGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGVyci5sYWJlbHNbMF07XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IGNvZGUuc2xpY2UoTWF0aC5tYXgoMCwgbGFiZWwuc3RhcnQgLSA4MCksIGxhYmVsLnN0YXJ0KTtcbiAgICAgICAgICBjb25zdCBhdCA9IGNvZGUuc2xpY2UobGFiZWwuc3RhcnQsIGxhYmVsLmVuZCk7XG4gICAgICAgICAgY29uc3QgYWZ0ZXIgPSBjb2RlLnNsaWNlKGxhYmVsLmVuZCwgTWF0aC5taW4oY29kZS5sZW5ndGgsIGxhYmVsLmVuZCArIDgwKSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9IChvZmZzZXQgJHtsYWJlbC5zdGFydH0tJHtsYWJlbC5lbmR9KWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgICBhcm91bmQ6IC4uLiR7YmVmb3JlfcK7JHthdH3CqyR7YWZ0ZXJ9Li4uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5jb2RlO1xufVxuXG5sZXQgY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gbG9hZE94Zm10Q29uZmlnKCk6IFByb21pc2U8Rm9ybWF0Q29uZmlnPiB7XG4gIGlmIChjYWNoZWRPeGZtdENvbmZpZyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgfVxuXG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4oZGlyLCBcIi5veGZtdHJjLmpzb25cIik7XG4gICAgdHJ5IHtcbiAgICAgIGNhY2hlZE94Zm10Q29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjYW5kaWRhdGUsIFwidXRmLThcIikpIGFzIEZvcm1hdENvbmZpZztcbiAgICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke2NhbmRpZGF0ZX06YCwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSBicmVhaztcbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICBjYWNoZWRPeGZtdENvbmZpZyA9IHt9O1xuICByZXR1cm4gY2FjaGVkT3hmbXRDb25maWc7XG59XG5cbi8qKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleyXkCDrp57strAg7L2U65Oc66W8IGxpbnTtlanri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleydhCDsoIHsmqnrsJvripQgb3hsaW50IGNsaeulvCDssL7slYQg652E7JuM7IScLFxuICog7J6E7IucIO2MjOydvOyXkCBpbi1wbGFjZeuhnCDsjajshJwg6re4IOqysOqzvOulvCDrubzsmKTripQg67Cp7Iud7Jy866GcIOyekeuPme2VqeuLiOuLpC5cbiAqIOyZnCDsnbTroIfqsowg7ZWY64qQ64OQPyBveGxpbnTqsIAgbm9kZSBhcGnrj4Qg7JWIIOyjvOqzoCBjbGnsl5DshJwgc3RkaW4g7Ji17IWY64+EIOyViCDso7zquLAg65WM66y4Li4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94bGludChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNUZXN0KCkpIHtcbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIOuKkOugpOyngOq4sOunjCDtlZjqs6Ag6rKA7Kad7ZWgIOqwgOy5mOuPhCDsl4bslrTshJwg7JWIIO2VqeuLiOuLpC5cbiAgICAvLyBHaXRIdWIgQWN0aW9ucyDtmZjqsr3sl5DshJwgbGludOqwgCDsmKTrnpgg6rG466Ck7IScIOu7l+q4sOuPhCDtlojslrTsmpQuIChodHRwczovL2dpdGh1Yi5jb20vY2FydGFub3ZhLWFpL3NvbmFtdS9hY3Rpb25zL3J1bnMvMjUyNjcyMTQwMjcvam9iLzc0MDgzNjMwMTY5KVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgY29uc3QgdG1wRmlsZSA9IGpvaW4oXG4gICAgLy8g7YOA6rKfIO2MjOydvOydtCDro6jtirgg7JWE656Y7JeQIOyeiOyWtOyVvCDtlbTsmpQuIOq3uOuemOyEnCB0bXAg65SU66CJ7Yag66as6rCZ7J2A6rGwIOyViCDslIHri4jri6QhXG4gICAgcHJvY2Vzcy5jd2QoKSxcbiAgICBgLnNvbmFtdS1mbXQtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfS50c2AsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUodG1wRmlsZSwgY29kZSwgXCJ1dGYtOFwiKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjdXRlKHJlc29sdmVPeGxpbnRCaW4oKSwgW1wiLS1maXhcIiwgXCItLWZpeC1zdWdnZXN0aW9uc1wiLCBcIi0tdHlwZS1hd2FyZVwiLCB0bXBGaWxlXSwge1xuICAgICAgICB0aW1lb3V0OiAxMDAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGxpbnQg7JyE67CYIOyLnCBleGl0IGNvZGUgIT0gMOydtOyngOunjCAtLWZpeOuKlCDsoIHsmqnrkKguIGV4ZWMg7J6Q7LK0IOyLpO2MqOunjCB0aHJvdy5cbiAgICAgIGlmICh0eXBlb2YgKGUgYXMgRXJyb3IgJiB7IGNvZGU/OiBudW1iZXIgfSkuY29kZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWFkRmlsZSh0bXBGaWxlLCBcInV0Zi04XCIpO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bmxpbmsodG1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsgq3soJwg7Iuk7Yyo7ZW064+EIOyWtOywqO2UvCBpZ25vcmXrkKguXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVPeGxpbnRCaW4oKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gX3JlcXVpcmUucmVzb2x2ZShcIm94bGludC9iaW4vb3hsaW50XCIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJveGxpbnRcIjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQTZCQSxlQUFlLG1CQUFtQixNQUFjLFVBQW1DO0FBRWpGLEtBQUksU0FBUyxTQUFTLFFBQVEsRUFBRTtBQUM5QixTQUFPLFNBQVMsTUFBTSxTQUFTOztBQUlqQyxRQUFPLFNBQVMsTUFBTSxVQUFVLEtBQUssRUFBRSxTQUFTOzs7OztBQU1sRCxlQUFlLFNBQVMsTUFBYyxVQUFtQztDQUN2RSxNQUFNLFNBQVMsTUFBTSxPQUFPLEtBQUssU0FBUyxTQUFTLEVBQUUsTUFBTSxNQUFNLGlCQUFpQixDQUFDO0NBRW5GLE1BQU0sU0FBUyxPQUFPLE9BQU8sUUFBUSxNQUFNLEVBQUUsYUFBYSxRQUFRO0FBQ2xFLEtBQUksT0FBTyxTQUFTLEdBQUc7QUFDckIsTUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNiLFdBQVEsTUFBTSxpQkFBaUIsU0FBUyxJQUFJO0FBQzVDLFFBQUssTUFBTSxPQUFPLFFBQVE7SUFDeEIsTUFBTSxRQUFRLElBQUksT0FBTztBQUN6QixRQUFJLE9BQU87S0FDVCxNQUFNLFNBQVMsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxHQUFHLEVBQUUsTUFBTSxNQUFNO0tBQ3JFLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxPQUFPLE1BQU0sSUFBSTtLQUM3QyxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sS0FBSyxLQUFLLElBQUksS0FBSyxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUM7QUFDMUUsYUFBUSxNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLEdBQUc7QUFDeEUsYUFBUSxNQUFNLGtCQUFrQixPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sS0FBSztXQUN0RDtBQUNMLGFBQVEsTUFBTSxPQUFPLElBQUksVUFBVTs7OztBQUl6QyxTQUFPOztBQUVULFFBQU8sT0FBTzs7QUFJaEIsZUFBZSxrQkFBeUM7QUFDdEQsS0FBSSxzQkFBc0IsTUFBTTtBQUM5QixTQUFPOztDQUdULElBQUksTUFBTSxRQUFRLEtBQUs7QUFDdkIsUUFBTyxNQUFNO0VBQ1gsTUFBTSxZQUFZLEtBQUssS0FBSyxnQkFBZ0I7QUFDNUMsTUFBSTtBQUNGLHVCQUFvQixLQUFLLE1BQU0sTUFBTSxTQUFTLFdBQVcsUUFBUSxDQUFDO0FBQ2xFLFVBQU87V0FDQSxHQUFHO0FBQ1YsT0FBSyxFQUE0QixTQUFTLFVBQVU7QUFDbEQsS0FBQyxRQUFRLElBQUksUUFBUSxNQUFNLGtCQUFrQixVQUFVLElBQUksRUFBRTtBQUM3RDs7O0VBR0osTUFBTSxTQUFTLFFBQVEsSUFBSTtBQUMzQixNQUFJLFdBQVcsSUFBSztBQUNwQixRQUFNOztBQUdSLHFCQUFvQixFQUFFO0FBQ3RCLFFBQU87Ozs7Ozs7OztBQVVULGVBQWUsVUFBVSxNQUErQjtBQUN0RCxLQUFJLFFBQVEsRUFBRTtBQUdaLFNBQU87O0NBR1QsTUFBTSxVQUFVLEtBRWQsUUFBUSxLQUFLLEVBQ2IsZUFBZSxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQ2xFO0FBRUQsS0FBSTtBQUNGLFFBQU0sVUFBVSxTQUFTLE1BQU0sUUFBUTtBQUV2QyxNQUFJO0FBQ0YsU0FBTSxRQUFRLGtCQUFrQixFQUFFO0lBQUM7SUFBUztJQUFxQjtJQUFnQjtJQUFRLEVBQUUsRUFDekYsU0FBUyxLQUNWLENBQUM7V0FDSyxHQUFHO0FBRVYsT0FBSSxPQUFRLEVBQWdDLFNBQVMsVUFBVTtBQUM3RCxVQUFNOzs7QUFJVixTQUFPLE1BQU0sU0FBUyxTQUFTLFFBQVE7V0FDL0I7QUFDUixNQUFJO0FBQ0YsU0FBTSxPQUFPLFFBQVE7VUFDZjs7O0FBTVosU0FBUyxtQkFBMkI7QUFDbEMsS0FBSTtBQUNGLFNBQU8sU0FBUyxRQUFRLG9CQUFvQjtTQUN0QztBQUNOLFNBQU87Ozs7O21CQXJJNEI7a0JBQ0Q7cUJBQ0k7Q0FFcEMsV0FBVyxjQUFjLE9BQU8sS0FBSyxJQUFJO0NBUWxDLGFBQWEsT0FBTyxxQkFBcUIsTUFBTSxhQUFhO0VBQ3ZFLE1BQU0sTUFBTSxTQUFTLFNBQVMsT0FBTyxHQUFHLFFBQVEsU0FBUyxTQUFTLFFBQVEsR0FBRyxTQUFTO0FBQ3RGLFNBQU8sR0FBRyxJQUFJLEdBQUcsV0FBVyxPQUFPLENBQUMsT0FBTyxLQUFLLENBQUMsT0FBTyxNQUFNO0dBQzlEO0NBMkNFQSxvQkFBeUMifQ==
|
package/dist/utils/fs-utils.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare function fileExists(path: PathLike): Promise<boolean>;
|
|
|
16
16
|
* - services/user/user.types.ts → ../sonamu.shared
|
|
17
17
|
* - i18n/ko.ts → ../services/sonamu.shared
|
|
18
18
|
*
|
|
19
|
+
* ts/tsx 파일은 쓰기 전에 oxfmt/oxlint 한번 돌려줍니다!
|
|
20
|
+
*
|
|
19
21
|
* @param fromPath 원본 파일 경로
|
|
20
22
|
* @param toPath 대상 파일 경로
|
|
21
23
|
* @param syncHeader 동기화 시 파일 최상단에 삽입할 주석 블록. 기존 @generated 블록이 있으면 교체하고, 없으면 최상단에 추가합니다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAMnC;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAGD,wBAAsB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CA4ClB"}
|
package/dist/utils/fs-utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { formatCode, init_formatter } from "./formatter.js";
|
|
2
3
|
import { access, readFile, stat, writeFile } from "fs/promises";
|
|
3
4
|
import path, { dirname } from "path";
|
|
4
5
|
import { constants } from "fs";
|
|
@@ -35,6 +36,8 @@ async function fileExists(path$1) {
|
|
|
35
36
|
* - services/user/user.types.ts → ../sonamu.shared
|
|
36
37
|
* - i18n/ko.ts → ../services/sonamu.shared
|
|
37
38
|
*
|
|
39
|
+
* ts/tsx 파일은 쓰기 전에 oxfmt/oxlint 한번 돌려줍니다!
|
|
40
|
+
*
|
|
38
41
|
* @param fromPath 원본 파일 경로
|
|
39
42
|
* @param toPath 대상 파일 경로
|
|
40
43
|
* @param syncHeader 동기화 시 파일 최상단에 삽입할 주석 블록. 기존 @generated 블록이 있으면 교체하고, 없으면 최상단에 추가합니다.
|
|
@@ -64,12 +67,17 @@ async function copyFileWithReplaceCoreToShared(fromPath, toPath, syncHeader) {
|
|
|
64
67
|
newFileContent = `${syncHeader}\n\n${newFileContent}`;
|
|
65
68
|
}
|
|
66
69
|
}
|
|
70
|
+
if (toPath.endsWith(".ts") || toPath.endsWith(".tsx")) {
|
|
71
|
+
newFileContent = await formatCode(newFileContent, toPath);
|
|
72
|
+
}
|
|
67
73
|
await writeFile(toPath, newFileContent);
|
|
68
74
|
return true;
|
|
69
75
|
}
|
|
70
|
-
var init_fs_utils = __esmMin((() => {
|
|
76
|
+
var init_fs_utils = __esmMin((() => {
|
|
77
|
+
init_formatter();
|
|
78
|
+
}));
|
|
71
79
|
|
|
72
80
|
//#endregion
|
|
73
81
|
init_fs_utils();
|
|
74
82
|
export { copyFileWithReplaceCoreToShared, exists, fileExists, init_fs_utils };
|
|
75
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdXRpbHMuanMiLCJuYW1lcyI6WyJwYXRoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2ZzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgYWNjZXNzLCByZWFkRmlsZSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuL2Zvcm1hdHRlclwiO1xuXG4vKipcbiAqIGZzL3Byb21pc2Vz7JeQ64qUIGV4aXN0c+qwgCDsl4bslrTsmpQuIOuMgOyLoCBhY2Nlc3PqsIAg7J6I7Iq164uI64ukLlxuICog6re8642wIOyWmOuKlCDsnbjthLDtjpjsnbTsiqTqsIAg7JOw6riwIOu2iO2OuO2VtOyalC4g6re4656Y7IScIOqwkOyLuOyjvOyXiOyKteuLiOuLpC5cbiAqIEBwYXJhbSBwYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhpc3RzKHBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKHBhdGgsIGNvbnN0YW50cy5GX09LKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIOuUlOugie2GoOumrOqwgCDslYTri4jrnbwg7YyM7J2866eMIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXRoKTtcbiAgICByZXR1cm4gc3RhdHMuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIO2MjOydvOydhCDrs7XsgqztlZjrqbTshJwgYGZyb20gXCJzb25hbXVcImAgaW1wb3J066W8IHNvbmFtdS5zaGFyZWQudHMg6rK966Gc66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiB3ZWLsnbTrgpggYXBwIOuTseyXkOuKlCBzb25hbXUg7Yyo7YKk7KeA6rCAIOyXhuycvOuvgOuhnCwg7ZWo6ruYIOuzteyCrOuQmOuKlCBzb25hbXUuc2hhcmVkLnRz7JeQ7IScIOqwgOyguOyYpOuPhOuhnSDrs4DtmZjtlanri4jri6QuXG4gKiDrjIDsg4Eg7YyM7J287J2YIOychOy5mOyXkCDrlLDrnbwg7IOB64yAIOqyveuhnOqwgCDri6zrnbzsp5Hri4jri6Q6XG4gKiAtIHNlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQudHMg4oaSIC4vc29uYW11LnNoYXJlZFxuICogLSBzZXJ2aWNlcy91c2VyL3VzZXIudHlwZXMudHMg4oaSIC4uL3NvbmFtdS5zaGFyZWRcbiAqIC0gaTE4bi9rby50cyDihpIgLi4vc2VydmljZXMvc29uYW11LnNoYXJlZFxuICpcbiAqIHRzL3RzeCDtjIzsnbzsnYAg7JOw6riwIOyghOyXkCBveGZtdC9veGxpbnQg7ZWc67KIIOuPjOugpOykjeuLiOuLpCFcbiAqXG4gKiBAcGFyYW0gZnJvbVBhdGgg7JuQ67O4IO2MjOydvCDqsr3roZxcbiAqIEBwYXJhbSB0b1BhdGgg64yA7IOBIO2MjOydvCDqsr3roZxcbiAqIEBwYXJhbSBzeW5jSGVhZGVyIOuPmeq4sO2ZlCDsi5wg7YyM7J28IOy1nOyDgeuLqOyXkCDsgr3snoXtlaAg7KO87ISdIOu4lOuhnS4g6riw7KG0IEBnZW5lcmF0ZWQg67iU66Gd7J20IOyeiOycvOuptCDqtZDssrTtlZjqs6AsIOyXhuycvOuptCDstZzsg4Hri6jsl5Ag7LaU6rCA7ZWp64uI64ukLlxuICogQHJldHVybnMg7YyM7J287J2EIOyNvOycvOuptCB0cnVlLCDqsbTrhIjrm7Dsl4jsnLzrqbQgZmFsc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoXG4gIGZyb21QYXRoOiBzdHJpbmcsXG4gIHRvUGF0aDogc3RyaW5nLFxuICBzeW5jSGVhZGVyPzogc3RyaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gIGxldCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtla3sg4Ege2Jhc2V9L3NyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRz7JeQIOychOy5mO2VqeuLiOuLpC5cbiAgICAvLyB0b1BhdGjsl5DshJwgL3NyYy/rpbwg7LC+7JWEIHNlcnZpY2VzIOuUlOugie2GoOumrCDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICAgIGNvbnN0IHNyY01hdGNoID0gdG9QYXRoLm1hdGNoKC9eKC4rXFwvc3JjKVxcLy8pO1xuICAgIGlmICghc3JjTWF0Y2gpIHtcbiAgICAgIC8vIC9zcmMv6rCAIOyXhuycvOuptCDrs4DtmZgg7JeG7J20IOq3uOuMgOuhnCDrsJjtmZhcbiAgICAgIHJldHVybiBvbGRGaWxlQ29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlc0RpciA9IHBhdGguam9pbihzcmNNYXRjaFsxXSwgXCJzZXJ2aWNlc1wiKTtcbiAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc2VydmljZXNEaXIpO1xuICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgIHJldHVybiBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11KFxcL2RpY3QpP1wiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gIH0pKCk7XG5cbiAgLy8gc3luY0hlYWRlcuqwgCDsoJzqs7XrkJwg6rK97JqwIEBnZW5lcmF0ZWQg67iU66Gd7J2EIOq1kOyytO2VmOqxsOuCmCDstZzsg4Hri6jsl5Ag7LaU6rCA7ZWp64uI64ukLlxuICAvLyBgKi9gIOynge2bhOyXkOuKlCDtla3sg4Eg67mIIOykhCDtlZwg6rCc66W8IOuztOyepe2VmOyXrCBveGZtdOqwgCDso7zshJ3snYQgaW1wb3J07J2YIGxlYWRpbmcgY29tbWVudOuhnCDsmKTsnbjtlbQg7KCV66CsIOyLnCDrgYzroKTqsIDripQg66y47KCc66W8IOuwqeyngO2VqeuLiOuLpC5cbiAgaWYgKHN5bmNIZWFkZXIpIHtcbiAgICAvLyDquLDsobQgQGdlbmVyYXRlZCDruJTroZ0gKyDrkqTsnbTslrQg7Jik64qUIOu5iCDspITrk6Qo7J6I7Jy866m0IO2PrO2VqCnsnYQg7ZWc6rq867KI7JeQIOunpOy5re2VmOyXrCDqtZDssrQg7IucIOu5iCDspITsnbQg64iE7KCB65CY7KeAIOyViuqyjCDtlanri4jri6QuXG4gICAgLy8g7ZWcIOykhOynnOumrCgvKiogQGdlbmVyYXRlZCAqLynripQg66ek7Lmt7ZWY7KeAIOyViuycvOuvgOuhnCDsiJjrj5nsnLzroZwg7LaV7JW97ZWY7KeAIOuniOyEuOyalC5cbiAgICBjb25zdCBnZW5lcmF0ZWRCbG9ja1JlZ2V4ID0gL1xcL1xcKlxcKlxccj9cXG4gXFwqIEBnZW5lcmF0ZWRcXHI/XFxuW1xcc1xcU10qP1xcKlxcL1xccj9cXG4oXFxyP1xcbikqLztcbiAgICBpZiAoZ2VuZXJhdGVkQmxvY2tSZWdleC50ZXN0KG5ld0ZpbGVDb250ZW50KSkge1xuICAgICAgbmV3RmlsZUNvbnRlbnQgPSBuZXdGaWxlQ29udGVudC5yZXBsYWNlKGdlbmVyYXRlZEJsb2NrUmVnZXgsIGAke3N5bmNIZWFkZXJ9XFxuXFxuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0ZpbGVDb250ZW50ID0gYCR7c3luY0hlYWRlcn1cXG5cXG4ke25ld0ZpbGVDb250ZW50fWA7XG4gICAgfVxuICB9XG5cbiAgLy8gLnRzLy50c3gg7IKw7Lac66y87J2AIOyTsOq4sCDsoITsl5Ag7Y+s66e364+EIO2VtOykmOyalCDjhY7jhY5cbiAgaWYgKHRvUGF0aC5lbmRzV2l0aChcIi50c1wiKSB8fCB0b1BhdGguZW5kc1dpdGgoXCIudHN4XCIpKSB7XG4gICAgbmV3RmlsZUNvbnRlbnQgPSBhd2FpdCBmb3JtYXRDb2RlKG5ld0ZpbGVDb250ZW50LCB0b1BhdGgpO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWFBLGVBQXNCLE9BQU8sUUFBa0M7QUFDN0QsS0FBSTtBQUNGLFFBQU0sT0FBT0EsUUFBTSxVQUFVLEtBQUs7QUFDbEMsU0FBTztTQUNEO0FBQ04sU0FBTzs7O0FBS1gsZUFBc0IsV0FBVyxRQUFrQztBQUNqRSxLQUFJO0VBQ0YsTUFBTSxRQUFRLE1BQU0sS0FBS0EsT0FBSztBQUM5QixTQUFPLE1BQU0sUUFBUTtTQUNmO0FBQ04sU0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CWCxlQUFzQixnQ0FDcEIsVUFDQSxRQUNBLFlBQ2tCO0FBQ2xCLEtBQUksQ0FBRSxNQUFNLE9BQU8sU0FBUyxFQUFHO0FBQzdCLFNBQU87O0NBR1QsTUFBTSxrQkFBa0IsTUFBTSxTQUFTLFNBQVMsRUFBRSxVQUFVO0NBRTVELElBQUksd0JBQXdCO0VBRzFCLE1BQU0sV0FBVyxPQUFPLE1BQU0sZUFBZTtBQUM3QyxNQUFJLENBQUMsVUFBVTtBQUViLFVBQU87O0VBR1QsTUFBTSxjQUFjLEtBQUssS0FBSyxTQUFTLElBQUksV0FBVztFQUN0RCxNQUFNLFVBQVUsUUFBUSxPQUFPO0VBQy9CLE1BQU0sZUFBZSxLQUFLLFNBQVMsU0FBUyxZQUFZO0VBQ3hELE1BQU0sYUFBYSxpQkFBaUIsS0FBSyxvQkFBb0IsR0FBRyxhQUFhO0FBRTdFLFNBQU8sZUFBZSxRQUFRLDJCQUEyQixTQUFTLFdBQVcsR0FBRztLQUM5RTtBQUlKLEtBQUksWUFBWTtFQUdkLE1BQU0sc0JBQXNCO0FBQzVCLE1BQUksb0JBQW9CLEtBQUssZUFBZSxFQUFFO0FBQzVDLG9CQUFpQixlQUFlLFFBQVEscUJBQXFCLEdBQUcsV0FBVyxNQUFNO1NBQzVFO0FBQ0wsb0JBQWlCLEdBQUcsV0FBVyxNQUFNOzs7QUFLekMsS0FBSSxPQUFPLFNBQVMsTUFBTSxJQUFJLE9BQU8sU0FBUyxPQUFPLEVBQUU7QUFDckQsbUJBQWlCLE1BQU0sV0FBVyxnQkFBZ0IsT0FBTzs7QUFHM0QsT0FBTSxVQUFVLFFBQVEsZUFBZTtBQUN2QyxRQUFPOzs7aUJBMUZnQyJ9
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
import { type ExecFileOptions } from "child_process";
|
|
2
|
+
/**
|
|
3
|
+
* child_process.execFile의 Promise 기반 wrapper입니다.
|
|
4
|
+
* exit code가 non-zero이면 reject해요.
|
|
5
|
+
*/
|
|
6
|
+
export declare function execute(bin: string, args: string[], options?: ExecFileOptions): Promise<string>;
|
|
1
7
|
/**
|
|
2
8
|
* 주어진 작업을 실행합니다.
|
|
3
|
-
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(
|
|
9
|
+
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(waitForUpTo) 동안 작업을 기다린 후 종료합니다.
|
|
4
10
|
* @param {() => Promise<void>} job - 실행할 작업
|
|
5
|
-
* @param {
|
|
6
|
-
* @param {NodeJS.Signals} options.
|
|
7
|
-
* @param {number} options.
|
|
11
|
+
* @param {{ whenThisHappens: NodeJS.Signals; waitForUpTo: number }} options - 옵션
|
|
12
|
+
* @param {NodeJS.Signals} options.whenThisHappens - 프로세스 이벤트
|
|
13
|
+
* @param {number} options.waitForUpTo - 최대 한계 시간
|
|
8
14
|
*/
|
|
9
15
|
export declare function runWithGracefulShutdown(job: () => Promise<void>, { whenThisHappens: event, waitForUpTo: delayBeforeShutdown, }?: {
|
|
10
16
|
whenThisHappens: NodeJS.Signals;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ/D;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACxB,EACE,eAAe,EAAE,KAAK,EACtB,WAAW,EAAE,mBAAmB,GACjC,GAAE;IAAE,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAGxD,GACA,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
+
import { execFile } from "child_process";
|
|
3
4
|
import { setTimeout } from "timers/promises";
|
|
5
|
+
import { promisify } from "util";
|
|
4
6
|
|
|
5
7
|
//#region src/utils/process-utils.ts
|
|
6
8
|
/**
|
|
9
|
+
* child_process.execFile의 Promise 기반 wrapper입니다.
|
|
10
|
+
* exit code가 non-zero이면 reject해요.
|
|
11
|
+
*/
|
|
12
|
+
async function execute(bin, args, options) {
|
|
13
|
+
const { stdout } = await execFileAsync(bin, args, options);
|
|
14
|
+
return typeof stdout === "string" ? stdout : stdout.toString();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
7
17
|
* 주어진 작업을 실행합니다.
|
|
8
|
-
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(
|
|
18
|
+
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(waitForUpTo) 동안 작업을 기다린 후 종료합니다.
|
|
9
19
|
* @param {() => Promise<void>} job - 실행할 작업
|
|
10
|
-
* @param {
|
|
11
|
-
* @param {NodeJS.Signals} options.
|
|
12
|
-
* @param {number} options.
|
|
20
|
+
* @param {{ whenThisHappens: NodeJS.Signals; waitForUpTo: number }} options - 옵션
|
|
21
|
+
* @param {NodeJS.Signals} options.whenThisHappens - 프로세스 이벤트
|
|
22
|
+
* @param {number} options.waitForUpTo - 최대 한계 시간
|
|
13
23
|
*/
|
|
14
24
|
async function runWithGracefulShutdown(job, { whenThisHappens: event, waitForUpTo: delayBeforeShutdown } = {
|
|
15
25
|
whenThisHappens: "SIGUSR2",
|
|
@@ -34,9 +44,12 @@ async function runWithGracefulShutdown(job, { whenThisHappens: event, waitForUpT
|
|
|
34
44
|
abortController.abort();
|
|
35
45
|
process.off(event, onEvent);
|
|
36
46
|
}
|
|
37
|
-
var
|
|
47
|
+
var execFileAsync;
|
|
48
|
+
var init_process_utils = __esmMin((() => {
|
|
49
|
+
execFileAsync = promisify(execFile);
|
|
50
|
+
}));
|
|
38
51
|
|
|
39
52
|
//#endregion
|
|
40
53
|
init_process_utils();
|
|
41
|
-
export { init_process_utils, runWithGracefulShutdown };
|
|
42
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
54
|
+
export { execute, init_process_utils, runWithGracefulShutdown };
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy11dGlscy5qcyIsIm5hbWVzIjpbInNldFRpbWVvdXRQcm9taXNlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlLCB0eXBlIEV4ZWNGaWxlT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNldFRpbWVvdXRQcm9taXNlcyB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gXCJ1dGlsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcblxuY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG5cbi8qKlxuICogY2hpbGRfcHJvY2Vzcy5leGVjRmlsZeydmCBQcm9taXNlIOq4sOuwmCB3cmFwcGVy7J6F64uI64ukLlxuICogZXhpdCBjb2Rl6rCAIG5vbi16ZXJv7J2066m0IHJlamVjdO2VtOyalC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUoXG4gIGJpbjogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IEV4ZWNGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKGJpbiwgYXJncywgb3B0aW9ucyk7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSBcInN0cmluZ1wiID8gc3Rkb3V0IDogc3Rkb3V0LnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICog7KO87Ja07KeEIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gKiDso7zslrTsp4Qg7ZSE66Gc7IS47IqkIOydtOuypO2KuCg97Iuc6re464SQKeqwgCDrsJzsg53tlZjsmIDsnYQg65WM7JeQ64+EIOy1nOuMgCDtlZzqs4Qod2FpdEZvclVwVG8pIOuPmeyViCDsnpHsl4XsnYQg6riw64uk66awIO2bhCDsooXro4ztlanri4jri6QuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGpvYiAtIOyLpO2Wie2VoCDsnpHsl4VcbiAqIEBwYXJhbSB7eyB3aGVuVGhpc0hhcHBlbnM6IE5vZGVKUy5TaWduYWxzOyB3YWl0Rm9yVXBUbzogbnVtYmVyIH19IG9wdGlvbnMgLSDsmLXshZhcbiAqIEBwYXJhbSB7Tm9kZUpTLlNpZ25hbHN9IG9wdGlvbnMud2hlblRoaXNIYXBwZW5zIC0g7ZSE66Gc7IS47IqkIOydtOuypO2KuFxuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMud2FpdEZvclVwVG8gLSDstZzrjIAg7ZWc6rOEIOyLnOqwhFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gIGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAge1xuICAgIHdoZW5UaGlzSGFwcGVuczogZXZlbnQsXG4gICAgd2FpdEZvclVwVG86IGRlbGF5QmVmb3JlU2h1dGRvd24sXG4gIH06IHsgd2hlblRoaXNIYXBwZW5zOiBOb2RlSlMuU2lnbmFsczsgd2FpdEZvclVwVG86IG51bWJlciB9ID0ge1xuICAgIHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsXG4gICAgd2FpdEZvclVwVG86IDIwMDAwLFxuICB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpc1J1bm5pbmcgPSB0cnVlIGFzIGJvb2xlYW47XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBvbkV2ZW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNSdW5uaW5nKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYHdhaXQgZm9yIHN5bmNpbmcgZG9uZS4uLi5gKSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0VGltZW91dFByb21pc2VzKGRlbGF5QmVmb3JlU2h1dGRvd24sIFwid2FpdGluZy1zeW5jXCIsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7fVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYFN5bmNpbmcgRE9ORSFgKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuICBwcm9jZXNzLm9uKGV2ZW50LCBvbkV2ZW50KTtcblxuICBhd2FpdCBqb2IoKTtcblxuICBpc1J1bm5pbmcgPSBmYWxzZTtcbiAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIHByb2Nlc3Mub2ZmKGV2ZW50LCBvbkV2ZW50KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFZQSxlQUFzQixRQUNwQixLQUNBLE1BQ0EsU0FDaUI7Q0FDakIsTUFBTSxFQUFFLFdBQVcsTUFBTSxjQUFjLEtBQUssTUFBTSxRQUFRO0FBQzFELFFBQU8sT0FBTyxXQUFXLFdBQVcsU0FBUyxPQUFPLFVBQVU7Ozs7Ozs7Ozs7QUFXaEUsZUFBc0Isd0JBQ3BCLEtBQ0EsRUFDRSxpQkFBaUIsT0FDakIsYUFBYSx3QkFDK0M7Q0FDNUQsaUJBQWlCO0NBQ2pCLGFBQWE7Q0FDZCxFQUNjO0NBQ2YsSUFBSSxZQUFZO0NBRWhCLE1BQU0sa0JBQWtCLElBQUksaUJBQWlCO0NBQzdDLE1BQU0sVUFBVSxZQUFZO0FBQzFCLE1BQUksQ0FBQyxXQUFXO0FBQ2QsV0FBUSxLQUFLLEVBQUU7O0FBRWpCLFVBQVEsSUFBSSxNQUFNLGNBQWMsNEJBQTRCLENBQUM7QUFFN0QsTUFBSTtBQUNGLFNBQU1BLFdBQW1CLHFCQUFxQixnQkFBZ0IsRUFDNUQsUUFBUSxnQkFBZ0IsUUFDekIsQ0FBQztVQUNJO0FBQ1IsVUFBUSxJQUFJLE1BQU0sY0FBYyxnQkFBZ0IsQ0FBQztBQUNqRCxVQUFRLEtBQUssRUFBRTs7QUFFakIsU0FBUSxHQUFHLE9BQU8sUUFBUTtBQUUxQixPQUFNLEtBQUs7QUFFWCxhQUFZO0FBQ1osaUJBQWdCLE9BQU87QUFDdkIsU0FBUSxJQUFJLE9BQU8sUUFBUTs7OztDQXhEdkIsZ0JBQWdCLFVBQVUsU0FBUyJ9
|
package/dist/utils/utils.d.ts
CHANGED
|
@@ -10,5 +10,6 @@ export declare function assertDefined<T>(value: T | undefined, message?: string)
|
|
|
10
10
|
export declare function intersectionBy<T, K>(arr1: readonly T[], arr2: readonly T[], iteratee: (item: T) => K): T[];
|
|
11
11
|
export declare function differenceWith<T>(arr1: readonly T[], arr2: readonly T[], comparator: (a: T, b: T) => boolean): T[];
|
|
12
12
|
export declare function merge<T extends Record<string, any>>(defaultObj: T, userObj: T): T;
|
|
13
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
13
14
|
export declare function convertFastifyHeadersToStandard(headers: FastifyRequest["headers"]): Headers;
|
|
14
15
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,eAAe,IAAI,YAAY,CA8B9C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,QAEvC;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKhF;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKrE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAK1E;AAGD,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EACjC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GACvB,CAAC,EAAE,CAGL;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAClC,CAAC,EAAE,CAEL;AAGD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAsBjF;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,eAAe,IAAI,YAAY,CA8B9C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,QAEvC;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKhF;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKrE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAK1E;AAGD,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EACjC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GACvB,CAAC,EAAE,CAGL;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAClC,CAAC,EAAE,CAEL;AAGD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAsBjF;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO9E;AAGD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,OAAO,CAM3F"}
|