@romanilyin/canonicalpath 2026.5.18-2
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/LICENSE.md +331 -0
- package/LICENSE.ru.md +331 -0
- package/NOTICE.md +45 -0
- package/README.md +10 -0
- package/dist/canonicalfs/errors.d.ts +8 -0
- package/dist/canonicalfs/errors.d.ts.map +1 -0
- package/dist/canonicalfs/errors.js +19 -0
- package/dist/canonicalfs/errors.js.map +1 -0
- package/dist/canonicalfs/http.d.ts +29 -0
- package/dist/canonicalfs/http.d.ts.map +1 -0
- package/dist/canonicalfs/http.js +107 -0
- package/dist/canonicalfs/http.js.map +1 -0
- package/dist/canonicalfs/index.d.ts +8 -0
- package/dist/canonicalfs/index.d.ts.map +1 -0
- package/dist/canonicalfs/index.js +8 -0
- package/dist/canonicalfs/index.js.map +1 -0
- package/dist/canonicalfs/limitations.d.ts +2 -0
- package/dist/canonicalfs/limitations.d.ts.map +1 -0
- package/dist/canonicalfs/limitations.js +2 -0
- package/dist/canonicalfs/limitations.js.map +1 -0
- package/dist/canonicalfs/root.d.ts +17 -0
- package/dist/canonicalfs/root.d.ts.map +1 -0
- package/dist/canonicalfs/root.js +51 -0
- package/dist/canonicalfs/root.js.map +1 -0
- package/dist/canonicalfs/rpc.d.ts +15 -0
- package/dist/canonicalfs/rpc.d.ts.map +1 -0
- package/dist/canonicalfs/rpc.js +31 -0
- package/dist/canonicalfs/rpc.js.map +1 -0
- package/dist/canonicalfs/types.d.ts +25 -0
- package/dist/canonicalfs/types.d.ts.map +1 -0
- package/dist/canonicalfs/types.js +2 -0
- package/dist/canonicalfs/types.js.map +1 -0
- package/dist/canonicalfs/validate.d.ts +3 -0
- package/dist/canonicalfs/validate.d.ts.map +1 -0
- package/dist/canonicalfs/validate.js +36 -0
- package/dist/canonicalfs/validate.js.map +1 -0
- package/dist/canonicalpath/equal.d.ts +3 -0
- package/dist/canonicalpath/equal.d.ts.map +1 -0
- package/dist/canonicalpath/equal.js +5 -0
- package/dist/canonicalpath/equal.js.map +1 -0
- package/dist/canonicalpath/errors.d.ts +8 -0
- package/dist/canonicalpath/errors.d.ts.map +1 -0
- package/dist/canonicalpath/errors.js +19 -0
- package/dist/canonicalpath/errors.js.map +1 -0
- package/dist/canonicalpath/index.d.ts +11 -0
- package/dist/canonicalpath/index.d.ts.map +1 -0
- package/dist/canonicalpath/index.js +11 -0
- package/dist/canonicalpath/index.js.map +1 -0
- package/dist/canonicalpath/internal.d.ts +22 -0
- package/dist/canonicalpath/internal.d.ts.map +1 -0
- package/dist/canonicalpath/internal.js +135 -0
- package/dist/canonicalpath/internal.js.map +1 -0
- package/dist/canonicalpath/normalize.d.ts +3 -0
- package/dist/canonicalpath/normalize.d.ts.map +1 -0
- package/dist/canonicalpath/normalize.js +56 -0
- package/dist/canonicalpath/normalize.js.map +1 -0
- package/dist/canonicalpath/posix.d.ts +3 -0
- package/dist/canonicalpath/posix.d.ts.map +1 -0
- package/dist/canonicalpath/posix.js +13 -0
- package/dist/canonicalpath/posix.js.map +1 -0
- package/dist/canonicalpath/relative.d.ts +5 -0
- package/dist/canonicalpath/relative.d.ts.map +1 -0
- package/dist/canonicalpath/relative.js +57 -0
- package/dist/canonicalpath/relative.js.map +1 -0
- package/dist/canonicalpath/sanitize.d.ts +4 -0
- package/dist/canonicalpath/sanitize.d.ts.map +1 -0
- package/dist/canonicalpath/sanitize.js +36 -0
- package/dist/canonicalpath/sanitize.js.map +1 -0
- package/dist/canonicalpath/types.d.ts +28 -0
- package/dist/canonicalpath/types.d.ts.map +1 -0
- package/dist/canonicalpath/types.js +2 -0
- package/dist/canonicalpath/types.js.map +1 -0
- package/dist/canonicalpath/uri.d.ts +3 -0
- package/dist/canonicalpath/uri.d.ts.map +1 -0
- package/dist/canonicalpath/uri.js +49 -0
- package/dist/canonicalpath/uri.js.map +1 -0
- package/dist/canonicalpath/windows.d.ts +3 -0
- package/dist/canonicalpath/windows.d.ts.map +1 -0
- package/dist/canonicalpath/windows.js +12 -0
- package/dist/canonicalpath/windows.js.map +1 -0
- package/dist/canonicalpath/wsl.d.ts +5 -0
- package/dist/canonicalpath/wsl.d.ts.map +1 -0
- package/dist/canonicalpath/wsl.js +15 -0
- package/dist/canonicalpath/wsl.js.map +1 -0
- package/dist/unity-gateway/broker.d.ts +21 -0
- package/dist/unity-gateway/broker.d.ts.map +1 -0
- package/dist/unity-gateway/broker.js +140 -0
- package/dist/unity-gateway/broker.js.map +1 -0
- package/dist/unity-gateway/fake-bridge.d.ts +33 -0
- package/dist/unity-gateway/fake-bridge.d.ts.map +1 -0
- package/dist/unity-gateway/fake-bridge.js +214 -0
- package/dist/unity-gateway/fake-bridge.js.map +1 -0
- package/dist/unity-gateway/index.d.ts +6 -0
- package/dist/unity-gateway/index.d.ts.map +1 -0
- package/dist/unity-gateway/index.js +6 -0
- package/dist/unity-gateway/index.js.map +1 -0
- package/dist/unity-gateway/mcp-tools.d.ts +12 -0
- package/dist/unity-gateway/mcp-tools.d.ts.map +1 -0
- package/dist/unity-gateway/mcp-tools.js +265 -0
- package/dist/unity-gateway/mcp-tools.js.map +1 -0
- package/dist/unity-gateway/path-service.d.ts +25 -0
- package/dist/unity-gateway/path-service.d.ts.map +1 -0
- package/dist/unity-gateway/path-service.js +233 -0
- package/dist/unity-gateway/path-service.js.map +1 -0
- package/dist/unity-gateway/types.d.ts +168 -0
- package/dist/unity-gateway/types.d.ts.map +1 -0
- package/dist/unity-gateway/types.js +2 -0
- package/dist/unity-gateway/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { fsError } from "./errors.js";
|
|
3
|
+
export class CanonicalFSHTTPClient {
|
|
4
|
+
endpoint;
|
|
5
|
+
capabilityToken;
|
|
6
|
+
fetchImpl;
|
|
7
|
+
constructor(endpoint, options) {
|
|
8
|
+
const capabilityToken = options.capabilityToken.trim();
|
|
9
|
+
if (capabilityToken === "")
|
|
10
|
+
throw fsError("ERR_DAEMON", "capabilityToken is required");
|
|
11
|
+
this.endpoint = endpoint.replace(/\/+$/, "");
|
|
12
|
+
this.capabilityToken = capabilityToken;
|
|
13
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
14
|
+
}
|
|
15
|
+
async openProject(projectId, hostRoot) {
|
|
16
|
+
await this.call("/v1/projects/open", { project_id: projectId, host_root: hostRoot });
|
|
17
|
+
}
|
|
18
|
+
async capabilities() {
|
|
19
|
+
const response = await this.request("GET", "/v1/caps");
|
|
20
|
+
return {
|
|
21
|
+
authRequired: response.auth_required,
|
|
22
|
+
endpoints: response.endpoints,
|
|
23
|
+
limits: {
|
|
24
|
+
maxRequestBytes: response.limits.max_request_bytes,
|
|
25
|
+
defaultReadBytes: response.limits.default_read_bytes,
|
|
26
|
+
maxReadBytes: response.limits.max_read_bytes,
|
|
27
|
+
maxResponseBytes: response.limits.max_response_bytes,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async closeProject(projectId) {
|
|
32
|
+
await this.call("/v1/projects/close", { project_id: projectId });
|
|
33
|
+
}
|
|
34
|
+
async readFile(projectId, rel) {
|
|
35
|
+
const response = await this.call("/v1/fs/readFile", { project_id: projectId, path: rel });
|
|
36
|
+
return fromBase64(response.data_base64 ?? "");
|
|
37
|
+
}
|
|
38
|
+
async writeFile(projectId, rel, data) {
|
|
39
|
+
await this.call("/v1/fs/writeFile", { project_id: projectId, path: rel, data_base64: toBase64(data) });
|
|
40
|
+
}
|
|
41
|
+
async stat(projectId, rel) {
|
|
42
|
+
const response = await this.call("/v1/fs/stat", { project_id: projectId, path: rel });
|
|
43
|
+
if (!response.stat)
|
|
44
|
+
throw fsError("ERR_DAEMON", "stat response is missing");
|
|
45
|
+
return { path: response.stat.path, size: response.stat.size, isDirectory: response.stat.is_directory };
|
|
46
|
+
}
|
|
47
|
+
async mkdirAll(projectId, rel) {
|
|
48
|
+
await this.call("/v1/fs/mkdirAll", { project_id: projectId, path: rel });
|
|
49
|
+
}
|
|
50
|
+
async remove(projectId, rel) {
|
|
51
|
+
await this.call("/v1/fs/remove", { project_id: projectId, path: rel });
|
|
52
|
+
}
|
|
53
|
+
async rename(projectId, oldRel, newRel) {
|
|
54
|
+
await this.call("/v1/fs/rename", { project_id: projectId, path: oldRel, target: newRel });
|
|
55
|
+
}
|
|
56
|
+
async call(path, body) {
|
|
57
|
+
return this.request("POST", path, body);
|
|
58
|
+
}
|
|
59
|
+
async request(method, path, body) {
|
|
60
|
+
const headers = { authorization: `Bearer ${this.capabilityToken}` };
|
|
61
|
+
if (body)
|
|
62
|
+
headers["content-type"] = "application/json";
|
|
63
|
+
const response = await this.fetchImpl(`${this.endpoint}${path}`, {
|
|
64
|
+
method,
|
|
65
|
+
headers,
|
|
66
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
67
|
+
});
|
|
68
|
+
let payload;
|
|
69
|
+
try {
|
|
70
|
+
payload = (await response.json());
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw fsError("ERR_DAEMON", "daemon response is not valid JSON");
|
|
74
|
+
}
|
|
75
|
+
if (!response.ok || payload.error)
|
|
76
|
+
throwTransportError(payload.error ?? { code: "ERR_DAEMON", message: response.statusText });
|
|
77
|
+
return payload;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function throwTransportError(error) {
|
|
81
|
+
switch (error.code) {
|
|
82
|
+
case "ERR_ABSOLUTE_PATH":
|
|
83
|
+
case "ERR_ARCHIVE_TRAVERSAL":
|
|
84
|
+
case "ERR_DRIVE_RELATIVE_PATH":
|
|
85
|
+
case "ERR_NUL_BYTE":
|
|
86
|
+
case "ERR_OUTSIDE_ROOT":
|
|
87
|
+
case "ERR_RACE_DETECTED":
|
|
88
|
+
case "ERR_READ_LIMIT_EXCEEDED":
|
|
89
|
+
case "ERR_REQUEST_TOO_LARGE":
|
|
90
|
+
case "ERR_RESPONSE_TOO_LARGE":
|
|
91
|
+
case "ERR_ROOT_NOT_ALLOWED":
|
|
92
|
+
case "ERR_SYMLINK_ESCAPE":
|
|
93
|
+
case "ERR_UNAUTHORIZED":
|
|
94
|
+
case "ERR_UNSUPPORTED_OPERATION":
|
|
95
|
+
case "ERR_DAEMON":
|
|
96
|
+
throw fsError(error.code, error.message);
|
|
97
|
+
default:
|
|
98
|
+
throw new Error(`${error.code}: ${error.message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function toBase64(data) {
|
|
102
|
+
return Buffer.from(data).toString("base64");
|
|
103
|
+
}
|
|
104
|
+
function fromBase64(data) {
|
|
105
|
+
return new Uint8Array(Buffer.from(data, "base64"));
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/canonicalfs/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canonicalfs/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limitations.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/limitations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,4LACwJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limitations.js","sourceRoot":"","sources":["../../src/canonicalfs/limitations.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GACjC,yLAAyL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CanonicalRelativePath } from "../canonicalpath/types.js";
|
|
2
|
+
import type { FileStat } from "./types.js";
|
|
3
|
+
export declare class BestEffortCanonicalFSRoot {
|
|
4
|
+
readonly projectId: string;
|
|
5
|
+
readonly hostRoot?: string | undefined;
|
|
6
|
+
constructor(projectId: string, hostRoot?: string | undefined);
|
|
7
|
+
readFile(rel: string): Promise<Uint8Array>;
|
|
8
|
+
writeFile(rel: string, data: Uint8Array): Promise<void>;
|
|
9
|
+
mkdirAll(rel: string): Promise<void>;
|
|
10
|
+
remove(rel: string): Promise<void>;
|
|
11
|
+
rename(oldRel: string, newRel: string): Promise<void>;
|
|
12
|
+
stat(rel: string): Promise<FileStat>;
|
|
13
|
+
validate(rel: string): CanonicalRelativePath;
|
|
14
|
+
private resolveBestEffort;
|
|
15
|
+
private resolveCleanBestEffort;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/root.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,qBAAa,yBAAyB;IAElC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;gBADjB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,YAAA;IAGtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM1C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB;IAI5C,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,sBAAsB;CAI/B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { mkdir, readFile, rename as fsRename, rm, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fsError } from "./errors.js";
|
|
4
|
+
import { canonicalFSLimitations } from "./limitations.js";
|
|
5
|
+
import { validateRelativePath } from "./validate.js";
|
|
6
|
+
// Local Node filesystem operations are lexical best-effort helpers only.
|
|
7
|
+
// Use CanonicalFSRPCRoot/CanonicalFSHTTPClient with the Go daemon for security-sensitive I/O.
|
|
8
|
+
export class BestEffortCanonicalFSRoot {
|
|
9
|
+
projectId;
|
|
10
|
+
hostRoot;
|
|
11
|
+
constructor(projectId, hostRoot) {
|
|
12
|
+
this.projectId = projectId;
|
|
13
|
+
this.hostRoot = hostRoot;
|
|
14
|
+
}
|
|
15
|
+
async readFile(rel) {
|
|
16
|
+
return readFile(this.resolveBestEffort(rel));
|
|
17
|
+
}
|
|
18
|
+
async writeFile(rel, data) {
|
|
19
|
+
const target = this.resolveBestEffort(rel);
|
|
20
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
21
|
+
await writeFile(target, data);
|
|
22
|
+
}
|
|
23
|
+
async mkdirAll(rel) {
|
|
24
|
+
await mkdir(this.resolveBestEffort(rel), { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
async remove(rel) {
|
|
27
|
+
await rm(this.resolveBestEffort(rel), { recursive: true, force: false });
|
|
28
|
+
}
|
|
29
|
+
async rename(oldRel, newRel) {
|
|
30
|
+
const oldClean = validateRelativePath(oldRel);
|
|
31
|
+
const newClean = validateRelativePath(newRel);
|
|
32
|
+
await fsRename(this.resolveCleanBestEffort(oldClean), this.resolveCleanBestEffort(newClean));
|
|
33
|
+
}
|
|
34
|
+
async stat(rel) {
|
|
35
|
+
const clean = validateRelativePath(rel);
|
|
36
|
+
const info = await stat(this.resolveCleanBestEffort(clean));
|
|
37
|
+
return { path: clean, size: info.size, isDirectory: info.isDirectory() };
|
|
38
|
+
}
|
|
39
|
+
validate(rel) {
|
|
40
|
+
return validateRelativePath(rel);
|
|
41
|
+
}
|
|
42
|
+
resolveBestEffort(rel) {
|
|
43
|
+
return this.resolveCleanBestEffort(validateRelativePath(rel));
|
|
44
|
+
}
|
|
45
|
+
resolveCleanBestEffort(rel) {
|
|
46
|
+
if (!this.hostRoot)
|
|
47
|
+
throw fsError("ERR_OUTSIDE_ROOT", `hostRoot is required for local TypeScript canonicalfs. ${canonicalFSLimitations}`);
|
|
48
|
+
return path.join(this.hostRoot, rel);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/canonicalfs/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,yEAAyE;AACzE,8FAA8F;AAC9F,MAAM,OAAO,yBAAyB;IAEzB;IACA;IAFX,YACW,SAAiB,EACjB,QAAiB;QADjB,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAS;IACzB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAAgB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAc;QACzC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3E,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEO,iBAAiB,CAAC,GAAW;QACnC,OAAO,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,sBAAsB,CAAC,GAA0B;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,OAAO,CAAC,kBAAkB,EAAE,0DAA0D,sBAAsB,EAAE,CAAC,CAAC;QAC1I,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CanonicalRelativePath } from "../canonicalpath/types.js";
|
|
2
|
+
import type { CanonicalFSClient, FileStat } from "./types.js";
|
|
3
|
+
export declare class CanonicalFSRPCRoot {
|
|
4
|
+
readonly projectId: string;
|
|
5
|
+
private readonly client;
|
|
6
|
+
constructor(projectId: string, client: CanonicalFSClient);
|
|
7
|
+
readFile(rel: string): Promise<Uint8Array>;
|
|
8
|
+
writeFile(rel: string, data: Uint8Array): Promise<void>;
|
|
9
|
+
stat(rel: string): Promise<FileStat>;
|
|
10
|
+
mkdirAll(rel: string): Promise<void>;
|
|
11
|
+
remove(rel: string): Promise<void>;
|
|
12
|
+
rename(oldRel: string, newRel: string): Promise<void>;
|
|
13
|
+
validate(rel: string): CanonicalRelativePath;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG9D,qBAAa,kBAAkB;IAE3B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADd,SAAS,EAAE,MAAM,EACT,MAAM,EAAE,iBAAiB;IAGtC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB;CAG7C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { validateRelativePath } from "./validate.js";
|
|
2
|
+
export class CanonicalFSRPCRoot {
|
|
3
|
+
projectId;
|
|
4
|
+
client;
|
|
5
|
+
constructor(projectId, client) {
|
|
6
|
+
this.projectId = projectId;
|
|
7
|
+
this.client = client;
|
|
8
|
+
}
|
|
9
|
+
async readFile(rel) {
|
|
10
|
+
return this.client.readFile(this.projectId, this.validate(rel));
|
|
11
|
+
}
|
|
12
|
+
async writeFile(rel, data) {
|
|
13
|
+
return this.client.writeFile(this.projectId, this.validate(rel), data);
|
|
14
|
+
}
|
|
15
|
+
async stat(rel) {
|
|
16
|
+
return this.client.stat(this.projectId, this.validate(rel));
|
|
17
|
+
}
|
|
18
|
+
async mkdirAll(rel) {
|
|
19
|
+
return this.client.mkdirAll(this.projectId, this.validate(rel));
|
|
20
|
+
}
|
|
21
|
+
async remove(rel) {
|
|
22
|
+
return this.client.remove(this.projectId, this.validate(rel));
|
|
23
|
+
}
|
|
24
|
+
async rename(oldRel, newRel) {
|
|
25
|
+
return this.client.rename(this.projectId, this.validate(oldRel), this.validate(newRel));
|
|
26
|
+
}
|
|
27
|
+
validate(rel) {
|
|
28
|
+
return validateRelativePath(rel);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/canonicalfs/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,OAAO,kBAAkB;IAElB;IACQ;IAFnB,YACW,SAAiB,EACT,MAAyB;QADjC,cAAS,GAAT,SAAS,CAAQ;QACT,WAAM,GAAN,MAAM,CAAmB;IACzC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAAgB;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAc;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CanonicalRelativePath } from "../canonicalpath/types.js";
|
|
2
|
+
export interface FileStat {
|
|
3
|
+
path: CanonicalRelativePath;
|
|
4
|
+
size: number;
|
|
5
|
+
isDirectory: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CanonicalFSDaemonCapabilities {
|
|
8
|
+
authRequired: boolean;
|
|
9
|
+
endpoints: string[];
|
|
10
|
+
limits: {
|
|
11
|
+
maxRequestBytes: number;
|
|
12
|
+
defaultReadBytes: number;
|
|
13
|
+
maxReadBytes: number;
|
|
14
|
+
maxResponseBytes: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface CanonicalFSClient {
|
|
18
|
+
readFile(projectId: string, rel: CanonicalRelativePath): Promise<Uint8Array>;
|
|
19
|
+
writeFile(projectId: string, rel: CanonicalRelativePath, data: Uint8Array): Promise<void>;
|
|
20
|
+
stat(projectId: string, rel: CanonicalRelativePath): Promise<FileStat>;
|
|
21
|
+
mkdirAll(projectId: string, rel: CanonicalRelativePath): Promise<void>;
|
|
22
|
+
remove(projectId: string, rel: CanonicalRelativePath): Promise<void>;
|
|
23
|
+
rename(projectId: string, oldRel: CanonicalRelativePath, newRel: CanonicalRelativePath): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/canonicalfs/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/canonicalfs/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAqBvE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { fsError } from "./errors.js";
|
|
2
|
+
export function validateRelativePath(rel) {
|
|
3
|
+
if (rel.includes("\0"))
|
|
4
|
+
throw fsError("ERR_NUL_BYTE", "path contains NUL");
|
|
5
|
+
if (rel === "" || rel === ".")
|
|
6
|
+
return ".";
|
|
7
|
+
if (isAbsolutePathLike(rel))
|
|
8
|
+
throw fsError("ERR_ABSOLUTE_PATH", "path must be relative to root");
|
|
9
|
+
if (isDriveRelativePathLike(rel))
|
|
10
|
+
throw fsError("ERR_DRIVE_RELATIVE_PATH", "Windows drive-relative paths are not accepted in CanonicalFS relative paths");
|
|
11
|
+
if (rel.includes("\\")) {
|
|
12
|
+
throw fsError("ERR_OUTSIDE_ROOT", "backslash separators are not accepted in CanonicalFS relative paths");
|
|
13
|
+
}
|
|
14
|
+
const parts = [];
|
|
15
|
+
for (const part of rel.split("/")) {
|
|
16
|
+
if (part === "" || part === ".")
|
|
17
|
+
continue;
|
|
18
|
+
if (part === "..") {
|
|
19
|
+
if (parts.length === 0)
|
|
20
|
+
throw fsError("ERR_OUTSIDE_ROOT", "path escapes root");
|
|
21
|
+
parts.pop();
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
parts.push(part);
|
|
25
|
+
}
|
|
26
|
+
return (parts.length === 0 ? "." : parts.join("/"));
|
|
27
|
+
}
|
|
28
|
+
function isAbsolutePathLike(rel) {
|
|
29
|
+
if (rel.startsWith("/") || rel.startsWith("\\\\"))
|
|
30
|
+
return true;
|
|
31
|
+
return /^[A-Za-z]:[\\/]/.test(rel);
|
|
32
|
+
}
|
|
33
|
+
function isDriveRelativePathLike(rel) {
|
|
34
|
+
return /^[A-Za-z]:($|[^\\/])/.test(rel);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/canonicalfs/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,OAAO,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IAC3E,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,GAA4B,CAAC;IACnE,IAAI,kBAAkB,CAAC,GAAG,CAAC;QAAE,MAAM,OAAO,CAAC,mBAAmB,EAAE,+BAA+B,CAAC,CAAC;IACjG,IAAI,uBAAuB,CAAC,GAAG,CAAC;QAAE,MAAM,OAAO,CAAC,yBAAyB,EAAE,6EAA6E,CAAC,CAAC;IAC1J,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,kBAAkB,EAAE,qEAAqE,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QAC1C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;YAC/E,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAA0B,CAAC;AAC/E,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW;IAC1C,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equal.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/equal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAE5F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equal.js","sourceRoot":"","sources":["../../src/canonicalpath/equal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,UAA4B,EAAE;IACjF,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ErrorCode = "ERR_ABSOLUTE_PATH" | "ERR_ALTERNATE_DATA_STREAM" | "ERR_DRIVE_RELATIVE_PATH" | "ERR_EMPTY_PATH" | "ERR_ENCODED_SEPARATOR" | "ERR_INVALID_COMPONENT" | "ERR_INVALID_PATH" | "ERR_INVALID_PERCENT_ENCODING" | "ERR_INVALID_URI" | "ERR_NUL_BYTE" | "ERR_OUTSIDE_ROOT" | "ERR_RESERVED_DEVICE_NAME" | "ERR_UNSUPPORTED_URI_SCHEME";
|
|
2
|
+
export declare class CanonicalPathError extends Error {
|
|
3
|
+
readonly code: ErrorCode;
|
|
4
|
+
constructor(code: ErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function pathError(code: ErrorCode, message: string): CanonicalPathError;
|
|
7
|
+
export declare function errorCode(error: unknown): string;
|
|
8
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,mBAAmB,GACnB,2BAA2B,GAC3B,yBAAyB,GACzB,gBAAgB,GAChB,uBAAuB,GACvB,uBAAuB,GACvB,kBAAkB,GAClB,8BAA8B,GAC9B,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,0BAA0B,GAC1B,4BAA4B,CAAC;AAEjC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;gBAEb,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAK7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAE9E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIhD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class CanonicalPathError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(`${code}: ${message}`);
|
|
5
|
+
this.name = "CanonicalPathError";
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function pathError(code, message) {
|
|
10
|
+
return new CanonicalPathError(code, message);
|
|
11
|
+
}
|
|
12
|
+
export function errorCode(error) {
|
|
13
|
+
if (error instanceof CanonicalPathError)
|
|
14
|
+
return error.code;
|
|
15
|
+
if (error instanceof Error)
|
|
16
|
+
return error.message;
|
|
17
|
+
return String(error);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/canonicalpath/errors.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAY;IAEzB,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,IAAe,EAAE,OAAe;IACxD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,kBAAkB;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC3D,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./errors.js";
|
|
2
|
+
export * from "./equal.js";
|
|
3
|
+
export * from "./normalize.js";
|
|
4
|
+
export * from "./posix.js";
|
|
5
|
+
export * from "./relative.js";
|
|
6
|
+
export * from "./sanitize.js";
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./uri.js";
|
|
9
|
+
export * from "./windows.js";
|
|
10
|
+
export * from "./wsl.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./errors.js";
|
|
2
|
+
export * from "./equal.js";
|
|
3
|
+
export * from "./normalize.js";
|
|
4
|
+
export * from "./posix.js";
|
|
5
|
+
export * from "./relative.js";
|
|
6
|
+
export * from "./sanitize.js";
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./uri.js";
|
|
9
|
+
export * from "./windows.js";
|
|
10
|
+
export * from "./wsl.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canonicalpath/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WSLOptions } from "./types.js";
|
|
2
|
+
export declare function isAsciiLetter(value: string): boolean;
|
|
3
|
+
export declare function hasUriScheme(value: string): boolean;
|
|
4
|
+
export declare function hasDriveRoot(value: string): boolean;
|
|
5
|
+
export declare function isDriveRelative(value: string): boolean;
|
|
6
|
+
export declare function isUriWindowsDrivePath(value: string): boolean;
|
|
7
|
+
export declare function isAbsolutePathLike(value: string): boolean;
|
|
8
|
+
export declare function unwrapWindowsExtendedPrefix(value: string): string;
|
|
9
|
+
export declare function mapWSLDrive(value: string, options: WSLOptions | undefined): string | undefined;
|
|
10
|
+
export declare function splitRoot(value: string): {
|
|
11
|
+
prefix: string;
|
|
12
|
+
rest: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function cleanCanonical(value: string): string;
|
|
15
|
+
export declare function canonicalParts(value: string): {
|
|
16
|
+
prefix: string;
|
|
17
|
+
parts: string[];
|
|
18
|
+
};
|
|
19
|
+
export declare function hasWindowsADS(value: string): boolean;
|
|
20
|
+
export declare function hasReservedDeviceName(value: string): boolean;
|
|
21
|
+
export declare function isReservedDeviceBase(base: string): boolean;
|
|
22
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/internal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAa9F;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWzE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBpD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAUjF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQpD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAY5D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D"}
|