sonamu 0.9.4 → 0.9.6
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/ai/providers/rtzr/utils.js +2 -2
- 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 +54 -3
- 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/database/upsert-builder.js +4 -4
- package/dist/dict/sonamu-dictionary.js +6 -6
- 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.d.ts.map +1 -1
- package/dist/migration/code-generation.js +8 -9
- 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/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +5 -3
- 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.d.ts.map +1 -1
- package/dist/ui/api.js +4 -3
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
- package/dist/ui-web/index.html +2 -2
- 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 +95 -60
- 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 +6 -0
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +16 -3
- 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 +7 -5
- package/src/ai/providers/rtzr/utils.ts +1 -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 +101 -1
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/database/upsert-builder.ts +3 -3
- package/src/dict/sonamu-dictionary.ts +3 -3
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +6 -11
- package/src/shared/app.shared.ts.txt +312 -4
- package/src/shared/web.shared.ts.txt +340 -4
- 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/testing/data-explorer.ts +3 -2
- package/src/types/types.ts +20 -2
- package/src/ui/api.ts +10 -1
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +114 -75
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +17 -0
- package/src/utils/utils.ts +1 -1
- package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
package/dist/utils/formatter.js
CHANGED
|
@@ -1,92 +1,127 @@
|
|
|
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";
|
|
8
|
+
import { tmpdir } from "os";
|
|
6
9
|
import { createRequire } from "module";
|
|
7
10
|
import { format } from "oxfmt";
|
|
8
11
|
|
|
9
12
|
//#region src/utils/formatter.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* 캐시 없는 포맷함수 엔트리.
|
|
15
|
+
*/
|
|
16
|
+
async function formatCodeInternal(code, filePath) {
|
|
17
|
+
if (filePath.endsWith("json")) {
|
|
18
|
+
return runOxfmt(code, filePath);
|
|
15
19
|
}
|
|
20
|
+
return runOxfmt(await runOxlint(code), filePath);
|
|
16
21
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* 프로젝트 설정을 찾아서 이에 맞춰서 코드를 포맷합니다.
|
|
24
|
+
*/
|
|
25
|
+
async function runOxfmt(code, filePath) {
|
|
26
|
+
const result = await format(path.basename(filePath), code, await loadOxfmtConfig());
|
|
27
|
+
const errors = result.errors.filter((e) => e.severity === "Error");
|
|
28
|
+
if (errors.length > 0) {
|
|
29
|
+
if (!isTest()) {
|
|
30
|
+
console.error(`oxfmt errors (${filePath}):`);
|
|
31
|
+
for (const err of errors) {
|
|
32
|
+
const label = err.labels[0];
|
|
33
|
+
if (label) {
|
|
34
|
+
const before = code.slice(Math.max(0, label.start - 80), label.start);
|
|
35
|
+
const at = code.slice(label.start, label.end);
|
|
36
|
+
const after = code.slice(label.end, Math.min(code.length, label.end + 80));
|
|
37
|
+
console.error(` - ${err.message} (offset ${label.start}-${label.end})`);
|
|
38
|
+
console.error(` around: ...${before}»${at}«${after}...`);
|
|
39
|
+
} else {
|
|
40
|
+
console.error(` - ${err.message}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return code;
|
|
45
|
+
}
|
|
46
|
+
return result.code;
|
|
47
|
+
}
|
|
48
|
+
async function loadOxfmtConfig() {
|
|
49
|
+
if (cachedOxfmtConfig !== null) {
|
|
50
|
+
return cachedOxfmtConfig;
|
|
51
|
+
}
|
|
52
|
+
let dir = process.cwd();
|
|
53
|
+
while (true) {
|
|
54
|
+
const candidate = join(dir, ".oxfmtrc.json");
|
|
55
|
+
try {
|
|
56
|
+
cachedOxfmtConfig = JSON.parse(await readFile(candidate, "utf-8"));
|
|
57
|
+
return cachedOxfmtConfig;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
if (e.code !== "ENOENT") {
|
|
60
|
+
!isTest() && console.error(`Failed to load ${candidate}:`, e);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
24
63
|
}
|
|
64
|
+
const parent = dirname(dir);
|
|
65
|
+
if (parent === dir) break;
|
|
66
|
+
dir = parent;
|
|
25
67
|
}
|
|
26
|
-
|
|
27
|
-
|
|
68
|
+
cachedOxfmtConfig = {};
|
|
69
|
+
return cachedOxfmtConfig;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 프로젝트 설정에 맞춰 코드를 lint합니다.
|
|
73
|
+
*
|
|
74
|
+
* 프로젝트 설정을 적용받는 oxlint cli를 찾아 띄워서,
|
|
75
|
+
* 임시 파일에 in-place로 써서 그 결과를 빼오는 방식으로 작동합니다.
|
|
76
|
+
* 왜 이렇게 하느냐? oxlint가 node api도 안 주고 cli에서 stdin 옵션도 안 주기 때문...
|
|
77
|
+
*/
|
|
78
|
+
async function runOxlint(code) {
|
|
79
|
+
if (isTest()) {
|
|
80
|
+
return code;
|
|
28
81
|
}
|
|
29
|
-
const tmpFile = join(
|
|
82
|
+
const tmpFile = join(tmpdir(), `.sonamu-fmt-${Date.now()}-${Math.random().toString(36).slice(2)}.ts`);
|
|
30
83
|
try {
|
|
31
|
-
|
|
32
|
-
const oxlintBin = resolveOxlintBin();
|
|
84
|
+
await writeFile(tmpFile, code, "utf-8");
|
|
33
85
|
try {
|
|
34
|
-
|
|
86
|
+
await execute(resolveOxlintBin(), [
|
|
35
87
|
"--fix",
|
|
36
88
|
"--fix-suggestions",
|
|
37
89
|
"--type-aware",
|
|
38
90
|
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;
|
|
91
|
+
], { timeout: 1e4 });
|
|
92
|
+
} catch (e) {
|
|
93
|
+
if (typeof e.code !== "number") {
|
|
94
|
+
throw e;
|
|
53
95
|
}
|
|
54
96
|
}
|
|
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;
|
|
97
|
+
return await readFile(tmpFile, "utf-8");
|
|
65
98
|
} finally {
|
|
66
99
|
try {
|
|
67
|
-
|
|
100
|
+
await unlink(tmpFile);
|
|
68
101
|
} catch {}
|
|
69
102
|
}
|
|
70
103
|
}
|
|
71
|
-
|
|
104
|
+
function resolveOxlintBin() {
|
|
105
|
+
try {
|
|
106
|
+
return _require.resolve("oxlint/bin/oxlint");
|
|
107
|
+
} catch {
|
|
108
|
+
return "oxlint";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
var _require, formatCode, cachedOxfmtConfig;
|
|
72
112
|
var init_formatter = __esmMin((() => {
|
|
113
|
+
init_async_utils();
|
|
73
114
|
init_controller();
|
|
115
|
+
init_process_utils();
|
|
74
116
|
_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
|
-
};
|
|
117
|
+
formatCode = cached(formatCodeInternal, (code, filePath) => {
|
|
118
|
+
const ext = filePath.endsWith(".tsx") ? "tsx" : filePath.endsWith("json") ? "json" : "ts";
|
|
119
|
+
return `${ext}:${createHash("sha1").update(code).digest("hex")}`;
|
|
120
|
+
});
|
|
121
|
+
cachedOxfmtConfig = null;
|
|
87
122
|
}));
|
|
88
123
|
|
|
89
124
|
//#endregion
|
|
90
125
|
init_formatter();
|
|
91
126
|
export { formatCode, init_formatter };
|
|
92
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
127
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwibmFtZXMiOlsiY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZm9ybWF0dGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG4vLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGZzL3Byb21pc2Vz6rCAIG1vY2vrkJjsp4Drp4wsIOyVhOuemCBydW5PeGxpbnTsnbQgaXNUZXN0IOqwgOuTnOuhnCDslYgg64+E64uI6rmMXG4vLyDqt7jrg6UgZnMvcHJvbWlzZXMg6re464yA66GcIOyCrOyaqS4gKHByb2R1Y3Rpb27sl5DshJzrp4wg7J6E7Iuc7YyM7J28IO2dkOumhOydtCDrj5Xri4jri6QuKVxuaW1wb3J0IHsgcmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZm9ybWF0LCB0eXBlIEZvcm1hdENvbmZpZyB9IGZyb20gXCJveGZtdFwiO1xuXG5pbXBvcnQgeyBjYWNoZWQgfSBmcm9tIFwiLi9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4vY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhlY3V0ZSB9IGZyb20gXCIuL3Byb2Nlc3MtdXRpbHNcIjtcblxuY29uc3QgX3JlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbi8qKlxuICog7L2U65Oc66W8IO2UhOuhnOygne2KuOydmCBveGZtdCArIG94bGludCDshKTsoJXsl5Ag66ee7LawIO2PrOunpO2Mhe2VnCDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIOy6kOyLseuPhCDsnojslrTsmpQg44WO44WOIOuYkeqwmeydgCDsnoXroKXsl5Ag64yA7ZW07IScIOy6kOyLnCDsu6TrsoTrkKnri4jri6QuXG4gKiDsiJjrqoXsnYAg7ZSE66Gc7IS47IqkIOyjveydhOuVjOq5jOyngCDjhYtcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENvZGUgPSBjYWNoZWQoZm9ybWF0Q29kZUludGVybmFsLCAoY29kZSwgZmlsZVBhdGgpID0+IHtcbiAgY29uc3QgZXh0ID0gZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpID8gXCJ0c3hcIiA6IGZpbGVQYXRoLmVuZHNXaXRoKFwianNvblwiKSA/IFwianNvblwiIDogXCJ0c1wiO1xuICByZXR1cm4gYCR7ZXh0fToke2NyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShjb2RlKS5kaWdlc3QoXCJoZXhcIil9YDtcbn0pO1xuXG4vKipcbiAqIOy6kOyLnCDsl4bripQg7Y+s66e37ZWo7IiYIOyXlO2KuOumrC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9ybWF0Q29kZUludGVybmFsKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGpzb27snYAg7Y+s66e366eMIO2VmOuptCDrkKnri4jri6QuXG4gIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcImpzb25cIikpIHtcbiAgICByZXR1cm4gcnVuT3hmbXQoY29kZSwgZmlsZVBhdGgpO1xuICB9XG5cbiAgLy8g66aw7Yq4IOuovOyggCDtlZwg64uk7J2M7JeQIO2PrOunt+ycvOuhnCDrp4jrrLTrpqztlbTsmpQuXG4gIHJldHVybiBydW5PeGZtdChhd2FpdCBydW5PeGxpbnQoY29kZSksIGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7J2EIOywvuyVhOyEnCDsnbTsl5Ag66ee7Law7IScIOy9lOuTnOulvCDtj6zrp7ftlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94Zm10KGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZvcm1hdChwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSwgY29kZSwgYXdhaXQgbG9hZE94Zm10Q29uZmlnKCkpO1xuXG4gIGNvbnN0IGVycm9ycyA9IHJlc3VsdC5lcnJvcnMuZmlsdGVyKChlKSA9PiBlLnNldmVyaXR5ID09PSBcIkVycm9yXCIpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBveGZtdCBlcnJvcnMgKCR7ZmlsZVBhdGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGVyci5sYWJlbHNbMF07XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IGNvZGUuc2xpY2UoTWF0aC5tYXgoMCwgbGFiZWwuc3RhcnQgLSA4MCksIGxhYmVsLnN0YXJ0KTtcbiAgICAgICAgICBjb25zdCBhdCA9IGNvZGUuc2xpY2UobGFiZWwuc3RhcnQsIGxhYmVsLmVuZCk7XG4gICAgICAgICAgY29uc3QgYWZ0ZXIgPSBjb2RlLnNsaWNlKGxhYmVsLmVuZCwgTWF0aC5taW4oY29kZS5sZW5ndGgsIGxhYmVsLmVuZCArIDgwKSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9IChvZmZzZXQgJHtsYWJlbC5zdGFydH0tJHtsYWJlbC5lbmR9KWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgICBhcm91bmQ6IC4uLiR7YmVmb3JlfcK7JHthdH3CqyR7YWZ0ZXJ9Li4uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5jb2RlO1xufVxuXG5sZXQgY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gbG9hZE94Zm10Q29uZmlnKCk6IFByb21pc2U8Rm9ybWF0Q29uZmlnPiB7XG4gIGlmIChjYWNoZWRPeGZtdENvbmZpZyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgfVxuXG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4oZGlyLCBcIi5veGZtdHJjLmpzb25cIik7XG4gICAgdHJ5IHtcbiAgICAgIGNhY2hlZE94Zm10Q29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjYW5kaWRhdGUsIFwidXRmLThcIikpIGFzIEZvcm1hdENvbmZpZztcbiAgICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke2NhbmRpZGF0ZX06YCwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSBicmVhaztcbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICBjYWNoZWRPeGZtdENvbmZpZyA9IHt9O1xuICByZXR1cm4gY2FjaGVkT3hmbXRDb25maWc7XG59XG5cbi8qKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleyXkCDrp57strAg7L2U65Oc66W8IGxpbnTtlanri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleydhCDsoIHsmqnrsJvripQgb3hsaW50IGNsaeulvCDssL7slYQg652E7JuM7IScLFxuICog7J6E7IucIO2MjOydvOyXkCBpbi1wbGFjZeuhnCDsjajshJwg6re4IOqysOqzvOulvCDrubzsmKTripQg67Cp7Iud7Jy866GcIOyekeuPme2VqeuLiOuLpC5cbiAqIOyZnCDsnbTroIfqsowg7ZWY64qQ64OQPyBveGxpbnTqsIAgbm9kZSBhcGnrj4Qg7JWIIOyjvOqzoCBjbGnsl5DshJwgc3RkaW4g7Ji17IWY64+EIOyViCDso7zquLAg65WM66y4Li4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94bGludChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNUZXN0KCkpIHtcbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIOuKkOugpOyngOq4sOunjCDtlZjqs6Ag6rKA7Kad7ZWgIOqwgOy5mOuPhCDsl4bslrTshJwg7JWIIO2VqeuLiOuLpC5cbiAgICAvLyBHaXRIdWIgQWN0aW9ucyDtmZjqsr3sl5DshJwgbGludOqwgCDsmKTrnpgg6rG466Ck7IScIOu7l+q4sOuPhCDtlojslrTsmpQuIChodHRwczovL2dpdGh1Yi5jb20vY2FydGFub3ZhLWFpL3NvbmFtdS9hY3Rpb25zL3J1bnMvMjUyNjcyMTQwMjcvam9iLzc0MDgzNjMwMTY5KVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgLy8gT1MgdG1wIGRpcuyXkCDrkZDripQg7J207JygOiBwcm9jZXNzLmN3ZCgp6rCAIHdhdGNoZXIg7Iqk7L2U7ZSEKGFwaS9zcmMg7JWE656YKeydvCDqsIDriqXshLHsnYQg7LCo64uo7ZWp64uI64ukLlxuICAvLyBjd2TqsIAg6re4IOychOy5mOudvOuptCB3cml0ZS91bmxpbmvqsIAg7Ken7J2AIOyInOqwhCB3YXRjaGVyIOydtOuypO2KuOuhnCDsnqHtmIAgYmF0Y2jsl5Ag7Z2Y65+s65Ok7Ja06rCIIOyImCDsnojslrTsmpQuXG4gIGNvbnN0IHRtcEZpbGUgPSBqb2luKFxuICAgIHRtcGRpcigpLFxuICAgIGAuc29uYW11LWZtdC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9LnRzYCxcbiAgKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0bXBGaWxlLCBjb2RlLCBcInV0Zi04XCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWN1dGUocmVzb2x2ZU94bGludEJpbigpLCBbXCItLWZpeFwiLCBcIi0tZml4LXN1Z2dlc3Rpb25zXCIsIFwiLS10eXBlLWF3YXJlXCIsIHRtcEZpbGVdLCB7XG4gICAgICAgIHRpbWVvdXQ6IDEwMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbGludCDsnITrsJgg7IucIGV4aXQgY29kZSAhPSAw7J207KeA66eMIC0tZml464qUIOyggeyaqeuQqC4gZXhlYyDsnpDssrQg7Iuk7Yyo66eMIHRocm93LlxuICAgICAgaWYgKHR5cGVvZiAoZSBhcyBFcnJvciAmIHsgY29kZT86IG51bWJlciB9KS5jb2RlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHRtcEZpbGUsIFwidXRmLThcIik7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVubGluayh0bXBGaWxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOyCreygnCDsi6TtjKjtlbTrj4Qg7Ja07LCo7ZS8IGlnbm9yZeuQqC5cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU94bGludEJpbigpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBfcmVxdWlyZS5yZXNvbHZlKFwib3hsaW50L2Jpbi9veGxpbnRcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIm94bGludFwiO1xuICB9XG59XG4i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
|
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,3 +1,9 @@
|
|
|
1
|
+
import { type ExecFileOptions } from "child_process";
|
|
2
|
+
/**
|
|
3
|
+
* exexFileSync의 비동기 버전입니다.
|
|
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
|
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(delayBeforeShutdown) 동안 작업을 기다린 후 종료합니다.
|
|
@@ -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,9 +1,19 @@
|
|
|
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
|
+
* exexFileSync의 비동기 버전입니다.
|
|
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
|
* 주어진 프로세스 이벤트(=시그널)가 발생하였을 때에도 최대 한계(delayBeforeShutdown) 동안 작업을 기다린 후 종료합니다.
|
|
9
19
|
* @param {() => Promise<void>} job - 실행할 작업
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy11dGlscy5qcyIsIm5hbWVzIjpbInNldFRpbWVvdXRQcm9taXNlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlLCB0eXBlIEV4ZWNGaWxlT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNldFRpbWVvdXRQcm9taXNlcyB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gXCJ1dGlsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcblxuY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG5cbi8qKlxuICogZXhleEZpbGVTeW5j7J2YIOu5hOuPmeq4sCDrsoTsoITsnoXri4jri6QuXG4gKiBleGl0IGNvZGXqsIAgbm9uLXplcm/snbTrqbQgcmVqZWN07ZW07JqULlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZShcbiAgYmluOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogRXhlY0ZpbGVPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoYmluLCBhcmdzLCBvcHRpb25zKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09IFwic3RyaW5nXCIgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4Qg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAqIOyjvOyWtOynhCDtlITroZzshLjsiqQg7J2067Kk7Yq4KD3si5zqt7jrhJAp6rCAIOuwnOyDne2VmOyYgOydhCDrlYzsl5Drj4Qg7LWc64yAIO2VnOqzhChkZWxheUJlZm9yZVNodXRkb3duKSDrj5nslYgg7J6R7JeF7J2EIOq4sOuLpOumsCDtm4Qg7KKF66OM7ZWp64uI64ukLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBqb2IgLSDsi6TtlontlaAg7J6R7JeFXG4gKiBAcGFyYW0ge2V2ZW50OiBOb2RlSlMuU2lnbmFsczsgZGVsYXlCZWZvcmVTaHV0ZG93bjogbnVtYmVyfSBvcHRpb25zIC0g7Ji17IWYXG4gKiBAcGFyYW0ge05vZGVKUy5TaWduYWxzfSBvcHRpb25zLmV2ZW50IC0g7ZSE66Gc7IS47IqkIOydtOuypO2KuFxuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMuZGVsYXlCZWZvcmVTaHV0ZG93biAtIOy1nOuMgCDtlZzqs4Qg7Iuc6rCEXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICB7XG4gICAgd2hlblRoaXNIYXBwZW5zOiBldmVudCxcbiAgICB3YWl0Rm9yVXBUbzogZGVsYXlCZWZvcmVTaHV0ZG93bixcbiAgfTogeyB3aGVuVGhpc0hhcHBlbnM6IE5vZGVKUy5TaWduYWxzOyB3YWl0Rm9yVXBUbzogbnVtYmVyIH0gPSB7XG4gICAgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIixcbiAgICB3YWl0Rm9yVXBUbzogMjAwMDAsXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGlzUnVubmluZyA9IHRydWUgYXMgYm9vbGVhbjtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IG9uRXZlbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFpc1J1bm5pbmcpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coY2hhbGsubWFnZW50YUJyaWdodChgd2FpdCBmb3Igc3luY2luZyBkb25lLi4uLmApKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXRUaW1lb3V0UHJvbWlzZXMoZGVsYXlCZWZvcmVTaHV0ZG93biwgXCJ3YWl0aW5nLXN5bmNcIiwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHt9XG4gICAgY29uc29sZS5sb2coY2hhbGsubWFnZW50YUJyaWdodChgU3luY2luZyBET05FIWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH07XG4gIHByb2Nlc3Mub24oZXZlbnQsIG9uRXZlbnQpO1xuXG4gIGF3YWl0IGpvYigpO1xuXG4gIGlzUnVubmluZyA9IGZhbHNlO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgcHJvY2Vzcy5vZmYoZXZlbnQsIG9uRXZlbnQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLGVBQXNCLFFBQ3BCLEtBQ0EsTUFDQSxTQUNpQjtDQUNqQixNQUFNLEVBQUUsV0FBVyxNQUFNLGNBQWMsS0FBSyxNQUFNLFFBQVE7QUFDMUQsUUFBTyxPQUFPLFdBQVcsV0FBVyxTQUFTLE9BQU8sVUFBVTs7Ozs7Ozs7OztBQVdoRSxlQUFzQix3QkFDcEIsS0FDQSxFQUNFLGlCQUFpQixPQUNqQixhQUFhLHdCQUMrQztDQUM1RCxpQkFBaUI7Q0FDakIsYUFBYTtDQUNkLEVBQ2M7Q0FDZixJQUFJLFlBQVk7Q0FFaEIsTUFBTSxrQkFBa0IsSUFBSSxpQkFBaUI7Q0FDN0MsTUFBTSxVQUFVLFlBQVk7QUFDMUIsTUFBSSxDQUFDLFdBQVc7QUFDZCxXQUFRLEtBQUssRUFBRTs7QUFFakIsVUFBUSxJQUFJLE1BQU0sY0FBYyw0QkFBNEIsQ0FBQztBQUU3RCxNQUFJO0FBQ0YsU0FBTUEsV0FBbUIscUJBQXFCLGdCQUFnQixFQUM1RCxRQUFRLGdCQUFnQixRQUN6QixDQUFDO1VBQ0k7QUFDUixVQUFRLElBQUksTUFBTSxjQUFjLGdCQUFnQixDQUFDO0FBQ2pELFVBQVEsS0FBSyxFQUFFOztBQUVqQixTQUFRLEdBQUcsT0FBTyxRQUFRO0FBRTFCLE9BQU0sS0FBSztBQUVYLGFBQVk7QUFDWixpQkFBZ0IsT0FBTztBQUN2QixTQUFRLElBQUksT0FBTyxRQUFROzs7O0NBeER2QixnQkFBZ0IsVUFBVSxTQUFTIn0=
|
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"}
|
package/dist/utils/utils.js
CHANGED
|
@@ -92,5 +92,5 @@ var init_utils = __esmMin((() => {}));
|
|
|
92
92
|
|
|
93
93
|
//#endregion
|
|
94
94
|
init_utils();
|
|
95
|
-
export { assertDefined, assertExists, assertNotNull, convertFastifyHeadersToStandard, differenceWith, exhaustive, findApiRootPath, findAppRootPath, init_utils, intersectionBy, merge, nonNullable };
|
|
96
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuXG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuL3BhdGgtdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBcHBSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICByZXR1cm4gcGF0aC5kaXJuYW1lKGFwaVJvb3RQYXRoKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgLy8gTk9URTogZm9yIHN1cHBvcnQgbnBtIC8geWFybiAvIHBucG0gd29ya3NwYWNlc1xuICAvLyDtlZjsp4Drp4wgd29ya3NwYWNlIOyTsOuptCBwcm9jZXNzLmN3ZCgpIO2VmOuptCDrkJjripTrjbAuLi4g7J206rG0IOuCmOykkeyXkCDtmJHsnZgg7ZuEIOyImOygle2VmOuKlOqxuOuhnFxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcHJvY2Vzcy5lbnYuUE5QTV9TQ1JJUFRfU1JDX0RJUiA/PyBwcm9jZXNzLmVudi5JTklUX0NXRDtcbiAgaWYgKG5vbk51bGxhYmxlKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgcmV0dXJuIHdvcmtzcGFjZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICB9XG5cbiAgaWYgKG5vbk51bGxhYmxlKHByb2Nlc3MuZW52LlBOUE1fUEFDS0FHRV9OQU1FKSkge1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpLnNwbGl0KHBhdGguc2VwKS5qb2luKHBhdGguc2VwKSBhcyBBYnNvbHV0ZVBhdGg7XG4gIH1cblxuICBjb25zdCBjd2RQYWNrYWdlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY3dkUGFja2FnZVBhdGgpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuY3dkKCkuc3BsaXQocGF0aC5zZXApLmpvaW4ocGF0aC5zZXApIGFzIEFic29sdXRlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGJhc2VQYXRoID0gaW1wb3J0Lm1ldGEuZmlsZW5hbWU7XG4gIGxldCBkaXIgPSBwYXRoLmRpcm5hbWUoYmFzZVBhdGgpO1xuICBpZiAoZGlyLmluY2x1ZGVzKFwiLy55YXJuL1wiKSkge1xuICAgIGRpciA9IGRpci5zcGxpdChcIi8ueWFybi9cIilbMF07XG4gIH1cblxuICBkbyB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpciwgXCIvcGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgcmV0dXJuIGRpci5zcGxpdChwYXRoLnNlcCkuam9pbihwYXRoLnNlcCkgYXMgQWJzb2x1dGVQYXRoO1xuICAgIH1cbiAgICBkaXIgPSBkaXIuc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfSB3aGlsZSAoZGlyLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggPiAxKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgQXBwUm9vdCB1c2luZyBTb25hbXUgLTJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsYWJsZTxUPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0aXZlKF9wYXJhbTogbmV2ZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBleGhhdXN0aXZlYCk7XG59XG5cbi8vIOydvOuwmCDrsoTsoIRcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeGlzdHM8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkLCBtZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgPz8gXCJWYWx1ZSBtdXN0IGV4aXN0XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gbnVsbOunjCDssrTtgaxcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3ROdWxsPFQ+KHZhbHVlOiBUIHwgbnVsbCwgbWVzc2FnZT86IHN0cmluZyk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSA/PyBcIlZhbHVlIG11c3Qgbm90IGJlIG51bGxcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuLy8gdW5kZWZpbmVk66eMIOyytO2BrFxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlZmluZWQ8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQsIG1lc3NhZ2U/OiBzdHJpbmcpOiBUIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSA/PyBcIlZhbHVlIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIGxvZGFzaCBpbnRlcnNlY3Rpb25CeSDrjIDssrRcbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb25CeTxULCBLPihcbiAgYXJyMTogcmVhZG9ubHkgVFtdLFxuICBhcnIyOiByZWFkb25seSBUW10sXG4gIGl0ZXJhdGVlOiAoaXRlbTogVCkgPT4gSyxcbik6IFRbXSB7XG4gIGNvbnN0IGFycjJLZXlzID0gbmV3IFNldChhcnIyLm1hcChpdGVyYXRlZSkpO1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW0pID0+IGFycjJLZXlzLmhhcyhpdGVyYXRlZShpdGVtKSkpO1xufVxuLy8gbG9kYXNoIGRpZmZlcmVuY2VXaXRoIOuMgOyytFxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VXaXRoPFQ+KFxuICBhcnIxOiByZWFkb25seSBUW10sXG4gIGFycjI6IHJlYWRvbmx5IFRbXSxcbiAgY29tcGFyYXRvcjogKGE6IFQsIGI6IFQpID0+
|
|
95
|
+
export { assertDefined, assertExists, assertNotNull, convertFastifyHeadersToStandard, differenceWith, exhaustive, findApiRootPath, findAppRootPath, init_utils, intersectionBy, isPlainObject, merge, nonNullable };
|
|
96
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuXG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuL3BhdGgtdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBcHBSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICByZXR1cm4gcGF0aC5kaXJuYW1lKGFwaVJvb3RQYXRoKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgLy8gTk9URTogZm9yIHN1cHBvcnQgbnBtIC8geWFybiAvIHBucG0gd29ya3NwYWNlc1xuICAvLyDtlZjsp4Drp4wgd29ya3NwYWNlIOyTsOuptCBwcm9jZXNzLmN3ZCgpIO2VmOuptCDrkJjripTrjbAuLi4g7J206rG0IOuCmOykkeyXkCDtmJHsnZgg7ZuEIOyImOygle2VmOuKlOqxuOuhnFxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcHJvY2Vzcy5lbnYuUE5QTV9TQ1JJUFRfU1JDX0RJUiA/PyBwcm9jZXNzLmVudi5JTklUX0NXRDtcbiAgaWYgKG5vbk51bGxhYmxlKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgcmV0dXJuIHdvcmtzcGFjZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICB9XG5cbiAgaWYgKG5vbk51bGxhYmxlKHByb2Nlc3MuZW52LlBOUE1fUEFDS0FHRV9OQU1FKSkge1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpLnNwbGl0KHBhdGguc2VwKS5qb2luKHBhdGguc2VwKSBhcyBBYnNvbHV0ZVBhdGg7XG4gIH1cblxuICBjb25zdCBjd2RQYWNrYWdlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY3dkUGFja2FnZVBhdGgpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuY3dkKCkuc3BsaXQocGF0aC5zZXApLmpvaW4ocGF0aC5zZXApIGFzIEFic29sdXRlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGJhc2VQYXRoID0gaW1wb3J0Lm1ldGEuZmlsZW5hbWU7XG4gIGxldCBkaXIgPSBwYXRoLmRpcm5hbWUoYmFzZVBhdGgpO1xuICBpZiAoZGlyLmluY2x1ZGVzKFwiLy55YXJuL1wiKSkge1xuICAgIGRpciA9IGRpci5zcGxpdChcIi8ueWFybi9cIilbMF07XG4gIH1cblxuICBkbyB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpciwgXCIvcGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgcmV0dXJuIGRpci5zcGxpdChwYXRoLnNlcCkuam9pbihwYXRoLnNlcCkgYXMgQWJzb2x1dGVQYXRoO1xuICAgIH1cbiAgICBkaXIgPSBkaXIuc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfSB3aGlsZSAoZGlyLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggPiAxKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgQXBwUm9vdCB1c2luZyBTb25hbXUgLTJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsYWJsZTxUPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0aXZlKF9wYXJhbTogbmV2ZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBleGhhdXN0aXZlYCk7XG59XG5cbi8vIOydvOuwmCDrsoTsoIRcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeGlzdHM8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkLCBtZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgPz8gXCJWYWx1ZSBtdXN0IGV4aXN0XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gbnVsbOunjCDssrTtgaxcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3ROdWxsPFQ+KHZhbHVlOiBUIHwgbnVsbCwgbWVzc2FnZT86IHN0cmluZyk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSA/PyBcIlZhbHVlIG11c3Qgbm90IGJlIG51bGxcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuLy8gdW5kZWZpbmVk66eMIOyytO2BrFxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlZmluZWQ8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQsIG1lc3NhZ2U/OiBzdHJpbmcpOiBUIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSA/PyBcIlZhbHVlIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIGxvZGFzaCBpbnRlcnNlY3Rpb25CeSDrjIDssrRcbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb25CeTxULCBLPihcbiAgYXJyMTogcmVhZG9ubHkgVFtdLFxuICBhcnIyOiByZWFkb25seSBUW10sXG4gIGl0ZXJhdGVlOiAoaXRlbTogVCkgPT4gSyxcbik6IFRbXSB7XG4gIGNvbnN0IGFycjJLZXlzID0gbmV3IFNldChhcnIyLm1hcChpdGVyYXRlZSkpO1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW0pID0+IGFycjJLZXlzLmhhcyhpdGVyYXRlZShpdGVtKSkpO1xufVxuLy8gbG9kYXNoIGRpZmZlcmVuY2VXaXRoIOuMgOyytFxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VXaXRoPFQ+KFxuICBhcnIxOiByZWFkb25seSBUW10sXG4gIGFycjI6IHJlYWRvbmx5IFRbXSxcbiAgY29tcGFyYXRvcjogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW4sXG4pOiBUW10ge1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW1BKSA9PiAhYXJyMi5zb21lKChpdGVtQikgPT4gY29tcGFyYXRvcihpdGVtQSwgaXRlbUIpKSk7XG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogZHluYW1pYyBwcm9wZXJ0eSBhY2Nlc3NcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oZGVmYXVsdE9iajogVCwgdXNlck9iajogVCk6IFQge1xuICAvLyDsm5Drs7gg67O07KG07J2EIOychO2VtCBkZWZhdWx0T2JqIOuzteyCrFxuICBjb25zdCByZXN1bHQgPSB7IC4uLmRlZmF1bHRPYmogfTtcblxuICAvLyB1c2VyT2Jq7J2YIOqwgSDsho3shLHsnYQg7Iic7ZqMXG4gIGZvciAoY29uc3Qga2V5IGluIHVzZXJPYmopIHtcbiAgICAvLyB1c2VyT2Jq7J2YIG93biBwcm9wZXJ0eeunjCDsspjrpqwgKO2UhOuhnO2GoO2DgOyehSDssrTsnbgg7KCc7Jm4KVxuICAgIGlmIChPYmplY3QuaGFzT3duKHVzZXJPYmosIGtleSkpIHtcbiAgICAgIGNvbnN0IHVzZXJWYWx1ZSA9IHVzZXJPYmpba2V5XTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJlc3VsdFtrZXldO1xuXG4gICAgICAvLyDrkZAg6rCS7J20IOuqqOuRkCDqsJ3ssrTsnbTqs6AsIOuwsOyXtOydtCDslYTri4wg6rK97JqwIOyerOq3gOyggeycvOuhnCDrs5HtlalcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHVzZXJWYWx1ZSkgJiYgaXNQbGFpbk9iamVjdChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UoZGVmYXVsdFZhbHVlLCB1c2VyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g6re4IOyZuOydmCDqsr3smrAgdXNlck9iauydmCDqsJLsnLzroZwg642u7Ja07JOw6riwXG4gICAgICAgIHJlc3VsdFtrZXldID0gdXNlclZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHBsYWluIG9iamVjdCDtjJDrs4Qg7Zes7Y28IO2VqOyImFxuLy8gKOuwsOyXtCwgbnVsbCwgRGF0ZSDrk7HsnYQg7KCc7Jm47ZWcIOyInOyImCDqsJ3ssrTrp4wgdHJ1ZSlcbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICApO1xufVxuXG4vLyBDb252ZXJ0IEZhc3RpZnkgaGVhZGVycyB0byBzdGFuZGFyZCBIZWFkZXJzIG9iamVjdFxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQoaGVhZGVyczogRmFzdGlmeVJlcXVlc3RbXCJoZWFkZXJzXCJdKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnNPYmogPSBuZXcgSGVhZGVycygpO1xuICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAodmFsdWUpIGhlYWRlcnNPYmouYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gIH0pO1xuICByZXR1cm4gaGVhZGVyc09iajtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFPQSxTQUFnQixrQkFBZ0M7Q0FDOUMsTUFBTSxjQUFjLGlCQUFpQjtBQUNyQyxRQUFPLEtBQUssUUFBUSxZQUFZOztBQUdsQyxTQUFnQixrQkFBZ0M7Q0FHOUMsTUFBTSxnQkFBZ0IsUUFBUSxJQUFJLHVCQUF1QixRQUFRLElBQUk7QUFDckUsS0FBSSxZQUFZLGNBQWMsRUFBRTtBQUM5QixTQUFPOztBQUdULEtBQUksWUFBWSxRQUFRLElBQUksa0JBQWtCLEVBQUU7QUFDOUMsU0FBTyxRQUFRLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJOztDQUdyRCxNQUFNLGlCQUFpQixLQUFLLEtBQUssUUFBUSxLQUFLLEVBQUUsZUFBZTtBQUMvRCxLQUFJLEdBQUcsV0FBVyxlQUFlLEVBQUU7QUFDakMsU0FBTyxRQUFRLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJOztDQUdyRCxNQUFNLFdBQVcsT0FBTyxLQUFLO0NBQzdCLElBQUksTUFBTSxLQUFLLFFBQVEsU0FBUztBQUNoQyxLQUFJLElBQUksU0FBUyxVQUFVLEVBQUU7QUFDM0IsUUFBTSxJQUFJLE1BQU0sVUFBVSxDQUFDOztBQUc3QixJQUFHO0FBQ0QsTUFBSSxHQUFHLFdBQVcsS0FBSyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsRUFBRTtBQUNsRCxVQUFPLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTs7QUFFM0MsUUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJO1VBQzlDLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTO0FBQ3RDLE9BQU0sSUFBSSxNQUFNLHNDQUFzQzs7QUFHeEQsU0FBZ0IsWUFBZSxPQUFtQztBQUNoRSxRQUFPLFVBQVUsUUFBUSxVQUFVOztBQUdyQyxTQUFnQixXQUFXLFFBQWU7QUFDeEMsT0FBTSxJQUFJLE1BQU0sYUFBYTs7QUFJL0IsU0FBZ0IsYUFBZ0IsT0FBNkIsU0FBcUI7QUFDaEYsS0FBSSxVQUFVLFFBQVEsVUFBVSxXQUFXO0FBQ3pDLFFBQU0sSUFBSSxNQUFNLFdBQVcsbUJBQW1COztBQUVoRCxRQUFPOztBQUlULFNBQWdCLGNBQWlCLE9BQWlCLFNBQXFCO0FBQ3JFLEtBQUksVUFBVSxNQUFNO0FBQ2xCLFFBQU0sSUFBSSxNQUFNLFdBQVcseUJBQXlCOztBQUV0RCxRQUFPOztBQUdULFNBQWdCLGNBQWlCLE9BQXNCLFNBQXFCO0FBQzFFLEtBQUksVUFBVSxXQUFXO0FBQ3ZCLFFBQU0sSUFBSSxNQUFNLFdBQVcsd0JBQXdCOztBQUVyRCxRQUFPOztBQUlULFNBQWdCLGVBQ2QsTUFDQSxNQUNBLFVBQ0s7Q0FDTCxNQUFNLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDNUMsUUFBTyxLQUFLLFFBQVEsU0FBUyxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQzs7QUFHNUQsU0FBZ0IsZUFDZCxNQUNBLE1BQ0EsWUFDSztBQUNMLFFBQU8sS0FBSyxRQUFRLFVBQVUsQ0FBQyxLQUFLLE1BQU0sVUFBVSxXQUFXLE9BQU8sTUFBTSxDQUFDLENBQUM7O0FBSWhGLFNBQWdCLE1BQXFDLFlBQWUsU0FBZTtDQUVqRixNQUFNLFNBQVMsRUFBRSxHQUFHLFlBQVk7QUFHaEMsTUFBSyxNQUFNLE9BQU8sU0FBUztBQUV6QixNQUFJLE9BQU8sT0FBTyxTQUFTLElBQUksRUFBRTtHQUMvQixNQUFNLFlBQVksUUFBUTtHQUMxQixNQUFNLGVBQWUsT0FBTztBQUc1QixPQUFJLGNBQWMsVUFBVSxJQUFJLGNBQWMsYUFBYSxFQUFFO0FBQzNELFdBQU8sT0FBTyxNQUFNLGNBQWMsVUFBVTtVQUN2QztBQUVMLFdBQU8sT0FBTzs7OztBQUtwQixRQUFPOztBQUtULFNBQWdCLGNBQWMsT0FBa0Q7QUFDOUUsUUFDRSxVQUFVLFFBQ1YsT0FBTyxVQUFVLFlBQ2pCLENBQUMsTUFBTSxRQUFRLE1BQU0sSUFDckIsT0FBTyxVQUFVLFNBQVMsS0FBSyxNQUFNLEtBQUs7O0FBSzlDLFNBQWdCLGdDQUFnQyxTQUE2QztDQUMzRixNQUFNLGFBQWEsSUFBSSxTQUFTO0FBQ2hDLFFBQU8sUUFBUSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssV0FBVztBQUNoRCxNQUFJLE1BQU8sWUFBVyxPQUFPLEtBQUssTUFBTSxVQUFVLENBQUM7R0FDbkQ7QUFDRixRQUFPIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -95,11 +95,13 @@
|
|
|
95
95
|
"@fastify/multipart": "^8",
|
|
96
96
|
"@fastify/passport": "^2.2.0",
|
|
97
97
|
"@fastify/static": "^7",
|
|
98
|
+
"@fastify/websocket": "^8.3.0",
|
|
98
99
|
"@logtape/fastify": "2.0.0",
|
|
99
100
|
"@logtape/logtape": "2.0.0",
|
|
100
101
|
"@logtape/pretty": "2.0.0",
|
|
101
102
|
"@logtape/redaction": "2.0.0",
|
|
102
103
|
"@sheetkit/node": "^0.5.0",
|
|
104
|
+
"@types/ws": "^8.18.1",
|
|
103
105
|
"bcrypt": "^6.0.0",
|
|
104
106
|
"bentocache": "^1.5.0",
|
|
105
107
|
"better-auth": "~1.6.0",
|
|
@@ -119,7 +121,7 @@
|
|
|
119
121
|
"node-cron": "^4.2.1",
|
|
120
122
|
"node-sql-parser": "^5.2.0",
|
|
121
123
|
"oxfmt": "^0.43.0",
|
|
122
|
-
"oxlint": "^1.
|
|
124
|
+
"oxlint": "^1.61.0",
|
|
123
125
|
"pg": "^8.16.3",
|
|
124
126
|
"prompts": "^2.4.2",
|
|
125
127
|
"qs": "^6.14.1",
|
|
@@ -128,8 +130,8 @@
|
|
|
128
130
|
"vite": "8.0.5",
|
|
129
131
|
"vitest": "^4.1.2",
|
|
130
132
|
"@sonamu-kit/hmr-hook": "^0.5.1",
|
|
131
|
-
"@sonamu-kit/tasks": "^0.3.0",
|
|
132
133
|
"@sonamu-kit/hmr-runner": "^0.2.0",
|
|
134
|
+
"@sonamu-kit/tasks": "^0.3.0",
|
|
133
135
|
"@sonamu-kit/ts-loader": "^2.2.0"
|
|
134
136
|
},
|
|
135
137
|
"devDependencies": {
|
|
@@ -142,7 +144,7 @@
|
|
|
142
144
|
"@types/qs": "^6.14.0",
|
|
143
145
|
"nodemon": "^3.1.10",
|
|
144
146
|
"tsdown": "^0.12.5",
|
|
145
|
-
"typescript": "^6.0.
|
|
147
|
+
"typescript": "^6.0.3"
|
|
146
148
|
},
|
|
147
149
|
"peerDependencies": {
|
|
148
150
|
"@ai-sdk/anthropic": "^3.0.0",
|
|
@@ -158,7 +160,7 @@
|
|
|
158
160
|
"ioredis": "^5.8.2",
|
|
159
161
|
"knex": "^3.2.9",
|
|
160
162
|
"pgvector": "^0.2.1",
|
|
161
|
-
"typescript": "^6.0.
|
|
163
|
+
"typescript": "^6.0.3",
|
|
162
164
|
"voyageai": "^0.0.8",
|
|
163
165
|
"zod": "^4.3.6"
|
|
164
166
|
},
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { type AnyWebSocketConnection } from "../../stream/ws";
|
|
4
|
+
import { type WebSocketContext } from "../context";
|
|
5
|
+
import { Sonamu } from "../sonamu";
|
|
6
|
+
|
|
7
|
+
describe("Sonamu websocket context scoping", () => {
|
|
8
|
+
it("restores websocket context inside deferred message handlers", async () => {
|
|
9
|
+
const messageHandlers = new Map<string, (data: unknown) => void | Promise<void>>();
|
|
10
|
+
|
|
11
|
+
const rawWs = {
|
|
12
|
+
id: "ws-1",
|
|
13
|
+
namespace: "chat",
|
|
14
|
+
transport: "ws" as const,
|
|
15
|
+
closed: false,
|
|
16
|
+
publishUntyped() {},
|
|
17
|
+
close() {},
|
|
18
|
+
onClose() {},
|
|
19
|
+
onMessage(event, handler) {
|
|
20
|
+
messageHandlers.set(String(event), handler as (data: unknown) => void | Promise<void>);
|
|
21
|
+
},
|
|
22
|
+
publish() {},
|
|
23
|
+
waitForClose() {
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
},
|
|
26
|
+
join() {},
|
|
27
|
+
leave() {},
|
|
28
|
+
setUserId() {},
|
|
29
|
+
clearUserId() {},
|
|
30
|
+
} satisfies AnyWebSocketConnection;
|
|
31
|
+
|
|
32
|
+
let context: WebSocketContext | null = null;
|
|
33
|
+
const scopedWs = (
|
|
34
|
+
Sonamu as unknown as {
|
|
35
|
+
createScopedWebSocketConnection(
|
|
36
|
+
ws: AnyWebSocketConnection,
|
|
37
|
+
getContext: () => WebSocketContext | null,
|
|
38
|
+
): AnyWebSocketConnection;
|
|
39
|
+
}
|
|
40
|
+
).createScopedWebSocketConnection(rawWs, () => context);
|
|
41
|
+
|
|
42
|
+
context = {
|
|
43
|
+
transport: "ws",
|
|
44
|
+
request: {} as WebSocketContext["request"],
|
|
45
|
+
headers: {},
|
|
46
|
+
ws: scopedWs,
|
|
47
|
+
naiteStore: new Map(),
|
|
48
|
+
locale: "ko",
|
|
49
|
+
user: null,
|
|
50
|
+
session: null,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
let seenTransport: WebSocketContext["transport"] | null = null;
|
|
54
|
+
scopedWs.onMessage("joinRoom", async () => {
|
|
55
|
+
seenTransport = Sonamu.getContext<WebSocketContext>().transport;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await messageHandlers.get("joinRoom")?.({
|
|
59
|
+
roomId: "room-1",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
expect(seenTransport).toBe("ws");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { type WebSocketContext } from "../context";
|
|
4
|
+
|
|
5
|
+
type ChatOutEvents = {
|
|
6
|
+
ready: {
|
|
7
|
+
history: string[];
|
|
8
|
+
};
|
|
9
|
+
typingUsers: Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type ChatInEvents = {
|
|
16
|
+
sendMessage: {
|
|
17
|
+
content: string;
|
|
18
|
+
};
|
|
19
|
+
typing: {
|
|
20
|
+
active: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
function assertTypedWebSocketContext(ctx: WebSocketContext<ChatOutEvents, ChatInEvents>) {
|
|
25
|
+
ctx.ws.onMessage("sendMessage", (data) => {
|
|
26
|
+
expectTypeOf(data).toEqualTypeOf<{ content: string }>();
|
|
27
|
+
expectTypeOf(data.content).toEqualTypeOf<string>();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
ctx.ws.onMessage("typing", (data) => {
|
|
31
|
+
expectTypeOf(data).toEqualTypeOf<{ active: boolean }>();
|
|
32
|
+
expectTypeOf(data.active).toEqualTypeOf<boolean>();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
ctx.ws.publish("ready", { history: ["hello"] });
|
|
36
|
+
ctx.ws.publish("typingUsers", [{ id: "u1", name: "Kim" }]);
|
|
37
|
+
|
|
38
|
+
// @ts-expect-error invalid inbound event name
|
|
39
|
+
ctx.ws.onMessage("unknown", () => {});
|
|
40
|
+
// @ts-expect-error invalid outbound payload
|
|
41
|
+
ctx.ws.publish("ready", { nope: true });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function assertDefaultWebSocketContext(ctx: WebSocketContext) {
|
|
45
|
+
ctx.ws.onMessage("sendMessage", (data) => {
|
|
46
|
+
expectTypeOf(data).toEqualTypeOf<unknown>();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
describe("WebSocketContext typing", () => {
|
|
51
|
+
it("narrows ws handlers and publish payloads from generic event maps", () => {
|
|
52
|
+
expectTypeOf(assertTypedWebSocketContext).toBeFunction();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("defaults handler payloads to unknown when generics are omitted", () => {
|
|
56
|
+
expectTypeOf(assertDefaultWebSocketContext).toBeFunction();
|
|
57
|
+
});
|
|
58
|
+
});
|