@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,135 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
export function isAsciiLetter(value) {
|
|
3
|
+
if (value.length !== 1)
|
|
4
|
+
return false;
|
|
5
|
+
const code = value.charCodeAt(0);
|
|
6
|
+
return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
|
|
7
|
+
}
|
|
8
|
+
export function hasUriScheme(value) {
|
|
9
|
+
const index = value.indexOf("://");
|
|
10
|
+
if (index <= 0)
|
|
11
|
+
return false;
|
|
12
|
+
return /^[A-Za-z][A-Za-z0-9+.-]*$/.test(value.slice(0, index));
|
|
13
|
+
}
|
|
14
|
+
export function hasDriveRoot(value) {
|
|
15
|
+
return value.length >= 3 && isAsciiLetter(value[0] ?? "") && value[1] === ":" && value[2] === "/";
|
|
16
|
+
}
|
|
17
|
+
export function isDriveRelative(value) {
|
|
18
|
+
return value.length >= 2 && isAsciiLetter(value[0] ?? "") && value[1] === ":" && (value.length === 2 || value[2] !== "/");
|
|
19
|
+
}
|
|
20
|
+
export function isUriWindowsDrivePath(value) {
|
|
21
|
+
return value.length >= 4 && value[0] === "/" && isAsciiLetter(value[1] ?? "") && value[2] === ":" && value[3] === "/";
|
|
22
|
+
}
|
|
23
|
+
export function isAbsolutePathLike(value) {
|
|
24
|
+
return value.startsWith("/") || value.startsWith("\\\\") || hasDriveRoot(value.replaceAll("\\", "/"));
|
|
25
|
+
}
|
|
26
|
+
export function unwrapWindowsExtendedPrefix(value) {
|
|
27
|
+
if (value.startsWith("\\\\?\\UNC\\"))
|
|
28
|
+
return `\\\\${value.slice("\\\\?\\UNC\\".length)}`;
|
|
29
|
+
if (value.startsWith("\\\\?\\"))
|
|
30
|
+
return value.slice("\\\\?\\".length);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
export function mapWSLDrive(value, options) {
|
|
34
|
+
if (!options?.enabled)
|
|
35
|
+
return undefined;
|
|
36
|
+
const mountRoot = (options.mountRoot ?? "/mnt").replace(/\/+$/, "");
|
|
37
|
+
const prefix = `${mountRoot}/`;
|
|
38
|
+
if (!value.startsWith(prefix))
|
|
39
|
+
return undefined;
|
|
40
|
+
const rest = value.slice(prefix.length);
|
|
41
|
+
if (rest.length < 1 || !isAsciiLetter(rest[0] ?? ""))
|
|
42
|
+
return undefined;
|
|
43
|
+
if (rest.length > 1 && rest[1] !== "/")
|
|
44
|
+
return undefined;
|
|
45
|
+
const drive = rest[0]?.toLowerCase();
|
|
46
|
+
if (rest.length === 1)
|
|
47
|
+
return `${drive}:/`;
|
|
48
|
+
return `${drive}:/${rest.slice(2)}`;
|
|
49
|
+
}
|
|
50
|
+
export function splitRoot(value) {
|
|
51
|
+
if (hasDriveRoot(value))
|
|
52
|
+
return { prefix: value.slice(0, 3), rest: value.slice(3) };
|
|
53
|
+
if (value.startsWith("//")) {
|
|
54
|
+
const parts = value.slice(2).split("/");
|
|
55
|
+
if (parts.length < 2 || !parts[0] || !parts[1]) {
|
|
56
|
+
throw pathError("ERR_INVALID_PATH", "UNC path requires server and share");
|
|
57
|
+
}
|
|
58
|
+
return { prefix: `//${parts[0]}/${parts[1]}`, rest: parts.slice(2).join("/") };
|
|
59
|
+
}
|
|
60
|
+
if (value.startsWith("/"))
|
|
61
|
+
return { prefix: "/", rest: value.slice(1) };
|
|
62
|
+
return { prefix: "", rest: value };
|
|
63
|
+
}
|
|
64
|
+
export function cleanCanonical(value) {
|
|
65
|
+
if (value === "")
|
|
66
|
+
throw pathError("ERR_EMPTY_PATH", "path is empty");
|
|
67
|
+
const { prefix, rest } = splitRoot(value);
|
|
68
|
+
const parts = [];
|
|
69
|
+
for (const part of rest.split("/")) {
|
|
70
|
+
if (part === "" || part === ".")
|
|
71
|
+
continue;
|
|
72
|
+
if (part === "..") {
|
|
73
|
+
if (parts.length > 0) {
|
|
74
|
+
parts.pop();
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (prefix !== "")
|
|
78
|
+
continue;
|
|
79
|
+
throw pathError("ERR_INVALID_PATH", "relative path escapes above its root");
|
|
80
|
+
}
|
|
81
|
+
parts.push(part);
|
|
82
|
+
}
|
|
83
|
+
const joined = parts.join("/");
|
|
84
|
+
if (prefix === "")
|
|
85
|
+
return joined === "" ? "." : joined;
|
|
86
|
+
if (prefix === "/")
|
|
87
|
+
return joined === "" ? "/" : `/${joined}`;
|
|
88
|
+
if (prefix.endsWith("/"))
|
|
89
|
+
return joined === "" ? prefix : `${prefix}${joined}`;
|
|
90
|
+
return joined === "" ? prefix : `${prefix}/${joined}`;
|
|
91
|
+
}
|
|
92
|
+
export function canonicalParts(value) {
|
|
93
|
+
if (value.includes("\0"))
|
|
94
|
+
throw pathError("ERR_NUL_BYTE", "path contains NUL");
|
|
95
|
+
const { prefix, rest } = splitRoot(value);
|
|
96
|
+
if (prefix === "")
|
|
97
|
+
throw pathError("ERR_INVALID_PATH", "path must be canonical absolute");
|
|
98
|
+
const parts = rest.split("/").filter((part) => part !== "");
|
|
99
|
+
if (parts.some((part) => part === "." || part === "..")) {
|
|
100
|
+
throw pathError("ERR_INVALID_PATH", "path is not lexically cleaned");
|
|
101
|
+
}
|
|
102
|
+
return { prefix, parts };
|
|
103
|
+
}
|
|
104
|
+
export function hasWindowsADS(value) {
|
|
105
|
+
let start = 0;
|
|
106
|
+
if (hasDriveRoot(value))
|
|
107
|
+
start = 3;
|
|
108
|
+
else if (value.startsWith("//")) {
|
|
109
|
+
const parts = value.slice(2).split("/");
|
|
110
|
+
if (parts.length >= 2)
|
|
111
|
+
start = `//${parts[0]}/${parts[1]}`.length;
|
|
112
|
+
}
|
|
113
|
+
return value.slice(start).includes(":");
|
|
114
|
+
}
|
|
115
|
+
export function hasReservedDeviceName(value) {
|
|
116
|
+
let rest;
|
|
117
|
+
try {
|
|
118
|
+
rest = splitRoot(value).rest;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return rest.split("/").some((part) => {
|
|
124
|
+
if (part === "" || part === "." || part === "..")
|
|
125
|
+
return false;
|
|
126
|
+
const base = part.split(/[.:]/, 1)[0]?.toUpperCase() ?? "";
|
|
127
|
+
return isReservedDeviceBase(base);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
export function isReservedDeviceBase(base) {
|
|
131
|
+
if (["CON", "PRN", "AUX", "NUL"].includes(base))
|
|
132
|
+
return true;
|
|
133
|
+
return /^(COM|LPT)[1-9]$/.test(base);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/canonicalpath/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAelE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa,CA+BpF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { cleanCanonical, hasDriveRoot, hasReservedDeviceName, hasUriScheme, hasWindowsADS, isDriveRelative, isUriWindowsDrivePath, mapWSLDrive, unwrapWindowsExtendedPrefix, } from "./internal.js";
|
|
3
|
+
import { parseFileUri } from "./uri.js";
|
|
4
|
+
export function normalize(raw, options = {}) {
|
|
5
|
+
if (options.trimOuterWhitespace)
|
|
6
|
+
raw = raw.trim();
|
|
7
|
+
if (raw === "")
|
|
8
|
+
throw pathError("ERR_EMPTY_PATH", "path is empty");
|
|
9
|
+
if (raw.includes("\0"))
|
|
10
|
+
throw pathError("ERR_NUL_BYTE", "path contains NUL");
|
|
11
|
+
let value = raw;
|
|
12
|
+
if (hasUriScheme(value) || options.sourceHost === "vscode-file-uri") {
|
|
13
|
+
value = parseFileUri(value, options);
|
|
14
|
+
}
|
|
15
|
+
if (!options.windows?.preserveExtendedLength)
|
|
16
|
+
value = unwrapWindowsExtendedPrefix(value);
|
|
17
|
+
value = value.replaceAll("\\", "/");
|
|
18
|
+
if (options.targetProfile !== "posix")
|
|
19
|
+
value = mapWSLDrive(value, options.wsl) ?? value;
|
|
20
|
+
if (isUriWindowsDrivePath(value))
|
|
21
|
+
value = value.slice(1);
|
|
22
|
+
if (isDriveRelative(value)) {
|
|
23
|
+
throw pathError("ERR_DRIVE_RELATIVE_PATH", "Windows drive-relative paths are not canonical");
|
|
24
|
+
}
|
|
25
|
+
if (hasDriveRoot(value))
|
|
26
|
+
value = `${value[0]?.toLowerCase()}${value.slice(1)}`;
|
|
27
|
+
if (options.windows?.rejectADS && hasWindowsADS(value)) {
|
|
28
|
+
throw pathError("ERR_ALTERNATE_DATA_STREAM", "Windows alternate data stream is not allowed");
|
|
29
|
+
}
|
|
30
|
+
if (options.windows?.rejectDeviceNames && hasReservedDeviceName(value)) {
|
|
31
|
+
throw pathError("ERR_RESERVED_DEVICE_NAME", "Windows reserved device name is not allowed");
|
|
32
|
+
}
|
|
33
|
+
const cleaned = cleanCanonical(value);
|
|
34
|
+
validateTargetProfile(cleaned, options.targetProfile);
|
|
35
|
+
return cleaned;
|
|
36
|
+
}
|
|
37
|
+
function validateTargetProfile(value, targetProfile) {
|
|
38
|
+
switch (targetProfile) {
|
|
39
|
+
case undefined:
|
|
40
|
+
case "portable":
|
|
41
|
+
return;
|
|
42
|
+
case "posix":
|
|
43
|
+
if (hasDriveRoot(value) || value.startsWith("//")) {
|
|
44
|
+
throw pathError("ERR_INVALID_PATH", "targetProfile posix does not allow Windows drive or UNC roots");
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
case "win32-drive":
|
|
48
|
+
if (value.startsWith("/")) {
|
|
49
|
+
throw pathError("ERR_INVALID_PATH", "targetProfile win32-drive does not allow POSIX or UNC roots");
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
default:
|
|
53
|
+
throw pathError("ERR_INVALID_PATH", "unsupported targetProfile");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/canonicalpath/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posix.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/posix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAOxD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { hasDriveRoot } from "./internal.js";
|
|
3
|
+
export function toPOSIX(canonical) {
|
|
4
|
+
if (canonical.includes("\0"))
|
|
5
|
+
throw pathError("ERR_NUL_BYTE", "path contains NUL");
|
|
6
|
+
if (hasDriveRoot(canonical)) {
|
|
7
|
+
throw pathError("ERR_INVALID_PATH", "win32 drive paths require an explicit host mapping such as toWSL");
|
|
8
|
+
}
|
|
9
|
+
if (canonical.includes("\\"))
|
|
10
|
+
throw pathError("ERR_INVALID_PATH", "canonical paths must use slash separators");
|
|
11
|
+
return canonical;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=posix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posix.js","sourceRoot":"","sources":["../../src/canonicalpath/posix.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,OAAO,CAAC,SAAwB;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnF,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,CAAC,kBAAkB,EAAE,kEAAkE,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,kBAAkB,EAAE,2CAA2C,CAAC,CAAC;IAC/G,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CanonicalPath, CanonicalRelativePath } from "./types.js";
|
|
2
|
+
export declare function relative(root: CanonicalPath, target: CanonicalPath): CanonicalRelativePath;
|
|
3
|
+
export declare function join(root: CanonicalPath, relative: CanonicalRelativePath): CanonicalPath;
|
|
4
|
+
export declare function normalizeRelative(raw: string): CanonicalRelativePath;
|
|
5
|
+
//# sourceMappingURL=relative.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/relative.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAIvE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,qBAAqB,CAa1F;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,GAAG,aAAa,CAMxF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAoBpE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { canonicalParts, isAbsolutePathLike, isDriveRelative } from "./internal.js";
|
|
3
|
+
export function relative(root, target) {
|
|
4
|
+
const rootParts = canonicalParts(root);
|
|
5
|
+
const targetParts = canonicalParts(target);
|
|
6
|
+
if (rootParts.prefix !== targetParts.prefix || targetParts.parts.length < rootParts.parts.length) {
|
|
7
|
+
throw pathError("ERR_OUTSIDE_ROOT", "target is outside root");
|
|
8
|
+
}
|
|
9
|
+
for (let index = 0; index < rootParts.parts.length; index += 1) {
|
|
10
|
+
if (targetParts.parts[index] !== rootParts.parts[index]) {
|
|
11
|
+
throw pathError("ERR_OUTSIDE_ROOT", "target is outside root");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (targetParts.parts.length === rootParts.parts.length)
|
|
15
|
+
return ".";
|
|
16
|
+
return targetParts.parts.slice(rootParts.parts.length).join("/");
|
|
17
|
+
}
|
|
18
|
+
export function join(root, relative) {
|
|
19
|
+
const cleanRelative = normalizeRelative(relative);
|
|
20
|
+
if (root.includes("\0"))
|
|
21
|
+
throw pathError("ERR_NUL_BYTE", "root contains NUL");
|
|
22
|
+
if (cleanRelative === ".")
|
|
23
|
+
return root;
|
|
24
|
+
if (root === "/" || root.endsWith("/"))
|
|
25
|
+
return `${root}${cleanRelative}`;
|
|
26
|
+
return `${root}/${cleanRelative}`;
|
|
27
|
+
}
|
|
28
|
+
export function normalizeRelative(raw) {
|
|
29
|
+
if (raw === "")
|
|
30
|
+
throw pathError("ERR_EMPTY_PATH", "relative path is empty");
|
|
31
|
+
if (raw === ".")
|
|
32
|
+
return ".";
|
|
33
|
+
if (raw.includes("\0"))
|
|
34
|
+
throw pathError("ERR_NUL_BYTE", "relative path contains NUL");
|
|
35
|
+
if (isAbsolutePathLike(raw))
|
|
36
|
+
throw pathError("ERR_ABSOLUTE_PATH", "relative path must not be absolute");
|
|
37
|
+
if (isDriveRelative(raw))
|
|
38
|
+
throw pathError("ERR_DRIVE_RELATIVE_PATH", "drive-relative path is not allowed");
|
|
39
|
+
if (raw.includes("\\"))
|
|
40
|
+
throw pathError("ERR_INVALID_PATH", "relative path must use slash separators");
|
|
41
|
+
const parts = [];
|
|
42
|
+
for (const part of raw.split("/")) {
|
|
43
|
+
if (part === "" || part === ".")
|
|
44
|
+
continue;
|
|
45
|
+
if (part === "..") {
|
|
46
|
+
if (parts.length === 0)
|
|
47
|
+
throw pathError("ERR_OUTSIDE_ROOT", "relative path escapes root");
|
|
48
|
+
parts.pop();
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
parts.push(part);
|
|
52
|
+
}
|
|
53
|
+
if (parts.length === 0)
|
|
54
|
+
throw pathError("ERR_EMPTY_PATH", "relative path is empty after cleaning");
|
|
55
|
+
return parts.join("/");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=relative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative.js","sourceRoot":"","sources":["../../src/canonicalpath/relative.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function sanitizeComponent(name: string, profile: "portable" | "win32" | "posix"): string;
|
|
2
|
+
export declare function encodeComponent(name: string, profile: "portable" | "win32" | "posix"): string;
|
|
3
|
+
export declare function encodeGitRef(raw: string): string;
|
|
4
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/sanitize.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAO/F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAE7F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { pathError } from "./errors.js";
|
|
3
|
+
import { isReservedDeviceBase } from "./internal.js";
|
|
4
|
+
export function sanitizeComponent(name, profile) {
|
|
5
|
+
if (name === "")
|
|
6
|
+
throw pathError("ERR_INVALID_COMPONENT", "component is empty");
|
|
7
|
+
if (name.includes("\0"))
|
|
8
|
+
throw pathError("ERR_NUL_BYTE", "component contains NUL");
|
|
9
|
+
let value = name.replace(/[\\/:\t\n\r]+/g, "-").replace(/^[ ._-]+|[ ._-]+$/g, "");
|
|
10
|
+
if (value === "")
|
|
11
|
+
value = "component";
|
|
12
|
+
if (profile === "win32")
|
|
13
|
+
value = escapeReservedWin32Component(value);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function encodeComponent(name, profile) {
|
|
17
|
+
return sanitizeComponent(name, profile);
|
|
18
|
+
}
|
|
19
|
+
export function encodeGitRef(raw) {
|
|
20
|
+
if (raw === "")
|
|
21
|
+
throw pathError("ERR_INVALID_COMPONENT", "git ref is empty");
|
|
22
|
+
if (raw.includes("\0"))
|
|
23
|
+
throw pathError("ERR_NUL_BYTE", "git ref contains NUL");
|
|
24
|
+
const slug = raw.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^[._-]+|[._-]+$/g, "") || "ref";
|
|
25
|
+
const hash = createHash("sha256").update(raw, "utf8").digest("hex").slice(0, 12);
|
|
26
|
+
return `${slug}--${hash}`;
|
|
27
|
+
}
|
|
28
|
+
function escapeReservedWin32Component(value) {
|
|
29
|
+
const dot = value.indexOf(".");
|
|
30
|
+
const base = dot >= 0 ? value.slice(0, dot) : value;
|
|
31
|
+
const suffix = dot >= 0 ? value.slice(dot) : "";
|
|
32
|
+
if (isReservedDeviceBase(base.toUpperCase()))
|
|
33
|
+
return `${base}-${suffix}`;
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/canonicalpath/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAuC;IACrF,IAAI,IAAI,KAAK,EAAE;QAAE,MAAM,SAAS,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,CAAC;IAChF,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;IACnF,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,KAAK,KAAK,EAAE;QAAE,KAAK,GAAG,WAAW,CAAC;IACtC,IAAI,OAAO,KAAK,OAAO;QAAE,KAAK,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAuC;IACnF,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,GAAG,KAAK,EAAE;QAAE,MAAM,SAAS,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IAC7E,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;IAC5F,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAa;IACjD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,IAAI,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;IACzE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type CanonicalPath = string & {
|
|
2
|
+
readonly __canonicalPath: unique symbol;
|
|
3
|
+
};
|
|
4
|
+
export type CanonicalRelativePath = string & {
|
|
5
|
+
readonly __canonicalRelativePath: unique symbol;
|
|
6
|
+
};
|
|
7
|
+
export type HostKind = "posix" | "win32" | "wsl" | "vscode-file-uri" | "dev-container" | "ssh-remote";
|
|
8
|
+
export interface WSLOptions {
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
mountRoot?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface NormalizeOptions {
|
|
13
|
+
sourceHost?: HostKind;
|
|
14
|
+
targetProfile?: "portable" | "win32-drive" | "posix";
|
|
15
|
+
wsl?: WSLOptions;
|
|
16
|
+
uri?: {
|
|
17
|
+
allowFileUri?: boolean;
|
|
18
|
+
allowVSCodeFileUri?: boolean;
|
|
19
|
+
rejectEncodedSlash?: boolean;
|
|
20
|
+
};
|
|
21
|
+
windows?: {
|
|
22
|
+
preserveExtendedLength?: boolean;
|
|
23
|
+
rejectDeviceNames?: boolean;
|
|
24
|
+
rejectADS?: boolean;
|
|
25
|
+
};
|
|
26
|
+
trimOuterWhitespace?: boolean;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,eAAe,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AACjF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,uBAAuB,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,iBAAiB,GAAG,eAAe,GAAG,YAAY,CAAC;AAEtG,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,aAAa,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;IACrD,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,OAAO,CAAC,EAAE;QACR,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/canonicalpath/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/uri.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAahF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { hasUriScheme } from "./internal.js";
|
|
3
|
+
export function parseFileUri(uri, options = {}) {
|
|
4
|
+
if (uri.includes("\0"))
|
|
5
|
+
throw pathError("ERR_NUL_BYTE", "URI contains NUL");
|
|
6
|
+
if (uri.startsWith("file://")) {
|
|
7
|
+
if (!options.uri?.allowFileUri)
|
|
8
|
+
throw pathError("ERR_UNSUPPORTED_URI_SCHEME", "file URI is not allowed");
|
|
9
|
+
return parseHierarchicalURIPath(uri, "file://", options);
|
|
10
|
+
}
|
|
11
|
+
if (uri.startsWith("vscode-file://")) {
|
|
12
|
+
if (!options.uri?.allowVSCodeFileUri)
|
|
13
|
+
throw pathError("ERR_UNSUPPORTED_URI_SCHEME", "vscode-file URI is not allowed");
|
|
14
|
+
return parseHierarchicalURIPath(uri, "vscode-file://", options);
|
|
15
|
+
}
|
|
16
|
+
if (hasUriScheme(uri))
|
|
17
|
+
throw pathError("ERR_UNSUPPORTED_URI_SCHEME", "unsupported URI scheme");
|
|
18
|
+
return uri;
|
|
19
|
+
}
|
|
20
|
+
function parseHierarchicalURIPath(raw, prefix, options) {
|
|
21
|
+
if (options.uri?.rejectEncodedSlash !== false && hasEncodedSeparator(raw)) {
|
|
22
|
+
throw pathError("ERR_ENCODED_SEPARATOR", "URI contains an encoded path separator");
|
|
23
|
+
}
|
|
24
|
+
const rest = raw.slice(prefix.length);
|
|
25
|
+
const slash = rest.indexOf("/");
|
|
26
|
+
if (slash < 0)
|
|
27
|
+
throw pathError("ERR_INVALID_URI", "URI path is empty");
|
|
28
|
+
const authority = rest.slice(0, slash);
|
|
29
|
+
const pathPart = rest.slice(slash);
|
|
30
|
+
try {
|
|
31
|
+
const decoded = decodeURIComponent(pathPart);
|
|
32
|
+
const decodedAuthority = decodeURIComponent(authority);
|
|
33
|
+
if (decoded === "")
|
|
34
|
+
throw pathError("ERR_INVALID_URI", "URI path is empty");
|
|
35
|
+
if (prefix === "file://" && decodedAuthority !== "" && decodedAuthority.toLowerCase() !== "localhost") {
|
|
36
|
+
return `//${decodedAuthority}${decoded}`;
|
|
37
|
+
}
|
|
38
|
+
return decoded;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof Error && error.name === "CanonicalPathError")
|
|
42
|
+
throw error;
|
|
43
|
+
throw pathError("ERR_INVALID_PERCENT_ENCODING", "URI percent encoding is invalid");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function hasEncodedSeparator(value) {
|
|
47
|
+
return /%(2f|2F|5c|5C)/.test(value);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/canonicalpath/uri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,UAA4B,EAAE;IACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAE5E,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY;YAAE,MAAM,SAAS,CAAC,4BAA4B,EAAE,yBAAyB,CAAC,CAAC;QACzG,OAAO,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB;YAAE,MAAM,SAAS,CAAC,4BAA4B,EAAE,gCAAgC,CAAC,CAAC;QACtH,OAAO,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,YAAY,CAAC,GAAG,CAAC;QAAE,MAAM,SAAS,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;IAC/F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAW,EAAE,MAAc,EAAE,OAAyB;IACtF,IAAI,OAAO,CAAC,GAAG,EAAE,kBAAkB,KAAK,KAAK,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1E,MAAM,SAAS,CAAC,uBAAuB,EAAE,wCAAwC,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,SAAS,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,OAAO,KAAK,EAAE;YAAE,MAAM,SAAS,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;QAC5E,IAAI,MAAM,KAAK,SAAS,IAAI,gBAAgB,KAAK,EAAE,IAAI,gBAAgB,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;YACtG,OAAO,KAAK,gBAAgB,GAAG,OAAO,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB;YAAE,MAAM,KAAK,CAAC;QAC/E,MAAM,SAAS,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/windows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAKxD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { hasDriveRoot } from "./internal.js";
|
|
3
|
+
export function toWin32(canonical) {
|
|
4
|
+
if (canonical.includes("\0"))
|
|
5
|
+
throw pathError("ERR_NUL_BYTE", "path contains NUL");
|
|
6
|
+
if (hasDriveRoot(canonical))
|
|
7
|
+
return `${canonical[0]?.toUpperCase()}:\\${canonical.slice(3).replaceAll("/", "\\")}`;
|
|
8
|
+
if (canonical.startsWith("//"))
|
|
9
|
+
return `\\\\${canonical.slice(2).replaceAll("/", "\\")}`;
|
|
10
|
+
return canonical.replaceAll("/", "\\");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/canonicalpath/windows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,OAAO,CAAC,SAAwB;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnF,IAAI,YAAY,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;IACnH,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;IACzF,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsl.d.ts","sourceRoot":"","sources":["../../src/canonicalpath/wsl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAQ5F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { pathError } from "./errors.js";
|
|
2
|
+
import { hasDriveRoot } from "./internal.js";
|
|
3
|
+
export function toWSL(canonical, options = {}) {
|
|
4
|
+
if (canonical.includes("\0"))
|
|
5
|
+
throw pathError("ERR_NUL_BYTE", "path contains NUL");
|
|
6
|
+
if (!hasDriveRoot(canonical))
|
|
7
|
+
return canonical;
|
|
8
|
+
const mountRoot = (options.mountRoot ?? "/mnt").replace(/\/+$/, "");
|
|
9
|
+
const drive = canonical[0]?.toLowerCase();
|
|
10
|
+
const rest = canonical.slice(3);
|
|
11
|
+
if (rest === "")
|
|
12
|
+
return `${mountRoot}/${drive}`;
|
|
13
|
+
return `${mountRoot}/${drive}/${rest}`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=wsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsl.js","sourceRoot":"","sources":["../../src/canonicalpath/wsl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,KAAK,CAAC,SAAwB,EAAE,UAAkC,EAAE;IAClF,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC;IAChD,OAAO,GAAG,SAAS,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CanonicalPath } from "../canonicalpath/types.js";
|
|
2
|
+
import { CanonicalPathService } from "./path-service.js";
|
|
3
|
+
import type { UnityBridgePathValidation, UnityPathValidationOptions, UnityProjectPathAlias, UnityProjectPathAliasRegistration, UnityProjectPathAliasSelector, UnityProjectRecord, UnityProjectRegistration } from "./types.js";
|
|
4
|
+
export declare class CanonicalPathBroker {
|
|
5
|
+
readonly paths: CanonicalPathService;
|
|
6
|
+
private readonly projects;
|
|
7
|
+
constructor(paths?: CanonicalPathService);
|
|
8
|
+
registerProject(registration: UnityProjectRegistration): UnityProjectRecord;
|
|
9
|
+
getProject(projectId: string): UnityProjectRecord;
|
|
10
|
+
listProjects(): UnityProjectRecord[];
|
|
11
|
+
registerPathAlias(projectId: string, registration: UnityProjectPathAliasRegistration): UnityProjectPathAlias;
|
|
12
|
+
private addPathAlias;
|
|
13
|
+
listPathAliases(projectId: string): UnityProjectPathAlias[];
|
|
14
|
+
getPathAlias(projectId: string, selector: UnityProjectPathAliasSelector): UnityProjectPathAlias;
|
|
15
|
+
resolveHostRoot(projectId: string, selector?: UnityProjectPathAliasSelector): string | undefined;
|
|
16
|
+
fromUnityAssetPath(projectId: string, unityPath: string): CanonicalPath;
|
|
17
|
+
toUnityAssetPath(projectId: string, fullPath: CanonicalPath): string;
|
|
18
|
+
validateUnityAssetPath(projectId: string, unityPath: string, options?: UnityPathValidationOptions): UnityBridgePathValidation;
|
|
19
|
+
private createPathAlias;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/unity-gateway/broker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE/N,qBAAa,mBAAmB;IAGlB,QAAQ,CAAC,KAAK;IAF1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAE7C,KAAK,uBAA6B;IAEvD,eAAe,CAAC,YAAY,EAAE,wBAAwB,GAAG,kBAAkB;IA2B3E,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB;IAMjD,YAAY,IAAI,kBAAkB,EAAE;IAIpC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,iCAAiC,GAAG,qBAAqB;IAI5G,OAAO,CAAC,YAAY;IASpB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAI3D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,6BAA6B,GAAG,qBAAqB;IAO/F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,6BAAkC,GAAG,MAAM,GAAG,SAAS;IAMpG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa;IAIvE,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM;IAIpE,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,yBAAyB;IAejI,OAAO,CAAC,eAAe;CAsBxB"}
|