git-daemon 0.1.1 → 0.1.3

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,103 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const supertest_1 = __importDefault(require("supertest"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const fs_1 = require("fs");
11
+ const pino_1 = __importDefault(require("pino"));
12
+ const app_1 = require("../src/app");
13
+ const tokens_1 = require("../src/tokens");
14
+ const pairing_1 = require("../src/pairing");
15
+ const jobs_1 = require("../src/jobs");
16
+ const createTempDir = async () => fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "git-daemon-test-"));
17
+ const createConfig = (workspaceRoot, origin) => ({
18
+ configVersion: 1,
19
+ server: { host: "127.0.0.1", port: 0 },
20
+ originAllowlist: [origin],
21
+ workspaceRoot,
22
+ pairing: { tokenTtlDays: 30 },
23
+ jobs: { maxConcurrent: 1, timeoutSeconds: 60 },
24
+ deps: { defaultSafer: true },
25
+ logging: { directory: "logs", maxFiles: 1, maxBytes: 1024 },
26
+ approvals: { entries: [] },
27
+ });
28
+ const createContext = async (workspaceRoot, origin) => {
29
+ const configDir = await createTempDir();
30
+ const config = createConfig(workspaceRoot, origin);
31
+ const tokenStore = new tokens_1.TokenStore(configDir);
32
+ await tokenStore.load();
33
+ const pairingManager = new pairing_1.PairingManager(tokenStore, config.pairing.tokenTtlDays);
34
+ const jobManager = new jobs_1.JobManager(config.jobs.maxConcurrent, config.jobs.timeoutSeconds);
35
+ const logger = (0, pino_1.default)({ enabled: false });
36
+ const capabilities = { tools: {} };
37
+ const ctx = {
38
+ config,
39
+ configDir,
40
+ tokenStore,
41
+ pairingManager,
42
+ jobManager,
43
+ capabilities,
44
+ logger,
45
+ version: "0.1.0",
46
+ build: undefined,
47
+ };
48
+ return { ctx, app: (0, app_1.createApp)(ctx) };
49
+ };
50
+ (0, vitest_1.describe)("Git Daemon API", () => {
51
+ const origin = "http://localhost:5173";
52
+ (0, vitest_1.it)("rejects missing Origin header", async () => {
53
+ const { app } = await createContext(null, origin);
54
+ const res = await (0, supertest_1.default)(app).get("/v1/meta").set("Host", "127.0.0.1");
55
+ (0, vitest_1.expect)(res.status).toBe(403);
56
+ (0, vitest_1.expect)(res.body.errorCode).toBe("origin_not_allowed");
57
+ });
58
+ (0, vitest_1.it)("returns meta for allowed origin", async () => {
59
+ const { app } = await createContext(null, origin);
60
+ const res = await (0, supertest_1.default)(app)
61
+ .get("/v1/meta")
62
+ .set("Origin", origin)
63
+ .set("Host", "127.0.0.1");
64
+ (0, vitest_1.expect)(res.status).toBe(200);
65
+ (0, vitest_1.expect)(res.body.version).toBeTypeOf("string");
66
+ (0, vitest_1.expect)(res.body.pairing).toBeTruthy();
67
+ });
68
+ (0, vitest_1.it)("requires auth for protected routes", async () => {
69
+ const { app } = await createContext(null, origin);
70
+ const res = await (0, supertest_1.default)(app)
71
+ .get("/v1/git/status")
72
+ .query({ repoPath: "repo" })
73
+ .set("Origin", origin)
74
+ .set("Host", "127.0.0.1");
75
+ (0, vitest_1.expect)(res.status).toBe(401);
76
+ (0, vitest_1.expect)(res.body.errorCode).toBe("auth_required");
77
+ });
78
+ (0, vitest_1.it)("returns workspace_required when not configured", async () => {
79
+ const { app, ctx } = await createContext(null, origin);
80
+ const { token } = await ctx.tokenStore.issueToken(origin, 30);
81
+ const res = await (0, supertest_1.default)(app)
82
+ .get("/v1/git/status")
83
+ .query({ repoPath: "repo" })
84
+ .set("Origin", origin)
85
+ .set("Host", "127.0.0.1")
86
+ .set("Authorization", `Bearer ${token}`);
87
+ (0, vitest_1.expect)(res.status).toBe(409);
88
+ (0, vitest_1.expect)(res.body.errorCode).toBe("workspace_required");
89
+ });
90
+ (0, vitest_1.it)("validates repoUrl on clone", async () => {
91
+ const workspaceRoot = await createTempDir();
92
+ const { app, ctx } = await createContext(workspaceRoot, origin);
93
+ const { token } = await ctx.tokenStore.issueToken(origin, 30);
94
+ const res = await (0, supertest_1.default)(app)
95
+ .post("/v1/git/clone")
96
+ .set("Origin", origin)
97
+ .set("Host", "127.0.0.1")
98
+ .set("Authorization", `Bearer ${token}`)
99
+ .send({ repoUrl: "file:///tmp/repo", destRelative: "repo" });
100
+ (0, vitest_1.expect)(res.status).toBe(422);
101
+ (0, vitest_1.expect)(res.body.errorCode).toBe("invalid_repo_url");
102
+ });
103
+ });
package/tsconfig.json CHANGED
@@ -10,5 +10,6 @@
10
10
  "skipLibCheck": true,
11
11
  "resolveJsonModule": true
12
12
  },
13
- "include": ["src", "tests", "vitest.config.ts"]
13
+ "include": ["src"],
14
+ "exclude": ["tests", "vitest.config.ts"]
14
15
  }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_1 = require("vitest/config");
4
+ exports.default = (0, config_1.defineConfig)({
5
+ test: {
6
+ environment: "node",
7
+ include: ["tests/**/*.test.ts"],
8
+ },
9
+ });