@jamesaphoenix/tx-api-server 0.1.2 → 0.5.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.
- package/dist/__tests__/api.test.d.ts +7 -0
- package/dist/__tests__/api.test.d.ts.map +1 -0
- package/dist/__tests__/api.test.js +184 -0
- package/dist/__tests__/api.test.js.map +1 -0
- package/dist/__tests__/auth.test.d.ts +7 -0
- package/dist/__tests__/auth.test.d.ts.map +1 -0
- package/dist/__tests__/auth.test.js +174 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/body-limit.test.d.ts +7 -0
- package/dist/__tests__/body-limit.test.d.ts.map +1 -0
- package/dist/__tests__/body-limit.test.js +60 -0
- package/dist/__tests__/body-limit.test.js.map +1 -0
- package/dist/__tests__/health.test.d.ts.map +1 -0
- package/dist/__tests__/health.test.js.map +1 -0
- package/dist/__tests__/log-reader.test.d.ts +8 -0
- package/dist/__tests__/log-reader.test.d.ts.map +1 -0
- package/dist/__tests__/log-reader.test.js +55 -0
- package/dist/__tests__/log-reader.test.js.map +1 -0
- package/dist/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit.test.js.map +1 -0
- package/dist/__tests__/server-lib.test.d.ts +10 -0
- package/dist/__tests__/server-lib.test.d.ts.map +1 -0
- package/dist/__tests__/server-lib.test.js +145 -0
- package/dist/__tests__/server-lib.test.js.map +1 -0
- package/dist/api.d.ts +420 -263
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +183 -123
- package/dist/api.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/middleware/auth.d.ts +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +9 -7
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/cycles.d.ts +10 -0
- package/dist/routes/cycles.d.ts.map +1 -0
- package/dist/routes/cycles.js +153 -0
- package/dist/routes/cycles.js.map +1 -0
- package/dist/routes/docs.d.ts +2 -2
- package/dist/routes/docs.d.ts.map +1 -1
- package/dist/routes/docs.js +114 -52
- package/dist/routes/docs.js.map +1 -1
- package/dist/routes/messages.d.ts +9 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +67 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +1 -4
- package/dist/routes/runs.js.map +1 -1
- package/dist/server-lib.d.ts +1 -1
- package/dist/server-lib.d.ts.map +1 -1
- package/dist/server-lib.js +5 -6
- package/dist/server-lib.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/utils/transcript-parser.js +8 -10
- package/dist/utils/transcript-parser.js.map +1 -1
- package/package.json +3 -8
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Library Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for server configuration and module exports.
|
|
5
|
+
* Note: makeServerLive and route layers require bun:sqlite (via tx-core)
|
|
6
|
+
* and can only be tested with `bun test`. These tests cover the parts
|
|
7
|
+
* that work in Node.js vitest.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
10
|
+
import { isAuthEnabled } from "../middleware/auth.js";
|
|
11
|
+
import { getCorsConfig } from "../middleware/cors.js";
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Auth Configuration Tests
|
|
14
|
+
// =============================================================================
|
|
15
|
+
describe("Server auth configuration", () => {
|
|
16
|
+
let savedEnv;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
savedEnv = {
|
|
19
|
+
TX_API_PORT: process.env.TX_API_PORT,
|
|
20
|
+
TX_API_HOST: process.env.TX_API_HOST,
|
|
21
|
+
TX_DB_PATH: process.env.TX_DB_PATH,
|
|
22
|
+
TX_API_KEY: process.env.TX_API_KEY,
|
|
23
|
+
TX_API_CORS_ORIGIN: process.env.TX_API_CORS_ORIGIN,
|
|
24
|
+
TX_API_CORS_CREDENTIALS: process.env.TX_API_CORS_CREDENTIALS,
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
for (const [key, value] of Object.entries(savedEnv)) {
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
delete process.env[key];
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
process.env[key] = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
it("should detect auth enabled via TX_API_KEY", () => {
|
|
38
|
+
process.env.TX_API_KEY = "my-secret-key";
|
|
39
|
+
expect(isAuthEnabled()).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it("should detect auth disabled when TX_API_KEY not set", () => {
|
|
42
|
+
delete process.env.TX_API_KEY;
|
|
43
|
+
expect(isAuthEnabled()).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it("should detect auth disabled for empty TX_API_KEY", () => {
|
|
46
|
+
process.env.TX_API_KEY = "";
|
|
47
|
+
expect(isAuthEnabled()).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// CORS Configuration Tests
|
|
52
|
+
// =============================================================================
|
|
53
|
+
describe("CORS configuration", () => {
|
|
54
|
+
let savedEnv;
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
savedEnv = {
|
|
57
|
+
TX_API_CORS_ORIGIN: process.env.TX_API_CORS_ORIGIN,
|
|
58
|
+
TX_API_CORS_CREDENTIALS: process.env.TX_API_CORS_CREDENTIALS,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
afterEach(() => {
|
|
62
|
+
for (const [key, value] of Object.entries(savedEnv)) {
|
|
63
|
+
if (value === undefined) {
|
|
64
|
+
delete process.env[key];
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
process.env[key] = value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it("should default to localhost origins when TX_API_CORS_ORIGIN is not set", () => {
|
|
72
|
+
delete process.env.TX_API_CORS_ORIGIN;
|
|
73
|
+
const config = getCorsConfig();
|
|
74
|
+
expect(config.allowedOrigins).toEqual([
|
|
75
|
+
"http://localhost:3000",
|
|
76
|
+
"http://localhost:3001",
|
|
77
|
+
"http://localhost:5173",
|
|
78
|
+
"http://127.0.0.1:3000",
|
|
79
|
+
"http://127.0.0.1:3001",
|
|
80
|
+
"http://127.0.0.1:5173",
|
|
81
|
+
]);
|
|
82
|
+
// Must NOT include wildcard by default
|
|
83
|
+
expect(config.allowedOrigins).not.toContain("*");
|
|
84
|
+
});
|
|
85
|
+
it("should allow wildcard only when explicitly set to *", () => {
|
|
86
|
+
process.env.TX_API_CORS_ORIGIN = "*";
|
|
87
|
+
const config = getCorsConfig();
|
|
88
|
+
expect(config.allowedOrigins).toEqual(["*"]);
|
|
89
|
+
});
|
|
90
|
+
it("should parse comma-separated origins", () => {
|
|
91
|
+
process.env.TX_API_CORS_ORIGIN = "https://app.example.com, https://admin.example.com";
|
|
92
|
+
const config = getCorsConfig();
|
|
93
|
+
expect(config.allowedOrigins).toEqual([
|
|
94
|
+
"https://app.example.com",
|
|
95
|
+
"https://admin.example.com",
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
it("should handle single custom origin", () => {
|
|
99
|
+
process.env.TX_API_CORS_ORIGIN = "https://myapp.com";
|
|
100
|
+
const config = getCorsConfig();
|
|
101
|
+
expect(config.allowedOrigins).toEqual(["https://myapp.com"]);
|
|
102
|
+
});
|
|
103
|
+
it("should enable credentials when TX_API_CORS_CREDENTIALS is true", () => {
|
|
104
|
+
process.env.TX_API_CORS_CREDENTIALS = "true";
|
|
105
|
+
const config = getCorsConfig();
|
|
106
|
+
expect(config.credentials).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
it("should disable credentials by default", () => {
|
|
109
|
+
delete process.env.TX_API_CORS_CREDENTIALS;
|
|
110
|
+
const config = getCorsConfig();
|
|
111
|
+
expect(config.credentials).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
// =============================================================================
|
|
115
|
+
// API Definition Exports Tests (no bun:sqlite dependency)
|
|
116
|
+
// =============================================================================
|
|
117
|
+
describe("API definition exports", () => {
|
|
118
|
+
it("should export TxApi class from api.ts", async () => {
|
|
119
|
+
const { TxApi } = await import("../api.js");
|
|
120
|
+
expect(TxApi).toBeDefined();
|
|
121
|
+
});
|
|
122
|
+
it("should export all error types from api.ts", async () => {
|
|
123
|
+
const { NotFound, BadRequest, InternalError, Unauthorized, Forbidden, ServiceUnavailable } = await import("../api.js");
|
|
124
|
+
expect(NotFound).toBeDefined();
|
|
125
|
+
expect(BadRequest).toBeDefined();
|
|
126
|
+
expect(InternalError).toBeDefined();
|
|
127
|
+
expect(Unauthorized).toBeDefined();
|
|
128
|
+
expect(Forbidden).toBeDefined();
|
|
129
|
+
expect(ServiceUnavailable).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
it("should export mapCoreError from api.ts", async () => {
|
|
132
|
+
const { mapCoreError } = await import("../api.js");
|
|
133
|
+
expect(mapCoreError).toBeDefined();
|
|
134
|
+
expect(typeof mapCoreError).toBe("function");
|
|
135
|
+
});
|
|
136
|
+
it("should export all API groups from api.ts", async () => {
|
|
137
|
+
const { HealthGroup, TasksGroup, LearningsGroup, RunsGroup, SyncGroup } = await import("../api.js");
|
|
138
|
+
expect(HealthGroup).toBeDefined();
|
|
139
|
+
expect(TasksGroup).toBeDefined();
|
|
140
|
+
expect(LearningsGroup).toBeDefined();
|
|
141
|
+
expect(RunsGroup).toBeDefined();
|
|
142
|
+
expect(SyncGroup).toBeDefined();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=server-lib.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-lib.test.js","sourceRoot":"","sources":["../../src/__tests__/server-lib.test.ts"],"names":[],"mappings":"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"}
|