llm-mock-server 1.0.6 → 1.0.8

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 (251) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/cli.d.ts +3 -0
  3. package/dist/cli/cli.d.ts.map +1 -0
  4. package/dist/cli/cli.js +103 -0
  5. package/dist/cli/cli.js.map +1 -0
  6. package/dist/cli/validators.d.ts +7 -0
  7. package/dist/cli/validators.d.ts.map +1 -0
  8. package/dist/cli/validators.js +53 -0
  9. package/dist/cli/validators.js.map +1 -0
  10. package/dist/formats/anthropic/index.d.ts +1 -1
  11. package/dist/formats/anthropic/index.d.ts.map +1 -1
  12. package/dist/formats/anthropic/index.js +1 -1
  13. package/dist/formats/anthropic/index.js.map +1 -1
  14. package/dist/formats/anthropic/parse.d.ts +2 -2
  15. package/dist/formats/anthropic/parse.d.ts.map +1 -1
  16. package/dist/formats/anthropic/parse.js +4 -2
  17. package/dist/formats/anthropic/parse.js.map +1 -1
  18. package/dist/formats/anthropic/schema.d.ts +1 -1
  19. package/dist/formats/anthropic/schema.d.ts.map +1 -1
  20. package/dist/formats/anthropic/schema.js +9 -4
  21. package/dist/formats/anthropic/schema.js.map +1 -1
  22. package/dist/formats/anthropic/serialize.d.ts +2 -2
  23. package/dist/formats/anthropic/serialize.d.ts.map +1 -1
  24. package/dist/formats/anthropic/serialize.js +76 -19
  25. package/dist/formats/anthropic/serialize.js.map +1 -1
  26. package/dist/formats/openai/chat-completions/index.d.ts +3 -0
  27. package/dist/formats/openai/chat-completions/index.d.ts.map +1 -0
  28. package/dist/formats/openai/chat-completions/index.js +13 -0
  29. package/dist/formats/openai/chat-completions/index.js.map +1 -0
  30. package/dist/formats/openai/chat-completions/parse.d.ts +4 -0
  31. package/dist/formats/openai/chat-completions/parse.d.ts.map +1 -0
  32. package/dist/formats/openai/chat-completions/parse.js +33 -0
  33. package/dist/formats/openai/chat-completions/parse.js.map +1 -0
  34. package/dist/formats/openai/chat-completions/schema.d.ts +93 -0
  35. package/dist/formats/openai/chat-completions/schema.d.ts.map +1 -0
  36. package/dist/formats/openai/chat-completions/schema.js +74 -0
  37. package/dist/formats/openai/chat-completions/schema.js.map +1 -0
  38. package/dist/formats/openai/chat-completions/serialize.d.ts +10 -0
  39. package/dist/formats/openai/chat-completions/serialize.d.ts.map +1 -0
  40. package/dist/formats/openai/chat-completions/serialize.js +99 -0
  41. package/dist/formats/openai/chat-completions/serialize.js.map +1 -0
  42. package/dist/formats/openai/responses/index.d.ts +3 -0
  43. package/dist/formats/openai/responses/index.d.ts.map +1 -0
  44. package/dist/formats/openai/responses/index.js +13 -0
  45. package/dist/formats/openai/responses/index.js.map +1 -0
  46. package/dist/formats/openai/responses/parse.d.ts +4 -0
  47. package/dist/formats/openai/responses/parse.d.ts.map +1 -0
  48. package/dist/formats/openai/responses/parse.js +51 -0
  49. package/dist/formats/openai/responses/parse.js.map +1 -0
  50. package/dist/formats/openai/responses/schema.d.ts +103 -0
  51. package/dist/formats/openai/responses/schema.d.ts.map +1 -0
  52. package/dist/formats/openai/responses/schema.js +71 -0
  53. package/dist/formats/openai/responses/schema.js.map +1 -0
  54. package/dist/formats/openai/responses/serialize.d.ts +10 -0
  55. package/dist/formats/openai/responses/serialize.d.ts.map +1 -0
  56. package/dist/formats/openai/responses/serialize.js +273 -0
  57. package/dist/formats/openai/responses/serialize.js.map +1 -0
  58. package/dist/formats/request-helpers.d.ts +1 -1
  59. package/dist/formats/request-helpers.d.ts.map +1 -1
  60. package/dist/formats/request-helpers.js.map +1 -1
  61. package/dist/formats/serialize-helpers.d.ts +1 -1
  62. package/dist/formats/serialize-helpers.d.ts.map +1 -1
  63. package/dist/formats/serialize-helpers.js +6 -3
  64. package/dist/formats/serialize-helpers.js.map +1 -1
  65. package/dist/formats/types.d.ts +2 -1
  66. package/dist/formats/types.d.ts.map +1 -1
  67. package/dist/history.d.ts +6 -2
  68. package/dist/history.d.ts.map +1 -1
  69. package/dist/history.js +2 -0
  70. package/dist/history.js.map +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/loader.d.ts +1 -1
  74. package/dist/loader.d.ts.map +1 -1
  75. package/dist/loader.js +26 -9
  76. package/dist/loader.js.map +1 -1
  77. package/dist/logger.d.ts.map +1 -1
  78. package/dist/logger.js +12 -4
  79. package/dist/logger.js.map +1 -1
  80. package/dist/mock-server.d.ts +44 -48
  81. package/dist/mock-server.d.ts.map +1 -1
  82. package/dist/mock-server.js +37 -85
  83. package/dist/mock-server.js.map +1 -1
  84. package/dist/route-handler.d.ts +1 -1
  85. package/dist/route-handler.d.ts.map +1 -1
  86. package/dist/route-handler.js +19 -7
  87. package/dist/route-handler.js.map +1 -1
  88. package/dist/rule-builder.d.ts +21 -0
  89. package/dist/rule-builder.d.ts.map +1 -0
  90. package/dist/rule-builder.js +58 -0
  91. package/dist/rule-builder.js.map +1 -0
  92. package/dist/rule-engine.d.ts +3 -1
  93. package/dist/rule-engine.d.ts.map +1 -1
  94. package/dist/rule-engine.js +7 -2
  95. package/dist/rule-engine.js.map +1 -1
  96. package/dist/sse-writer.d.ts +1 -1
  97. package/dist/sse-writer.d.ts.map +1 -1
  98. package/dist/types/reply.d.ts +51 -8
  99. package/dist/types/reply.d.ts.map +1 -1
  100. package/dist/types/request.d.ts +21 -6
  101. package/dist/types/request.d.ts.map +1 -1
  102. package/dist/types/rule.d.ts +65 -7
  103. package/dist/types/rule.d.ts.map +1 -1
  104. package/dist/types.d.ts +3 -3
  105. package/dist/types.d.ts.map +1 -1
  106. package/package.json +15 -9
  107. package/.claude/skills/desloppify/SKILL.md +0 -308
  108. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000801.json +0 -242
  109. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000905.json +0 -248
  110. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000917.json +0 -248
  111. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000950.json +0 -311
  112. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/claude_launch_prompt.md +0 -17
  113. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.json +0 -255
  114. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.template.json +0 -22
  115. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/reviewer_instructions.md +0 -20
  116. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/session.json +0 -20
  117. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050000.json +0 -286
  118. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050028.json +0 -303
  119. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/claude_launch_prompt.md +0 -17
  120. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.json +0 -297
  121. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.template.json +0 -22
  122. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/reviewer_instructions.md +0 -20
  123. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/session.json +0 -20
  124. package/.desloppify/query.json +0 -1312
  125. package/.desloppify/review_packet_blind.json +0 -1249
  126. package/.desloppify/review_packets/holistic_packet_20260315_000339.json +0 -1471
  127. package/.desloppify/review_packets/holistic_packet_20260315_045546.json +0 -1480
  128. package/.desloppify/review_packets/holistic_packet_20260315_185401.json +0 -1407
  129. package/.desloppify/review_packets/holistic_packet_20260315_185613.json +0 -1407
  130. package/.desloppify/state-typescript.json +0 -8438
  131. package/.desloppify/state-typescript.json.bak +0 -8432
  132. package/.desloppify/subagents/runs/20260315_185401/logs/batch-1.log +0 -384
  133. package/.desloppify/subagents/runs/20260315_185401/logs/batch-10.log +0 -484
  134. package/.desloppify/subagents/runs/20260315_185401/logs/batch-2.log +0 -408
  135. package/.desloppify/subagents/runs/20260315_185401/logs/batch-3.log +0 -416
  136. package/.desloppify/subagents/runs/20260315_185401/logs/batch-4.log +0 -360
  137. package/.desloppify/subagents/runs/20260315_185401/logs/batch-5.log +0 -360
  138. package/.desloppify/subagents/runs/20260315_185401/logs/batch-6.log +0 -364
  139. package/.desloppify/subagents/runs/20260315_185401/logs/batch-7.log +0 -428
  140. package/.desloppify/subagents/runs/20260315_185401/logs/batch-8.log +0 -388
  141. package/.desloppify/subagents/runs/20260315_185401/logs/batch-9.log +0 -500
  142. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-1.md +0 -83
  143. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-10.md +0 -108
  144. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-2.md +0 -89
  145. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-3.md +0 -91
  146. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-4.md +0 -77
  147. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-5.md +0 -77
  148. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-6.md +0 -78
  149. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-7.md +0 -94
  150. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-8.md +0 -84
  151. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-9.md +0 -112
  152. package/.desloppify/subagents/runs/20260315_185401/results/batch-1.raw.txt +0 -0
  153. package/.desloppify/subagents/runs/20260315_185401/results/batch-10.raw.txt +0 -0
  154. package/.desloppify/subagents/runs/20260315_185401/results/batch-2.raw.txt +0 -0
  155. package/.desloppify/subagents/runs/20260315_185401/results/batch-3.raw.txt +0 -0
  156. package/.desloppify/subagents/runs/20260315_185401/results/batch-4.raw.txt +0 -0
  157. package/.desloppify/subagents/runs/20260315_185401/results/batch-5.raw.txt +0 -0
  158. package/.desloppify/subagents/runs/20260315_185401/results/batch-6.raw.txt +0 -0
  159. package/.desloppify/subagents/runs/20260315_185401/results/batch-7.raw.txt +0 -0
  160. package/.desloppify/subagents/runs/20260315_185401/results/batch-8.raw.txt +0 -0
  161. package/.desloppify/subagents/runs/20260315_185401/results/batch-9.raw.txt +0 -0
  162. package/.desloppify/subagents/runs/20260315_185401/run.log +0 -36
  163. package/.desloppify/subagents/runs/20260315_185401/run_summary.json +0 -156
  164. package/.desloppify/subagents/runs/20260315_185613/holistic_findings_merged.json +0 -741
  165. package/.desloppify/subagents/runs/20260315_185613/logs/batch-1.log +0 -579
  166. package/.desloppify/subagents/runs/20260315_185613/logs/batch-10.log +0 -1537
  167. package/.desloppify/subagents/runs/20260315_185613/logs/batch-2.log +0 -829
  168. package/.desloppify/subagents/runs/20260315_185613/logs/batch-3.log +0 -927
  169. package/.desloppify/subagents/runs/20260315_185613/logs/batch-4.log +0 -429
  170. package/.desloppify/subagents/runs/20260315_185613/logs/batch-5.log +0 -276
  171. package/.desloppify/subagents/runs/20260315_185613/logs/batch-6.log +0 -450
  172. package/.desloppify/subagents/runs/20260315_185613/logs/batch-7.log +0 -730
  173. package/.desloppify/subagents/runs/20260315_185613/logs/batch-8.log +0 -698
  174. package/.desloppify/subagents/runs/20260315_185613/logs/batch-9.log +0 -938
  175. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-1.md +0 -83
  176. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-10.md +0 -108
  177. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-2.md +0 -89
  178. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-3.md +0 -91
  179. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-4.md +0 -77
  180. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-5.md +0 -77
  181. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-6.md +0 -78
  182. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-7.md +0 -94
  183. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-8.md +0 -84
  184. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-9.md +0 -112
  185. package/.desloppify/subagents/runs/20260315_185613/results/batch-1.raw.txt +0 -78
  186. package/.desloppify/subagents/runs/20260315_185613/results/batch-10.raw.txt +0 -242
  187. package/.desloppify/subagents/runs/20260315_185613/results/batch-2.raw.txt +0 -102
  188. package/.desloppify/subagents/runs/20260315_185613/results/batch-3.raw.txt +0 -94
  189. package/.desloppify/subagents/runs/20260315_185613/results/batch-4.raw.txt +0 -86
  190. package/.desloppify/subagents/runs/20260315_185613/results/batch-5.raw.txt +0 -1
  191. package/.desloppify/subagents/runs/20260315_185613/results/batch-6.raw.txt +0 -87
  192. package/.desloppify/subagents/runs/20260315_185613/results/batch-7.raw.txt +0 -1
  193. package/.desloppify/subagents/runs/20260315_185613/results/batch-8.raw.txt +0 -107
  194. package/.desloppify/subagents/runs/20260315_185613/results/batch-9.raw.txt +0 -67
  195. package/.desloppify/subagents/runs/20260315_185613/run.log +0 -96
  196. package/.desloppify/subagents/runs/20260315_185613/run_summary.json +0 -156
  197. package/.editorconfig +0 -12
  198. package/.github/dependabot.yml +0 -11
  199. package/.github/workflows/docs.yml +0 -46
  200. package/.github/workflows/test.yml +0 -40
  201. package/.markdownlint.jsonc +0 -11
  202. package/.node-version +0 -1
  203. package/.oxfmtrc.json +0 -9
  204. package/.oxlintrc.json +0 -35
  205. package/docs/ARCHITECTURE.md +0 -125
  206. package/scorecard.png +0 -0
  207. package/src/cli/cli.ts +0 -141
  208. package/src/cli/validators.ts +0 -68
  209. package/src/formats/anthropic/index.ts +0 -14
  210. package/src/formats/anthropic/parse.ts +0 -70
  211. package/src/formats/anthropic/schema.ts +0 -74
  212. package/src/formats/anthropic/serialize.ts +0 -179
  213. package/src/formats/openai/chat-completions/index.ts +0 -14
  214. package/src/formats/openai/chat-completions/parse.ts +0 -47
  215. package/src/formats/openai/chat-completions/schema.ts +0 -92
  216. package/src/formats/openai/chat-completions/serialize.ts +0 -146
  217. package/src/formats/openai/responses/index.ts +0 -14
  218. package/src/formats/openai/responses/parse.ts +0 -73
  219. package/src/formats/openai/responses/schema.ts +0 -86
  220. package/src/formats/openai/responses/serialize.ts +0 -328
  221. package/src/formats/request-helpers.ts +0 -56
  222. package/src/formats/serialize-helpers.ts +0 -43
  223. package/src/formats/types.ts +0 -26
  224. package/src/history.ts +0 -70
  225. package/src/index.ts +0 -46
  226. package/src/loader.ts +0 -246
  227. package/src/logger.ts +0 -70
  228. package/src/mock-server.ts +0 -203
  229. package/src/route-handler.ts +0 -144
  230. package/src/rule-builder.ts +0 -73
  231. package/src/rule-engine.ts +0 -165
  232. package/src/sse-writer.ts +0 -35
  233. package/src/types/reply.ts +0 -92
  234. package/src/types/request.ts +0 -56
  235. package/src/types/rule.ts +0 -125
  236. package/src/types.ts +0 -24
  237. package/test/cli-validators.test.ts +0 -151
  238. package/test/formats/anthropic.test.ts +0 -336
  239. package/test/formats/openai.test.ts +0 -316
  240. package/test/formats/parse-helpers.test.ts +0 -315
  241. package/test/formats/responses.test.ts +0 -380
  242. package/test/helpers/make-req.ts +0 -18
  243. package/test/history.test.ts +0 -361
  244. package/test/loader.test.ts +0 -333
  245. package/test/logger.test.ts +0 -344
  246. package/test/mock-server.test.ts +0 -619
  247. package/test/rule-engine.test.ts +0 -229
  248. package/tsconfig.json +0 -24
  249. package/tsconfig.test.json +0 -11
  250. package/typedoc.json +0 -9
  251. package/vitest.config.ts +0 -18
@@ -1,344 +0,0 @@
1
- import { describe, it, expect, vi, afterEach } from "vitest";
2
- import { Logger, LEVEL_PRIORITY } from "#/logger.js";
3
- import type { LogLevel } from "#/logger.js";
4
-
5
- afterEach(() => {
6
- vi.restoreAllMocks();
7
- });
8
-
9
- describe("LEVEL_PRIORITY", () => {
10
- it("has the expected keys and ascending values", () => {
11
- expect(LEVEL_PRIORITY).toEqual({
12
- none: 0,
13
- error: 1,
14
- warning: 2,
15
- info: 3,
16
- debug: 4,
17
- all: 5,
18
- });
19
- });
20
-
21
- it("is ordered so that each named level is strictly higher than the previous", () => {
22
- expect(LEVEL_PRIORITY.none).toBeLessThan(LEVEL_PRIORITY.error);
23
- expect(LEVEL_PRIORITY.error).toBeLessThan(LEVEL_PRIORITY.warning);
24
- expect(LEVEL_PRIORITY.warning).toBeLessThan(LEVEL_PRIORITY.info);
25
- expect(LEVEL_PRIORITY.info).toBeLessThan(LEVEL_PRIORITY.debug);
26
- expect(LEVEL_PRIORITY.debug).toBeLessThan(LEVEL_PRIORITY.all);
27
- });
28
- });
29
-
30
- describe("Logger", () => {
31
- describe("constructor", () => {
32
- it("defaults to 'info' level when no argument is provided", () => {
33
- const logger = new Logger();
34
- expect(logger.level).toBe("info");
35
- });
36
-
37
- it("accepts an explicit level", () => {
38
- const logger = new Logger("debug");
39
- expect(logger.level).toBe("debug");
40
- });
41
-
42
- it("level property is readonly and accessible", () => {
43
- const logger = new Logger("warning");
44
- expect(logger.level).toBe("warning");
45
- });
46
- });
47
-
48
- describe("error()", () => {
49
- it("logs to console.error when level is 'error'", () => {
50
- const spy = vi.spyOn(console, "error").mockImplementation(() => {});
51
- const logger = new Logger("error");
52
- logger.error("something broke");
53
- expect(spy).toHaveBeenCalledOnce();
54
- expect(spy.mock.calls[0]![0]).toContain("something broke");
55
- });
56
-
57
- it("logs to console.error when level is 'info' (threshold above error)", () => {
58
- const spy = vi.spyOn(console, "error").mockImplementation(() => {});
59
- const logger = new Logger("info");
60
- logger.error("boom");
61
- expect(spy).toHaveBeenCalledOnce();
62
- });
63
-
64
- it("logs to console.error when level is 'all'", () => {
65
- const spy = vi.spyOn(console, "error").mockImplementation(() => {});
66
- const logger = new Logger("all");
67
- logger.error("critical");
68
- expect(spy).toHaveBeenCalledOnce();
69
- });
70
-
71
- it("is silent when level is 'none'", () => {
72
- const spy = vi.spyOn(console, "error").mockImplementation(() => {});
73
- const logger = new Logger("none");
74
- logger.error("should not appear");
75
- expect(spy).not.toHaveBeenCalled();
76
- });
77
-
78
- it("passes extra arguments through to console.error", () => {
79
- const spy = vi.spyOn(console, "error").mockImplementation(() => {});
80
- const logger = new Logger("error");
81
- const extra = { code: 500 };
82
- logger.error("fail", extra);
83
- expect(spy).toHaveBeenCalledOnce();
84
- expect(spy.mock.calls[0]).toContain(extra);
85
- });
86
- });
87
-
88
- describe("warn()", () => {
89
- it("logs to console.warn when level is 'warning'", () => {
90
- const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
91
- const logger = new Logger("warning");
92
- logger.warn("heads up");
93
- expect(spy).toHaveBeenCalledOnce();
94
- expect(spy.mock.calls[0]![0]).toContain("heads up");
95
- });
96
-
97
- it("logs to console.warn when level is 'info' (threshold above warning)", () => {
98
- const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
99
- const logger = new Logger("info");
100
- logger.warn("watch out");
101
- expect(spy).toHaveBeenCalledOnce();
102
- });
103
-
104
- it("logs to console.warn when level is 'debug'", () => {
105
- const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
106
- const logger = new Logger("debug");
107
- logger.warn("careful");
108
- expect(spy).toHaveBeenCalledOnce();
109
- });
110
-
111
- it("is silent when level is 'error' (threshold below warning)", () => {
112
- const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
113
- const logger = new Logger("error");
114
- logger.warn("should not appear");
115
- expect(spy).not.toHaveBeenCalled();
116
- });
117
-
118
- it("is silent when level is 'none'", () => {
119
- const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
120
- const logger = new Logger("none");
121
- logger.warn("nope");
122
- expect(spy).not.toHaveBeenCalled();
123
- });
124
- });
125
-
126
- describe("info()", () => {
127
- it("logs to console.log when level is 'info'", () => {
128
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
129
- const logger = new Logger("info");
130
- logger.info("status update");
131
- expect(spy).toHaveBeenCalledOnce();
132
- expect(spy.mock.calls[0]![0]).toContain("status update");
133
- });
134
-
135
- it("logs to console.log when level is 'debug' (threshold above info)", () => {
136
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
137
- const logger = new Logger("debug");
138
- logger.info("still visible");
139
- expect(spy).toHaveBeenCalledOnce();
140
- });
141
-
142
- it("logs to console.log when level is 'all'", () => {
143
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
144
- const logger = new Logger("all");
145
- logger.info("everything mode");
146
- expect(spy).toHaveBeenCalledOnce();
147
- });
148
-
149
- it("is silent when level is 'warning' (threshold below info)", () => {
150
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
151
- const logger = new Logger("warning");
152
- logger.info("should not appear");
153
- expect(spy).not.toHaveBeenCalled();
154
- });
155
-
156
- it("is silent when level is 'error'", () => {
157
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
158
- const logger = new Logger("error");
159
- logger.info("nope");
160
- expect(spy).not.toHaveBeenCalled();
161
- });
162
-
163
- it("is silent when level is 'none'", () => {
164
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
165
- const logger = new Logger("none");
166
- logger.info("nothing");
167
- expect(spy).not.toHaveBeenCalled();
168
- });
169
- });
170
-
171
- describe("debug()", () => {
172
- it("logs to console.log when level is 'debug'", () => {
173
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
174
- const logger = new Logger("debug");
175
- logger.debug("trace data");
176
- expect(spy).toHaveBeenCalledOnce();
177
- expect(spy.mock.calls[0]![0]).toContain("trace data");
178
- });
179
-
180
- it("logs to console.log when level is 'all'", () => {
181
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
182
- const logger = new Logger("all");
183
- logger.debug("everything");
184
- expect(spy).toHaveBeenCalledOnce();
185
- });
186
-
187
- it("is silent when level is 'info' (threshold below debug)", () => {
188
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
189
- const logger = new Logger("info");
190
- logger.debug("should not appear");
191
- expect(spy).not.toHaveBeenCalled();
192
- });
193
-
194
- it("is silent when level is 'warning'", () => {
195
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
196
- const logger = new Logger("warning");
197
- logger.debug("nope");
198
- expect(spy).not.toHaveBeenCalled();
199
- });
200
-
201
- it("is silent when level is 'error'", () => {
202
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
203
- const logger = new Logger("error");
204
- logger.debug("nope");
205
- expect(spy).not.toHaveBeenCalled();
206
- });
207
-
208
- it("is silent when level is 'none'", () => {
209
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
210
- const logger = new Logger("none");
211
- logger.debug("nothing");
212
- expect(spy).not.toHaveBeenCalled();
213
- });
214
-
215
- it("passes extra arguments through to console.log", () => {
216
- const spy = vi.spyOn(console, "log").mockImplementation(() => {});
217
- const logger = new Logger("debug");
218
- const obj = { detail: true };
219
- logger.debug("check", obj);
220
- expect(spy).toHaveBeenCalledOnce();
221
- expect(spy.mock.calls[0]).toContain(obj);
222
- });
223
- });
224
-
225
- describe("all methods silent at level 'none'", () => {
226
- it("produces no output for any method", () => {
227
- const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
228
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
229
- const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
230
-
231
- const logger = new Logger("none");
232
- logger.error("e");
233
- logger.warn("w");
234
- logger.info("i");
235
- logger.debug("d");
236
-
237
- expect(errorSpy).not.toHaveBeenCalled();
238
- expect(warnSpy).not.toHaveBeenCalled();
239
- expect(logSpy).not.toHaveBeenCalled();
240
- });
241
- });
242
-
243
- describe("all methods active at level 'all'", () => {
244
- it("produces output for every method", () => {
245
- const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
246
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
247
- const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
248
-
249
- const logger = new Logger("all");
250
- logger.error("e");
251
- logger.warn("w");
252
- logger.info("i");
253
- logger.debug("d");
254
-
255
- expect(errorSpy).toHaveBeenCalledOnce();
256
- expect(warnSpy).toHaveBeenCalledOnce();
257
- // Info and debug both use console.log
258
- expect(logSpy).toHaveBeenCalledTimes(2);
259
- });
260
- });
261
-
262
- describe("each level as constructor argument", () => {
263
- const cases: Array<{
264
- level: LogLevel;
265
- expectError: boolean;
266
- expectWarn: boolean;
267
- expectInfo: boolean;
268
- expectDebug: boolean;
269
- }> = [
270
- {
271
- level: "none",
272
- expectError: false,
273
- expectWarn: false,
274
- expectInfo: false,
275
- expectDebug: false,
276
- },
277
- {
278
- level: "error",
279
- expectError: true,
280
- expectWarn: false,
281
- expectInfo: false,
282
- expectDebug: false,
283
- },
284
- {
285
- level: "warning",
286
- expectError: true,
287
- expectWarn: true,
288
- expectInfo: false,
289
- expectDebug: false,
290
- },
291
- {
292
- level: "info",
293
- expectError: true,
294
- expectWarn: true,
295
- expectInfo: true,
296
- expectDebug: false,
297
- },
298
- {
299
- level: "debug",
300
- expectError: true,
301
- expectWarn: true,
302
- expectInfo: true,
303
- expectDebug: true,
304
- },
305
- {
306
- level: "all",
307
- expectError: true,
308
- expectWarn: true,
309
- expectInfo: true,
310
- expectDebug: true,
311
- },
312
- ];
313
-
314
- for (const {
315
- level,
316
- expectError,
317
- expectWarn,
318
- expectInfo,
319
- expectDebug,
320
- } of cases) {
321
- it(`level '${level}' enables the correct methods`, () => {
322
- const errorSpy = vi
323
- .spyOn(console, "error")
324
- .mockImplementation(() => {});
325
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
326
- const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
327
-
328
- const logger = new Logger(level);
329
- logger.error("e");
330
- logger.warn("w");
331
- logger.info("i");
332
- logger.debug("d");
333
-
334
- expect(errorSpy).toHaveBeenCalledTimes(expectError ? 1 : 0);
335
- expect(warnSpy).toHaveBeenCalledTimes(expectWarn ? 1 : 0);
336
-
337
- let expectedLogCalls = 0;
338
- if (expectInfo) expectedLogCalls++;
339
- if (expectDebug) expectedLogCalls++;
340
- expect(logSpy).toHaveBeenCalledTimes(expectedLogCalls);
341
- });
342
- }
343
- });
344
- });