@melra/file-runtime 0.3.0-alpha.11 → 0.3.0-alpha.12
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/package.json +3 -3
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -59
- package/dist/index.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@melra/file-runtime",
|
|
3
|
-
"version": "0.3.0-alpha.
|
|
3
|
+
"version": "0.3.0-alpha.12",
|
|
4
4
|
"description": "Workspace-confined file reference effect adapter for the MELRA kernel.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
"dist"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@melra/protocol": "0.3.0-alpha.
|
|
24
|
+
"@melra/protocol": "0.3.0-alpha.12"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
27
|
"build": "tsc -p tsconfig.json",
|
|
28
28
|
"clean": "rm -rf dist",
|
|
29
29
|
"test": "vitest run",
|
|
30
|
-
"typecheck": "tsc -p tsconfig.json
|
|
30
|
+
"typecheck": "tsc -p tsconfig.test.json"
|
|
31
31
|
}
|
|
32
32
|
}
|
package/dist/index.test.d.ts
DELETED
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
package/dist/index.test.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { mkdtemp, readFile, realpath, rm, symlink, writeFile } from "node:fs/promises";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join, parse } from "node:path";
|
|
6
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
-
import { FileOperationSchema } from "@melra/protocol";
|
|
8
|
-
import { FileRuntime } from "./index.js";
|
|
9
|
-
const roots = [];
|
|
10
|
-
afterEach(async () => {
|
|
11
|
-
await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
|
|
12
|
-
});
|
|
13
|
-
describe("FileRuntime", () => {
|
|
14
|
-
it("writes atomically and returns a content hash", async () => {
|
|
15
|
-
const root = await mkdtemp(join(tmpdir(), "melra-file-"));
|
|
16
|
-
roots.push(root);
|
|
17
|
-
const runtime = await FileRuntime.create({ root });
|
|
18
|
-
const result = await runtime.execute(FileOperationSchema.parse({
|
|
19
|
-
kind: "file",
|
|
20
|
-
action: "write",
|
|
21
|
-
path: "artifacts/result.txt",
|
|
22
|
-
content: "verified",
|
|
23
|
-
}));
|
|
24
|
-
expect(result.written).toBe(true);
|
|
25
|
-
expect(await readFile(join(root, "artifacts/result.txt"), "utf8")).toBe("verified");
|
|
26
|
-
expect(result.sha256).toMatch(/^[a-f0-9]{64}$/);
|
|
27
|
-
});
|
|
28
|
-
it("blocks traversal and escaping symlinks", async () => {
|
|
29
|
-
const root = await mkdtemp(join(tmpdir(), "melra-file-"));
|
|
30
|
-
const outside = await mkdtemp(join(tmpdir(), "melra-outside-"));
|
|
31
|
-
roots.push(root, outside);
|
|
32
|
-
await writeFile(join(outside, "secret.txt"), "secret");
|
|
33
|
-
await symlink(outside, join(root, "escape"));
|
|
34
|
-
const runtime = await FileRuntime.create({ root });
|
|
35
|
-
await expect(runtime.execute(FileOperationSchema.parse({
|
|
36
|
-
kind: "file",
|
|
37
|
-
action: "read",
|
|
38
|
-
path: "../secret.txt",
|
|
39
|
-
}))).rejects.toThrow("path_outside_workspace");
|
|
40
|
-
await expect(runtime.execute(FileOperationSchema.parse({
|
|
41
|
-
kind: "file",
|
|
42
|
-
action: "read",
|
|
43
|
-
path: "escape/secret.txt",
|
|
44
|
-
}))).rejects.toThrow("path_outside_workspace");
|
|
45
|
-
});
|
|
46
|
-
it("creates a missing root but accepts one it cannot create", async () => {
|
|
47
|
-
// A workspace the user has not made yet is created for them.
|
|
48
|
-
const parent = await mkdtemp(join(tmpdir(), "melra-file-"));
|
|
49
|
-
roots.push(parent);
|
|
50
|
-
const nested = join(parent, "workspace", "inner");
|
|
51
|
-
expect((await FileRuntime.create({ root: nested })).root).toBe(await realpath(nested));
|
|
52
|
-
// Unhinged mode roots this runtime at the filesystem root. That directory
|
|
53
|
-
// always exists, but Windows answers `mkdir C:\` with EPERM instead of the
|
|
54
|
-
// no-op POSIX gives for an existing directory, so `create` must not ask.
|
|
55
|
-
const driveRoot = parse(tmpdir()).root;
|
|
56
|
-
expect((await FileRuntime.create({ root: driveRoot })).root).toBe(await realpath(driveRoot));
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|