@zudojs/testing 0.1.0 → 1.0.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -15
  3. package/dist/assertions/deepEqual.core.d.ts +25 -0
  4. package/dist/assertions/deepEqual.core.js +164 -0
  5. package/dist/assertions/deepEqual.describe.d.ts +19 -0
  6. package/dist/assertions/deepEqual.describe.js +59 -0
  7. package/dist/assertions/errorAssertions.core.d.ts +4 -0
  8. package/dist/assertions/errorAssertions.core.js +13 -2
  9. package/dist/assertions/eventAssertions.core.d.ts +12 -0
  10. package/dist/assertions/eventAssertions.core.js +26 -4
  11. package/dist/assertions/httpAssertions.core.d.ts +12 -1
  12. package/dist/assertions/httpAssertions.core.js +28 -6
  13. package/dist/assertions/index.d.ts +7 -6
  14. package/dist/assertions/index.js +6 -6
  15. package/dist/cleanupManager/cleanupManager.core.d.ts +4 -0
  16. package/dist/cleanupManager/cleanupManager.core.js +5 -2
  17. package/dist/mocking/mockFn.core.d.ts +4 -1
  18. package/dist/mocking/mockFn.core.js +33 -41
  19. package/dist/mocking/spy.core.d.ts +11 -2
  20. package/dist/mocking/spy.core.js +54 -25
  21. package/dist/mocking/stub.core.d.ts +9 -6
  22. package/dist/mocking/stub.core.js +49 -12
  23. package/dist/spyLogger/index.d.ts +5 -4
  24. package/dist/spyLogger/index.js +3 -3
  25. package/dist/spyLogger/spyLogger.context.d.ts +19 -0
  26. package/dist/spyLogger/spyLogger.context.js +41 -0
  27. package/dist/spyLogger/spyLogger.core.d.ts +7 -1
  28. package/dist/spyLogger/spyLogger.core.js +10 -56
  29. package/dist/spyLogger/spyLogger.recording.d.ts +31 -0
  30. package/dist/spyLogger/spyLogger.recording.js +89 -0
  31. package/dist/testApplication/testApplication.core.js +6 -3
  32. package/dist/testClock/testClock.core.js +19 -2
  33. package/dist/testContext/testContext.recorder.core.js +3 -3
  34. package/dist/testEventBus/testEventBus.core.js +5 -2
  35. package/dist/testMessageBus/testMessageBus.core.js +5 -2
  36. package/dist/testQueue/testQueue.core.js +3 -1
  37. package/dist/testSerialization/serializationAssertions.core.js +13 -4
  38. package/dist/testStorage/testStorageMemory.core.d.ts +12 -4
  39. package/dist/testStorage/testStorageMemory.core.js +25 -12
  40. package/package.json +33 -26
  41. package/dist/.tsbuildinfo +0 -1
  42. package/dist/assertions/errorAssertions.core.d.ts.map +0 -1
  43. package/dist/assertions/errorAssertions.core.js.map +0 -1
  44. package/dist/assertions/eventAssertions.core.d.ts.map +0 -1
  45. package/dist/assertions/eventAssertions.core.js.map +0 -1
  46. package/dist/assertions/httpAssertions.core.d.ts.map +0 -1
  47. package/dist/assertions/httpAssertions.core.js.map +0 -1
  48. package/dist/assertions/index.d.ts.map +0 -1
  49. package/dist/assertions/index.js.map +0 -1
  50. package/dist/cleanupManager/cleanupManager.core.d.ts.map +0 -1
  51. package/dist/cleanupManager/cleanupManager.core.js.map +0 -1
  52. package/dist/cleanupManager/index.d.ts.map +0 -1
  53. package/dist/cleanupManager/index.js.map +0 -1
  54. package/dist/fixtures/eventFixtures.core.d.ts.map +0 -1
  55. package/dist/fixtures/eventFixtures.core.js.map +0 -1
  56. package/dist/fixtures/index.d.ts.map +0 -1
  57. package/dist/fixtures/index.js.map +0 -1
  58. package/dist/fixtures/messageFixtures.core.d.ts.map +0 -1
  59. package/dist/fixtures/messageFixtures.core.js.map +0 -1
  60. package/dist/httpTesting/httpRequest.core.d.ts.map +0 -1
  61. package/dist/httpTesting/httpRequest.core.js.map +0 -1
  62. package/dist/httpTesting/httpResponse.core.d.ts.map +0 -1
  63. package/dist/httpTesting/httpResponse.core.js.map +0 -1
  64. package/dist/httpTesting/httpResponse.helpers.d.ts.map +0 -1
  65. package/dist/httpTesting/httpResponse.helpers.js.map +0 -1
  66. package/dist/httpTesting/httpResponse.type.d.ts.map +0 -1
  67. package/dist/httpTesting/httpResponse.type.js.map +0 -1
  68. package/dist/httpTesting/httpStatusCode.type.d.ts.map +0 -1
  69. package/dist/httpTesting/httpStatusCode.type.js.map +0 -1
  70. package/dist/httpTesting/index.d.ts.map +0 -1
  71. package/dist/httpTesting/index.js.map +0 -1
  72. package/dist/index.d.ts.map +0 -1
  73. package/dist/index.js.map +0 -1
  74. package/dist/mocking/index.d.ts.map +0 -1
  75. package/dist/mocking/index.js.map +0 -1
  76. package/dist/mocking/mockFn.core.d.ts.map +0 -1
  77. package/dist/mocking/mockFn.core.js.map +0 -1
  78. package/dist/mocking/spy.core.d.ts.map +0 -1
  79. package/dist/mocking/spy.core.js.map +0 -1
  80. package/dist/mocking/stub.core.d.ts.map +0 -1
  81. package/dist/mocking/stub.core.js.map +0 -1
  82. package/dist/spyLogger/index.d.ts.map +0 -1
  83. package/dist/spyLogger/index.js.map +0 -1
  84. package/dist/spyLogger/spyLogger.core.d.ts.map +0 -1
  85. package/dist/spyLogger/spyLogger.core.js.map +0 -1
  86. package/dist/spyLogger/spyLogger.type.d.ts.map +0 -1
  87. package/dist/spyLogger/spyLogger.type.js.map +0 -1
  88. package/dist/testApplication/index.d.ts.map +0 -1
  89. package/dist/testApplication/index.js.map +0 -1
  90. package/dist/testApplication/testApplication.core.d.ts.map +0 -1
  91. package/dist/testApplication/testApplication.core.js.map +0 -1
  92. package/dist/testClock/index.d.ts.map +0 -1
  93. package/dist/testClock/index.js.map +0 -1
  94. package/dist/testClock/testClock.core.d.ts.map +0 -1
  95. package/dist/testClock/testClock.core.js.map +0 -1
  96. package/dist/testConfig/index.d.ts.map +0 -1
  97. package/dist/testConfig/index.js.map +0 -1
  98. package/dist/testConfig/testConfig.core.d.ts.map +0 -1
  99. package/dist/testConfig/testConfig.core.js.map +0 -1
  100. package/dist/testContainer/index.d.ts.map +0 -1
  101. package/dist/testContainer/index.js.map +0 -1
  102. package/dist/testContainer/testContainer.core.d.ts.map +0 -1
  103. package/dist/testContainer/testContainer.core.js.map +0 -1
  104. package/dist/testContext/index.d.ts.map +0 -1
  105. package/dist/testContext/index.js.map +0 -1
  106. package/dist/testContext/testContext.core.d.ts.map +0 -1
  107. package/dist/testContext/testContext.core.js.map +0 -1
  108. package/dist/testContext/testContext.recorder.core.d.ts.map +0 -1
  109. package/dist/testContext/testContext.recorder.core.js.map +0 -1
  110. package/dist/testContext/testContext.recorder.type.d.ts.map +0 -1
  111. package/dist/testContext/testContext.recorder.type.js.map +0 -1
  112. package/dist/testEventBus/index.d.ts.map +0 -1
  113. package/dist/testEventBus/index.js.map +0 -1
  114. package/dist/testEventBus/testEventBus.core.d.ts.map +0 -1
  115. package/dist/testEventBus/testEventBus.core.js.map +0 -1
  116. package/dist/testMessageBus/index.d.ts.map +0 -1
  117. package/dist/testMessageBus/index.js.map +0 -1
  118. package/dist/testMessageBus/testMessageBus.core.d.ts.map +0 -1
  119. package/dist/testMessageBus/testMessageBus.core.js.map +0 -1
  120. package/dist/testQueue/index.d.ts.map +0 -1
  121. package/dist/testQueue/index.js.map +0 -1
  122. package/dist/testQueue/testQueue.core.d.ts.map +0 -1
  123. package/dist/testQueue/testQueue.core.js.map +0 -1
  124. package/dist/testSerialization/index.d.ts.map +0 -1
  125. package/dist/testSerialization/index.js.map +0 -1
  126. package/dist/testSerialization/serializationAssertions.core.d.ts.map +0 -1
  127. package/dist/testSerialization/serializationAssertions.core.js.map +0 -1
  128. package/dist/testStorage/index.d.ts.map +0 -1
  129. package/dist/testStorage/index.js.map +0 -1
  130. package/dist/testStorage/testStorageMemory.core.d.ts.map +0 -1
  131. package/dist/testStorage/testStorageMemory.core.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @zudojs/testing — Recording logger construction.
3
+ *
4
+ * Split from the factory so a derived logger — `child()` or `withContext()` —
5
+ * is built the same way as its parent and shares the same recording.
6
+ *
7
+ * @module spyLogger/spyLogger.recording
8
+ */
9
+ import { deepMatches, mergeContext, mergeLoggerContext, } from "./spyLogger.context.js";
10
+ /** Numeric level for each method, ascending in verbosity. */
11
+ export const LEVELS = {
12
+ fatal: 0,
13
+ error: 1,
14
+ warn: 2,
15
+ info: 3,
16
+ debug: 4,
17
+ trace: 5,
18
+ };
19
+ /** Builds a logger over an existing recording. */
20
+ export function createRecordingLogger(recorder, derived, initialLevel, initiallyEnabled) {
21
+ let level = initialLevel;
22
+ let enabled = initiallyEnabled;
23
+ /** Records a call, honouring the configured level and enabled state. */
24
+ const record = (method, callLevel, message, metadata) => {
25
+ if (!enabled)
26
+ return;
27
+ if (callLevel > level)
28
+ return;
29
+ recorder.calls.push({
30
+ method,
31
+ level: callLevel,
32
+ message,
33
+ metadata: mergeContext(derived.context, metadata),
34
+ timestamp: new Date(),
35
+ });
36
+ };
37
+ const at = (method) => (message, metadata) => {
38
+ record(method, LEVELS[method], message, metadata);
39
+ };
40
+ return {
41
+ get name() {
42
+ return derived.name;
43
+ },
44
+ get level() {
45
+ return level;
46
+ },
47
+ get enabled() {
48
+ return enabled;
49
+ },
50
+ get calls() {
51
+ return [...recorder.calls];
52
+ },
53
+ fatal: at("fatal"),
54
+ error: at("error"),
55
+ warn: at("warn"),
56
+ info: at("info"),
57
+ debug: at("debug"),
58
+ trace: at("trace"),
59
+ log: (logLevel, message, options) => {
60
+ record("log", logLevel, message, options?.metadata);
61
+ },
62
+ child: (options) => createRecordingLogger(recorder, {
63
+ name: `${derived.name}.${options?.name ?? "child"}`,
64
+ ...(derived.context ? { context: derived.context } : {}),
65
+ }, level, enabled),
66
+ withContext: (context) => createRecordingLogger(recorder, {
67
+ name: derived.name,
68
+ context: mergeLoggerContext(derived.context, context),
69
+ }, level, enabled),
70
+ setLevel: (newLevel) => {
71
+ level = newLevel;
72
+ },
73
+ enable: () => {
74
+ enabled = true;
75
+ },
76
+ disable: () => {
77
+ enabled = false;
78
+ },
79
+ flush: async () => { },
80
+ close: async () => { },
81
+ clear: () => {
82
+ recorder.calls.length = 0;
83
+ },
84
+ findByMethod: (method) => recorder.calls.filter((call) => call.method === method),
85
+ findByMessage: (substring) => recorder.calls.filter((call) => call.message.includes(substring)),
86
+ findByMetadata: (key, value) => recorder.calls.filter((call) => call.metadata !== undefined && deepMatches(call.metadata[key], value)),
87
+ };
88
+ }
89
+ //# sourceMappingURL=spyLogger.recording.js.map
@@ -30,12 +30,15 @@ export function createTestApplication(options = {}) {
30
30
  const logger = options.logger ?? createLogger({ name });
31
31
  const clock = options.clock ?? createTestClock();
32
32
  const cleanup = options.cleanup ?? createCleanupManager();
33
- cleanup.register(async () => {
34
- container.dispose();
35
- }, "container-dispose");
33
+ // Cleanups run in reverse registration order, so the logger is registered
34
+ // first and therefore closed last: anything that logs while the container
35
+ // disposes still has somewhere to write.
36
36
  cleanup.register(async () => {
37
37
  await logger.close();
38
38
  }, "logger-close");
39
+ cleanup.register(async () => {
40
+ await container.dispose();
41
+ }, "container-dispose");
39
42
  const dispose = async () => {
40
43
  await cleanup.dispose();
41
44
  };
@@ -23,12 +23,29 @@
23
23
  * ```
24
24
  */
25
25
  export function createTestClock(initialTime) {
26
- let currentTime = initialTime ? new Date(initialTime).getTime() : Date.now();
26
+ /**
27
+ * Resolve a caller-supplied instant.
28
+ *
29
+ * Tested against `undefined`, not truthiness: epoch 0 is the natural choice
30
+ * for a deterministic test, and treating it as "not supplied" silently
31
+ * handed back the real clock in the one place determinism was requested.
32
+ */
33
+ const toTimestamp = (value) => {
34
+ const timestamp = new Date(value).getTime();
35
+ if (Number.isNaN(timestamp)) {
36
+ throw new TypeError(`Invalid test clock time: ${JSON.stringify(value)} is not a valid date.`);
37
+ }
38
+ return timestamp;
39
+ };
40
+ let currentTime = initialTime === undefined ? Date.now() : toTimestamp(initialTime);
27
41
  const now = () => new Date(currentTime);
28
42
  const set = (date) => {
29
- currentTime = new Date(date).getTime();
43
+ currentTime = toTimestamp(date);
30
44
  };
31
45
  const advance = (ms) => {
46
+ if (!Number.isFinite(ms)) {
47
+ throw new TypeError(`Cannot advance the clock by ${String(ms)}.`);
48
+ }
32
49
  currentTime += ms;
33
50
  };
34
51
  const add = (duration) => {
@@ -10,7 +10,7 @@ export function createLogRecorder() {
10
10
  const entries = [];
11
11
  return {
12
12
  get entries() {
13
- return entries;
13
+ return [...entries];
14
14
  },
15
15
  record: (level, message, metadata) => {
16
16
  entries.push({
@@ -34,7 +34,7 @@ export function createEventRecorder() {
34
34
  const entries = [];
35
35
  return {
36
36
  get entries() {
37
- return entries;
37
+ return [...entries];
38
38
  },
39
39
  record: (type, payload) => {
40
40
  entries.push({
@@ -56,7 +56,7 @@ export function createMessageRecorder() {
56
56
  const entries = [];
57
57
  return {
58
58
  get entries() {
59
- return entries;
59
+ return [...entries];
60
60
  },
61
61
  record: (type, payload) => {
62
62
  entries.push({
@@ -4,6 +4,7 @@
4
4
  * Wraps the real EventBus with recording and assertion support.
5
5
  */
6
6
  import { EventBus } from "@zudojs/events";
7
+ import { randomUUID } from "node:crypto";
7
8
  /**
8
9
  * Creates a test event bus with recording.
9
10
  *
@@ -28,7 +29,7 @@ export function createTestEventBus(options = {}) {
28
29
  bus.start();
29
30
  const publish = async (input) => {
30
31
  const event = {
31
- id: `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
32
+ id: `evt_${randomUUID()}`,
32
33
  type: input.type,
33
34
  payload: input.payload,
34
35
  timestamp: new Date(),
@@ -51,7 +52,9 @@ export function createTestEventBus(options = {}) {
51
52
  };
52
53
  return {
53
54
  bus,
54
- published,
55
+ get published() {
56
+ return [...published];
57
+ },
55
58
  publish,
56
59
  findByType,
57
60
  clear,
@@ -4,6 +4,7 @@
4
4
  * Wraps the real MessageBus with recording and assertion support.
5
5
  */
6
6
  import { createMessageBus } from "@zudojs/messaging";
7
+ import { randomUUID } from "node:crypto";
7
8
  /**
8
9
  * Creates a test message bus with recording.
9
10
  *
@@ -28,7 +29,7 @@ export function createTestMessageBus(options = {}) {
28
29
  const dispatched = [];
29
30
  const send = async (input, dispatchOptions) => {
30
31
  const message = {
31
- id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
32
+ id: `msg_${randomUUID()}`,
32
33
  type: input.type,
33
34
  payload: input.payload,
34
35
  timestamp: new Date(),
@@ -51,7 +52,9 @@ export function createTestMessageBus(options = {}) {
51
52
  };
52
53
  return {
53
54
  bus,
54
- dispatched,
55
+ get dispatched() {
56
+ return [...dispatched];
57
+ },
55
58
  send,
56
59
  findByType,
57
60
  clear,
@@ -25,7 +25,9 @@ export function createTestQueue(name, options) {
25
25
  };
26
26
  return {
27
27
  queue,
28
- jobs: recordedJobs,
28
+ get jobs() {
29
+ return [...recordedJobs];
30
+ },
29
31
  add,
30
32
  findByName,
31
33
  getStats,
@@ -4,6 +4,7 @@
4
4
  * Helpers for testing serialization round-trips and type preservation.
5
5
  */
6
6
  import { JSONSerializer } from "@zudojs/serialization";
7
+ import { findDifference } from "../assertions/deepEqual.core.js";
7
8
  const defaultSerializer = new JSONSerializer();
8
9
  /**
9
10
  * Assert that a value round-trips through serialization correctly.
@@ -19,8 +20,15 @@ export function assertSerializesCorrectly(value, options) {
19
20
  const restored = serializer.deserialize(json, {
20
21
  preserveTypes: options?.preserveTypes,
21
22
  });
22
- if (JSON.stringify(restored) !== JSON.stringify(value)) {
23
- throw new Error(`Serialization round-trip failed: expected ${JSON.stringify(value)}, got ${JSON.stringify(restored)}`);
23
+ /*
24
+ * Compared structurally, not by JSON string. `JSON.stringify` renders a Map
25
+ * or a Set as `{}`, so a round trip that silently dropped one compared equal
26
+ * to the original and this assertion passed — precisely the failure it exists
27
+ * to catch.
28
+ */
29
+ const difference = findDifference(restored, value, "value");
30
+ if (difference) {
31
+ throw new Error(`Serialization round-trip failed at ${difference.path}: ${difference.reason}.`);
24
32
  }
25
33
  }
26
34
  /**
@@ -43,8 +51,9 @@ export function assertDeserializesTo(json, expected, options) {
43
51
  const actual = serializer.deserialize(json, {
44
52
  preserveTypes: options?.preserveTypes,
45
53
  });
46
- if (JSON.stringify(actual) !== JSON.stringify(expected)) {
47
- throw new Error(`Expected deserialized value ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
54
+ const difference = findDifference(actual, expected, "value");
55
+ if (difference) {
56
+ throw new Error(`Deserialized value mismatch at ${difference.path}: ${difference.reason}.`);
48
57
  }
49
58
  }
50
59
  /**
@@ -12,19 +12,27 @@
12
12
  */
13
13
  export declare class InMemoryTestStorage {
14
14
  private readonly store;
15
- /** Get a value by key. */
15
+ /** Drops the entry when its TTL has passed. Returns the live entry. */
16
+ private live;
17
+ /**
18
+ * Get a value by key.
19
+ *
20
+ * Returns null for a miss. Use {@link has} to tell a miss apart from a
21
+ * stored `null` — caching a negative result is exactly the case a cache
22
+ * test needs to distinguish.
23
+ */
16
24
  get<T = unknown>(key: string): T | null;
17
25
  /** Set a value with optional TTL in milliseconds. */
18
26
  set(key: string, value: unknown, ttlMs?: number): void;
19
27
  /** Delete a value by key. Returns true if deleted. */
20
28
  delete(key: string): boolean;
21
- /** Check if a key exists and is not expired. */
29
+ /** Check if a key exists and is not expired, whatever its value. */
22
30
  has(key: string): boolean;
23
31
  /** Clear all entries. */
24
32
  clear(): void;
25
- /** Get all keys. */
33
+ /** Get all live keys, excluding expired entries. */
26
34
  keys(): string[];
27
- /** Get the number of entries. */
35
+ /** Get the number of live entries. */
28
36
  get size(): number;
29
37
  }
30
38
  //# sourceMappingURL=testStorageMemory.core.d.ts.map
@@ -12,16 +12,29 @@
12
12
  */
13
13
  export class InMemoryTestStorage {
14
14
  store = new Map();
15
- /** Get a value by key. */
16
- get(key) {
15
+ /** Drops the entry when its TTL has passed. Returns the live entry. */
16
+ live(key) {
17
17
  const entry = this.store.get(key);
18
18
  if (!entry)
19
- return null;
20
- if (entry.expiresAt && entry.expiresAt < new Date()) {
19
+ return undefined;
20
+ if (entry.expiresAt && entry.expiresAt.getTime() <= Date.now()) {
21
21
  this.store.delete(key);
22
- return null;
22
+ return undefined;
23
23
  }
24
- return entry.value;
24
+ return entry;
25
+ }
26
+ /**
27
+ * Get a value by key.
28
+ *
29
+ * Returns null for a miss. Use {@link has} to tell a miss apart from a
30
+ * stored `null` — caching a negative result is exactly the case a cache
31
+ * test needs to distinguish.
32
+ */
33
+ get(key) {
34
+ const entry = this.live(key);
35
+ if (!entry)
36
+ return null;
37
+ return (entry.value ?? null);
25
38
  }
26
39
  /** Set a value with optional TTL in milliseconds. */
27
40
  set(key, value, ttlMs) {
@@ -32,21 +45,21 @@ export class InMemoryTestStorage {
32
45
  delete(key) {
33
46
  return this.store.delete(key);
34
47
  }
35
- /** Check if a key exists and is not expired. */
48
+ /** Check if a key exists and is not expired, whatever its value. */
36
49
  has(key) {
37
- return this.get(key) !== null;
50
+ return this.live(key) !== undefined;
38
51
  }
39
52
  /** Clear all entries. */
40
53
  clear() {
41
54
  this.store.clear();
42
55
  }
43
- /** Get all keys. */
56
+ /** Get all live keys, excluding expired entries. */
44
57
  keys() {
45
- return [...this.store.keys()];
58
+ return [...this.store.keys()].filter((key) => this.live(key) !== undefined);
46
59
  }
47
- /** Get the number of entries. */
60
+ /** Get the number of live entries. */
48
61
  get size() {
49
- return this.store.size;
62
+ return this.keys().length;
50
63
  }
51
64
  }
52
65
  //# sourceMappingURL=testStorageMemory.core.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zudojs/testing",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Test helpers, fixtures, mocks, and utilities for testing Zudojs applications.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,33 +13,30 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
- "dist"
16
+ "dist",
17
+ "!dist/**/*.map",
18
+ "!dist/**/*.tsbuildinfo",
19
+ "!dist/.tsbuildinfo"
17
20
  ],
18
- "scripts": {
19
- "build": "tsc -p tsconfig.json",
20
- "clean": "rm -rf dist",
21
- "typecheck": "tsc -p tsconfig.json --noEmit",
22
- "test": "../../node_modules/.bin/vitest run"
23
- },
24
21
  "dependencies": {
25
- "@zudojs/config": "0.1.0",
26
- "@zudojs/constants": "0.1.0",
27
- "@zudojs/container": "0.1.0",
28
- "@zudojs/errors": "0.1.0",
29
- "@zudojs/events": "0.1.0",
30
- "@zudojs/http": "0.1.0",
31
- "@zudojs/logger": "0.1.0",
32
- "@zudojs/messaging": "0.1.0",
33
- "@zudojs/middleware": "0.1.0",
34
- "@zudojs/queue": "0.1.0",
35
- "@zudojs/security": "0.1.0",
36
- "@zudojs/serialization": "0.1.0",
37
- "@zudojs/storage": "0.1.0",
38
- "@zudojs/types": "0.1.0",
39
- "@zudojs/validation": "0.1.0"
22
+ "@zudojs/config": "1.0.0",
23
+ "@zudojs/constants": "1.0.0",
24
+ "@zudojs/container": "1.0.0",
25
+ "@zudojs/errors": "1.0.0",
26
+ "@zudojs/events": "1.0.0",
27
+ "@zudojs/http": "1.0.0",
28
+ "@zudojs/logger": "1.0.0",
29
+ "@zudojs/messaging": "1.0.0",
30
+ "@zudojs/middleware": "1.0.0",
31
+ "@zudojs/queue": "1.0.0",
32
+ "@zudojs/security": "1.0.0",
33
+ "@zudojs/serialization": "1.0.0",
34
+ "@zudojs/storage": "1.0.0",
35
+ "@zudojs/types": "1.0.0",
36
+ "@zudojs/validation": "1.0.0"
40
37
  },
41
38
  "devDependencies": {
42
- "typescript": "^7.0.2",
39
+ "typescript": "7.0.2",
43
40
  "vitest": "^4.1.11"
44
41
  },
45
42
  "engines": {
@@ -57,8 +54,18 @@
57
54
  "vitest"
58
55
  ],
59
56
  "homepage": "https://github.com/oyinlola-tech/zudo#readme",
57
+ "bugs": {
58
+ "url": "https://github.com/oyinlola-tech/zudo/issues"
59
+ },
60
60
  "repository": {
61
61
  "type": "git",
62
- "url": "https://github.com/oyinlola-tech/zudo"
62
+ "url": "https://github.com/oyinlola-tech/zudo",
63
+ "directory": "packages/testing"
64
+ },
65
+ "scripts": {
66
+ "build": "tsc -p tsconfig.json",
67
+ "clean": "rm -rf dist",
68
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
69
+ "test": "../../node_modules/.bin/vitest run"
63
70
  }
64
- }
71
+ }