@smthrs/kernel 0.0.0-stage → 1.0.0-rc.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.
- package/CHANGELOG.md +206 -0
- package/LICENSE +21 -0
- package/README.md +154 -2
- package/dist/cjs/CapabilitySet.d.ts +6 -0
- package/dist/cjs/CapabilitySet.d.ts.map +1 -0
- package/dist/cjs/CapabilitySet.js +19 -0
- package/dist/cjs/CapabilitySet.js.map +7 -0
- package/dist/cjs/ChildProcessEnvironment.d.ts +60 -0
- package/dist/cjs/ChildProcessEnvironment.d.ts.map +1 -0
- package/dist/cjs/ChildProcessEnvironment.js +61 -0
- package/dist/cjs/ChildProcessEnvironment.js.map +7 -0
- package/dist/cjs/ChildProcessSpawner.d.ts +100 -0
- package/dist/cjs/ChildProcessSpawner.d.ts.map +1 -0
- package/dist/cjs/ChildProcessSpawner.js +291 -0
- package/dist/cjs/ChildProcessSpawner.js.map +7 -0
- package/dist/cjs/CommandLine.d.ts +173 -0
- package/dist/cjs/CommandLine.d.ts.map +1 -0
- package/dist/cjs/CommandLine.js +54 -0
- package/dist/cjs/CommandLine.js.map +7 -0
- package/dist/cjs/ContainedSpawner.d.ts +135 -0
- package/dist/cjs/ContainedSpawner.d.ts.map +1 -0
- package/dist/cjs/ContainedSpawner.js +141 -0
- package/dist/cjs/ContainedSpawner.js.map +7 -0
- package/dist/cjs/FileSystem.d.ts +452 -0
- package/dist/cjs/FileSystem.d.ts.map +1 -0
- package/dist/cjs/FileSystem.js +890 -0
- package/dist/cjs/FileSystem.js.map +7 -0
- package/dist/cjs/FileSystemBatch.d.ts +94 -0
- package/dist/cjs/FileSystemBatch.d.ts.map +1 -0
- package/dist/cjs/FileSystemBatch.js +31 -0
- package/dist/cjs/FileSystemBatch.js.map +7 -0
- package/dist/cjs/GrantEvent.d.ts +240 -0
- package/dist/cjs/GrantEvent.d.ts.map +1 -0
- package/dist/cjs/GrantEvent.js +115 -0
- package/dist/cjs/GrantEvent.js.map +7 -0
- package/dist/cjs/GrantStore.d.ts +270 -0
- package/dist/cjs/GrantStore.d.ts.map +1 -0
- package/dist/cjs/GrantStore.js +857 -0
- package/dist/cjs/GrantStore.js.map +7 -0
- package/dist/cjs/HostError.d.ts +36 -0
- package/dist/cjs/HostError.d.ts.map +1 -0
- package/dist/cjs/HostError.js +17 -0
- package/dist/cjs/HostError.js.map +7 -0
- package/dist/cjs/HostServices.d.ts +101 -0
- package/dist/cjs/HostServices.d.ts.map +1 -0
- package/dist/cjs/HostServices.js +66 -0
- package/dist/cjs/HostServices.js.map +7 -0
- package/dist/cjs/HttpClient.d.ts +177 -0
- package/dist/cjs/HttpClient.d.ts.map +1 -0
- package/dist/cjs/HttpClient.js +217 -0
- package/dist/cjs/HttpClient.js.map +7 -0
- package/dist/cjs/Jj.d.ts +67 -0
- package/dist/cjs/Jj.d.ts.map +1 -0
- package/dist/cjs/Jj.js +118 -0
- package/dist/cjs/Jj.js.map +7 -0
- package/dist/cjs/JournalGrantStore.d.ts +65 -0
- package/dist/cjs/JournalGrantStore.d.ts.map +1 -0
- package/dist/cjs/JournalGrantStore.js +354 -0
- package/dist/cjs/JournalGrantStore.js.map +7 -0
- package/dist/cjs/Path.d.ts +37 -0
- package/dist/cjs/Path.d.ts.map +1 -0
- package/dist/cjs/Path.js +46 -0
- package/dist/cjs/Path.js.map +7 -0
- package/dist/cjs/ProcessConfinement.d.ts +55 -0
- package/dist/cjs/ProcessConfinement.d.ts.map +1 -0
- package/dist/cjs/ProcessConfinement.js +94 -0
- package/dist/cjs/ProcessConfinement.js.map +7 -0
- package/dist/cjs/ProcessLedger.d.ts +260 -0
- package/dist/cjs/ProcessLedger.d.ts.map +1 -0
- package/dist/cjs/ProcessLedger.js +190 -0
- package/dist/cjs/ProcessLedger.js.map +7 -0
- package/dist/cjs/Rooted.d.ts +53 -0
- package/dist/cjs/Rooted.d.ts.map +1 -0
- package/dist/cjs/Rooted.js +101 -0
- package/dist/cjs/Rooted.js.map +7 -0
- package/dist/cjs/Unreachable.d.ts +27 -0
- package/dist/cjs/Unreachable.d.ts.map +1 -0
- package/dist/cjs/Unreachable.js +43 -0
- package/dist/cjs/Unreachable.js.map +7 -0
- package/dist/cjs/Workspace.d.ts +62 -0
- package/dist/cjs/Workspace.d.ts.map +1 -0
- package/dist/cjs/Workspace.js +35 -0
- package/dist/cjs/Workspace.js.map +7 -0
- package/dist/cjs/index.d.ts +161 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +73 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/Containment.d.ts +24 -0
- package/dist/cjs/internal/Containment.d.ts.map +1 -0
- package/dist/cjs/internal/Containment.js +30 -0
- package/dist/cjs/internal/Containment.js.map +7 -0
- package/dist/cjs/internal/Pipeline.d.ts +18 -0
- package/dist/cjs/internal/Pipeline.d.ts.map +1 -0
- package/dist/cjs/internal/Pipeline.js +90 -0
- package/dist/cjs/internal/Pipeline.js.map +7 -0
- package/dist/cjs/internal/makeCapability.d.ts +16 -0
- package/dist/cjs/internal/makeCapability.d.ts.map +1 -0
- package/dist/cjs/internal/makeCapability.js +44 -0
- package/dist/cjs/internal/makeCapability.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/FileSystemBatchContract.d.ts +15 -0
- package/dist/cjs/test/FileSystemBatchContract.d.ts.map +1 -0
- package/dist/cjs/test/FileSystemBatchContract.js +76 -0
- package/dist/cjs/test/FileSystemBatchContract.js.map +7 -0
- package/dist/cjs/test/HostContract.d.ts +225 -0
- package/dist/cjs/test/HostContract.d.ts.map +1 -0
- package/dist/cjs/test/HostContract.js +489 -0
- package/dist/cjs/test/HostContract.js.map +7 -0
- package/dist/cjs/test/TestGrantStore.d.ts +31 -0
- package/dist/cjs/test/TestGrantStore.d.ts.map +1 -0
- package/dist/cjs/test/TestGrantStore.js +65 -0
- package/dist/cjs/test/TestGrantStore.js.map +7 -0
- package/dist/esm/CapabilitySet.d.ts +6 -0
- package/dist/esm/CapabilitySet.d.ts.map +1 -0
- package/dist/esm/CapabilitySet.js +6 -0
- package/dist/esm/CapabilitySet.js.map +1 -0
- package/dist/esm/ChildProcessEnvironment.d.ts +60 -0
- package/dist/esm/ChildProcessEnvironment.d.ts.map +1 -0
- package/dist/esm/ChildProcessEnvironment.js +91 -0
- package/dist/esm/ChildProcessEnvironment.js.map +1 -0
- package/dist/esm/ChildProcessSpawner.d.ts +100 -0
- package/dist/esm/ChildProcessSpawner.d.ts.map +1 -0
- package/dist/esm/ChildProcessSpawner.js +342 -0
- package/dist/esm/ChildProcessSpawner.js.map +1 -0
- package/dist/esm/CommandLine.d.ts +173 -0
- package/dist/esm/CommandLine.d.ts.map +1 -0
- package/dist/esm/CommandLine.js +195 -0
- package/dist/esm/CommandLine.js.map +1 -0
- package/dist/esm/ContainedSpawner.d.ts +135 -0
- package/dist/esm/ContainedSpawner.d.ts.map +1 -0
- package/dist/esm/ContainedSpawner.js +180 -0
- package/dist/esm/ContainedSpawner.js.map +1 -0
- package/dist/esm/FileSystem.d.ts +452 -0
- package/dist/esm/FileSystem.d.ts.map +1 -0
- package/dist/esm/FileSystem.js +989 -0
- package/dist/esm/FileSystem.js.map +1 -0
- package/dist/esm/FileSystemBatch.d.ts +94 -0
- package/dist/esm/FileSystemBatch.d.ts.map +1 -0
- package/dist/esm/FileSystemBatch.js +26 -0
- package/dist/esm/FileSystemBatch.js.map +1 -0
- package/dist/esm/GrantEvent.d.ts +240 -0
- package/dist/esm/GrantEvent.d.ts.map +1 -0
- package/dist/esm/GrantEvent.js +155 -0
- package/dist/esm/GrantEvent.js.map +1 -0
- package/dist/esm/GrantStore.d.ts +270 -0
- package/dist/esm/GrantStore.d.ts.map +1 -0
- package/dist/esm/GrantStore.js +951 -0
- package/dist/esm/GrantStore.js.map +1 -0
- package/dist/esm/HostError.d.ts +36 -0
- package/dist/esm/HostError.d.ts.map +1 -0
- package/dist/esm/HostError.js +20 -0
- package/dist/esm/HostError.js.map +1 -0
- package/dist/esm/HostServices.d.ts +101 -0
- package/dist/esm/HostServices.d.ts.map +1 -0
- package/dist/esm/HostServices.js +76 -0
- package/dist/esm/HostServices.js.map +1 -0
- package/dist/esm/HttpClient.d.ts +177 -0
- package/dist/esm/HttpClient.d.ts.map +1 -0
- package/dist/esm/HttpClient.js +299 -0
- package/dist/esm/HttpClient.js.map +1 -0
- package/dist/esm/Jj.d.ts +67 -0
- package/dist/esm/Jj.d.ts.map +1 -0
- package/dist/esm/Jj.js +111 -0
- package/dist/esm/Jj.js.map +1 -0
- package/dist/esm/JournalGrantStore.d.ts +65 -0
- package/dist/esm/JournalGrantStore.d.ts.map +1 -0
- package/dist/esm/JournalGrantStore.js +350 -0
- package/dist/esm/JournalGrantStore.js.map +1 -0
- package/dist/esm/Path.d.ts +37 -0
- package/dist/esm/Path.d.ts.map +1 -0
- package/dist/esm/Path.js +34 -0
- package/dist/esm/Path.js.map +1 -0
- package/dist/esm/ProcessConfinement.d.ts +55 -0
- package/dist/esm/ProcessConfinement.d.ts.map +1 -0
- package/dist/esm/ProcessConfinement.js +106 -0
- package/dist/esm/ProcessConfinement.js.map +1 -0
- package/dist/esm/ProcessLedger.d.ts +260 -0
- package/dist/esm/ProcessLedger.d.ts.map +1 -0
- package/dist/esm/ProcessLedger.js +283 -0
- package/dist/esm/ProcessLedger.js.map +1 -0
- package/dist/esm/Rooted.d.ts +53 -0
- package/dist/esm/Rooted.d.ts.map +1 -0
- package/dist/esm/Rooted.js +104 -0
- package/dist/esm/Rooted.js.map +1 -0
- package/dist/esm/Unreachable.d.ts +27 -0
- package/dist/esm/Unreachable.d.ts.map +1 -0
- package/dist/esm/Unreachable.js +26 -0
- package/dist/esm/Unreachable.js.map +1 -0
- package/dist/esm/Workspace.d.ts +62 -0
- package/dist/esm/Workspace.d.ts.map +1 -0
- package/dist/esm/Workspace.js +51 -0
- package/dist/esm/Workspace.js.map +1 -0
- package/dist/esm/index.d.ts +161 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +151 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/Containment.d.ts +24 -0
- package/dist/esm/internal/Containment.d.ts.map +1 -0
- package/dist/esm/internal/Containment.js +27 -0
- package/dist/esm/internal/Containment.js.map +1 -0
- package/dist/esm/internal/Pipeline.d.ts +18 -0
- package/dist/esm/internal/Pipeline.d.ts.map +1 -0
- package/dist/esm/internal/Pipeline.js +68 -0
- package/dist/esm/internal/Pipeline.js.map +1 -0
- package/dist/esm/internal/makeCapability.d.ts +16 -0
- package/dist/esm/internal/makeCapability.d.ts.map +1 -0
- package/dist/esm/internal/makeCapability.js +22 -0
- package/dist/esm/internal/makeCapability.js.map +1 -0
- package/dist/esm/test/FileSystemBatchContract.d.ts +15 -0
- package/dist/esm/test/FileSystemBatchContract.d.ts.map +1 -0
- package/dist/esm/test/FileSystemBatchContract.js +57 -0
- package/dist/esm/test/FileSystemBatchContract.js.map +1 -0
- package/dist/esm/test/HostContract.d.ts +225 -0
- package/dist/esm/test/HostContract.d.ts.map +1 -0
- package/dist/esm/test/HostContract.js +460 -0
- package/dist/esm/test/HostContract.js.map +1 -0
- package/dist/esm/test/TestGrantStore.d.ts +31 -0
- package/dist/esm/test/TestGrantStore.d.ts.map +1 -0
- package/dist/esm/test/TestGrantStore.js +57 -0
- package/dist/esm/test/TestGrantStore.js.map +1 -0
- package/docs/README.md +162 -0
- package/docs/api.md +1532 -0
- package/docs/concepts/decoration-in-place.md +117 -0
- package/docs/concepts/filesystem-batches.md +58 -0
- package/docs/concepts/filesystem-confinement.md +168 -0
- package/docs/concepts/grant-decisions.md +181 -0
- package/docs/concepts/process-containment.md +155 -0
- package/docs/contract.md +14 -0
- package/docs/guides/adapt-a-new-host-platform.md +148 -0
- package/docs/guides/answer-permission-requests.md +151 -0
- package/docs/guides/authorize-network-and-model-calls.md +118 -0
- package/docs/guides/contain-spawned-processes.md +118 -0
- package/docs/guides/guard-a-host-bundle.md +109 -0
- package/docs/guides/persist-grants-across-restarts.md +135 -0
- package/docs/guides/write-a-capability-policy.md +159 -0
- package/docs/installation.md +115 -0
- package/docs/quickstart.md +182 -0
- package/docs/testing.md +108 -0
- package/docs/troubleshooting.md +281 -0
- package/package.json +344 -3
- package/src/CapabilitySet.ts +6 -0
- package/src/ChildProcessEnvironment.ts +98 -0
- package/src/ChildProcessSpawner.ts +414 -0
- package/src/CommandLine.ts +250 -0
- package/src/ContainedSpawner.ts +284 -0
- package/src/FileSystem.ts +1655 -0
- package/src/FileSystemBatch.ts +90 -0
- package/src/GrantEvent.ts +174 -0
- package/src/GrantStore.ts +1345 -0
- package/src/HostError.ts +37 -0
- package/src/HostServices.ts +133 -0
- package/src/HttpClient.ts +406 -0
- package/src/Jj.ts +159 -0
- package/src/JournalGrantStore.ts +461 -0
- package/src/Path.ts +47 -0
- package/src/ProcessConfinement.ts +156 -0
- package/src/ProcessLedger.ts +423 -0
- package/src/Rooted.ts +128 -0
- package/src/Unreachable.ts +30 -0
- package/src/Workspace.ts +65 -0
- package/src/index.ts +181 -0
- package/src/internal/Containment.ts +37 -0
- package/src/internal/Pipeline.ts +85 -0
- package/src/internal/makeCapability.ts +26 -0
- package/src/test/FileSystemBatchContract.ts +59 -0
- package/src/test/HostContract.ts +785 -0
- package/src/test/TestGrantStore.ts +73 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The optional atomic batch portion of the shared host contract.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { expect } from "@effect/vitest";
|
|
7
|
+
import { Effect, Option, Path, Result } from "effect";
|
|
8
|
+
import * as KernelFileSystem from "../FileSystem.js";
|
|
9
|
+
/**
|
|
10
|
+
* Exercises every advertised batch implementation over the host contract's
|
|
11
|
+
* fresh `source.txt` fixture. Isolated volumes may omit this optimization.
|
|
12
|
+
*
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
* @category testing
|
|
15
|
+
*/
|
|
16
|
+
export const check = (fs, root) => Effect.gen(function* () {
|
|
17
|
+
const atomic = fs[KernelFileSystem.AtomicFileSystemTypeId];
|
|
18
|
+
if (atomic?.batchLimits === undefined) {
|
|
19
|
+
expect(KernelFileSystem.batch(fs)).toBeUndefined();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const path = yield* Path.Path;
|
|
23
|
+
const boundaryRoot = yield* fs.realPath(root);
|
|
24
|
+
const rootIdentity = atomic.identifyRoot === undefined
|
|
25
|
+
? yield* Effect.map(fs.stat(root), (info) => `${info.dev}:${Option.getOrThrow(info.ino)}`)
|
|
26
|
+
: yield* atomic.identifyRoot(boundaryRoot);
|
|
27
|
+
const response = yield* atomic.execute({
|
|
28
|
+
operation: "batch",
|
|
29
|
+
boundaryRoot,
|
|
30
|
+
logicalRoot: root,
|
|
31
|
+
rootIdentity,
|
|
32
|
+
requests: [
|
|
33
|
+
{ operation: "digest", path: path.join(root, "source.txt"), content: true },
|
|
34
|
+
{ operation: "stat", path: path.join(root, "source.txt") },
|
|
35
|
+
{ operation: "readDirectory", path: root },
|
|
36
|
+
{ operation: "glob", path: path.join(root, "*.txt"), root },
|
|
37
|
+
{ operation: "digest", path: path.join(root, "absent") }
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
expect(response.rootIdentity).toBe(rootIdentity);
|
|
41
|
+
expect(response.entries.map((entry) => entry.index)).toEqual([2, 3, 4, 0, 1]);
|
|
42
|
+
const entries = [...response.entries].sort((a, b) => a.index - b.index);
|
|
43
|
+
expect(Result.getOrThrow(entries[0].result)).toEqual({
|
|
44
|
+
operation: "digest",
|
|
45
|
+
digest: "0e1c618211c39c03726d50ee05e7e520ca6d8a2a3619b17983adc574e3ca34bf",
|
|
46
|
+
sizeBytes: 13,
|
|
47
|
+
bytes: new TextEncoder().encode("host-contract")
|
|
48
|
+
});
|
|
49
|
+
expect(Result.getOrThrow(entries[1].result)).toMatchObject({
|
|
50
|
+
operation: "stat",
|
|
51
|
+
info: { type: "File", size: 13n }
|
|
52
|
+
});
|
|
53
|
+
expect(Result.getOrThrow(entries[2].result)).toEqual({ operation: "readDirectory", paths: ["source.txt"] });
|
|
54
|
+
expect(Result.getOrThrow(entries[3].result)).toEqual({ operation: "glob", paths: [path.join(root, "source.txt")] });
|
|
55
|
+
expect(entries[4].result).toMatchObject({ _tag: "Failure", failure: { reason: { _tag: "NotFound" } } });
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=FileSystemBatchContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemBatchContract.js","sourceRoot":"","sources":["../../../src/test/FileSystemBatchContract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The optional atomic batch portion of the shared host contract.\n *\n * @since 1.0.0\n */\n\nimport { expect } from \"@effect/vitest\"\nimport { Effect, type FileSystem, Option, Path, Result } from \"effect\"\nimport * as KernelFileSystem from \"../FileSystem.ts\"\n\n/**\n * Exercises every advertised batch implementation over the host contract's\n * fresh `source.txt` fixture. Isolated volumes may omit this optimization.\n *\n * @since 1.0.0\n * @category testing\n */\nexport const check = (fs: FileSystem.FileSystem, root: string) =>\n Effect.gen(function*() {\n const atomic = (fs as Partial<KernelFileSystem.AtomicHostFileSystem>)[KernelFileSystem.AtomicFileSystemTypeId]\n if (atomic?.batchLimits === undefined) {\n expect(KernelFileSystem.batch(fs)).toBeUndefined()\n return\n }\n const path = yield* Path.Path\n const boundaryRoot = yield* fs.realPath(root)\n const rootIdentity = atomic.identifyRoot === undefined\n ? yield* Effect.map(fs.stat(root), (info) => `${info.dev}:${Option.getOrThrow(info.ino)}`)\n : yield* atomic.identifyRoot(boundaryRoot)\n const response = yield* atomic.execute({\n operation: \"batch\",\n boundaryRoot,\n logicalRoot: root,\n rootIdentity,\n requests: [\n { operation: \"digest\", path: path.join(root, \"source.txt\"), content: true },\n { operation: \"stat\", path: path.join(root, \"source.txt\") },\n { operation: \"readDirectory\", path: root },\n { operation: \"glob\", path: path.join(root, \"*.txt\"), root },\n { operation: \"digest\", path: path.join(root, \"absent\") }\n ]\n })\n expect(response.rootIdentity).toBe(rootIdentity)\n expect(response.entries.map((entry) => entry.index)).toEqual([2, 3, 4, 0, 1])\n const entries = [...response.entries].sort((a, b) => a.index - b.index)\n expect(Result.getOrThrow(entries[0]!.result)).toEqual({\n operation: \"digest\",\n digest: \"0e1c618211c39c03726d50ee05e7e520ca6d8a2a3619b17983adc574e3ca34bf\",\n sizeBytes: 13,\n bytes: new TextEncoder().encode(\"host-contract\")\n })\n expect(Result.getOrThrow(entries[1]!.result)).toMatchObject({\n operation: \"stat\",\n info: { type: \"File\", size: 13n }\n })\n expect(Result.getOrThrow(entries[2]!.result)).toEqual({ operation: \"readDirectory\", paths: [\"source.txt\"] })\n expect(Result.getOrThrow(entries[3]!.result)).toEqual({ operation: \"glob\", paths: [path.join(root, \"source.txt\")] })\n expect(entries[4]!.result).toMatchObject({ _tag: \"Failure\", failure: { reason: { _tag: \"NotFound\" } } })\n })\n"]}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contract suite for complete Host bundles.
|
|
3
|
+
*
|
|
4
|
+
* This module is emitted as ESM, CJS, and declarations and exported from
|
|
5
|
+
* `@smthrs/kernel/test/contract`. It intentionally has a Vitest peer because
|
|
6
|
+
* it registers a reusable behavioral contract for third-party Host bundles.
|
|
7
|
+
*
|
|
8
|
+
* @since 1.0.0-rc.0
|
|
9
|
+
*/
|
|
10
|
+
import type { Jj, JjErrorCode } from "@smthrs/jj";
|
|
11
|
+
import { Effect, FileSystem, type Layer, Path } from "effect";
|
|
12
|
+
import { HttpClient } from "effect/unstable/http/HttpClient";
|
|
13
|
+
import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
|
|
14
|
+
import type * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
|
|
15
|
+
import * as ChildProcess from "effect/unstable/process/ChildProcess";
|
|
16
|
+
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
|
|
17
|
+
export { check as checkFileSystemBatch } from "./FileSystemBatchContract.ts";
|
|
18
|
+
/**
|
|
19
|
+
* A capability that must fail with a stable typed code.
|
|
20
|
+
*
|
|
21
|
+
* @category models
|
|
22
|
+
* @since 1.0.0-rc.0
|
|
23
|
+
*/
|
|
24
|
+
export interface FailureCapability<Code extends string> {
|
|
25
|
+
readonly expected: "failure";
|
|
26
|
+
readonly code: Code;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Successful filesystem contract options.
|
|
30
|
+
*
|
|
31
|
+
* `scratchPath` is required only for hosts whose filesystem does not accept an
|
|
32
|
+
* OS temp path — an in-memory double, say. Omitting it takes
|
|
33
|
+
* {@link defaultScratchPath}, which is process-scoped and outside the working
|
|
34
|
+
* tree.
|
|
35
|
+
*
|
|
36
|
+
* @category models
|
|
37
|
+
* @since 1.0.0-rc.0
|
|
38
|
+
*/
|
|
39
|
+
export interface FileSystemSuccess {
|
|
40
|
+
readonly expected: "success";
|
|
41
|
+
readonly scratchPath?: string | undefined;
|
|
42
|
+
/** Operations this otherwise available host deliberately refuses. */
|
|
43
|
+
readonly unsupported?: Partial<Record<FileSystemOperation, string>> | undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Every method on Effect's closed filesystem service.
|
|
47
|
+
* @category constants
|
|
48
|
+
* @since 1.0.0-rc.0
|
|
49
|
+
*/
|
|
50
|
+
export declare const FileSystemOperations: readonly ["access", "copy", "copyFile", "chmod", "chown", "glob", "exists", "link", "makeDirectory", "makeTempDirectory", "makeTempDirectoryScoped", "makeTempFile", "makeTempFileScoped", "open", "readDirectory", "readFile", "readFileString", "readLink", "realPath", "remove", "rename", "sink", "stat", "stream", "symlink", "truncate", "utimes", "watch", "writeFile", "writeFileString"];
|
|
51
|
+
/**
|
|
52
|
+
* One method of Effect's closed filesystem service.
|
|
53
|
+
* @category models
|
|
54
|
+
* @since 1.0.0-rc.0
|
|
55
|
+
*/
|
|
56
|
+
export type FileSystemOperation = typeof FileSystemOperations[number];
|
|
57
|
+
/**
|
|
58
|
+
* Successful Path contract expectation.
|
|
59
|
+
*
|
|
60
|
+
* @category models
|
|
61
|
+
* @since 1.0.0-rc.0
|
|
62
|
+
*/
|
|
63
|
+
export interface PathSuccess {
|
|
64
|
+
readonly expected: "success";
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Successful `ChildProcessSpawner` contract options.
|
|
68
|
+
*
|
|
69
|
+
* Defaults use the current Node or Bun executable. In-process browser
|
|
70
|
+
* doubles can provide their own scripted commands and expected output.
|
|
71
|
+
*
|
|
72
|
+
* There is no timeout case: a wall-clock budget is `Effect.timeout` around any
|
|
73
|
+
* effect, not a per-spawn option, so there is nothing host-specific left to
|
|
74
|
+
* assert.
|
|
75
|
+
*
|
|
76
|
+
* @category models
|
|
77
|
+
* @since 1.0.0-rc.0
|
|
78
|
+
*/
|
|
79
|
+
export interface ChildProcessSuccess {
|
|
80
|
+
readonly expected: "success";
|
|
81
|
+
readonly execCommand?: ChildProcess.Command | undefined;
|
|
82
|
+
readonly expectedStdout?: string | undefined;
|
|
83
|
+
readonly streamCommand?: ChildProcess.Command | undefined;
|
|
84
|
+
readonly expectedStreamText?: string | undefined;
|
|
85
|
+
/** A command carrying `cwd` and `env` options through to the child. */
|
|
86
|
+
readonly optionsCommand?: ChildProcess.Command | undefined;
|
|
87
|
+
readonly expectedOptionsStdout?: string | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* How the host handles a command fed from a `stdin` stream: the expected
|
|
90
|
+
* stdout when it supports one, or the typed code when it does not.
|
|
91
|
+
*/
|
|
92
|
+
readonly stdin?: {
|
|
93
|
+
readonly command: ChildProcess.Command;
|
|
94
|
+
readonly expectedStdout: string;
|
|
95
|
+
} | FailureCapability<string> | undefined;
|
|
96
|
+
/** A two-leg pipeline, or the exact typed refusal for hosts without one. */
|
|
97
|
+
readonly pipeline?: {
|
|
98
|
+
readonly command: ChildProcess.Command;
|
|
99
|
+
readonly expectedStdout: string;
|
|
100
|
+
} | FailureCapability<string> | undefined;
|
|
101
|
+
readonly interruptCommand?: ChildProcess.Command | undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Successful Jj contract expectation.
|
|
105
|
+
*
|
|
106
|
+
* @category models
|
|
107
|
+
* @since 1.0.0-rc.0
|
|
108
|
+
*/
|
|
109
|
+
export interface JjSuccess {
|
|
110
|
+
readonly expected: "success";
|
|
111
|
+
/** Makes the first and second snapshots observably different. */
|
|
112
|
+
readonly prepareChange?: ((phase: "first" | "second") => Effect.Effect<void, unknown>) | undefined;
|
|
113
|
+
/** Nonexistent path at which the contract may add one temporary workspace. */
|
|
114
|
+
readonly workspacePath?: string | undefined;
|
|
115
|
+
/** Path whose repository root the host must resolve. */
|
|
116
|
+
readonly rootFrom?: string | undefined;
|
|
117
|
+
/** Optional methods this otherwise available backend explicitly refuses. */
|
|
118
|
+
readonly unsupported?: Partial<Record<"root" | "revert", JjErrorCode>> | undefined;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Every method on the closed Jj host service.
|
|
122
|
+
* @category constants
|
|
123
|
+
* @since 1.0.0-rc.0
|
|
124
|
+
*/
|
|
125
|
+
export declare const JjOperations: readonly ["snapshot", "restore", "diff", "workspaceAdd", "workspaceForget", "status", "root", "revert"];
|
|
126
|
+
/**
|
|
127
|
+
* One method of the closed Jj host service.
|
|
128
|
+
* @category models
|
|
129
|
+
* @since 1.0.0-rc.0
|
|
130
|
+
*/
|
|
131
|
+
export type JjOperation = typeof JjOperations[number];
|
|
132
|
+
/**
|
|
133
|
+
* Successful HTTP contract probe.
|
|
134
|
+
*
|
|
135
|
+
* A request is explicit so the shared suite never invents a live network call.
|
|
136
|
+
*
|
|
137
|
+
* @category models
|
|
138
|
+
* @since 1.0.0-rc.0
|
|
139
|
+
*/
|
|
140
|
+
export interface HttpClientProbe {
|
|
141
|
+
/** Exact request the host must execute. */
|
|
142
|
+
readonly request: HttpClientRequest.HttpClientRequest;
|
|
143
|
+
/** Adapter-specific response proof. */
|
|
144
|
+
readonly assertResponse: (response: HttpClientResponse.HttpClientResponse) => void;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Successful read/write/redirect HTTP contract probes.
|
|
148
|
+
* @category models
|
|
149
|
+
* @since 1.0.0-rc.0
|
|
150
|
+
*/
|
|
151
|
+
export interface HttpClientSuccess {
|
|
152
|
+
readonly expected: "success";
|
|
153
|
+
/** Safe read method. */
|
|
154
|
+
readonly read: HttpClientProbe;
|
|
155
|
+
/** Body-carrying write method. */
|
|
156
|
+
readonly write: HttpClientProbe;
|
|
157
|
+
/** Manual redirect response; the host must not follow it below the guard. */
|
|
158
|
+
readonly redirect: HttpClientProbe;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Complete capability expectations for the closed five-tag Host surface.
|
|
162
|
+
* Unsupported capabilities are asserted with their code and are never skipped.
|
|
163
|
+
*
|
|
164
|
+
* @category models
|
|
165
|
+
* @since 1.0.0-rc.0
|
|
166
|
+
*/
|
|
167
|
+
export interface HostContractCapabilities {
|
|
168
|
+
readonly fileSystem: FileSystemSuccess | FailureCapability<string>;
|
|
169
|
+
readonly path: PathSuccess | FailureCapability<string>;
|
|
170
|
+
readonly childProcess: ChildProcessSuccess | FailureCapability<string>;
|
|
171
|
+
readonly jj: JjSuccess | FailureCapability<JjErrorCode>;
|
|
172
|
+
readonly httpClient: HttpClientSuccess | FailureCapability<string>;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* The full layer output required by the contract.
|
|
176
|
+
*
|
|
177
|
+
* @category models
|
|
178
|
+
* @since 1.0.0-rc.0
|
|
179
|
+
*/
|
|
180
|
+
export type HostContractLayer = Layer.Layer<FileSystem.FileSystem | Path.Path | ChildProcessSpawner | Jj | HttpClient, unknown>;
|
|
181
|
+
/**
|
|
182
|
+
* Normalizes the code a Host failure is identified by, across the three shapes
|
|
183
|
+
* the closed surface produces: a `code` field (`JjError`), a nested
|
|
184
|
+
* `reason._tag` (`PlatformError`, `HttpClientError`), and a bare `_tag`.
|
|
185
|
+
* Anything else is uncoded.
|
|
186
|
+
*
|
|
187
|
+
* @category testing
|
|
188
|
+
* @since 1.0.0-rc.0
|
|
189
|
+
*/
|
|
190
|
+
export declare const errorCode: (error: unknown) => string | undefined;
|
|
191
|
+
/**
|
|
192
|
+
* Asserts that `effect` fails with `code`. Succeeding is itself a contract
|
|
193
|
+
* violation: a capability declared unsupported must never quietly work.
|
|
194
|
+
*
|
|
195
|
+
* @category testing
|
|
196
|
+
* @since 1.0.0-rc.0
|
|
197
|
+
*/
|
|
198
|
+
export declare const assertFailure: <A, E, R>(effect: Effect.Effect<A, E, R>, code: string) => Effect.Effect<void, never, R>;
|
|
199
|
+
/**
|
|
200
|
+
* Allocates the scratch file path a contract bundle writes through when the
|
|
201
|
+
* caller declares no `scratchPath` of its own.
|
|
202
|
+
*
|
|
203
|
+
* The path is absolute under the OS temp directory and scoped by both process
|
|
204
|
+
* id and an allocation counter. A repo-relative default would put the file in
|
|
205
|
+
* the working tree, where it is neither ignored by git nor private to one test
|
|
206
|
+
* process: concurrent `vitest run` invocations would then race the same path,
|
|
207
|
+
* and the suite's `ensuring` remove could truncate a sibling's file between its
|
|
208
|
+
* write and its read.
|
|
209
|
+
*
|
|
210
|
+
* @category testing
|
|
211
|
+
* @since 1.0.0-rc.0
|
|
212
|
+
*/
|
|
213
|
+
export declare const defaultScratchPath: (suite: string) => string;
|
|
214
|
+
/**
|
|
215
|
+
* Registers the shared Host contract with Vitest.
|
|
216
|
+
*
|
|
217
|
+
* Every invocation creates ten cases: complete service presence,
|
|
218
|
+
* FileSystem, Path, five child-process lifecycle cases, Jj, and
|
|
219
|
+
* HttpClient.
|
|
220
|
+
*
|
|
221
|
+
* @category testing
|
|
222
|
+
* @since 1.0.0-rc.0
|
|
223
|
+
*/
|
|
224
|
+
export declare const runHostContract: (name: string, layer: HostContractLayer, caps: HostContractCapabilities) => void;
|
|
225
|
+
//# sourceMappingURL=HostContract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HostContract.d.ts","sourceRoot":"","sources":["../../../src/test/HostContract.ts"],"names":[],"mappings":"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"}
|