sonamu 0.10.13 → 0.11.0

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 (230) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  3. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  4. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  5. package/dist/api/base-frame.d.ts.map +1 -1
  6. package/dist/api/decorators.d.ts.map +1 -1
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +3 -2
  9. package/dist/api/validator.d.ts.map +1 -1
  10. package/dist/auth/audit-log/events.d.ts.map +1 -1
  11. package/dist/auth/index.d.ts +1 -1
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +3 -3
  14. package/dist/auth/knex-adapter.d.ts.map +1 -1
  15. package/dist/auth/plugins/wrappers/admin.d.ts +4 -4
  16. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  17. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  18. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  19. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  20. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  21. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  22. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  23. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  24. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  25. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  26. package/dist/bin/build-config.d.ts +10 -0
  27. package/dist/bin/build-config.d.ts.map +1 -1
  28. package/dist/bin/build-config.js +130 -6
  29. package/dist/bin/fixture.d.ts +7 -4
  30. package/dist/bin/fixture.d.ts.map +1 -1
  31. package/dist/bin/fixture.js +161 -13
  32. package/dist/bin/test-command.d.ts +7 -0
  33. package/dist/bin/test-command.d.ts.map +1 -1
  34. package/dist/bin/test-command.js +18 -4
  35. package/dist/bin/typecheck-web.d.ts +2 -0
  36. package/dist/bin/typecheck-web.d.ts.map +1 -0
  37. package/dist/bin/typecheck-web.js +36 -0
  38. package/dist/cache/decorator.d.ts.map +1 -1
  39. package/dist/cache/drivers.d.ts.map +1 -1
  40. package/dist/cache-control/cache-control.d.ts.map +1 -1
  41. package/dist/compress/compress.d.ts.map +1 -1
  42. package/dist/cone/cone-generator.js +1 -1
  43. package/dist/database/base-model.d.ts.map +1 -1
  44. package/dist/database/base-model.types.d.ts +0 -1
  45. package/dist/database/base-model.types.d.ts.map +1 -1
  46. package/dist/database/db.d.ts.map +1 -1
  47. package/dist/database/puri-subset.types.d.ts +0 -1
  48. package/dist/database/puri-subset.types.d.ts.map +1 -1
  49. package/dist/database/puri-wrapper.d.ts +0 -1
  50. package/dist/database/puri-wrapper.d.ts.map +1 -1
  51. package/dist/database/puri.d.ts +0 -1
  52. package/dist/database/puri.d.ts.map +1 -1
  53. package/dist/database/puri.types.d.ts +0 -1
  54. package/dist/database/puri.types.d.ts.map +1 -1
  55. package/dist/database/transaction-context.d.ts.map +1 -1
  56. package/dist/database/upsert-builder.d.ts.map +1 -1
  57. package/dist/dict/en.d.ts +58 -58
  58. package/dist/dict/en.d.ts.map +1 -1
  59. package/dist/dict/ko.d.ts +58 -58
  60. package/dist/dict/ko.d.ts.map +1 -1
  61. package/dist/dict/rc-keys.d.ts.map +1 -1
  62. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  63. package/dist/dict/sonamu-dictionary.js +2 -2
  64. package/dist/dict/utils.d.ts.map +1 -1
  65. package/dist/entity/entity-manager.d.ts +115 -113
  66. package/dist/entity/entity-manager.d.ts.map +1 -1
  67. package/dist/entity/entity-manager.js +25 -19
  68. package/dist/entity/entity-template-cone.d.ts +4 -4
  69. package/dist/entity/entity.d.ts +6 -1
  70. package/dist/entity/entity.d.ts.map +1 -1
  71. package/dist/entity/entity.js +8 -3
  72. package/dist/env.d.ts.map +1 -1
  73. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  74. package/dist/filter/types.d.ts.map +1 -1
  75. package/dist/index.js +6 -6
  76. package/dist/logger/configure.d.ts +10 -1
  77. package/dist/logger/configure.d.ts.map +1 -1
  78. package/dist/logger/configure.js +30 -5
  79. package/dist/migration/migrator.d.ts +12 -1
  80. package/dist/migration/migrator.d.ts.map +1 -1
  81. package/dist/migration/migrator.js +77 -30
  82. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  83. package/dist/migration/slack-confirm.d.ts.map +1 -1
  84. package/dist/naite/messaging-types.d.ts +0 -1
  85. package/dist/naite/messaging-types.d.ts.map +1 -1
  86. package/dist/naite/naite-reporter.d.ts +0 -1
  87. package/dist/naite/naite-reporter.d.ts.map +1 -1
  88. package/dist/naite/naite.d.ts.map +1 -1
  89. package/dist/storage/base-file.d.ts.map +1 -1
  90. package/dist/storage/buffered-file.d.ts.map +1 -1
  91. package/dist/storage/drivers.d.ts.map +1 -1
  92. package/dist/storage/s3-driver.d.ts.map +1 -1
  93. package/dist/storage/storage-manager.d.ts.map +1 -1
  94. package/dist/storage/uploaded-file.d.ts.map +1 -1
  95. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  96. package/dist/stream/ws-audience.d.ts.map +1 -1
  97. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  98. package/dist/stream/ws-delivery.d.ts.map +1 -1
  99. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  100. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  101. package/dist/stream/ws-registry.d.ts.map +1 -1
  102. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -1
  103. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  104. package/dist/stream/ws.d.ts.map +1 -1
  105. package/dist/syncer/api-parser.js +2 -2
  106. package/dist/syncer/file-patterns.d.ts +17 -17
  107. package/dist/syncer/filesystem-dependencies.js +1 -1
  108. package/dist/syncer/syncer.d.ts.map +1 -1
  109. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  110. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  111. package/dist/template/implementations/entity.template.d.ts +2 -2
  112. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  113. package/dist/template/implementations/entry-server.template.d.ts +2 -2
  114. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  115. package/dist/template/implementations/generated.template.d.ts +2 -2
  116. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  117. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  118. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  119. package/dist/template/implementations/generated_sso.template.d.ts +2 -2
  120. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  121. package/dist/template/implementations/http_validators.template.d.ts +2 -2
  122. package/dist/template/implementations/http_validators.template.d.ts.map +1 -1
  123. package/dist/template/implementations/init_types.template.d.ts +2 -2
  124. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  125. package/dist/template/implementations/model.template.d.ts +2 -2
  126. package/dist/template/implementations/model.template.d.ts.map +1 -1
  127. package/dist/template/implementations/model_test.template.d.ts +2 -2
  128. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  129. package/dist/template/implementations/queries.template.d.ts +2 -2
  130. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  131. package/dist/template/implementations/sd.template.d.ts +2 -2
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +1 -1
  134. package/dist/template/implementations/services.template.d.ts +2 -2
  135. package/dist/template/implementations/services.template.d.ts.map +1 -1
  136. package/dist/template/implementations/view_form.template.d.ts +3 -3
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  139. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  140. package/dist/template/implementations/view_list.template.d.ts +2 -2
  141. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  142. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  144. package/dist/template/template-manager.d.ts.map +1 -1
  145. package/dist/template/template.d.ts.map +1 -1
  146. package/dist/template/zod-converter.d.ts.map +1 -1
  147. package/dist/testing/_relation-graph.d.ts.map +1 -1
  148. package/dist/testing/data-explorer.d.ts +2 -2
  149. package/dist/testing/data-explorer.d.ts.map +1 -1
  150. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  151. package/dist/testing/faker-mappings.d.ts.map +1 -1
  152. package/dist/testing/fixture-generator.d.ts.map +1 -1
  153. package/dist/testing/fixture-generator.js +1 -1
  154. package/dist/testing/fixture-loader.d.ts.map +1 -1
  155. package/dist/testing/fixture-manager.d.ts +4 -0
  156. package/dist/testing/fixture-manager.d.ts.map +1 -1
  157. package/dist/testing/fixture-manager.js +99 -25
  158. package/dist/testing/naite-vitest-reporter.d.ts.map +1 -1
  159. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  160. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts +10 -0
  161. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts.map +1 -0
  162. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +42 -0
  163. package/dist/tooling/cdd-service.d.ts +87 -0
  164. package/dist/tooling/cdd-service.d.ts.map +1 -0
  165. package/dist/tooling/cdd-service.js +215 -0
  166. package/dist/tooling/cli-tooling.d.ts +11 -0
  167. package/dist/tooling/cli-tooling.d.ts.map +1 -0
  168. package/dist/tooling/cli-tooling.js +901 -0
  169. package/dist/tooling/fixture-service.d.ts +29 -0
  170. package/dist/tooling/fixture-service.d.ts.map +1 -0
  171. package/dist/tooling/fixture-service.js +53 -0
  172. package/dist/tooling/index.d.ts +2 -0
  173. package/dist/tooling/index.d.ts.map +1 -0
  174. package/dist/tooling/index.js +2 -0
  175. package/dist/tooling/test-run-client.d.ts +27 -0
  176. package/dist/tooling/test-run-client.d.ts.map +1 -0
  177. package/dist/tooling/test-run-client.js +120 -0
  178. package/dist/tsdown.api.config.js +48 -0
  179. package/dist/types/types.d.ts +527 -527
  180. package/dist/types/types.d.ts.map +1 -1
  181. package/dist/ui/ai-client.d.ts.map +1 -1
  182. package/dist/utils/formatter.d.ts +6 -0
  183. package/dist/utils/formatter.d.ts.map +1 -1
  184. package/dist/utils/formatter.js +42 -11
  185. package/dist/utils/model.d.ts +1 -1
  186. package/dist/vector/chunking.d.ts.map +1 -1
  187. package/dist/vector/embedding.d.ts.map +1 -1
  188. package/package.json +13 -12
  189. package/src/api/sonamu.ts +2 -1
  190. package/src/auth/index.ts +1 -1
  191. package/src/bin/__tests__/zod-compiler-build.test.ts +67 -0
  192. package/src/bin/build-config.ts +151 -5
  193. package/src/bin/fixture.ts +204 -21
  194. package/src/bin/test-command.ts +27 -4
  195. package/src/bin/typecheck-web.ts +56 -0
  196. package/src/dict/sonamu-dictionary.ts +1 -1
  197. package/src/entity/__tests__/entity-manager-autoload.contract.test.ts +55 -0
  198. package/src/entity/__tests__/entity-manager-explicit-root-registration.contract.test.ts +107 -0
  199. package/src/entity/entity-manager.ts +31 -19
  200. package/src/entity/entity.ts +7 -2
  201. package/src/logger/__tests__/configure.test.ts +33 -0
  202. package/src/logger/configure.ts +45 -3
  203. package/src/migration/__tests__/migrator.test.ts +51 -0
  204. package/src/migration/migrator.ts +103 -34
  205. package/src/syncer/api-parser.ts +1 -1
  206. package/src/testing/fixture-manager.ts +124 -32
  207. package/src/tooling/__tests__/cdd-rule-bootstrap.contract.test.ts +118 -0
  208. package/src/tooling/__tests__/cli-tooling-auth.contract.test.ts +72 -0
  209. package/src/tooling/__tests__/cli-tooling-cone-locale.contract.test.ts +150 -0
  210. package/src/tooling/__tests__/cli-tooling-entity-patch.contract.test.ts +131 -0
  211. package/src/tooling/__tests__/cli-tooling-fixture-transfer.contract.test.ts +255 -0
  212. package/src/tooling/__tests__/cli-tooling-i18n-update.contract.test.ts +104 -0
  213. package/src/tooling/__tests__/cli-tooling-scaffold.contract.test.ts +86 -0
  214. package/src/tooling/__tests__/cli-tooling-stub-practice.contract.test.ts +147 -0
  215. package/src/tooling/__tests__/default-cdd-adapter.contract.test.ts +73 -0
  216. package/src/tooling/__tests__/helpers/sonamu-test-root.ts +42 -0
  217. package/src/tooling/__tests__/test-run-client-config.contract.test.ts +154 -0
  218. package/src/tooling/cdd-service.ts +256 -0
  219. package/src/tooling/cli-tooling.ts +937 -0
  220. package/src/tooling/fixture-service.ts +72 -0
  221. package/src/tooling/index.ts +1 -0
  222. package/src/tooling/test-run-client.ts +196 -0
  223. package/src/utils/__tests__/formatter-bin.test.ts +99 -0
  224. package/src/utils/formatter.ts +74 -10
  225. package/tsdown.api.config.ts +8 -10
  226. package/bin/cli.js +0 -75
  227. package/dist/bin/cli.d.ts +0 -2
  228. package/dist/bin/cli.d.ts.map +0 -1
  229. package/dist/bin/cli.js +0 -956
  230. package/src/bin/cli.ts +0 -1166
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ declare const legacyFixtureOptionsSchema: z.ZodObject<{
3
+ _: z.ZodOptional<z.ZodArray<z.ZodString>>;
4
+ all: z.ZodOptional<z.ZodBoolean>;
5
+ include: z.ZodOptional<z.ZodString>;
6
+ exclude: z.ZodOptional<z.ZodString>;
7
+ count: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
8
+ strategy: z.ZodOptional<z.ZodString>;
9
+ limit: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
10
+ saveTo: z.ZodOptional<z.ZodString>;
11
+ useLlm: z.ZodOptional<z.ZodBoolean>;
12
+ noCache: z.ZodOptional<z.ZodBoolean>;
13
+ "save-to": z.ZodOptional<z.ZodString>;
14
+ "use-llm": z.ZodOptional<z.ZodBoolean>;
15
+ "no-cache": z.ZodOptional<z.ZodBoolean>;
16
+ nonInteractive: z.ZodOptional<z.ZodBoolean>;
17
+ userMode: z.ZodOptional<z.ZodEnum<{
18
+ dummy: "dummy";
19
+ login: "login";
20
+ }>>;
21
+ }, z.core.$strip>;
22
+ type LegacyFixtureOptions = z.infer<typeof legacyFixtureOptionsSchema>;
23
+ export type LegacyFixtureSource = z.input<typeof legacyFixtureOptionsSchema>;
24
+ export type LegacyFixtureCommand = "gen" | "fetch" | "explore";
25
+ export type NormalizedLegacyFixtureOptions = Omit<LegacyFixtureOptions, "saveTo" | "useLlm" | "noCache">;
26
+ export declare function normalizeLegacyFixtureOptions(input: LegacyFixtureSource): NormalizedLegacyFixtureOptions;
27
+ export declare function normalizeLegacyFixtureCommandOptions(command: LegacyFixtureCommand, input: LegacyFixtureSource): NormalizedLegacyFixtureOptions;
28
+ export {};
29
+ //# sourceMappingURL=fixture-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-service.d.ts","sourceRoot":"","sources":["../../src/tooling/fixture-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;iBAgB9B,CAAC;AAEH,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACvE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAC/D,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAC/C,oBAAoB,EACpB,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAChC,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,mBAAmB,GACzB,8BAA8B,CAQhC;AAUD,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,mBAAmB,GACzB,8BAA8B,CAoBhC"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ //#region src/tooling/fixture-service.ts
3
+ const legacyFixtureOptionsSchema = z.object({
4
+ _: z.array(z.string()).optional(),
5
+ all: z.boolean().optional(),
6
+ include: z.string().optional(),
7
+ exclude: z.string().optional(),
8
+ count: z.union([z.string(), z.number()]).optional(),
9
+ strategy: z.string().optional(),
10
+ limit: z.union([z.string(), z.number()]).optional(),
11
+ saveTo: z.string().optional(),
12
+ useLlm: z.boolean().optional(),
13
+ noCache: z.boolean().optional(),
14
+ "save-to": z.string().optional(),
15
+ "use-llm": z.boolean().optional(),
16
+ "no-cache": z.boolean().optional(),
17
+ nonInteractive: z.boolean().optional(),
18
+ userMode: z.enum(["login", "dummy"]).optional()
19
+ });
20
+ function normalizeLegacyFixtureOptions(input) {
21
+ const { saveTo, useLlm, noCache, ...options } = legacyFixtureOptionsSchema.parse(input);
22
+ return {
23
+ ...options,
24
+ "save-to": saveTo ?? options["save-to"],
25
+ "use-llm": useLlm ?? options["use-llm"],
26
+ "no-cache": noCache ?? options["no-cache"]
27
+ };
28
+ }
29
+ function hasLegacyFixtureSelector(command, input) {
30
+ const hasInclude = input.include !== void 0 && input.include.trim().length > 0;
31
+ return command === "explore" ? hasInclude : input.all === true || hasInclude;
32
+ }
33
+ function normalizeLegacyFixtureCommandOptions(command, input) {
34
+ const normalized = normalizeLegacyFixtureOptions(input);
35
+ if (normalized.nonInteractive !== true) return normalized;
36
+ if (!hasLegacyFixtureSelector(command, normalized)) throw Object.assign(/* @__PURE__ */ new Error(`Missing fixture ${command} selector.`), {
37
+ code: "MISSING_ARGUMENT",
38
+ exitCode: 2
39
+ });
40
+ if (command !== "gen") return normalized;
41
+ return {
42
+ ...normalized,
43
+ count: normalized.count || 5,
44
+ "save-to": normalized["save-to"] || "db",
45
+ "use-llm": normalized["use-llm"] ?? false,
46
+ "no-cache": normalized["no-cache"] ?? false,
47
+ userMode: normalized.userMode ?? "dummy"
48
+ };
49
+ }
50
+ //#endregion
51
+ export { normalizeLegacyFixtureCommandOptions, normalizeLegacyFixtureOptions };
52
+
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1zZXJ2aWNlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29saW5nL2ZpeHR1cmUtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBsZWdhY3lGaXh0dXJlT3B0aW9uc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgXzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBhbGw6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGluY2x1ZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXhjbHVkZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjb3VudDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLm9wdGlvbmFsKCksXG4gIHN0cmF0ZWd5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGxpbWl0OiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkub3B0aW9uYWwoKSxcbiAgc2F2ZVRvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZUxsbTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgbm9DYWNoZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgXCJzYXZlLXRvXCI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgXCJ1c2UtbGxtXCI6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIFwibm8tY2FjaGVcIjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgbm9uSW50ZXJhY3RpdmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIHVzZXJNb2RlOiB6LmVudW0oW1wibG9naW5cIiwgXCJkdW1teVwiXSkub3B0aW9uYWwoKSxcbn0pO1xuXG50eXBlIExlZ2FjeUZpeHR1cmVPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgbGVnYWN5Rml4dHVyZU9wdGlvbnNTY2hlbWE+O1xuZXhwb3J0IHR5cGUgTGVnYWN5Rml4dHVyZVNvdXJjZSA9IHouaW5wdXQ8dHlwZW9mIGxlZ2FjeUZpeHR1cmVPcHRpb25zU2NoZW1hPjtcbmV4cG9ydCB0eXBlIExlZ2FjeUZpeHR1cmVDb21tYW5kID0gXCJnZW5cIiB8IFwiZmV0Y2hcIiB8IFwiZXhwbG9yZVwiO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZExlZ2FjeUZpeHR1cmVPcHRpb25zID0gT21pdDxcbiAgTGVnYWN5Rml4dHVyZU9wdGlvbnMsXG4gIFwic2F2ZVRvXCIgfCBcInVzZUxsbVwiIHwgXCJub0NhY2hlXCJcbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMZWdhY3lGaXh0dXJlT3B0aW9ucyhcbiAgaW5wdXQ6IExlZ2FjeUZpeHR1cmVTb3VyY2UsXG4pOiBOb3JtYWxpemVkTGVnYWN5Rml4dHVyZU9wdGlvbnMge1xuICBjb25zdCB7IHNhdmVUbywgdXNlTGxtLCBub0NhY2hlLCAuLi5vcHRpb25zIH0gPSBsZWdhY3lGaXh0dXJlT3B0aW9uc1NjaGVtYS5wYXJzZShpbnB1dCk7XG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBcInNhdmUtdG9cIjogc2F2ZVRvID8/IG9wdGlvbnNbXCJzYXZlLXRvXCJdLFxuICAgIFwidXNlLWxsbVwiOiB1c2VMbG0gPz8gb3B0aW9uc1tcInVzZS1sbG1cIl0sXG4gICAgXCJuby1jYWNoZVwiOiBub0NhY2hlID8/IG9wdGlvbnNbXCJuby1jYWNoZVwiXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGFzTGVnYWN5Rml4dHVyZVNlbGVjdG9yKFxuICBjb21tYW5kOiBMZWdhY3lGaXh0dXJlQ29tbWFuZCxcbiAgaW5wdXQ6IE5vcm1hbGl6ZWRMZWdhY3lGaXh0dXJlT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBoYXNJbmNsdWRlID0gaW5wdXQuaW5jbHVkZSAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmluY2x1ZGUudHJpbSgpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBjb21tYW5kID09PSBcImV4cGxvcmVcIiA/IGhhc0luY2x1ZGUgOiBpbnB1dC5hbGwgPT09IHRydWUgfHwgaGFzSW5jbHVkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUxlZ2FjeUZpeHR1cmVDb21tYW5kT3B0aW9ucyhcbiAgY29tbWFuZDogTGVnYWN5Rml4dHVyZUNvbW1hbmQsXG4gIGlucHV0OiBMZWdhY3lGaXh0dXJlU291cmNlLFxuKTogTm9ybWFsaXplZExlZ2FjeUZpeHR1cmVPcHRpb25zIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUxlZ2FjeUZpeHR1cmVPcHRpb25zKGlucHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWQubm9uSW50ZXJhY3RpdmUgIT09IHRydWUpIHJldHVybiBub3JtYWxpemVkO1xuXG4gIGlmICghaGFzTGVnYWN5Rml4dHVyZVNlbGVjdG9yKGNvbW1hbmQsIG5vcm1hbGl6ZWQpKSB7XG4gICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYE1pc3NpbmcgZml4dHVyZSAke2NvbW1hbmR9IHNlbGVjdG9yLmApLCB7XG4gICAgICBjb2RlOiBcIk1JU1NJTkdfQVJHVU1FTlRcIixcbiAgICAgIGV4aXRDb2RlOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbW1hbmQgIT09IFwiZ2VuXCIpIHJldHVybiBub3JtYWxpemVkO1xuICByZXR1cm4ge1xuICAgIC4uLm5vcm1hbGl6ZWQsXG4gICAgY291bnQ6IG5vcm1hbGl6ZWQuY291bnQgfHwgNSxcbiAgICBcInNhdmUtdG9cIjogbm9ybWFsaXplZFtcInNhdmUtdG9cIl0gfHwgXCJkYlwiLFxuICAgIFwidXNlLWxsbVwiOiBub3JtYWxpemVkW1widXNlLWxsbVwiXSA/PyBmYWxzZSxcbiAgICBcIm5vLWNhY2hlXCI6IG5vcm1hbGl6ZWRbXCJuby1jYWNoZVwiXSA/PyBmYWxzZSxcbiAgICB1c2VyTW9kZTogbm9ybWFsaXplZC51c2VyTW9kZSA/PyBcImR1bW15XCIsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBTSw2QkFBNkIsRUFBRSxPQUFPO0NBQzFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO0NBQ2hDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztDQUNsRCxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUM5QixPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Q0FDbEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDNUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDN0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDL0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDaEMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDakMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUMsU0FBUztDQUNyQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2hELENBQUM7QUFVRCxTQUFnQiw4QkFDZCxPQUNnQztDQUNoQyxNQUFNLEVBQUUsUUFBUSxRQUFRLFNBQVMsR0FBRyxZQUFZLDJCQUEyQixNQUFNLEtBQUs7Q0FDdEYsT0FBTztFQUNMLEdBQUc7RUFDSCxXQUFXLFVBQVUsUUFBUTtFQUM3QixXQUFXLFVBQVUsUUFBUTtFQUM3QixZQUFZLFdBQVcsUUFBUTtDQUNqQztBQUNGO0FBRUEsU0FBUyx5QkFDUCxTQUNBLE9BQ1M7Q0FDVCxNQUFNLGFBQWEsTUFBTSxZQUFZLFVBQWEsTUFBTSxRQUFRLEtBQUssQ0FBQyxDQUFDLFNBQVM7Q0FDaEYsT0FBTyxZQUFZLFlBQVksYUFBYSxNQUFNLFFBQVEsUUFBUTtBQUNwRTtBQUVBLFNBQWdCLHFDQUNkLFNBQ0EsT0FDZ0M7Q0FDaEMsTUFBTSxhQUFhLDhCQUE4QixLQUFLO0NBQ3RELElBQUksV0FBVyxtQkFBbUIsTUFBTSxPQUFPO0NBRS9DLElBQUksQ0FBQyx5QkFBeUIsU0FBUyxVQUFVLEdBQy9DLE1BQU0sT0FBTyx1QkFBTyxJQUFJLE1BQU0sbUJBQW1CLFFBQVEsV0FBVyxHQUFHO0VBQ3JFLE1BQU07RUFDTixVQUFVO0NBQ1osQ0FBQztDQUdILElBQUksWUFBWSxPQUFPLE9BQU87Q0FDOUIsT0FBTztFQUNMLEdBQUc7RUFDSCxPQUFPLFdBQVcsU0FBUztFQUMzQixXQUFXLFdBQVcsY0FBYztFQUNwQyxXQUFXLFdBQVcsY0FBYztFQUNwQyxZQUFZLFdBQVcsZUFBZTtFQUN0QyxVQUFVLFdBQVcsWUFBWTtDQUNuQztBQUNGIn0=
@@ -0,0 +1,2 @@
1
+ export { tooling } from "./cli-tooling";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tooling/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { tooling } from "./cli-tooling.js";
2
+ export { tooling };
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export interface TestRunRequest {
3
+ files?: string[];
4
+ pattern?: string;
5
+ traces?: boolean;
6
+ }
7
+ interface TestRunResult {
8
+ ok: boolean;
9
+ summary: {
10
+ total: number;
11
+ passed: number;
12
+ failed: number;
13
+ skipped: number;
14
+ durationMs: number;
15
+ };
16
+ results: z.infer<typeof jsonValueSchema>[];
17
+ }
18
+ export interface TestRunClient {
19
+ status(): Promise<JsonObject>;
20
+ run(input: TestRunRequest): Promise<TestRunResult>;
21
+ }
22
+ declare const jsonValueSchema: z.ZodJSONSchema;
23
+ declare const jsonObjectSchema: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
24
+ type JsonObject = z.infer<typeof jsonObjectSchema>;
25
+ export declare function createDefaultTestRunClient(projectRoot?: string): TestRunClient;
26
+ export {};
27
+ //# sourceMappingURL=test-run-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-client.d.ts","sourceRoot":"","sources":["../../src/tooling/test-run-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACpD;AAsBD,QAAA,MAAM,eAAe,iBAAW,CAAC;AACjC,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AA2InD,wBAAgB,0BAA0B,CAAC,WAAW,GAAE,MAA0B,GAAG,aAAa,CAMjG"}
@@ -0,0 +1,120 @@
1
+ import { findApiRootPath, init_utils } from "../utils/utils.js";
2
+ import { init_config, loadConfig } from "../api/config.js";
3
+ import { z } from "zod";
4
+ //#region src/tooling/test-run-client.ts
5
+ init_config();
6
+ init_utils();
7
+ var TestRunClientError = class extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.code = code;
12
+ this.name = "TestRunClientError";
13
+ }
14
+ };
15
+ const jsonValueSchema = z.json();
16
+ const jsonObjectSchema = z.record(z.string(), jsonValueSchema);
17
+ const configSchema = z.object({
18
+ server: z.object({ listen: z.object({
19
+ host: z.string().optional(),
20
+ port: z.number().optional()
21
+ }).optional() }).optional(),
22
+ test: z.object({ devRunner: z.object({
23
+ enabled: z.boolean().optional(),
24
+ routePrefix: z.string().optional()
25
+ }).optional() }).optional()
26
+ });
27
+ const testRunResultSchema = z.object({
28
+ ok: z.boolean(),
29
+ summary: z.object({
30
+ total: z.number(),
31
+ passed: z.number(),
32
+ failed: z.number(),
33
+ skipped: z.number(),
34
+ durationMs: z.number()
35
+ }),
36
+ results: z.array(jsonValueSchema)
37
+ });
38
+ /**
39
+ * sonamu.config를 소스(`src/sonamu.config.ts`)에서 읽도록 강제해 설정을 불러옵니다.
40
+ *
41
+ * loadConfig는 VITEST/HOT 환경변수로 dist/소스 설정을 고르므로, dist 빌드가 없는
42
+ * 일반 개발 셸에서도 소스 설정을 읽도록 VITEST를 잠시 켜고 원래 값을 그대로 복원합니다.
43
+ */
44
+ async function loadSourceConfig(dependencies) {
45
+ const previousVitest = process.env.VITEST;
46
+ process.env.VITEST = "true";
47
+ try {
48
+ return await dependencies.loadConfig(dependencies.projectRoot);
49
+ } finally {
50
+ if (previousVitest === void 0) delete process.env.VITEST;
51
+ else process.env.VITEST = previousVitest;
52
+ }
53
+ }
54
+ async function resolveBaseUrl(dependencies) {
55
+ let config;
56
+ try {
57
+ config = await loadSourceConfig(dependencies);
58
+ } catch {
59
+ throw new TestRunClientError("TEST_RUN_CONFIG_ERROR", "sonamu.config를 불러올 수 없습니다. 프로젝트 설정을 확인하세요.");
60
+ }
61
+ const parsedConfig = configSchema.parse(config);
62
+ const listen = parsedConfig.server?.listen;
63
+ const devRunner = parsedConfig.test?.devRunner;
64
+ if (devRunner?.enabled !== true) throw new TestRunClientError("TEST_RUN_CONFIG_ERROR", "sonamu.config의 test.devRunner.enabled를 true로 설정해야 합니다.");
65
+ const configuredHost = listen?.host ?? "localhost";
66
+ const host = ["0.0.0.0", "::"].includes(configuredHost) ? "127.0.0.1" : configuredHost;
67
+ const port = listen?.port ?? 3e3;
68
+ const routePrefix = devRunner.routePrefix ?? "/__test__";
69
+ return `http://${host}:${port}${(routePrefix.startsWith("/") ? routePrefix : `/${routePrefix}`).replace(/\/$/, "")}`;
70
+ }
71
+ async function requestJson(dependencies, url, init) {
72
+ let response;
73
+ try {
74
+ response = await dependencies.fetch(url, init);
75
+ } catch {
76
+ throw new TestRunClientError("TEST_RUN_NETWORK_ERROR", "로컬 DevRunner에 연결할 수 없습니다. sonamu dev 실행 상태를 확인하세요.");
77
+ }
78
+ if (!response.ok) throw new TestRunClientError("TEST_RUN_HTTP_ERROR", `DevRunner 요청이 HTTP ${response.status} 상태로 실패했습니다.`);
79
+ const object = jsonObjectSchema.safeParse(await response.json());
80
+ if (!object.success) throw new TestRunClientError("TEST_RUN_HTTP_ERROR", "DevRunner 응답이 JSON 객체가 아닙니다.");
81
+ return object.data;
82
+ }
83
+ function parseResult(value) {
84
+ const result = testRunResultSchema.safeParse(value);
85
+ if (!result.success) throw new TestRunClientError("TEST_RUN_HTTP_ERROR", "DevRunner 테스트 결과의 구조가 올바르지 않습니다.");
86
+ return result.data;
87
+ }
88
+ function createTestRunClient(dependencies) {
89
+ return {
90
+ async status() {
91
+ return requestJson(dependencies, `${await resolveBaseUrl(dependencies)}/status`);
92
+ },
93
+ async run(input) {
94
+ const payload = {};
95
+ if (input.files !== void 0) payload.files = input.files;
96
+ if (input.pattern !== void 0) payload.pattern = input.pattern;
97
+ const result = parseResult(await requestJson(dependencies, `${await resolveBaseUrl(dependencies)}/run`, {
98
+ method: "POST",
99
+ headers: { "Content-Type": "application/json" },
100
+ body: JSON.stringify(payload)
101
+ }));
102
+ if (!result.ok) throw Object.assign(new TestRunClientError("TEST_RUN_FAILED", "테스트 실행이 실패했습니다."), {
103
+ exitCode: 1,
104
+ result
105
+ });
106
+ return result;
107
+ }
108
+ };
109
+ }
110
+ function createDefaultTestRunClient(projectRoot = findApiRootPath()) {
111
+ return createTestRunClient({
112
+ projectRoot,
113
+ loadConfig,
114
+ fetch: globalThis.fetch
115
+ });
116
+ }
117
+ //#endregion
118
+ export { createDefaultTestRunClient };
119
+
120
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tY2xpZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29saW5nL3Rlc3QtcnVuLWNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5SZXF1ZXN0IHtcbiAgZmlsZXM/OiBzdHJpbmdbXTtcbiAgcGF0dGVybj86IHN0cmluZztcbiAgdHJhY2VzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5SZXN1bHQge1xuICBvazogYm9vbGVhbjtcbiAgc3VtbWFyeToge1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgcGFzc2VkOiBudW1iZXI7XG4gICAgZmFpbGVkOiBudW1iZXI7XG4gICAgc2tpcHBlZDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfTtcbiAgcmVzdWx0czogei5pbmZlcjx0eXBlb2YganNvblZhbHVlU2NoZW1hPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5DbGllbnQge1xuICBzdGF0dXMoKTogUHJvbWlzZTxKc29uT2JqZWN0PjtcbiAgcnVuKGlucHV0OiBUZXN0UnVuUmVxdWVzdCk6IFByb21pc2U8VGVzdFJ1blJlc3VsdD47XG59XG5cbmludGVyZmFjZSBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzIHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgbG9hZENvbmZpZyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+O1xuICBmZXRjaDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbmNsYXNzIFRlc3RSdW5DbGllbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY29kZTpcbiAgICAgIHwgXCJURVNUX1JVTl9DT05GSUdfRVJST1JcIlxuICAgICAgfCBcIlRFU1RfUlVOX0ZBSUxFRFwiXG4gICAgICB8IFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiXG4gICAgICB8IFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJUZXN0UnVuQ2xpZW50RXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBqc29uVmFsdWVTY2hlbWEgPSB6Lmpzb24oKTtcbmNvbnN0IGpzb25PYmplY3RTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEpO1xudHlwZSBKc29uT2JqZWN0ID0gei5pbmZlcjx0eXBlb2YganNvbk9iamVjdFNjaGVtYT47XG5jb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlcnZlcjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgbGlzdGVuOiB6Lm9iamVjdCh7IGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSwgcG9ydDogei5udW1iZXIoKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbiAgdGVzdDogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZGV2UnVubmVyOiB6XG4gICAgICAgIC5vYmplY3QoeyBlbmFibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLCByb3V0ZVByZWZpeDogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbmNvbnN0IHRlc3RSdW5SZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG9rOiB6LmJvb2xlYW4oKSxcbiAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgIHRvdGFsOiB6Lm51bWJlcigpLFxuICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICBmYWlsZWQ6IHoubnVtYmVyKCksXG4gICAgc2tpcHBlZDogei5udW1iZXIoKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLFxuICB9KSxcbiAgcmVzdWx0czogei5hcnJheShqc29uVmFsdWVTY2hlbWEpLFxufSk7XG5cbi8qKlxuICogc29uYW11LmNvbmZpZ+ulvCDshozsiqQoYHNyYy9zb25hbXUuY29uZmlnLnRzYCnsl5DshJwg7J2964+E66GdIOqwleygnO2VtCDshKTsoJXsnYQg67aI65+s7Ji164uI64ukLlxuICpcbiAqIGxvYWRDb25maWfripQgVklURVNUL0hPVCDtmZjqsr3rs4DsiJjroZwgZGlzdC/shozsiqQg7ISk7KCV7J2EIOqzoOultOuvgOuhnCwgZGlzdCDruYzrk5zqsIAg7JeG64qUXG4gKiDsnbzrsJgg6rCc67CcIOyFuOyXkOyEnOuPhCDshozsiqQg7ISk7KCV7J2EIOydveuPhOuhnSBWSVRFU1Trpbwg7J6g7IucIOy8nOqzoCDsm5Drnpgg6rCS7J2EIOq3uOuMgOuhnCDrs7Xsm5Dtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgY29uc3QgcHJldmlvdXNWaXRlc3QgPSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gIHByb2Nlc3MuZW52LlZJVEVTVCA9IFwidHJ1ZVwiO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMubG9hZENvbmZpZyhkZXBlbmRlbmNpZXMucHJvamVjdFJvb3QpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2aW91c1ZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2aW91c1ZpdGVzdDtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGNvbmZpZzogb2JqZWN0O1xuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fQ09ORklHX0VSUk9SXCIsXG4gICAgICBcInNvbmFtdS5jb25maWfrpbwg67aI65+s7JisIOyImCDsl4bsirXri4jri6QuIO2UhOuhnOygne2KuCDshKTsoJXsnYQg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkQ29uZmlnID0gY29uZmlnU2NoZW1hLnBhcnNlKGNvbmZpZyk7XG4gIGNvbnN0IGxpc3RlbiA9IHBhcnNlZENvbmZpZy5zZXJ2ZXI/Lmxpc3RlbjtcbiAgY29uc3QgZGV2UnVubmVyID0gcGFyc2VkQ29uZmlnLnRlc3Q/LmRldlJ1bm5lcjtcbiAgaWYgKGRldlJ1bm5lcj8uZW5hYmxlZCAhPT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0NPTkZJR19FUlJPUlwiLFxuICAgICAgXCJzb25hbXUuY29uZmln7J2YIHRlc3QuZGV2UnVubmVyLmVuYWJsZWTrpbwgdHJ1ZeuhnCDshKTsoJXtlbTslbwg7ZWp64uI64ukLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29uZmlndXJlZEhvc3QgPSBsaXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgY29uc3QgaG9zdCA9IFtcIjAuMC4wLjBcIiwgXCI6OlwiXS5pbmNsdWRlcyhjb25maWd1cmVkSG9zdCkgPyBcIjEyNy4wLjAuMVwiIDogY29uZmlndXJlZEhvc3Q7XG4gIGNvbnN0IHBvcnQgPSBsaXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgY29uc3Qgcm91dGVQcmVmaXggPSBkZXZSdW5uZXIucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcbiAgY29uc3QgcHJlZml4ID0gKHJvdXRlUHJlZml4LnN0YXJ0c1dpdGgoXCIvXCIpID8gcm91dGVQcmVmaXggOiBgLyR7cm91dGVQcmVmaXh9YCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICByZXR1cm4gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0ke3ByZWZpeH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0SnNvbihcbiAgZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzLFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdD86IFJlcXVlc3RJbml0LFxuKTogUHJvbWlzZTxKc29uT2JqZWN0PiB7XG4gIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2godXJsLCBpbml0KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgICAgXCLroZzsu6wgRGV2UnVubmVy7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV2IOyLpO2WiSDsg4Htg5zrpbwg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIGBEZXZSdW5uZXIg7JqU7LKt7J20IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG9iamVjdCA9IGpzb25PYmplY3RTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gIGlmICghb2JqZWN0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiLCBcIkRldlJ1bm5lciDsnZHri7XsnbQgSlNPTiDqsJ3ssrTqsIAg7JWE64uZ64uI64ukLlwiKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVzdWx0KHZhbHVlOiBKc29uT2JqZWN0KTogVGVzdFJ1blJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHRlc3RSdW5SZXN1bHRTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIFwiRGV2UnVubmVyIO2FjOyKpO2KuCDqsrDqs7zsnZgg6rWs7KGw6rCAIOyYrOuwlOultOyngCDslYrsirXri4jri6QuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW5DbGllbnQoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgc3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHJlcXVlc3RKc29uKGRlcGVuZGVuY2llcywgYCR7YXdhaXQgcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzKX0vc3RhdHVzYCk7XG4gICAgfSxcbiAgICBhc3luYyBydW4oaW5wdXQpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFRlc3RSdW5SZXF1ZXN0ID0ge307XG4gICAgICBpZiAoaW5wdXQuZmlsZXMgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5maWxlcyA9IGlucHV0LmZpbGVzO1xuICAgICAgaWYgKGlucHV0LnBhdHRlcm4gIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5wYXR0ZXJuID0gaW5wdXQucGF0dGVybjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlUmVzdWx0KFxuICAgICAgICBhd2FpdCByZXF1ZXN0SnNvbihkZXBlbmRlbmNpZXMsIGAke2F3YWl0IHJlc29sdmVCYXNlVXJsKGRlcGVuZGVuY2llcyl9L3J1bmAsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fRkFJTEVEXCIsIFwi7YWM7Iqk7Yq4IOyLpO2WieydtCDsi6TtjKjtlojsirXri4jri6QuXCIpLFxuICAgICAgICAgIHsgZXhpdENvZGU6IDEsIHJlc3VsdCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQocHJvamVjdFJvb3Q6IHN0cmluZyA9IGZpbmRBcGlSb290UGF0aCgpKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiBjcmVhdGVUZXN0UnVuQ2xpZW50KHtcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBsb2FkQ29uZmlnLFxuICAgIGZldGNoOiBnbG9iYWxUaGlzLmZldGNoLFxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztZQUUwQztXQUNNO0FBK0JoRCxJQUFNLHFCQUFOLGNBQWlDLE1BQU07Q0FFMUI7Q0FEWCxZQUNFLE1BS0Es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
@@ -0,0 +1,48 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ //#region tsdown.api.config.ts
4
+ const srcRoot = path.resolve(process.cwd(), "src");
5
+ const ignoredSuffixes = [
6
+ ".test.ts",
7
+ ".test-hold.ts",
8
+ ".ignore.ts",
9
+ ".d.ts"
10
+ ];
11
+ const ignoredDirectories = /* @__PURE__ */ new Set([
12
+ "__mocks__",
13
+ "_templates",
14
+ "wasted_src"
15
+ ]);
16
+ async function collectEntries(directory) {
17
+ const entries = {};
18
+ for (const entry of await readdir(directory)) {
19
+ if (ignoredDirectories.has(entry)) continue;
20
+ const absolutePath = path.join(directory, entry);
21
+ if ((await stat(absolutePath)).isDirectory()) {
22
+ Object.assign(entries, await collectEntries(absolutePath));
23
+ continue;
24
+ }
25
+ if (!absolutePath.endsWith(".ts") || ignoredSuffixes.some((suffix) => absolutePath.endsWith(suffix))) continue;
26
+ const entryName = path.relative(srcRoot, absolutePath).replace(/\.ts$/, "").split(path.sep).join("/");
27
+ entries[entryName] = absolutePath;
28
+ }
29
+ return entries;
30
+ }
31
+ var tsdown_api_config_default = {
32
+ clean: true,
33
+ deps: { neverBundle: [/^sonamu(?:\/.*)?$/] },
34
+ dts: false,
35
+ entry: await collectEntries(srcRoot),
36
+ fixedExtension: false,
37
+ format: "esm",
38
+ outDir: path.resolve(process.cwd(), "dist"),
39
+ platform: "node",
40
+ sourcemap: "inline",
41
+ target: "esnext",
42
+ treeshake: false,
43
+ unbundle: true
44
+ };
45
+ //#endregion
46
+ export { tsdown_api_config_default as default };
47
+
48
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb3duLmFwaS5jb25maWcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vdHNkb3duLmFwaS5jb25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZGRpciwgc3RhdCB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmNvbnN0IHNyY1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCJzcmNcIik7XG5jb25zdCBpZ25vcmVkU3VmZml4ZXMgPSBbXCIudGVzdC50c1wiLCBcIi50ZXN0LWhvbGQudHNcIiwgXCIuaWdub3JlLnRzXCIsIFwiLmQudHNcIl07XG5jb25zdCBpZ25vcmVkRGlyZWN0b3JpZXMgPSBuZXcgU2V0KFtcIl9fbW9ja3NfX1wiLCBcIl90ZW1wbGF0ZXNcIiwgXCJ3YXN0ZWRfc3JjXCJdKTtcbmludGVyZmFjZSBCdWlsZEVudHJpZXMge1xuICBbZW50cnlOYW1lOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RFbnRyaWVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxCdWlsZEVudHJpZXM+IHtcbiAgY29uc3QgZW50cmllczogQnVpbGRFbnRyaWVzID0ge307XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSkpIHtcbiAgICBpZiAoaWdub3JlZERpcmVjdG9yaWVzLmhhcyhlbnRyeSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5KTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIGF3YWl0IGNvbGxlY3RFbnRyaWVzKGFic29sdXRlUGF0aCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWFic29sdXRlUGF0aC5lbmRzV2l0aChcIi50c1wiKSB8fFxuICAgICAgaWdub3JlZFN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT4gYWJzb2x1dGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHNyY1Jvb3QsIGFic29sdXRlUGF0aCk7XG4gICAgY29uc3QgZW50cnlOYW1lID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpLnNwbGl0KHBhdGguc2VwKS5qb2luKFwiL1wiKTtcbiAgICBlbnRyaWVzW2VudHJ5TmFtZV0gPSBhYnNvbHV0ZVBhdGg7XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBjbGVhbjogdHJ1ZSxcbiAgZGVwczoge1xuICAgIG5ldmVyQnVuZGxlOiBbL15zb25hbXUoPzpcXC8uKik/JC9dLFxuICB9LFxuICBkdHM6IGZhbHNlLFxuICBlbnRyeTogYXdhaXQgY29sbGVjdEVudHJpZXMoc3JjUm9vdCksXG4gIGZpeGVkRXh0ZW5zaW9uOiBmYWxzZSxcbiAgZm9ybWF0OiBcImVzbVwiLFxuICBvdXREaXI6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcImRpc3RcIiksXG4gIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgc291cmNlbWFwOiBcImlubGluZVwiLFxuICB0YXJnZXQ6IFwiZXNuZXh0XCIsXG4gIHRyZWVzaGFrZTogZmFsc2UsXG4gIHVuYnVuZGxlOiB0cnVlLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBTSxVQUFVLEtBQUssUUFBUSxRQUFRLElBQUksR0FBRyxLQUFLO0FBQ2pELE1BQU0sa0JBQWtCO0NBQUM7Q0FBWTtDQUFpQjtDQUFjO0FBQU87QUFDM0UsTUFBTSxxQ0FBcUIsSUFBSSxJQUFJO0NBQUM7Q0FBYTtDQUFjO0FBQVksQ0FBQztBQUs1RSxlQUFlLGVBQWUsV0FBMEM7Q0FDdEUsTUFBTSxVQUF3QixDQUFDO0NBRS9CLEtBQUssTUFBTSxTQUFTLE1BQU0sUUFBUSxTQUFTLEdBQUc7RUFDNUMsSUFBSSxtQkFBbUIsSUFBSSxLQUFLLEdBQzlCO0VBR0YsTUFBTSxlQUFlLEtBQUssS0FBSyxXQUFXLEtBQUs7RUFHL0MsS0FBSSxNQUZnQixLQUFLLFlBQVksRUFFakMsQ0FBTSxZQUFZLEdBQUc7R0FDdkIsT0FBTyxPQUFPLFNBQVMsTUFBTSxlQUFlLFlBQVksQ0FBQztHQUN6RDtFQUNGO0VBRUEsSUFDRSxDQUFDLGFBQWEsU0FBUyxLQUFLLEtBQzVCLGdCQUFnQixNQUFNLFdBQVcsYUFBYSxTQUFTLE1BQU0sQ0FBQyxHQUU5RDtFQUlGLE1BQU0sWUFEZSxLQUFLLFNBQVMsU0FBUyxZQUMxQixDQUFBLENBQWEsUUFBUSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7RUFDNUUsUUFBUSxhQUFhO0NBQ3ZCO0NBRUEsT0FBTztBQUNUO0FBRUEsSUFBQSw0QkFBZTtDQUNiLE9BQU87Q0FDUCxNQUFNLEVBQ0osYUFBYSxDQUFDLG1CQUFtQixFQUNuQztDQUNBLEtBQUs7Q0FDTCxPQUFPLE1BQU0sZUFBZSxPQUFPO0NBQ25DLGdCQUFnQjtDQUNoQixRQUFRO0NBQ1IsUUFBUSxLQUFLLFFBQVEsUUFBUSxJQUFJLEdBQUcsTUFBTTtDQUMxQyxVQUFVO0NBQ1YsV0FBVztDQUNYLFFBQVE7Q0FDUixXQUFXO0NBQ1gsVUFBVTtBQUNaIn0=