llm-mock-server 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/dist/cli/cli.d.ts +3 -0
  2. package/dist/cli/cli.d.ts.map +1 -0
  3. package/dist/cli/cli.js +103 -0
  4. package/dist/cli/cli.js.map +1 -0
  5. package/dist/cli/validators.d.ts +7 -0
  6. package/dist/cli/validators.d.ts.map +1 -0
  7. package/dist/cli/validators.js +53 -0
  8. package/dist/cli/validators.js.map +1 -0
  9. package/dist/formats/anthropic/index.d.ts +1 -1
  10. package/dist/formats/anthropic/index.d.ts.map +1 -1
  11. package/dist/formats/anthropic/index.js +1 -1
  12. package/dist/formats/anthropic/index.js.map +1 -1
  13. package/dist/formats/anthropic/parse.d.ts +2 -2
  14. package/dist/formats/anthropic/parse.d.ts.map +1 -1
  15. package/dist/formats/anthropic/parse.js +4 -2
  16. package/dist/formats/anthropic/parse.js.map +1 -1
  17. package/dist/formats/anthropic/schema.d.ts +1 -1
  18. package/dist/formats/anthropic/schema.d.ts.map +1 -1
  19. package/dist/formats/anthropic/schema.js +9 -4
  20. package/dist/formats/anthropic/schema.js.map +1 -1
  21. package/dist/formats/anthropic/serialize.d.ts +2 -2
  22. package/dist/formats/anthropic/serialize.d.ts.map +1 -1
  23. package/dist/formats/anthropic/serialize.js +76 -19
  24. package/dist/formats/anthropic/serialize.js.map +1 -1
  25. package/dist/formats/openai/chat-completions/index.d.ts +3 -0
  26. package/dist/formats/openai/chat-completions/index.d.ts.map +1 -0
  27. package/dist/formats/openai/chat-completions/index.js +13 -0
  28. package/dist/formats/openai/chat-completions/index.js.map +1 -0
  29. package/dist/formats/openai/chat-completions/parse.d.ts +4 -0
  30. package/dist/formats/openai/chat-completions/parse.d.ts.map +1 -0
  31. package/dist/formats/openai/chat-completions/parse.js +33 -0
  32. package/dist/formats/openai/chat-completions/parse.js.map +1 -0
  33. package/dist/formats/openai/chat-completions/schema.d.ts +93 -0
  34. package/dist/formats/openai/chat-completions/schema.d.ts.map +1 -0
  35. package/dist/formats/openai/chat-completions/schema.js +74 -0
  36. package/dist/formats/openai/chat-completions/schema.js.map +1 -0
  37. package/dist/formats/openai/chat-completions/serialize.d.ts +10 -0
  38. package/dist/formats/openai/chat-completions/serialize.d.ts.map +1 -0
  39. package/dist/formats/openai/chat-completions/serialize.js +99 -0
  40. package/dist/formats/openai/chat-completions/serialize.js.map +1 -0
  41. package/dist/formats/openai/responses/index.d.ts +3 -0
  42. package/dist/formats/openai/responses/index.d.ts.map +1 -0
  43. package/dist/formats/openai/responses/index.js +13 -0
  44. package/dist/formats/openai/responses/index.js.map +1 -0
  45. package/dist/formats/openai/responses/parse.d.ts +4 -0
  46. package/dist/formats/openai/responses/parse.d.ts.map +1 -0
  47. package/dist/formats/openai/responses/parse.js +51 -0
  48. package/dist/formats/openai/responses/parse.js.map +1 -0
  49. package/dist/formats/openai/responses/schema.d.ts +103 -0
  50. package/dist/formats/openai/responses/schema.d.ts.map +1 -0
  51. package/dist/formats/openai/responses/schema.js +71 -0
  52. package/dist/formats/openai/responses/schema.js.map +1 -0
  53. package/dist/formats/openai/responses/serialize.d.ts +10 -0
  54. package/dist/formats/openai/responses/serialize.d.ts.map +1 -0
  55. package/dist/formats/openai/responses/serialize.js +273 -0
  56. package/dist/formats/openai/responses/serialize.js.map +1 -0
  57. package/dist/formats/request-helpers.d.ts +1 -1
  58. package/dist/formats/request-helpers.d.ts.map +1 -1
  59. package/dist/formats/request-helpers.js.map +1 -1
  60. package/dist/formats/serialize-helpers.d.ts +1 -1
  61. package/dist/formats/serialize-helpers.d.ts.map +1 -1
  62. package/dist/formats/serialize-helpers.js +6 -3
  63. package/dist/formats/serialize-helpers.js.map +1 -1
  64. package/dist/formats/types.d.ts +2 -1
  65. package/dist/formats/types.d.ts.map +1 -1
  66. package/dist/history.d.ts +6 -2
  67. package/dist/history.d.ts.map +1 -1
  68. package/dist/history.js +2 -0
  69. package/dist/history.js.map +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/loader.d.ts +1 -1
  73. package/dist/loader.d.ts.map +1 -1
  74. package/dist/loader.js +26 -9
  75. package/dist/loader.js.map +1 -1
  76. package/dist/logger.d.ts.map +1 -1
  77. package/dist/logger.js +12 -4
  78. package/dist/logger.js.map +1 -1
  79. package/dist/mock-server.d.ts +44 -48
  80. package/dist/mock-server.d.ts.map +1 -1
  81. package/dist/mock-server.js +37 -85
  82. package/dist/mock-server.js.map +1 -1
  83. package/dist/route-handler.d.ts +1 -1
  84. package/dist/route-handler.d.ts.map +1 -1
  85. package/dist/route-handler.js +19 -7
  86. package/dist/route-handler.js.map +1 -1
  87. package/dist/rule-builder.d.ts +21 -0
  88. package/dist/rule-builder.d.ts.map +1 -0
  89. package/dist/rule-builder.js +58 -0
  90. package/dist/rule-builder.js.map +1 -0
  91. package/dist/rule-engine.d.ts +3 -1
  92. package/dist/rule-engine.d.ts.map +1 -1
  93. package/dist/rule-engine.js +7 -2
  94. package/dist/rule-engine.js.map +1 -1
  95. package/dist/sse-writer.d.ts +1 -1
  96. package/dist/sse-writer.d.ts.map +1 -1
  97. package/dist/types/reply.d.ts +51 -8
  98. package/dist/types/reply.d.ts.map +1 -1
  99. package/dist/types/request.d.ts +21 -6
  100. package/dist/types/request.d.ts.map +1 -1
  101. package/dist/types/rule.d.ts +65 -7
  102. package/dist/types/rule.d.ts.map +1 -1
  103. package/dist/types.d.ts +3 -3
  104. package/dist/types.d.ts.map +1 -1
  105. package/package.json +15 -9
  106. package/.claude/skills/desloppify/SKILL.md +0 -308
  107. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000801.json +0 -242
  108. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000905.json +0 -248
  109. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000917.json +0 -248
  110. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000950.json +0 -311
  111. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/claude_launch_prompt.md +0 -17
  112. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.json +0 -255
  113. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.template.json +0 -22
  114. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/reviewer_instructions.md +0 -20
  115. package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/session.json +0 -20
  116. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050000.json +0 -286
  117. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050028.json +0 -303
  118. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/claude_launch_prompt.md +0 -17
  119. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.json +0 -297
  120. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.template.json +0 -22
  121. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/reviewer_instructions.md +0 -20
  122. package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/session.json +0 -20
  123. package/.desloppify/query.json +0 -1312
  124. package/.desloppify/review_packet_blind.json +0 -1249
  125. package/.desloppify/review_packets/holistic_packet_20260315_000339.json +0 -1471
  126. package/.desloppify/review_packets/holistic_packet_20260315_045546.json +0 -1480
  127. package/.desloppify/review_packets/holistic_packet_20260315_185401.json +0 -1407
  128. package/.desloppify/review_packets/holistic_packet_20260315_185613.json +0 -1407
  129. package/.desloppify/state-typescript.json +0 -8438
  130. package/.desloppify/state-typescript.json.bak +0 -8432
  131. package/.desloppify/subagents/runs/20260315_185401/logs/batch-1.log +0 -384
  132. package/.desloppify/subagents/runs/20260315_185401/logs/batch-10.log +0 -484
  133. package/.desloppify/subagents/runs/20260315_185401/logs/batch-2.log +0 -408
  134. package/.desloppify/subagents/runs/20260315_185401/logs/batch-3.log +0 -416
  135. package/.desloppify/subagents/runs/20260315_185401/logs/batch-4.log +0 -360
  136. package/.desloppify/subagents/runs/20260315_185401/logs/batch-5.log +0 -360
  137. package/.desloppify/subagents/runs/20260315_185401/logs/batch-6.log +0 -364
  138. package/.desloppify/subagents/runs/20260315_185401/logs/batch-7.log +0 -428
  139. package/.desloppify/subagents/runs/20260315_185401/logs/batch-8.log +0 -388
  140. package/.desloppify/subagents/runs/20260315_185401/logs/batch-9.log +0 -500
  141. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-1.md +0 -83
  142. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-10.md +0 -108
  143. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-2.md +0 -89
  144. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-3.md +0 -91
  145. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-4.md +0 -77
  146. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-5.md +0 -77
  147. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-6.md +0 -78
  148. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-7.md +0 -94
  149. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-8.md +0 -84
  150. package/.desloppify/subagents/runs/20260315_185401/prompts/batch-9.md +0 -112
  151. package/.desloppify/subagents/runs/20260315_185401/results/batch-1.raw.txt +0 -0
  152. package/.desloppify/subagents/runs/20260315_185401/results/batch-10.raw.txt +0 -0
  153. package/.desloppify/subagents/runs/20260315_185401/results/batch-2.raw.txt +0 -0
  154. package/.desloppify/subagents/runs/20260315_185401/results/batch-3.raw.txt +0 -0
  155. package/.desloppify/subagents/runs/20260315_185401/results/batch-4.raw.txt +0 -0
  156. package/.desloppify/subagents/runs/20260315_185401/results/batch-5.raw.txt +0 -0
  157. package/.desloppify/subagents/runs/20260315_185401/results/batch-6.raw.txt +0 -0
  158. package/.desloppify/subagents/runs/20260315_185401/results/batch-7.raw.txt +0 -0
  159. package/.desloppify/subagents/runs/20260315_185401/results/batch-8.raw.txt +0 -0
  160. package/.desloppify/subagents/runs/20260315_185401/results/batch-9.raw.txt +0 -0
  161. package/.desloppify/subagents/runs/20260315_185401/run.log +0 -36
  162. package/.desloppify/subagents/runs/20260315_185401/run_summary.json +0 -156
  163. package/.desloppify/subagents/runs/20260315_185613/holistic_findings_merged.json +0 -741
  164. package/.desloppify/subagents/runs/20260315_185613/logs/batch-1.log +0 -579
  165. package/.desloppify/subagents/runs/20260315_185613/logs/batch-10.log +0 -1537
  166. package/.desloppify/subagents/runs/20260315_185613/logs/batch-2.log +0 -829
  167. package/.desloppify/subagents/runs/20260315_185613/logs/batch-3.log +0 -927
  168. package/.desloppify/subagents/runs/20260315_185613/logs/batch-4.log +0 -429
  169. package/.desloppify/subagents/runs/20260315_185613/logs/batch-5.log +0 -276
  170. package/.desloppify/subagents/runs/20260315_185613/logs/batch-6.log +0 -450
  171. package/.desloppify/subagents/runs/20260315_185613/logs/batch-7.log +0 -730
  172. package/.desloppify/subagents/runs/20260315_185613/logs/batch-8.log +0 -698
  173. package/.desloppify/subagents/runs/20260315_185613/logs/batch-9.log +0 -938
  174. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-1.md +0 -83
  175. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-10.md +0 -108
  176. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-2.md +0 -89
  177. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-3.md +0 -91
  178. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-4.md +0 -77
  179. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-5.md +0 -77
  180. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-6.md +0 -78
  181. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-7.md +0 -94
  182. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-8.md +0 -84
  183. package/.desloppify/subagents/runs/20260315_185613/prompts/batch-9.md +0 -112
  184. package/.desloppify/subagents/runs/20260315_185613/results/batch-1.raw.txt +0 -78
  185. package/.desloppify/subagents/runs/20260315_185613/results/batch-10.raw.txt +0 -242
  186. package/.desloppify/subagents/runs/20260315_185613/results/batch-2.raw.txt +0 -102
  187. package/.desloppify/subagents/runs/20260315_185613/results/batch-3.raw.txt +0 -94
  188. package/.desloppify/subagents/runs/20260315_185613/results/batch-4.raw.txt +0 -86
  189. package/.desloppify/subagents/runs/20260315_185613/results/batch-5.raw.txt +0 -1
  190. package/.desloppify/subagents/runs/20260315_185613/results/batch-6.raw.txt +0 -87
  191. package/.desloppify/subagents/runs/20260315_185613/results/batch-7.raw.txt +0 -1
  192. package/.desloppify/subagents/runs/20260315_185613/results/batch-8.raw.txt +0 -107
  193. package/.desloppify/subagents/runs/20260315_185613/results/batch-9.raw.txt +0 -67
  194. package/.desloppify/subagents/runs/20260315_185613/run.log +0 -96
  195. package/.desloppify/subagents/runs/20260315_185613/run_summary.json +0 -156
  196. package/.editorconfig +0 -12
  197. package/.github/dependabot.yml +0 -11
  198. package/.github/workflows/docs.yml +0 -46
  199. package/.github/workflows/test.yml +0 -40
  200. package/.markdownlint.jsonc +0 -11
  201. package/.node-version +0 -1
  202. package/.oxfmtrc.json +0 -9
  203. package/.oxlintrc.json +0 -35
  204. package/docs/ARCHITECTURE.md +0 -125
  205. package/scorecard.png +0 -0
  206. package/src/cli/cli.ts +0 -141
  207. package/src/cli/validators.ts +0 -68
  208. package/src/formats/anthropic/index.ts +0 -14
  209. package/src/formats/anthropic/parse.ts +0 -70
  210. package/src/formats/anthropic/schema.ts +0 -74
  211. package/src/formats/anthropic/serialize.ts +0 -179
  212. package/src/formats/openai/chat-completions/index.ts +0 -14
  213. package/src/formats/openai/chat-completions/parse.ts +0 -47
  214. package/src/formats/openai/chat-completions/schema.ts +0 -92
  215. package/src/formats/openai/chat-completions/serialize.ts +0 -146
  216. package/src/formats/openai/responses/index.ts +0 -14
  217. package/src/formats/openai/responses/parse.ts +0 -73
  218. package/src/formats/openai/responses/schema.ts +0 -86
  219. package/src/formats/openai/responses/serialize.ts +0 -328
  220. package/src/formats/request-helpers.ts +0 -56
  221. package/src/formats/serialize-helpers.ts +0 -43
  222. package/src/formats/types.ts +0 -26
  223. package/src/history.ts +0 -70
  224. package/src/index.ts +0 -46
  225. package/src/loader.ts +0 -246
  226. package/src/logger.ts +0 -70
  227. package/src/mock-server.ts +0 -203
  228. package/src/route-handler.ts +0 -144
  229. package/src/rule-builder.ts +0 -73
  230. package/src/rule-engine.ts +0 -165
  231. package/src/sse-writer.ts +0 -35
  232. package/src/types/reply.ts +0 -92
  233. package/src/types/request.ts +0 -56
  234. package/src/types/rule.ts +0 -125
  235. package/src/types.ts +0 -24
  236. package/test/cli-validators.test.ts +0 -151
  237. package/test/formats/anthropic.test.ts +0 -336
  238. package/test/formats/openai.test.ts +0 -316
  239. package/test/formats/parse-helpers.test.ts +0 -315
  240. package/test/formats/responses.test.ts +0 -380
  241. package/test/helpers/make-req.ts +0 -18
  242. package/test/history.test.ts +0 -361
  243. package/test/loader.test.ts +0 -333
  244. package/test/logger.test.ts +0 -344
  245. package/test/mock-server.test.ts +0 -619
  246. package/test/rule-engine.test.ts +0 -229
  247. package/tsconfig.json +0 -24
  248. package/tsconfig.test.json +0 -11
  249. package/typedoc.json +0 -9
  250. 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
- });