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.
Files changed (171) hide show
  1. package/dist/ai/providers/rtzr/utils.js +2 -2
  2. package/dist/api/config.d.ts +13 -2
  3. package/dist/api/config.d.ts.map +1 -1
  4. package/dist/api/config.js +1 -1
  5. package/dist/api/context.d.ts +17 -7
  6. package/dist/api/context.d.ts.map +1 -1
  7. package/dist/api/context.js +1 -1
  8. package/dist/api/decorators.d.ts +18 -0
  9. package/dist/api/decorators.d.ts.map +1 -1
  10. package/dist/api/decorators.js +54 -3
  11. package/dist/api/index.js +8 -3
  12. package/dist/api/sonamu.d.ts +24 -9
  13. package/dist/api/sonamu.d.ts.map +1 -1
  14. package/dist/api/sonamu.js +365 -79
  15. package/dist/api/websocket-helpers.d.ts +24 -0
  16. package/dist/api/websocket-helpers.d.ts.map +1 -0
  17. package/dist/api/websocket-helpers.js +77 -0
  18. package/dist/bin/cli.js +12 -4
  19. package/dist/database/upsert-builder.js +4 -4
  20. package/dist/dict/sonamu-dictionary.js +6 -6
  21. package/dist/entity/entity-manager.js +1 -1
  22. package/dist/entity/entity.js +3 -3
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -4
  26. package/dist/migration/code-generation.d.ts.map +1 -1
  27. package/dist/migration/code-generation.js +8 -9
  28. package/dist/stream/index.d.ts +6 -0
  29. package/dist/stream/index.d.ts.map +1 -1
  30. package/dist/stream/index.js +13 -2
  31. package/dist/stream/ws-audience-resolver.d.ts +15 -0
  32. package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
  33. package/dist/stream/ws-audience-resolver.js +31 -0
  34. package/dist/stream/ws-audience.d.ts +28 -0
  35. package/dist/stream/ws-audience.d.ts.map +1 -0
  36. package/dist/stream/ws-audience.js +46 -0
  37. package/dist/stream/ws-cluster-bus.d.ts +23 -0
  38. package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
  39. package/dist/stream/ws-cluster-bus.js +18 -0
  40. package/dist/stream/ws-core.d.ts +15 -0
  41. package/dist/stream/ws-core.d.ts.map +1 -0
  42. package/dist/stream/ws-core.js +1 -0
  43. package/dist/stream/ws-delivery.d.ts +24 -0
  44. package/dist/stream/ws-delivery.d.ts.map +1 -0
  45. package/dist/stream/ws-delivery.js +103 -0
  46. package/dist/stream/ws-local-connection-store.d.ts +10 -0
  47. package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
  48. package/dist/stream/ws-local-connection-store.js +44 -0
  49. package/dist/stream/ws-presence-store.d.ts +61 -0
  50. package/dist/stream/ws-presence-store.d.ts.map +1 -0
  51. package/dist/stream/ws-presence-store.js +236 -0
  52. package/dist/stream/ws-registry.d.ts +42 -0
  53. package/dist/stream/ws-registry.d.ts.map +1 -0
  54. package/dist/stream/ws-registry.js +108 -0
  55. package/dist/stream/ws.d.ts +52 -0
  56. package/dist/stream/ws.d.ts.map +1 -0
  57. package/dist/stream/ws.js +397 -0
  58. package/dist/syncer/api-parser.d.ts.map +1 -1
  59. package/dist/syncer/api-parser.js +72 -2
  60. package/dist/syncer/checksum.d.ts.map +1 -1
  61. package/dist/syncer/checksum.js +13 -12
  62. package/dist/syncer/code-generator.d.ts.map +1 -1
  63. package/dist/syncer/code-generator.js +7 -4
  64. package/dist/syncer/event-batcher.d.ts +27 -0
  65. package/dist/syncer/event-batcher.d.ts.map +1 -0
  66. package/dist/syncer/event-batcher.js +69 -0
  67. package/dist/syncer/file-patterns.d.ts +48 -26
  68. package/dist/syncer/file-patterns.d.ts.map +1 -1
  69. package/dist/syncer/file-patterns.js +71 -23
  70. package/dist/syncer/file-tracking.d.ts +13 -0
  71. package/dist/syncer/file-tracking.d.ts.map +1 -0
  72. package/dist/syncer/file-tracking.js +33 -0
  73. package/dist/syncer/index.js +2 -2
  74. package/dist/syncer/module-loader.d.ts +2 -11
  75. package/dist/syncer/module-loader.d.ts.map +1 -1
  76. package/dist/syncer/module-loader.js +3 -3
  77. package/dist/syncer/syncer-actions.d.ts +39 -6
  78. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  79. package/dist/syncer/syncer-actions.js +125 -10
  80. package/dist/syncer/syncer.d.ts +33 -19
  81. package/dist/syncer/syncer.d.ts.map +1 -1
  82. package/dist/syncer/syncer.js +168 -168
  83. package/dist/syncer/watcher.d.ts +8 -0
  84. package/dist/syncer/watcher.d.ts.map +1 -0
  85. package/dist/syncer/watcher.js +105 -0
  86. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  87. package/dist/tasks/workflow-manager.js +2 -1
  88. package/dist/template/implementations/services.template.d.ts.map +1 -1
  89. package/dist/template/implementations/services.template.js +36 -1
  90. package/dist/testing/bootstrap.d.ts.map +1 -1
  91. package/dist/testing/bootstrap.js +8 -1
  92. package/dist/testing/data-explorer.d.ts.map +1 -1
  93. package/dist/testing/data-explorer.js +5 -3
  94. package/dist/testing/fixture-manager.js +1 -1
  95. package/dist/types/types.d.ts +2 -1
  96. package/dist/types/types.d.ts.map +1 -1
  97. package/dist/types/types.js +2 -2
  98. package/dist/ui/api.d.ts.map +1 -1
  99. package/dist/ui/api.js +4 -3
  100. package/dist/ui/cdd-service.js +1 -1
  101. package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
  102. package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
  103. package/dist/ui-web/index.html +2 -2
  104. package/dist/utils/async-utils.d.ts +27 -3
  105. package/dist/utils/async-utils.d.ts.map +1 -1
  106. package/dist/utils/async-utils.js +56 -6
  107. package/dist/utils/formatter.d.ts +7 -1
  108. package/dist/utils/formatter.d.ts.map +1 -1
  109. package/dist/utils/formatter.js +95 -60
  110. package/dist/utils/fs-utils.d.ts +2 -0
  111. package/dist/utils/fs-utils.d.ts.map +1 -1
  112. package/dist/utils/fs-utils.js +10 -2
  113. package/dist/utils/process-utils.d.ts +6 -0
  114. package/dist/utils/process-utils.d.ts.map +1 -1
  115. package/dist/utils/process-utils.js +16 -3
  116. package/dist/utils/utils.d.ts +1 -0
  117. package/dist/utils/utils.d.ts.map +1 -1
  118. package/dist/utils/utils.js +2 -2
  119. package/package.json +7 -5
  120. package/src/ai/providers/rtzr/utils.ts +1 -1
  121. package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
  122. package/src/api/__tests__/websocket-context.types.test.ts +58 -0
  123. package/src/api/config.ts +28 -2
  124. package/src/api/context.ts +21 -7
  125. package/src/api/decorators.ts +101 -1
  126. package/src/api/sonamu.ts +529 -127
  127. package/src/api/websocket-helpers.ts +122 -0
  128. package/src/bin/cli.ts +10 -2
  129. package/src/database/upsert-builder.ts +3 -3
  130. package/src/dict/sonamu-dictionary.ts +3 -3
  131. package/src/entity/entity.ts +1 -1
  132. package/src/index.ts +6 -0
  133. package/src/migration/code-generation.ts +6 -11
  134. package/src/shared/app.shared.ts.txt +312 -4
  135. package/src/shared/web.shared.ts.txt +340 -4
  136. package/src/stream/__tests__/ws-contracts.test.ts +381 -0
  137. package/src/stream/__tests__/ws.test.ts +449 -0
  138. package/src/stream/index.ts +6 -0
  139. package/src/stream/ws-audience-resolver.ts +35 -0
  140. package/src/stream/ws-audience.ts +62 -0
  141. package/src/stream/ws-cluster-bus.ts +32 -0
  142. package/src/stream/ws-core.ts +16 -0
  143. package/src/stream/ws-delivery.ts +138 -0
  144. package/src/stream/ws-local-connection-store.ts +44 -0
  145. package/src/stream/ws-presence-store.ts +326 -0
  146. package/src/stream/ws-registry.ts +138 -0
  147. package/src/stream/ws.ts +591 -0
  148. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
  149. package/src/syncer/api-parser.ts +112 -1
  150. package/src/syncer/checksum.ts +23 -29
  151. package/src/syncer/code-generator.ts +4 -1
  152. package/src/syncer/event-batcher.ts +72 -0
  153. package/src/syncer/file-patterns.ts +98 -30
  154. package/src/syncer/file-tracking.ts +27 -0
  155. package/src/syncer/module-loader.ts +5 -12
  156. package/src/syncer/syncer-actions.ts +179 -17
  157. package/src/syncer/syncer.ts +250 -287
  158. package/src/syncer/watcher.ts +128 -0
  159. package/src/tasks/workflow-manager.ts +1 -0
  160. package/src/template/__tests__/services.template.websocket.test.ts +79 -0
  161. package/src/template/implementations/services.template.ts +69 -0
  162. package/src/testing/bootstrap.ts +8 -1
  163. package/src/testing/data-explorer.ts +3 -2
  164. package/src/types/types.ts +20 -2
  165. package/src/ui/api.ts +10 -1
  166. package/src/utils/async-utils.ts +71 -4
  167. package/src/utils/formatter.ts +114 -75
  168. package/src/utils/fs-utils.ts +9 -0
  169. package/src/utils/process-utils.ts +17 -0
  170. package/src/utils/utils.ts +1 -1
  171. package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
@@ -1,92 +1,127 @@
1
1
  import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
2
  import { init_controller, isTest } from "./controller.js";
3
- import { join } from "path";
4
- import { readFileSync, unlinkSync, writeFileSync } from "fs";
5
- import { execFileSync } from "child_process";
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
- function resolveOxlintBin() {
11
- try {
12
- return _require.resolve("oxlint/bin/oxlint");
13
- } catch {
14
- return "oxlint";
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
- async function formatCode(code, parser, _filePath) {
18
- const fileName = parser === "json" ? "file.json" : "file.ts";
19
- const formatted = await format(fileName, code, OXFMT_OPTIONS);
20
- if (formatted.errors.length > 0) {
21
- const errorMessages = formatted.errors.filter((e) => e.severity === "Error").map((e) => e.message);
22
- if (errorMessages.length > 0) {
23
- return code;
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
- if (parser === "json") {
27
- return formatted.code;
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(process.cwd(), `.sonamu-fmt-${Date.now()}-${Math.random().toString(36).slice(2)}.ts`);
82
+ const tmpFile = join(tmpdir(), `.sonamu-fmt-${Date.now()}-${Math.random().toString(36).slice(2)}.ts`);
30
83
  try {
31
- writeFileSync(tmpFile, formatted.code, "utf-8");
32
- const oxlintBin = resolveOxlintBin();
84
+ await writeFile(tmpFile, code, "utf-8");
33
85
  try {
34
- execFileSync(oxlintBin, [
86
+ await execute(resolveOxlintBin(), [
35
87
  "--fix",
36
88
  "--fix-suggestions",
37
89
  "--type-aware",
38
90
  tmpFile
39
- ], {
40
- stdio: "pipe",
41
- timeout: 1e4
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
- const lintFixed = readFileSync(tmpFile, "utf-8");
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
- unlinkSync(tmpFile);
100
+ await unlink(tmpFile);
68
101
  } catch {}
69
102
  }
70
103
  }
71
- var _require, OXFMT_OPTIONS;
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
- OXFMT_OPTIONS = {
76
- printWidth: 100,
77
- tabWidth: 2,
78
- useTabs: false,
79
- singleQuote: false,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwibmFtZXMiOlsiZXhlY0Vycm9yOiB1bmtub3duIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Zvcm1hdHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJveGZtdFwiO1xuXG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi9jb250cm9sbGVyXCI7XG5cbmNvbnN0IF9yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5jb25zdCBPWEZNVF9PUFRJT05TID0ge1xuICBwcmludFdpZHRoOiAxMDAsXG4gIHRhYldpZHRoOiAyLFxuICB1c2VUYWJzOiBmYWxzZSxcbiAgc2luZ2xlUXVvdGU6IGZhbHNlLFxuICBqc3hTaW5nbGVRdW90ZTogZmFsc2UsXG4gIHRyYWlsaW5nQ29tbWE6IFwiYWxsXCIgYXMgY29uc3QsXG4gIHNlbWk6IHRydWUsXG4gIGVuZE9mTGluZTogXCJsZlwiIGFzIGNvbnN0LFxuICBicmFja2V0U3BhY2luZzogdHJ1ZSxcbiAgc29ydEltcG9ydHM6IHRydWUsXG59O1xuXG5mdW5jdGlvbiByZXNvbHZlT3hsaW50QmluKCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIF9yZXF1aXJlLnJlc29sdmUoXCJveGxpbnQvYmluL294bGludFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwib3hsaW50XCI7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvZGUoXG4gIGNvZGU6IHN0cmluZyxcbiAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiB8IFwianNvblwiLFxuICBfZmlsZVBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGFyc2VyID09PSBcImpzb25cIiA/IFwiZmlsZS5qc29uXCIgOiBcImZpbGUudHNcIjtcblxuICAvLyBveGZtdCDtj6zrp7ftjIVcbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0KGZpbGVOYW1lLCBjb2RlLCBPWEZNVF9PUFRJT05TKTtcbiAgaWYgKGZvcm1hdHRlZC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBmb3JtYXR0ZWQuZXJyb3JzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLnNldmVyaXR5ID09PSBcIkVycm9yXCIpXG4gICAgICAubWFwKChlKSA9PiBlLm1lc3NhZ2UpO1xuICAgIGlmIChlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIO2MjOyLsSDsl5Drn6zqsIAg7J6I64qUIOy9lOuTnOuKlCDtj6zrp7ftjIUg7JeG7J20IOybkOuzuCDrsJjtmZggKEJpb21lIGZvcm1hdFdpdGhFcnJvcnM6IGZhbHNl7JmAIOuPmeydvClcbiAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEpTT07snYAg7Y+s66e37YyF66eMIOyImO2WiVxuICBpZiAocGFyc2VyID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBmb3JtYXR0ZWQuY29kZTtcbiAgfVxuXG4gIC8vIFR5cGVTY3JpcHQ6IG94bGludCAtLWZpeOuhnCBsaW50IGZpeCDsiJjtlokgKHVudXNlZCBpbXBvcnQg7KCc6rGwLCB0eXBlIGltcG9ydCDrs4DtmZgg65OxKVxuICAvLyBjd2Qg7JWE656Y7JeQIOyDneyEse2VtOyVvCBuZXN0ZWQgY29uZmlnKC5veGxpbnRyYy5qc29uKeqzvCB0c2NvbmZpZ+ulvCDssL7snYQg7IiYIOyeiOydjFxuICBjb25zdCB0bXBGaWxlID0gam9pbihcbiAgICBwcm9jZXNzLmN3ZCgpLFxuICAgIGAuc29uYW11LWZtdC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9LnRzYCxcbiAgKTtcbiAgdHJ5IHtcbiAgICB3cml0ZUZpbGVTeW5jKHRtcEZpbGUsIGZvcm1hdHRlZC5jb2RlLCBcInV0Zi04XCIpO1xuXG4gICAgY29uc3Qgb3hsaW50QmluID0gcmVzb2x2ZU94bGludEJpbigpO1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMob3hsaW50QmluLCBbXCItLWZpeFwiLCBcIi0tZml4LXN1Z2dlc3Rpb25zXCIsIFwiLS10eXBlLWF3YXJlXCIsIHRtcEZpbGVdLCB7XG4gICAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChleGVjRXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIG94bGludOydgCBsaW50IOyXkOufrOqwgCDsnojsnLzrqbQgZXhpdCBjb2RlICE9IDDsnLzroZwg7KKF66OM7ZWY7KeA66eMIC0tZml464qUIOyggeyaqeuQqFxuICAgICAgaWYgKGV4ZWNFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVyck9iaiA9IGV4ZWNFcnJvciBhcyBFcnJvciAmIHsgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDsgY29kZT86IHN0cmluZyB9O1xuICAgICAgICBpZiAodHlwZW9mIGVyck9iai5zdGF0dXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB2b2lkIGVyck9iai5zdGF0dXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXhlY0Vycm9yO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBleGVjRXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGludEZpeGVkID0gcmVhZEZpbGVTeW5jKHRtcEZpbGUsIFwidXRmLThcIik7XG5cbiAgICAvLyBsaW50IGZpeCDtm4Qg7J6s7Y+s66e3IChpbXBvcnQg6rWs66y4IOuzgOqyveycvOuhnCDsnbjtlZwg7KCV66CsIOuTsSlcbiAgICBjb25zdCByZWZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdChmaWxlTmFtZSwgbGludEZpeGVkLCBPWEZNVF9PUFRJT05TKTtcbiAgICBpZiAocmVmb3JtYXR0ZWQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSByZWZvcm1hdHRlZC5lcnJvcnNcbiAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5zZXZlcml0eSA9PT0gXCJFcnJvclwiKVxuICAgICAgICAubWFwKChlKSA9PiBlLm1lc3NhZ2UpO1xuICAgICAgaWYgKGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5lcnJvcihcIm94Zm10IHJlZm9ybWF0IGVycm9yczpcIiwgZXJyb3JNZXNzYWdlcyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgb3hmbXQgcmVmb3JtYXQgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZm9ybWF0dGVkLmNvZGU7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIHVubGlua1N5bmModG1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsnoTsi5wg7YyM7J28IOygleumrCDsi6TtjKjripQg66y07IucXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXdCQSxTQUFTLG1CQUEyQjtBQUNsQyxLQUFJO0FBQ0YsU0FBTyxTQUFTLFFBQVEsb0JBQW9CO1NBQ3RDO0FBQ04sU0FBTzs7O0FBSVgsZUFBc0IsV0FDcEIsTUFDQSxRQUNBLFdBQ2lCO0NBQ2pCLE1BQU0sV0FBVyxXQUFXLFNBQVMsY0FBYztDQUduRCxNQUFNLFlBQVksTUFBTSxPQUFPLFVBQVUsTUFBTSxjQUFjO0FBQzdELEtBQUksVUFBVSxPQUFPLFNBQVMsR0FBRztFQUMvQixNQUFNLGdCQUFnQixVQUFVLE9BQzdCLFFBQVEsTUFBTSxFQUFFLGFBQWEsUUFBUSxDQUNyQyxLQUFLLE1BQU0sRUFBRSxRQUFRO0FBQ3hCLE1BQUksY0FBYyxTQUFTLEdBQUc7QUFFNUIsVUFBTzs7O0FBS1gsS0FBSSxXQUFXLFFBQVE7QUFDckIsU0FBTyxVQUFVOztDQUtuQixNQUFNLFVBQVUsS0FDZCxRQUFRLEtBQUssRUFDYixlQUFlLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsS0FDbEU7QUFDRCxLQUFJO0FBQ0YsZ0JBQWMsU0FBUyxVQUFVLE1BQU0sUUFBUTtFQUUvQyxNQUFNLFlBQVksa0JBQWtCO0FBQ3BDLE1BQUk7QUFDRixnQkFBYSxXQUFXO0lBQUM7SUFBUztJQUFxQjtJQUFnQjtJQUFRLEVBQUU7SUFDL0UsT0FBTztJQUNQLFNBQVM7SUFDVixDQUFDO1dBQ0tBLFdBQW9CO0FBRTNCLE9BQUkscUJBQXFCLE9BQU87SUFDOUIsTUFBTSxTQUFTO0FBQ2YsUUFBSSxPQUFPLE9BQU8sV0FBVyxVQUFVO0FBQ3JDLFVBQUssT0FBTztXQUNQO0FBQ0wsV0FBTTs7VUFFSDtBQUNMLFVBQU07OztFQUlWLE1BQU0sWUFBWSxhQUFhLFNBQVMsUUFBUTtFQUdoRCxNQUFNLGNBQWMsTUFBTSxPQUFPLFVBQVUsV0FBVyxjQUFjO0FBQ3BFLE1BQUksWUFBWSxPQUFPLFNBQVMsR0FBRztHQUNqQyxNQUFNLGdCQUFnQixZQUFZLE9BQy9CLFFBQVEsTUFBTSxFQUFFLGFBQWEsUUFBUSxDQUNyQyxLQUFLLE1BQU0sRUFBRSxRQUFRO0FBQ3hCLE9BQUksY0FBYyxTQUFTLEdBQUc7QUFDNUIsS0FBQyxRQUFRLElBQUksUUFBUSxNQUFNLDBCQUEwQixjQUFjO0FBQ25FLFVBQU0sSUFBSSxNQUFNLHlCQUF5QixjQUFjLEtBQUssS0FBSyxHQUFHOzs7QUFJeEUsU0FBTyxZQUFZO1dBQ1g7QUFDUixNQUFJO0FBQ0YsY0FBVyxRQUFRO1VBQ2I7Ozs7O2tCQWhHMEI7Q0FFaEMsV0FBVyxjQUFjLE9BQU8sS0FBSyxJQUFJO0NBRXpDLGdCQUFnQjtFQUNwQixZQUFZO0VBQ1osVUFBVTtFQUNWLFNBQVM7RUFDVCxhQUFhO0VBQ2IsZ0JBQWdCO0VBQ2hCLGVBQWU7RUFDZixNQUFNO0VBQ04sV0FBVztFQUNYLGdCQUFnQjtFQUNoQixhQUFhO0VBQ2QifQ==
127
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwibmFtZXMiOlsiY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZm9ybWF0dGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG4vLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGZzL3Byb21pc2Vz6rCAIG1vY2vrkJjsp4Drp4wsIOyVhOuemCBydW5PeGxpbnTsnbQgaXNUZXN0IOqwgOuTnOuhnCDslYgg64+E64uI6rmMXG4vLyDqt7jrg6UgZnMvcHJvbWlzZXMg6re464yA66GcIOyCrOyaqS4gKHByb2R1Y3Rpb27sl5DshJzrp4wg7J6E7Iuc7YyM7J28IO2dkOumhOydtCDrj5Xri4jri6QuKVxuaW1wb3J0IHsgcmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZm9ybWF0LCB0eXBlIEZvcm1hdENvbmZpZyB9IGZyb20gXCJveGZtdFwiO1xuXG5pbXBvcnQgeyBjYWNoZWQgfSBmcm9tIFwiLi9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4vY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhlY3V0ZSB9IGZyb20gXCIuL3Byb2Nlc3MtdXRpbHNcIjtcblxuY29uc3QgX3JlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbi8qKlxuICog7L2U65Oc66W8IO2UhOuhnOygne2KuOydmCBveGZtdCArIG94bGludCDshKTsoJXsl5Ag66ee7LawIO2PrOunpO2Mhe2VnCDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIOy6kOyLseuPhCDsnojslrTsmpQg44WO44WOIOuYkeqwmeydgCDsnoXroKXsl5Ag64yA7ZW07IScIOy6kOyLnCDsu6TrsoTrkKnri4jri6QuXG4gKiDsiJjrqoXsnYAg7ZSE66Gc7IS47IqkIOyjveydhOuVjOq5jOyngCDjhYtcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENvZGUgPSBjYWNoZWQoZm9ybWF0Q29kZUludGVybmFsLCAoY29kZSwgZmlsZVBhdGgpID0+IHtcbiAgY29uc3QgZXh0ID0gZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpID8gXCJ0c3hcIiA6IGZpbGVQYXRoLmVuZHNXaXRoKFwianNvblwiKSA/IFwianNvblwiIDogXCJ0c1wiO1xuICByZXR1cm4gYCR7ZXh0fToke2NyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShjb2RlKS5kaWdlc3QoXCJoZXhcIil9YDtcbn0pO1xuXG4vKipcbiAqIOy6kOyLnCDsl4bripQg7Y+s66e37ZWo7IiYIOyXlO2KuOumrC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9ybWF0Q29kZUludGVybmFsKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGpzb27snYAg7Y+s66e366eMIO2VmOuptCDrkKnri4jri6QuXG4gIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcImpzb25cIikpIHtcbiAgICByZXR1cm4gcnVuT3hmbXQoY29kZSwgZmlsZVBhdGgpO1xuICB9XG5cbiAgLy8g66aw7Yq4IOuovOyggCDtlZwg64uk7J2M7JeQIO2PrOunt+ycvOuhnCDrp4jrrLTrpqztlbTsmpQuXG4gIHJldHVybiBydW5PeGZtdChhd2FpdCBydW5PeGxpbnQoY29kZSksIGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7J2EIOywvuyVhOyEnCDsnbTsl5Ag66ee7Law7IScIOy9lOuTnOulvCDtj6zrp7ftlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94Zm10KGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZvcm1hdChwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSwgY29kZSwgYXdhaXQgbG9hZE94Zm10Q29uZmlnKCkpO1xuXG4gIGNvbnN0IGVycm9ycyA9IHJlc3VsdC5lcnJvcnMuZmlsdGVyKChlKSA9PiBlLnNldmVyaXR5ID09PSBcIkVycm9yXCIpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBveGZtdCBlcnJvcnMgKCR7ZmlsZVBhdGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGVyci5sYWJlbHNbMF07XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IGNvZGUuc2xpY2UoTWF0aC5tYXgoMCwgbGFiZWwuc3RhcnQgLSA4MCksIGxhYmVsLnN0YXJ0KTtcbiAgICAgICAgICBjb25zdCBhdCA9IGNvZGUuc2xpY2UobGFiZWwuc3RhcnQsIGxhYmVsLmVuZCk7XG4gICAgICAgICAgY29uc3QgYWZ0ZXIgPSBjb2RlLnNsaWNlKGxhYmVsLmVuZCwgTWF0aC5taW4oY29kZS5sZW5ndGgsIGxhYmVsLmVuZCArIDgwKSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9IChvZmZzZXQgJHtsYWJlbC5zdGFydH0tJHtsYWJlbC5lbmR9KWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgICBhcm91bmQ6IC4uLiR7YmVmb3JlfcK7JHthdH3CqyR7YWZ0ZXJ9Li4uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5jb2RlO1xufVxuXG5sZXQgY2FjaGVkT3hmbXRDb25maWc6IEZvcm1hdENvbmZpZyB8IG51bGwgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gbG9hZE94Zm10Q29uZmlnKCk6IFByb21pc2U8Rm9ybWF0Q29uZmlnPiB7XG4gIGlmIChjYWNoZWRPeGZtdENvbmZpZyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgfVxuXG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4oZGlyLCBcIi5veGZtdHJjLmpzb25cIik7XG4gICAgdHJ5IHtcbiAgICAgIGNhY2hlZE94Zm10Q29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjYW5kaWRhdGUsIFwidXRmLThcIikpIGFzIEZvcm1hdENvbmZpZztcbiAgICAgIHJldHVybiBjYWNoZWRPeGZtdENvbmZpZztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke2NhbmRpZGF0ZX06YCwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSBicmVhaztcbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICBjYWNoZWRPeGZtdENvbmZpZyA9IHt9O1xuICByZXR1cm4gY2FjaGVkT3hmbXRDb25maWc7XG59XG5cbi8qKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleyXkCDrp57strAg7L2U65Oc66W8IGxpbnTtlanri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleydhCDsoIHsmqnrsJvripQgb3hsaW50IGNsaeulvCDssL7slYQg652E7JuM7IScLFxuICog7J6E7IucIO2MjOydvOyXkCBpbi1wbGFjZeuhnCDsjajshJwg6re4IOqysOqzvOulvCDrubzsmKTripQg67Cp7Iud7Jy866GcIOyekeuPme2VqeuLiOuLpC5cbiAqIOyZnCDsnbTroIfqsowg7ZWY64qQ64OQPyBveGxpbnTqsIAgbm9kZSBhcGnrj4Qg7JWIIOyjvOqzoCBjbGnsl5DshJwgc3RkaW4g7Ji17IWY64+EIOyViCDso7zquLAg65WM66y4Li4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk94bGludChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNUZXN0KCkpIHtcbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIOuKkOugpOyngOq4sOunjCDtlZjqs6Ag6rKA7Kad7ZWgIOqwgOy5mOuPhCDsl4bslrTshJwg7JWIIO2VqeuLiOuLpC5cbiAgICAvLyBHaXRIdWIgQWN0aW9ucyDtmZjqsr3sl5DshJwgbGludOqwgCDsmKTrnpgg6rG466Ck7IScIOu7l+q4sOuPhCDtlojslrTsmpQuIChodHRwczovL2dpdGh1Yi5jb20vY2FydGFub3ZhLWFpL3NvbmFtdS9hY3Rpb25zL3J1bnMvMjUyNjcyMTQwMjcvam9iLzc0MDgzNjMwMTY5KVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgLy8gT1MgdG1wIGRpcuyXkCDrkZDripQg7J207JygOiBwcm9jZXNzLmN3ZCgp6rCAIHdhdGNoZXIg7Iqk7L2U7ZSEKGFwaS9zcmMg7JWE656YKeydvCDqsIDriqXshLHsnYQg7LCo64uo7ZWp64uI64ukLlxuICAvLyBjd2TqsIAg6re4IOychOy5mOudvOuptCB3cml0ZS91bmxpbmvqsIAg7Ken7J2AIOyInOqwhCB3YXRjaGVyIOydtOuypO2KuOuhnCDsnqHtmIAgYmF0Y2jsl5Ag7Z2Y65+s65Ok7Ja06rCIIOyImCDsnojslrTsmpQuXG4gIGNvbnN0IHRtcEZpbGUgPSBqb2luKFxuICAgIHRtcGRpcigpLFxuICAgIGAuc29uYW11LWZtdC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9LnRzYCxcbiAgKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0bXBGaWxlLCBjb2RlLCBcInV0Zi04XCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWN1dGUocmVzb2x2ZU94bGludEJpbigpLCBbXCItLWZpeFwiLCBcIi0tZml4LXN1Z2dlc3Rpb25zXCIsIFwiLS10eXBlLWF3YXJlXCIsIHRtcEZpbGVdLCB7XG4gICAgICAgIHRpbWVvdXQ6IDEwMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbGludCDsnITrsJgg7IucIGV4aXQgY29kZSAhPSAw7J207KeA66eMIC0tZml464qUIOyggeyaqeuQqC4gZXhlYyDsnpDssrQg7Iuk7Yyo66eMIHRocm93LlxuICAgICAgaWYgKHR5cGVvZiAoZSBhcyBFcnJvciAmIHsgY29kZT86IG51bWJlciB9KS5jb2RlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHRtcEZpbGUsIFwidXRmLThcIik7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVubGluayh0bXBGaWxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOyCreygnCDsi6TtjKjtlbTrj4Qg7Ja07LCo7ZS8IGlnbm9yZeuQqC5cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU94bGludEJpbigpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBfcmVxdWlyZS5yZXNvbHZlKFwib3hsaW50L2Jpbi9veGxpbnRcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIm94bGludFwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxlQUFlLG1CQUFtQixNQUFjLFVBQW1DO0FBRWpGLEtBQUksU0FBUyxTQUFTLE9BQU8sRUFBRTtBQUM3QixTQUFPLFNBQVMsTUFBTSxTQUFTOztBQUlqQyxRQUFPLFNBQVMsTUFBTSxVQUFVLEtBQUssRUFBRSxTQUFTOzs7OztBQU1sRCxlQUFlLFNBQVMsTUFBYyxVQUFtQztDQUN2RSxNQUFNLFNBQVMsTUFBTSxPQUFPLEtBQUssU0FBUyxTQUFTLEVBQUUsTUFBTSxNQUFNLGlCQUFpQixDQUFDO0NBRW5GLE1BQU0sU0FBUyxPQUFPLE9BQU8sUUFBUSxNQUFNLEVBQUUsYUFBYSxRQUFRO0FBQ2xFLEtBQUksT0FBTyxTQUFTLEdBQUc7QUFDckIsTUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNiLFdBQVEsTUFBTSxpQkFBaUIsU0FBUyxJQUFJO0FBQzVDLFFBQUssTUFBTSxPQUFPLFFBQVE7SUFDeEIsTUFBTSxRQUFRLElBQUksT0FBTztBQUN6QixRQUFJLE9BQU87S0FDVCxNQUFNLFNBQVMsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxHQUFHLEVBQUUsTUFBTSxNQUFNO0tBQ3JFLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxPQUFPLE1BQU0sSUFBSTtLQUM3QyxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sS0FBSyxLQUFLLElBQUksS0FBSyxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUM7QUFDMUUsYUFBUSxNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLEdBQUc7QUFDeEUsYUFBUSxNQUFNLGtCQUFrQixPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sS0FBSztXQUN0RDtBQUNMLGFBQVEsTUFBTSxPQUFPLElBQUksVUFBVTs7OztBQUl6QyxTQUFPOztBQUVULFFBQU8sT0FBTzs7QUFJaEIsZUFBZSxrQkFBeUM7QUFDdEQsS0FBSSxzQkFBc0IsTUFBTTtBQUM5QixTQUFPOztDQUdULElBQUksTUFBTSxRQUFRLEtBQUs7QUFDdkIsUUFBTyxNQUFNO0VBQ1gsTUFBTSxZQUFZLEtBQUssS0FBSyxnQkFBZ0I7QUFDNUMsTUFBSTtBQUNGLHVCQUFvQixLQUFLLE1BQU0sTUFBTSxTQUFTLFdBQVcsUUFBUSxDQUFDO0FBQ2xFLFVBQU87V0FDQSxHQUFHO0FBQ1YsT0FBSyxFQUE0QixTQUFTLFVBQVU7QUFDbEQsS0FBQyxRQUFRLElBQUksUUFBUSxNQUFNLGtCQUFrQixVQUFVLElBQUksRUFBRTtBQUM3RDs7O0VBR0osTUFBTSxTQUFTLFFBQVEsSUFBSTtBQUMzQixNQUFJLFdBQVcsSUFBSztBQUNwQixRQUFNOztBQUdSLHFCQUFvQixFQUFFO0FBQ3RCLFFBQU87Ozs7Ozs7OztBQVVULGVBQWUsVUFBVSxNQUErQjtBQUN0RCxLQUFJLFFBQVEsRUFBRTtBQUdaLFNBQU87O0NBS1QsTUFBTSxVQUFVLEtBQ2QsUUFBUSxFQUNSLGVBQWUsS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUNsRTtBQUVELEtBQUk7QUFDRixRQUFNLFVBQVUsU0FBUyxNQUFNLFFBQVE7QUFFdkMsTUFBSTtBQUNGLFNBQU0sUUFBUSxrQkFBa0IsRUFBRTtJQUFDO0lBQVM7SUFBcUI7SUFBZ0I7SUFBUSxFQUFFLEVBQ3pGLFNBQVMsS0FDVixDQUFDO1dBQ0ssR0FBRztBQUVWLE9BQUksT0FBUSxFQUFnQyxTQUFTLFVBQVU7QUFDN0QsVUFBTTs7O0FBSVYsU0FBTyxNQUFNLFNBQVMsU0FBUyxRQUFRO1dBQy9CO0FBQ1IsTUFBSTtBQUNGLFNBQU0sT0FBTyxRQUFRO1VBQ2Y7OztBQU1aLFNBQVMsbUJBQTJCO0FBQ2xDLEtBQUk7QUFDRixTQUFPLFNBQVMsUUFBUSxvQkFBb0I7U0FDdEM7QUFDTixTQUFPOzs7OzttQkF0STRCO2tCQUNEO3FCQUNJO0NBRXBDLFdBQVcsY0FBYyxPQUFPLEtBQUssSUFBSTtDQVFsQyxhQUFhLE9BQU8scUJBQXFCLE1BQU0sYUFBYTtFQUN2RSxNQUFNLE1BQU0sU0FBUyxTQUFTLE9BQU8sR0FBRyxRQUFRLFNBQVMsU0FBUyxPQUFPLEdBQUcsU0FBUztBQUNyRixTQUFPLEdBQUcsSUFBSSxHQUFHLFdBQVcsT0FBTyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sTUFBTTtHQUM5RDtDQTJDRUEsb0JBQXlDIn0=
@@ -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;AAInC;;;;;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;;;;;;;;;;;;;GAaG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAuClB"}
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"}
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdXRpbHMuanMiLCJuYW1lcyI6WyJwYXRoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2ZzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgYWNjZXNzLCByZWFkRmlsZSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuLyoqXG4gKiBmcy9wcm9taXNlc+yXkOuKlCBleGlzdHPqsIAg7JeG7Ja07JqULiDrjIDsi6AgYWNjZXNz6rCAIOyeiOyKteuLiOuLpC5cbiAqIOq3vOuNsCDslpjripQg7J247YSw7Y6Y7J207Iqk6rCAIOyTsOq4sCDrtojtjrjtlbTsmpQuIOq3uOuemOyEnCDqsJDsi7jso7zsl4jsirXri4jri6QuXG4gKiBAcGFyYW0gcGF0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0cyhwYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IGFjY2VzcyhwYXRoLCBjb25zdGFudHMuRl9PSyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyDrlJTroInthqDrpqzqsIAg7JWE64uI6528IO2MjOydvOunjCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMocGF0aDogUGF0aExpa2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHN0YXRzLmlzRmlsZSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiDtjIzsnbzsnYQg67O17IKs7ZWY66m07IScIGBmcm9tIFwic29uYW11XCJgIGltcG9ydOulvCBzb25hbXUuc2hhcmVkLnRzIOqyveuhnOuhnCDsuZjtmZjtlanri4jri6QuXG4gKlxuICogd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW11IO2MqO2CpOyngOqwgCDsl4bsnLzrr4DroZwsIO2VqOq7mCDrs7XsgqzrkJjripQgc29uYW11LnNoYXJlZC50c+yXkOyEnCDqsIDsoLjsmKTrj4TroZ0g67OA7ZmY7ZWp64uI64ukLlxuICog64yA7IOBIO2MjOydvOydmCDsnITsuZjsl5Ag65Sw6528IOyDgeuMgCDqsr3roZzqsIAg64us65287KeR64uI64ukOlxuICogLSBzZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkLnRzIOKGkiAuL3NvbmFtdS5zaGFyZWRcbiAqIC0gc2VydmljZXMvdXNlci91c2VyLnR5cGVzLnRzIOKGkiAuLi9zb25hbXUuc2hhcmVkXG4gKiAtIGkxOG4va28udHMg4oaSIC4uL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWRcbiAqXG4gKiBAcGFyYW0gZnJvbVBhdGgg7JuQ67O4IO2MjOydvCDqsr3roZxcbiAqIEBwYXJhbSB0b1BhdGgg64yA7IOBIO2MjOydvCDqsr3roZxcbiAqIEBwYXJhbSBzeW5jSGVhZGVyIOuPmeq4sO2ZlCDsi5wg7YyM7J28IOy1nOyDgeuLqOyXkCDsgr3snoXtlaAg7KO87ISdIOu4lOuhnS4g6riw7KG0IEBnZW5lcmF0ZWQg67iU66Gd7J20IOyeiOycvOuptCDqtZDssrTtlZjqs6AsIOyXhuycvOuptCDstZzsg4Hri6jsl5Ag7LaU6rCA7ZWp64uI64ukLlxuICogQHJldHVybnMg7YyM7J287J2EIOyNvOycvOuptCB0cnVlLCDqsbTrhIjrm7Dsl4jsnLzrqbQgZmFsc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoXG4gIGZyb21QYXRoOiBzdHJpbmcsXG4gIHRvUGF0aDogc3RyaW5nLFxuICBzeW5jSGVhZGVyPzogc3RyaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gIGxldCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtla3sg4Ege2Jhc2V9L3NyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRz7JeQIOychOy5mO2VqeuLiOuLpC5cbiAgICAvLyB0b1BhdGjsl5DshJwgL3NyYy/rpbwg7LC+7JWEIHNlcnZpY2VzIOuUlOugie2GoOumrCDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICAgIGNvbnN0IHNyY01hdGNoID0gdG9QYXRoLm1hdGNoKC9eKC4rXFwvc3JjKVxcLy8pO1xuICAgIGlmICghc3JjTWF0Y2gpIHtcbiAgICAgIC8vIC9zcmMv6rCAIOyXhuycvOuptCDrs4DtmZgg7JeG7J20IOq3uOuMgOuhnCDrsJjtmZhcbiAgICAgIHJldHVybiBvbGRGaWxlQ29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlc0RpciA9IHBhdGguam9pbihzcmNNYXRjaFsxXSwgXCJzZXJ2aWNlc1wiKTtcbiAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc2VydmljZXNEaXIpO1xuICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgIHJldHVybiBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11KFxcL2RpY3QpP1wiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gIH0pKCk7XG5cbiAgLy8gc3luY0hlYWRlcuqwgCDsoJzqs7XrkJwg6rK97JqwIEBnZW5lcmF0ZWQg67iU66Gd7J2EIOq1kOyytO2VmOqxsOuCmCDstZzsg4Hri6jsl5Ag7LaU6rCA7ZWp64uI64ukLlxuICAvLyBgKi9gIOynge2bhOyXkOuKlCDtla3sg4Eg67mIIOykhCDtlZwg6rCc66W8IOuztOyepe2VmOyXrCBveGZtdOqwgCDso7zshJ3snYQgaW1wb3J07J2YIGxlYWRpbmcgY29tbWVudOuhnCDsmKTsnbjtlbQg7KCV66CsIOyLnCDrgYzroKTqsIDripQg66y47KCc66W8IOuwqeyngO2VqeuLiOuLpC5cbiAgaWYgKHN5bmNIZWFkZXIpIHtcbiAgICAvLyDquLDsobQgQGdlbmVyYXRlZCDruJTroZ0gKyDrkqTsnbTslrQg7Jik64qUIOu5iCDspITrk6Qo7J6I7Jy866m0IO2PrO2VqCnsnYQg7ZWc6rq867KI7JeQIOunpOy5re2VmOyXrCDqtZDssrQg7IucIOu5iCDspITsnbQg64iE7KCB65CY7KeAIOyViuqyjCDtlanri4jri6QuXG4gICAgLy8g7ZWcIOykhOynnOumrCgvKiogQGdlbmVyYXRlZCAqLynripQg66ek7Lmt7ZWY7KeAIOyViuycvOuvgOuhnCDsiJjrj5nsnLzroZwg7LaV7JW97ZWY7KeAIOuniOyEuOyalC5cbiAgICBjb25zdCBnZW5lcmF0ZWRCbG9ja1JlZ2V4ID0gL1xcL1xcKlxcKlxccj9cXG4gXFwqIEBnZW5lcmF0ZWRcXHI/XFxuW1xcc1xcU10qP1xcKlxcL1xccj9cXG4oXFxyP1xcbikqLztcbiAgICBpZiAoZ2VuZXJhdGVkQmxvY2tSZWdleC50ZXN0KG5ld0ZpbGVDb250ZW50KSkge1xuICAgICAgbmV3RmlsZUNvbnRlbnQgPSBuZXdGaWxlQ29udGVudC5yZXBsYWNlKGdlbmVyYXRlZEJsb2NrUmVnZXgsIGAke3N5bmNIZWFkZXJ9XFxuXFxuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0ZpbGVDb250ZW50ID0gYCR7c3luY0hlYWRlcn1cXG5cXG4ke25ld0ZpbGVDb250ZW50fWA7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBV0EsZUFBc0IsT0FBTyxRQUFrQztBQUM3RCxLQUFJO0FBQ0YsUUFBTSxPQUFPQSxRQUFNLFVBQVUsS0FBSztBQUNsQyxTQUFPO1NBQ0Q7QUFDTixTQUFPOzs7QUFLWCxlQUFzQixXQUFXLFFBQWtDO0FBQ2pFLEtBQUk7RUFDRixNQUFNLFFBQVEsTUFBTSxLQUFLQSxPQUFLO0FBQzlCLFNBQU8sTUFBTSxRQUFRO1NBQ2Y7QUFDTixTQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCWCxlQUFzQixnQ0FDcEIsVUFDQSxRQUNBLFlBQ2tCO0FBQ2xCLEtBQUksQ0FBRSxNQUFNLE9BQU8sU0FBUyxFQUFHO0FBQzdCLFNBQU87O0NBR1QsTUFBTSxrQkFBa0IsTUFBTSxTQUFTLFNBQVMsRUFBRSxVQUFVO0NBRTVELElBQUksd0JBQXdCO0VBRzFCLE1BQU0sV0FBVyxPQUFPLE1BQU0sZUFBZTtBQUM3QyxNQUFJLENBQUMsVUFBVTtBQUViLFVBQU87O0VBR1QsTUFBTSxjQUFjLEtBQUssS0FBSyxTQUFTLElBQUksV0FBVztFQUN0RCxNQUFNLFVBQVUsUUFBUSxPQUFPO0VBQy9CLE1BQU0sZUFBZSxLQUFLLFNBQVMsU0FBUyxZQUFZO0VBQ3hELE1BQU0sYUFBYSxpQkFBaUIsS0FBSyxvQkFBb0IsR0FBRyxhQUFhO0FBRTdFLFNBQU8sZUFBZSxRQUFRLDJCQUEyQixTQUFTLFdBQVcsR0FBRztLQUM5RTtBQUlKLEtBQUksWUFBWTtFQUdkLE1BQU0sc0JBQXNCO0FBQzVCLE1BQUksb0JBQW9CLEtBQUssZUFBZSxFQUFFO0FBQzVDLG9CQUFpQixlQUFlLFFBQVEscUJBQXFCLEdBQUcsV0FBVyxNQUFNO1NBQzVFO0FBQ0wsb0JBQWlCLEdBQUcsV0FBVyxNQUFNOzs7QUFJekMsT0FBTSxVQUFVLFFBQVEsZUFBZTtBQUN2QyxRQUFPIn0=
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":"AAIA;;;;;;;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
+ {"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 init_process_utils = __esmMin((() => {}));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy11dGlscy5qcyIsIm5hbWVzIjpbInNldFRpbWVvdXRQcm9taXNlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2V0VGltZW91dFByb21pc2VzIH0gZnJvbSBcInRpbWVycy9wcm9taXNlc1wiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5cbi8qKlxuICog7KO87Ja07KeEIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gKiDso7zslrTsp4Qg7ZSE66Gc7IS47IqkIOydtOuypO2KuCg97Iuc6re464SQKeqwgCDrsJzsg53tlZjsmIDsnYQg65WM7JeQ64+EIOy1nOuMgCDtlZzqs4QoZGVsYXlCZWZvcmVTaHV0ZG93bikg64+Z7JWIIOyekeyXheydhCDquLDri6TrprAg7ZuEIOyiheujjO2VqeuLiOuLpC5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gam9iIC0g7Iuk7ZaJ7ZWgIOyekeyXhVxuICogQHBhcmFtIHtldmVudDogTm9kZUpTLlNpZ25hbHM7IGRlbGF5QmVmb3JlU2h1dGRvd246IG51bWJlcn0gb3B0aW9ucyAtIOyYteyFmFxuICogQHBhcmFtIHtOb2RlSlMuU2lnbmFsc30gb3B0aW9ucy5ldmVudCAtIO2UhOuhnOyEuOyKpCDsnbTrsqTtirhcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmRlbGF5QmVmb3JlU2h1dGRvd24gLSDstZzrjIAg7ZWc6rOEIOyLnOqwhFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gIGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAge1xuICAgIHdoZW5UaGlzSGFwcGVuczogZXZlbnQsXG4gICAgd2FpdEZvclVwVG86IGRlbGF5QmVmb3JlU2h1dGRvd24sXG4gIH06IHsgd2hlblRoaXNIYXBwZW5zOiBOb2RlSlMuU2lnbmFsczsgd2FpdEZvclVwVG86IG51bWJlciB9ID0ge1xuICAgIHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsXG4gICAgd2FpdEZvclVwVG86IDIwMDAwLFxuICB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpc1J1bm5pbmcgPSB0cnVlIGFzIGJvb2xlYW47XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBvbkV2ZW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNSdW5uaW5nKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYHdhaXQgZm9yIHN5bmNpbmcgZG9uZS4uLi5gKSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0VGltZW91dFByb21pc2VzKGRlbGF5QmVmb3JlU2h1dGRvd24sIFwid2FpdGluZy1zeW5jXCIsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7fVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYFN5bmNpbmcgRE9ORSFgKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuICBwcm9jZXNzLm9uKGV2ZW50LCBvbkV2ZW50KTtcblxuICBhd2FpdCBqb2IoKTtcblxuICBpc1J1bm5pbmcgPSBmYWxzZTtcbiAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIHByb2Nlc3Mub2ZmKGV2ZW50LCBvbkV2ZW50KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVlBLGVBQXNCLHdCQUNwQixLQUNBLEVBQ0UsaUJBQWlCLE9BQ2pCLGFBQWEsd0JBQytDO0NBQzVELGlCQUFpQjtDQUNqQixhQUFhO0NBQ2QsRUFDYztDQUNmLElBQUksWUFBWTtDQUVoQixNQUFNLGtCQUFrQixJQUFJLGlCQUFpQjtDQUM3QyxNQUFNLFVBQVUsWUFBWTtBQUMxQixNQUFJLENBQUMsV0FBVztBQUNkLFdBQVEsS0FBSyxFQUFFOztBQUVqQixVQUFRLElBQUksTUFBTSxjQUFjLDRCQUE0QixDQUFDO0FBRTdELE1BQUk7QUFDRixTQUFNQSxXQUFtQixxQkFBcUIsZ0JBQWdCLEVBQzVELFFBQVEsZ0JBQWdCLFFBQ3pCLENBQUM7VUFDSTtBQUNSLFVBQVEsSUFBSSxNQUFNLGNBQWMsZ0JBQWdCLENBQUM7QUFDakQsVUFBUSxLQUFLLEVBQUU7O0FBRWpCLFNBQVEsR0FBRyxPQUFPLFFBQVE7QUFFMUIsT0FBTSxLQUFLO0FBRVgsYUFBWTtBQUNaLGlCQUFnQixPQUFPO0FBQ3ZCLFNBQVEsSUFBSSxPQUFPLFFBQVEifQ==
54
+ export { execute, init_process_utils, runWithGracefulShutdown };
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy11dGlscy5qcyIsIm5hbWVzIjpbInNldFRpbWVvdXRQcm9taXNlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlLCB0eXBlIEV4ZWNGaWxlT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNldFRpbWVvdXRQcm9taXNlcyB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gXCJ1dGlsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcblxuY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG5cbi8qKlxuICogZXhleEZpbGVTeW5j7J2YIOu5hOuPmeq4sCDrsoTsoITsnoXri4jri6QuXG4gKiBleGl0IGNvZGXqsIAgbm9uLXplcm/snbTrqbQgcmVqZWN07ZW07JqULlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZShcbiAgYmluOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogRXhlY0ZpbGVPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoYmluLCBhcmdzLCBvcHRpb25zKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09IFwic3RyaW5nXCIgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4Qg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAqIOyjvOyWtOynhCDtlITroZzshLjsiqQg7J2067Kk7Yq4KD3si5zqt7jrhJAp6rCAIOuwnOyDne2VmOyYgOydhCDrlYzsl5Drj4Qg7LWc64yAIO2VnOqzhChkZWxheUJlZm9yZVNodXRkb3duKSDrj5nslYgg7J6R7JeF7J2EIOq4sOuLpOumsCDtm4Qg7KKF66OM7ZWp64uI64ukLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBqb2IgLSDsi6TtlontlaAg7J6R7JeFXG4gKiBAcGFyYW0ge2V2ZW50OiBOb2RlSlMuU2lnbmFsczsgZGVsYXlCZWZvcmVTaHV0ZG93bjogbnVtYmVyfSBvcHRpb25zIC0g7Ji17IWYXG4gKiBAcGFyYW0ge05vZGVKUy5TaWduYWxzfSBvcHRpb25zLmV2ZW50IC0g7ZSE66Gc7IS47IqkIOydtOuypO2KuFxuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMuZGVsYXlCZWZvcmVTaHV0ZG93biAtIOy1nOuMgCDtlZzqs4Qg7Iuc6rCEXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICB7XG4gICAgd2hlblRoaXNIYXBwZW5zOiBldmVudCxcbiAgICB3YWl0Rm9yVXBUbzogZGVsYXlCZWZvcmVTaHV0ZG93bixcbiAgfTogeyB3aGVuVGhpc0hhcHBlbnM6IE5vZGVKUy5TaWduYWxzOyB3YWl0Rm9yVXBUbzogbnVtYmVyIH0gPSB7XG4gICAgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIixcbiAgICB3YWl0Rm9yVXBUbzogMjAwMDAsXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGlzUnVubmluZyA9IHRydWUgYXMgYm9vbGVhbjtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IG9uRXZlbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFpc1J1bm5pbmcpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coY2hhbGsubWFnZW50YUJyaWdodChgd2FpdCBmb3Igc3luY2luZyBkb25lLi4uLmApKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXRUaW1lb3V0UHJvbWlzZXMoZGVsYXlCZWZvcmVTaHV0ZG93biwgXCJ3YWl0aW5nLXN5bmNcIiwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHt9XG4gICAgY29uc29sZS5sb2coY2hhbGsubWFnZW50YUJyaWdodChgU3luY2luZyBET05FIWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH07XG4gIHByb2Nlc3Mub24oZXZlbnQsIG9uRXZlbnQpO1xuXG4gIGF3YWl0IGpvYigpO1xuXG4gIGlzUnVubmluZyA9IGZhbHNlO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgcHJvY2Vzcy5vZmYoZXZlbnQsIG9uRXZlbnQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLGVBQXNCLFFBQ3BCLEtBQ0EsTUFDQSxTQUNpQjtDQUNqQixNQUFNLEVBQUUsV0FBVyxNQUFNLGNBQWMsS0FBSyxNQUFNLFFBQVE7QUFDMUQsUUFBTyxPQUFPLFdBQVcsV0FBVyxTQUFTLE9BQU8sVUFBVTs7Ozs7Ozs7OztBQVdoRSxlQUFzQix3QkFDcEIsS0FDQSxFQUNFLGlCQUFpQixPQUNqQixhQUFhLHdCQUMrQztDQUM1RCxpQkFBaUI7Q0FDakIsYUFBYTtDQUNkLEVBQ2M7Q0FDZixJQUFJLFlBQVk7Q0FFaEIsTUFBTSxrQkFBa0IsSUFBSSxpQkFBaUI7Q0FDN0MsTUFBTSxVQUFVLFlBQVk7QUFDMUIsTUFBSSxDQUFDLFdBQVc7QUFDZCxXQUFRLEtBQUssRUFBRTs7QUFFakIsVUFBUSxJQUFJLE1BQU0sY0FBYyw0QkFBNEIsQ0FBQztBQUU3RCxNQUFJO0FBQ0YsU0FBTUEsV0FBbUIscUJBQXFCLGdCQUFnQixFQUM1RCxRQUFRLGdCQUFnQixRQUN6QixDQUFDO1VBQ0k7QUFDUixVQUFRLElBQUksTUFBTSxjQUFjLGdCQUFnQixDQUFDO0FBQ2pELFVBQVEsS0FBSyxFQUFFOztBQUVqQixTQUFRLEdBQUcsT0FBTyxRQUFRO0FBRTFCLE9BQU0sS0FBSztBQUVYLGFBQVk7QUFDWixpQkFBZ0IsT0FBTztBQUN2QixTQUFRLElBQUksT0FBTyxRQUFROzs7O0NBeER2QixnQkFBZ0IsVUFBVSxTQUFTIn0=
@@ -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;AAcD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,OAAO,CAM3F"}
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"}
@@ -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+IGJvb2xlYW4sXG4pOiBUW10ge1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW1BKSA9PiAhYXJyMi5zb21lKChpdGVtQikgPT4gY29tcGFyYXRvcihpdGVtQSwgaXRlbUIpKSk7XG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogZHluYW1pYyBwcm9wZXJ0eSBhY2Nlc3NcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oZGVmYXVsdE9iajogVCwgdXNlck9iajogVCk6IFQge1xuICAvLyDsm5Drs7gg67O07KG07J2EIOychO2VtCBkZWZhdWx0T2JqIOuzteyCrFxuICBjb25zdCByZXN1bHQgPSB7IC4uLmRlZmF1bHRPYmogfTtcblxuICAvLyB1c2VyT2Jq7J2YIOqwgSDsho3shLHsnYQg7Iic7ZqMXG4gIGZvciAoY29uc3Qga2V5IGluIHVzZXJPYmopIHtcbiAgICAvLyB1c2VyT2Jq7J2YIG93biBwcm9wZXJ0eeunjCDsspjrpqwgKO2UhOuhnO2GoO2DgOyehSDssrTsnbgg7KCc7Jm4KVxuICAgIGlmIChPYmplY3QuaGFzT3duKHVzZXJPYmosIGtleSkpIHtcbiAgICAgIGNvbnN0IHVzZXJWYWx1ZSA9IHVzZXJPYmpba2V5XTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJlc3VsdFtrZXldO1xuXG4gICAgICAvLyDrkZAg6rCS7J20IOuqqOuRkCDqsJ3ssrTsnbTqs6AsIOuwsOyXtOydtCDslYTri4wg6rK97JqwIOyerOq3gOyggeycvOuhnCDrs5HtlalcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHVzZXJWYWx1ZSkgJiYgaXNQbGFpbk9iamVjdChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UoZGVmYXVsdFZhbHVlLCB1c2VyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g6re4IOyZuOydmCDqsr3smrAgdXNlck9iauydmCDqsJLsnLzroZwg642u7Ja07JOw6riwXG4gICAgICAgIHJlc3VsdFtrZXldID0gdXNlclZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHBsYWluIG9iamVjdCDtjJDrs4Qg7Zes7Y28IO2VqOyImFxuLy8gKOuwsOyXtCwgbnVsbCwgRGF0ZSDrk7HsnYQg7KCc7Jm47ZWcIOyInOyImCDqsJ3ssrTrp4wgdHJ1ZSlcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICk7XG59XG5cbi8vIENvbnZlcnQgRmFzdGlmeSBoZWFkZXJzIHRvIHN0YW5kYXJkIEhlYWRlcnMgb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChoZWFkZXJzOiBGYXN0aWZ5UmVxdWVzdFtcImhlYWRlcnNcIl0pOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVyc09iaiA9IG5ldyBIZWFkZXJzKCk7XG4gIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICh2YWx1ZSkgaGVhZGVyc09iai5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgfSk7XG4gIHJldHVybiBoZWFkZXJzT2JqO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQU9BLFNBQWdCLGtCQUFnQztDQUM5QyxNQUFNLGNBQWMsaUJBQWlCO0FBQ3JDLFFBQU8sS0FBSyxRQUFRLFlBQVk7O0FBR2xDLFNBQWdCLGtCQUFnQztDQUc5QyxNQUFNLGdCQUFnQixRQUFRLElBQUksdUJBQXVCLFFBQVEsSUFBSTtBQUNyRSxLQUFJLFlBQVksY0FBYyxFQUFFO0FBQzlCLFNBQU87O0FBR1QsS0FBSSxZQUFZLFFBQVEsSUFBSSxrQkFBa0IsRUFBRTtBQUM5QyxTQUFPLFFBQVEsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUk7O0NBR3JELE1BQU0saUJBQWlCLEtBQUssS0FBSyxRQUFRLEtBQUssRUFBRSxlQUFlO0FBQy9ELEtBQUksR0FBRyxXQUFXLGVBQWUsRUFBRTtBQUNqQyxTQUFPLFFBQVEsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUk7O0NBR3JELE1BQU0sV0FBVyxPQUFPLEtBQUs7Q0FDN0IsSUFBSSxNQUFNLEtBQUssUUFBUSxTQUFTO0FBQ2hDLEtBQUksSUFBSSxTQUFTLFVBQVUsRUFBRTtBQUMzQixRQUFNLElBQUksTUFBTSxVQUFVLENBQUM7O0FBRzdCLElBQUc7QUFDRCxNQUFJLEdBQUcsV0FBVyxLQUFLLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2xELFVBQU8sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJOztBQUUzQyxRQUFNLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUk7VUFDOUMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVM7QUFDdEMsT0FBTSxJQUFJLE1BQU0sc0NBQXNDOztBQUd4RCxTQUFnQixZQUFlLE9BQW1DO0FBQ2hFLFFBQU8sVUFBVSxRQUFRLFVBQVU7O0FBR3JDLFNBQWdCLFdBQVcsUUFBZTtBQUN4QyxPQUFNLElBQUksTUFBTSxhQUFhOztBQUkvQixTQUFnQixhQUFnQixPQUE2QixTQUFxQjtBQUNoRixLQUFJLFVBQVUsUUFBUSxVQUFVLFdBQVc7QUFDekMsUUFBTSxJQUFJLE1BQU0sV0FBVyxtQkFBbUI7O0FBRWhELFFBQU87O0FBSVQsU0FBZ0IsY0FBaUIsT0FBaUIsU0FBcUI7QUFDckUsS0FBSSxVQUFVLE1BQU07QUFDbEIsUUFBTSxJQUFJLE1BQU0sV0FBVyx5QkFBeUI7O0FBRXRELFFBQU87O0FBR1QsU0FBZ0IsY0FBaUIsT0FBc0IsU0FBcUI7QUFDMUUsS0FBSSxVQUFVLFdBQVc7QUFDdkIsUUFBTSxJQUFJLE1BQU0sV0FBVyx3QkFBd0I7O0FBRXJELFFBQU87O0FBSVQsU0FBZ0IsZUFDZCxNQUNBLE1BQ0EsVUFDSztDQUNMLE1BQU0sV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLFNBQVMsQ0FBQztBQUM1QyxRQUFPLEtBQUssUUFBUSxTQUFTLFNBQVMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDOztBQUc1RCxTQUFnQixlQUNkLE1BQ0EsTUFDQSxZQUNLO0FBQ0wsUUFBTyxLQUFLLFFBQVEsVUFBVSxDQUFDLEtBQUssTUFBTSxVQUFVLFdBQVcsT0FBTyxNQUFNLENBQUMsQ0FBQzs7QUFJaEYsU0FBZ0IsTUFBcUMsWUFBZSxTQUFlO0NBRWpGLE1BQU0sU0FBUyxFQUFFLEdBQUcsWUFBWTtBQUdoQyxNQUFLLE1BQU0sT0FBTyxTQUFTO0FBRXpCLE1BQUksT0FBTyxPQUFPLFNBQVMsSUFBSSxFQUFFO0dBQy9CLE1BQU0sWUFBWSxRQUFRO0dBQzFCLE1BQU0sZUFBZSxPQUFPO0FBRzVCLE9BQUksY0FBYyxVQUFVLElBQUksY0FBYyxhQUFhLEVBQUU7QUFDM0QsV0FBTyxPQUFPLE1BQU0sY0FBYyxVQUFVO1VBQ3ZDO0FBRUwsV0FBTyxPQUFPOzs7O0FBS3BCLFFBQU87O0FBS1QsU0FBUyxjQUFjLE9BQWtEO0FBQ3ZFLFFBQ0UsVUFBVSxRQUNWLE9BQU8sVUFBVSxZQUNqQixDQUFDLE1BQU0sUUFBUSxNQUFNLElBQ3JCLE9BQU8sVUFBVSxTQUFTLEtBQUssTUFBTSxLQUFLOztBQUs5QyxTQUFnQixnQ0FBZ0MsU0FBNkM7Q0FDM0YsTUFBTSxhQUFhLElBQUksU0FBUztBQUNoQyxRQUFPLFFBQVEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFdBQVc7QUFDaEQsTUFBSSxNQUFPLFlBQVcsT0FBTyxLQUFLLE1BQU0sVUFBVSxDQUFDO0dBQ25EO0FBQ0YsUUFBTyJ9
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.4",
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.58.0",
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.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.0",
163
+ "typescript": "^6.0.3",
162
164
  "voyageai": "^0.0.8",
163
165
  "zod": "^4.3.6"
164
166
  },
@@ -23,7 +23,7 @@ export function handleFetchError({
23
23
  ) {
24
24
  const cause = (error as { cause?: Error }).cause;
25
25
 
26
- if (cause != null) {
26
+ if (cause) {
27
27
  return new APICallError({
28
28
  message: `Cannot connect to API: ${cause.message}`,
29
29
  cause,
@@ -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
+ });