@kognitivedev/shared 0.2.5 → 0.2.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.
@@ -0,0 +1,30 @@
1
+ $ vitest run
2
+
3
+ RUN v3.2.4 /Users/vserifsaglam/work/memory-experiment/packages/shared
4
+
5
+ stdout | src/__tests__/shared.test.ts > Loggers > ConsoleLogger logs without throwing
6
+ [Test] DEBUG: test
7
+ [Test] INFO: test
8
+
9
+ stderr | src/__tests__/shared.test.ts > Loggers > ConsoleLogger logs without throwing
10
+ [Test] WARN: test
11
+ [Test] ERROR: test Error: e
12
+ at /Users/vserifsaglam/work/memory-experiment/packages/shared/src/__tests__/shared.test.ts:241:43
13
+ at Proxy.assertThrows (file:///Users/vserifsaglam/work/memory-experiment/node_modules/chai/index.js:2767:5)
14
+ at Proxy.methodWrapper (file:///Users/vserifsaglam/work/memory-experiment/node_modules/chai/index.js:1686:25)
15
+ at Proxy.<anonymous> (file:///Users/vserifsaglam/work/memory-experiment/node_modules/@vitest/expect/dist/index.js:1088:12)
16
+ at Proxy.overwritingMethodWrapper (file:///Users/vserifsaglam/work/memory-experiment/node_modules/chai/index.js:1735:33)
17
+ at Proxy.<anonymous> (file:///Users/vserifsaglam/work/memory-experiment/node_modules/@vitest/expect/dist/index.js:1420:16)
18
+ at Proxy.<anonymous> (file:///Users/vserifsaglam/work/memory-experiment/node_modules/@vitest/expect/dist/index.js:1029:14)
19
+ at Proxy.methodWrapper (file:///Users/vserifsaglam/work/memory-experiment/node_modules/chai/index.js:1686:25)
20
+ at /Users/vserifsaglam/work/memory-experiment/packages/shared/src/__tests__/shared.test.ts:241:64
21
+ at file:///Users/vserifsaglam/work/memory-experiment/node_modules/@vitest/runner/dist/chunk-hooks.js:155:11
22
+
23
+ ✓ src/__tests__/shared.test.ts (28 tests) 20ms
24
+ ✓ src/__tests__/shared-extra.test.ts (8 tests) 35ms
25
+
26
+ Test Files 2 passed (2)
27
+ Tests 36 passed (36)
28
+ Start at 20:16:33
29
+ Duration 458ms (transform 86ms, setup 0ms, collect 182ms, tests 55ms, environment 0ms, prepare 163ms)
30
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @kognitivedev/shared
2
2
 
3
+ ## 0.2.8
4
+
5
+ ### Patch Changes
6
+
7
+ - release
8
+
9
+ ## 0.2.7
10
+
11
+ ### Patch Changes
12
+
13
+ - release
14
+
15
+ ## 0.2.6
16
+
17
+ ### Patch Changes
18
+
19
+ - release
20
+
3
21
  ## 0.2.5
4
22
 
5
23
  ### Patch Changes
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const index_1 = require("../index");
5
+ (0, vitest_1.describe)("streaming helpers", () => {
6
+ (0, vitest_1.it)("parses comma-separated modes and removes duplicates", () => {
7
+ (0, vitest_1.expect)((0, index_1.parseStreamModes)("messages,debug,messages")).toEqual(["messages", "debug"]);
8
+ });
9
+ (0, vitest_1.it)("defaults to messages when input is empty", () => {
10
+ (0, vitest_1.expect)((0, index_1.parseStreamModes)(undefined)).toEqual(["messages"]);
11
+ });
12
+ (0, vitest_1.it)("rejects invalid modes", () => {
13
+ (0, vitest_1.expect)(() => (0, index_1.parseStreamModes)("messages,invalid")).toThrow('Invalid stream mode: "invalid"');
14
+ });
15
+ (0, vitest_1.it)("encodes SSE events", async () => {
16
+ const encoder = (0, index_1.createSSEEncoder)();
17
+ const writer = encoder.writable.getWriter();
18
+ const chunks = [];
19
+ const reader = encoder.readable.getReader();
20
+ const readPromise = (async () => {
21
+ while (true) {
22
+ const { done, value } = await reader.read();
23
+ if (done)
24
+ break;
25
+ chunks.push(value);
26
+ }
27
+ })();
28
+ await writer.write({ event: "values", data: { step: 1 } });
29
+ await writer.close();
30
+ await readPromise;
31
+ (0, vitest_1.expect)(new TextDecoder().decode(chunks[0])).toContain("event: values");
32
+ (0, vitest_1.expect)(new TextDecoder().decode(chunks[0])).toContain('data: {"step":1}');
33
+ });
34
+ (0, vitest_1.it)("returns SSE headers", () => {
35
+ (0, vitest_1.expect)((0, index_1.sseHeaders)()).toEqual({
36
+ "Content-Type": "text/event-stream",
37
+ "Cache-Control": "no-cache",
38
+ Connection: "keep-alive",
39
+ });
40
+ });
41
+ });
42
+ (0, vitest_1.describe)("telemetry helpers", () => {
43
+ (0, vitest_1.it)("ends a span with error status", () => {
44
+ const span = {
45
+ setStatus: vitest_1.vi.fn(),
46
+ end: vitest_1.vi.fn(),
47
+ isRecording: () => true,
48
+ setAttribute: vitest_1.vi.fn(),
49
+ };
50
+ (0, index_1.endSpan)(span, new Error("boom"));
51
+ (0, vitest_1.expect)(span.setStatus).toHaveBeenCalledWith({ code: 2, message: "boom" });
52
+ (0, vitest_1.expect)(span.end).toHaveBeenCalledTimes(1);
53
+ });
54
+ (0, vitest_1.it)("runs withSpan and propagates errors", async () => {
55
+ const result = await (0, index_1.withSpan)("test", async (span) => {
56
+ span.setAttribute("key", true);
57
+ return 42;
58
+ });
59
+ (0, vitest_1.expect)(result).toBe(42);
60
+ await (0, vitest_1.expect)((0, index_1.withSpan)("test", async () => {
61
+ throw new Error("fail");
62
+ })).rejects.toThrow("fail");
63
+ });
64
+ });
65
+ (0, vitest_1.describe)("template helper", () => {
66
+ (0, vitest_1.it)("renders a template from shared", () => {
67
+ (0, vitest_1.expect)((0, index_1.renderTemplate)("Hello {{name}}", { name: "Ada" })).toBe("Hello Ada");
68
+ });
69
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kognitivedev/shared",
3
- "version": "0.2.5",
3
+ "version": "0.2.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "publishConfig": {
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { createSSEEncoder, endSpan, parseStreamModes, sseHeaders, withSpan, renderTemplate } from "../index";
3
+
4
+ describe("streaming helpers", () => {
5
+ it("parses comma-separated modes and removes duplicates", () => {
6
+ expect(parseStreamModes("messages,debug,messages")).toEqual(["messages", "debug"]);
7
+ });
8
+
9
+ it("defaults to messages when input is empty", () => {
10
+ expect(parseStreamModes(undefined)).toEqual(["messages"]);
11
+ });
12
+
13
+ it("rejects invalid modes", () => {
14
+ expect(() => parseStreamModes("messages,invalid")).toThrow('Invalid stream mode: "invalid"');
15
+ });
16
+
17
+ it("encodes SSE events", async () => {
18
+ const encoder = createSSEEncoder();
19
+ const writer = encoder.writable.getWriter();
20
+ const chunks: Uint8Array[] = [];
21
+ const reader = encoder.readable.getReader();
22
+
23
+ const readPromise = (async () => {
24
+ while (true) {
25
+ const { done, value } = await reader.read();
26
+ if (done) break;
27
+ chunks.push(value);
28
+ }
29
+ })();
30
+
31
+ await writer.write({ event: "values", data: { step: 1 } });
32
+ await writer.close();
33
+ await readPromise;
34
+
35
+ expect(new TextDecoder().decode(chunks[0])).toContain("event: values");
36
+ expect(new TextDecoder().decode(chunks[0])).toContain('data: {"step":1}');
37
+ });
38
+
39
+ it("returns SSE headers", () => {
40
+ expect(sseHeaders()).toEqual({
41
+ "Content-Type": "text/event-stream",
42
+ "Cache-Control": "no-cache",
43
+ Connection: "keep-alive",
44
+ });
45
+ });
46
+ });
47
+
48
+ describe("telemetry helpers", () => {
49
+ it("ends a span with error status", () => {
50
+ const span = {
51
+ setStatus: vi.fn(),
52
+ end: vi.fn(),
53
+ isRecording: () => true,
54
+ setAttribute: vi.fn(),
55
+ };
56
+
57
+ endSpan(span, new Error("boom"));
58
+
59
+ expect(span.setStatus).toHaveBeenCalledWith({ code: 2, message: "boom" });
60
+ expect(span.end).toHaveBeenCalledTimes(1);
61
+ });
62
+
63
+ it("runs withSpan and propagates errors", async () => {
64
+ const result = await withSpan("test", async (span) => {
65
+ span.setAttribute("key", true);
66
+ return 42;
67
+ });
68
+
69
+ expect(result).toBe(42);
70
+
71
+ await expect(withSpan("test", async () => {
72
+ throw new Error("fail");
73
+ })).rejects.toThrow("fail");
74
+ });
75
+ });
76
+
77
+ describe("template helper", () => {
78
+ it("renders a template from shared", () => {
79
+ expect(renderTemplate("Hello {{name}}", { name: "Ada" })).toBe("Hello Ada");
80
+ });
81
+ });